475 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			475 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <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>
 | ||
|    |