yunzer_go/mobile/pages/message/chatdetail.vue
2025-10-27 23:13:08 +08:00

475 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="chat-detail-container">
<!-- 移动设备顶部状态栏 -->
<view class="top_bar flex w-full" v-if="isMobile">
<view class="chat-header">
<view class="header-left" @click="goBack">
<i class="fas fa-arrow-left"></i>
</view>
<view class="header-title">聊天详情</view>
<view class="header-right"></view>
</view>
</view>
<!-- 浏览器环境顶部导航栏 -->
<view class="chat-header" v-else>
<view class="header-left" @click="goBack">
<i class="fas fa-arrow-left"></i>
</view>
<view class="header-title">聊天详情</view>
<view class="header-right"></view>
</view>
<!-- 顶部用户信息卡片 -->
<view class="user-card">
<view class="user-info">
<view class="avatar-container">
<image
class="avatar"
src="/static/imgs/default_avatar.png"
mode="aspectFill"
@error="onAvatarError"
/>
</view>
<view class="user-base-info">
<view class="nickname">{{ user.nickname }}</view>
<view class="meteid">账号{{ user.meteid }}</view>
</view>
</view>
</view>
<!-- 功能操作卡片 -->
<view class="action-card">
<view class="card-header">
<i class="fas fa-search"></i>
<text>聊天功能</text>
</view>
<view class="action-list">
<view class="action-item" @click="goToSearchRecord">
<view class="action-icon">
<i class="fas fa-search"></i>
</view>
<text>查找聊天记录</text>
<i class="fas fa-chevron-right"></i>
</view>
</view>
</view>
<!-- 聊天设置卡片 -->
<view class="setting-card">
<view class="card-header">
<i class="fas fa-cog"></i>
<text>聊天设置</text>
</view>
<view class="setting-list">
<view class="setting-item">
<view class="setting-icon">
<i class="fas fa-bell-slash"></i>
</view>
<text>消息免打扰</text>
<switch :checked="disturb" @change="switchDisturb" />
</view>
<view class="setting-item">
<view class="setting-icon">
<i class="fas fa-thumbtack"></i>
</view>
<text>置顶聊天</text>
<switch :checked="pinned" @change="switchPinned" />
</view>
<view class="setting-item" @click="chooseChatBg">
<view class="setting-icon">
<i class="fas fa-image"></i>
</view>
<text>设置当前聊天背景</text>
<i class="fas fa-chevron-right"></i>
</view>
</view>
</view>
<!-- 危险操作卡片 -->
<view class="danger-card">
<view class="card-header">
<i class="fas fa-exclamation-triangle"></i>
<text>危险操作</text>
</view>
<view class="danger-list">
<view class="danger-item" @click="clearRecord">
<view class="danger-icon">
<i class="fas fa-trash"></i>
</view>
<text>清空聊天记录</text>
<i class="fas fa-chevron-right"></i>
</view>
<view class="danger-item" @click="complain">
<view class="danger-icon">
<i class="fas fa-flag"></i>
</view>
<text>投诉</text>
<i class="fas fa-chevron-right"></i>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
user: {
avatar: "",
nickname: "美天科技用户",
meteid: "mete_123456",
},
disturb: false,
pinned: false,
};
},
computed: {
// 从全局数据获取设备信息
isMobile() {
return getApp().globalData.isMobile;
}
},
methods: {
goBack() {
uni.navigateBack();
},
onAvatarError() {
// 头像加载失败时的处理
console.log('头像加载失败');
},
goToSearchRecord() {
uni.navigateTo({
url: "/pages/message/chatsearch?userid=" + this.user.meteid,
});
},
switchDisturb(e) {
this.disturb = e.detail.value;
uni.showToast({
title: this.disturb ? "已开启免打扰" : "已关闭免打扰",
icon: "none",
});
},
switchPinned(e) {
this.pinned = e.detail.value;
uni.showToast({
title: this.pinned ? "已置顶聊天" : "已取消置顶",
icon: "none",
});
},
remindOnce() {
uni.showToast({
title: "已为你开启消息提醒一次",
icon: "none",
});
},
chooseChatBg() {
uni.chooseImage({
count: 1,
success: (res) => {
const bgPath = res.tempFilePaths[0];
uni.setStorageSync("chat_bg_" + this.user.meteid, bgPath);
uni.showToast({ title: "聊天背景已设置", icon: "none" });
},
});
},
clearRecord() {
uni.showModal({
title: "提示",
content: "确定要清空与该用户的聊天记录吗?",
success: (res) => {
if (res.confirm) {
// 这里可以调用API或清空本地数据
uni.showToast({ title: "聊天记录已清空", icon: "none" });
}
},
});
},
complain() {
uni.showModal({
title: "投诉",
content: "如发现对方有违规行为,请进行投诉,我们将协助核实处理。",
confirmText: "投诉",
success: (res) => {
if (res.confirm) {
uni.showToast({
title: "已投诉,平台将进行核查",
icon: "none",
});
}
},
});
},
},
};
</script>
<style scoped>
.chat-detail-container {
background: var(--background);
min-height: 100vh;
padding: 30rpx;
}
/* 移动设备顶部状态栏 */
.top_bar {
background: var(--gradient-primary);
box-shadow: var(--shadow-lg);
z-index: 9999;
position: fixed;
top: 0;
left: 0;
right: 0;
height: calc(var(--status-bar-height) + 88rpx);
display: flex;
align-items: flex-end;
padding-top: var(--status-bar-height);
box-sizing: border-box;
}
/* 支持安全区域的设备 */
@supports (padding: max(0px)) {
.top_bar {
height: calc(var(--status-bar-height) + 88rpx + env(safe-area-inset-top));
padding-top: calc(var(--status-bar-height) + env(safe-area-inset-top));
}
.top_bar + .user-card {
margin-top: calc(var(--status-bar-height) + 88rpx + env(safe-area-inset-top));
}
.chat-detail-container .chat-header:not(.top_bar .chat-header) {
height: calc(var(--status-bar-height) + 88rpx + env(safe-area-inset-top));
padding-top: calc(var(--status-bar-height) + env(safe-area-inset-top));
}
.chat-detail-container .chat-header:not(.top_bar .chat-header) + .user-card {
margin-top: calc(var(--status-bar-height) + 88rpx + env(safe-area-inset-top));
}
}
/* 顶部导航栏 */
.chat-header {
display: flex;
justify-content: space-between;
align-items: center;
height: 88rpx;
background-color: var(--surface);
border-bottom: 1rpx solid var(--border);
padding: 0 20rpx;
box-sizing: border-box;
box-shadow: var(--shadow);
}
/* 浏览器环境下的固定定位 */
.chat-detail-container .chat-header:not(.top_bar .chat-header) {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 9999;
height: calc(var(--status-bar-height) + 88rpx);
padding-top: var(--status-bar-height);
}
/* 移动设备下的导航栏样式 */
.top_bar .chat-header {
background: transparent;
border-bottom: none;
box-shadow: none;
width: 100%;
height: 88rpx;
padding: 0 20rpx;
box-sizing: border-box;
}
.top_bar .header-title {
color: var(--white);
font-weight: 600;
font-size: 36rpx;
}
.top_bar .header-left i,
.top_bar .header-right i {
color: var(--white);
font-size: 40rpx;
}
.header-left,
.header-right {
width: 80rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s ease;
}
.header-left:active,
.header-right:active {
background-color: var(--gray-lighter);
border-radius: 8rpx;
}
.top_bar .header-left:active,
.top_bar .header-right:active {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 8rpx;
}
.header-title {
font-size: 32rpx;
font-weight: 600;
color: var(--title-color);
}
/* 移动设备下为内容添加顶部间距 */
.top_bar + .user-card {
margin-top: calc(var(--status-bar-height) + 88rpx);
}
/* 浏览器环境下为内容添加顶部间距 */
.chat-detail-container .chat-header:not(.top_bar .chat-header) + .user-card {
margin-top: calc(var(--status-bar-height) + 88rpx);
}
/* 用户信息卡片 */
.user-card {
background: var(--surface);
border-radius: 16rpx;
margin-bottom: 30rpx;
box-shadow: var(--shadow-md);
border: 1rpx solid var(--border-light);
overflow: hidden;
}
.user-info {
display: flex;
align-items: center;
padding: 40rpx 30rpx;
}
.avatar-container {
margin-right: 30rpx;
}
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 16rpx;
background: var(--gray);
box-shadow: var(--shadow);
}
.user-base-info {
flex: 1;
}
.nickname {
font-size: 36rpx;
font-weight: 600;
color: var(--title-color);
margin-bottom: 8rpx;
}
.meteid {
font-size: 24rpx;
color: var(--text-secondary);
}
/* 卡片通用样式 */
.action-card, .setting-card, .danger-card {
background: var(--surface);
border-radius: 16rpx;
margin-bottom: 20rpx;
box-shadow: var(--shadow);
border: 1rpx solid var(--border-light);
overflow: hidden;
}
.card-header {
display: flex;
align-items: center;
padding: 30rpx 30rpx 20rpx 30rpx;
border-bottom: 1rpx solid var(--border-light);
background: var(--gray-lighter);
}
.card-header i {
font-size: 28rpx;
color: var(--icon-color);
margin-right: 16rpx;
}
.card-header text {
font-size: 28rpx;
font-weight: 600;
color: var(--title-color);
}
/* 操作列表 */
.action-list, .setting-list, .danger-list {
padding: 0;
}
.action-item, .setting-item, .danger-item {
display: flex;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid var(--border-light);
transition: background-color 0.2s ease;
}
.action-item:last-child, .setting-item:last-child, .danger-item:last-child {
border-bottom: none;
}
.action-item:active, .setting-item:active, .danger-item:active {
background-color: var(--surface-hover);
}
/* 图标样式 */
.action-icon, .setting-icon, .danger-icon {
width: 60rpx;
height: 60rpx;
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
}
.action-icon {
background: var(--gradient-primary);
}
.setting-icon {
background: var(--gradient-primary);
}
.danger-icon {
background: var(--gradient-error);
}
.action-icon i, .setting-icon i, .danger-icon i {
color: var(--white);
font-size: 24rpx;
}
/* 文字样式 */
.action-item text, .setting-item text, .danger-item text {
flex: 1;
font-size: 28rpx;
color: var(--text-color);
font-weight: 500;
}
.danger-item text {
color: var(--error);
}
.action-item i.fas.fa-chevron-right, .setting-item i.fas.fa-chevron-right, .danger-item i.fas.fa-chevron-right {
color: var(--text-muted);
font-size: 24rpx;
}
</style>