590 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			590 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
|   <view class="user-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="user.avatar || '/static/imgs/default_avatar.png'"
 | ||
|             mode="aspectFill"
 | ||
|             @error="onAvatarError"
 | ||
|           />
 | ||
|           <view class="online-status" v-if="user.isOnline"></view>
 | ||
|         </view>
 | ||
|         <view class="user-base-info">
 | ||
|           <view class="nickname">{{ user.nickname }}</view>
 | ||
|           <view class="meteid">账号:{{ user.meteid }}</view>
 | ||
|           <view class="meta-info">
 | ||
|             <view class="meta-item" v-if="user.department">
 | ||
|               部门:<text>{{ user.department }}</text>
 | ||
|             </view>
 | ||
|           </view>
 | ||
|           <view class="meta-info">
 | ||
|             <view class="meta-item" v-if="user.position">
 | ||
|               职位:<text>{{ user.position }}</text>
 | ||
|             </view>
 | ||
|           </view>
 | ||
|         </view>
 | ||
|       </view>
 | ||
|     </view>
 | ||
| 
 | ||
|     <!-- 功能按钮区域 -->
 | ||
|     <view class="action-section">
 | ||
|       <view class="action-btn primary" @click="sendMessage">
 | ||
|         <i class="fas fa-comment-dots"></i>
 | ||
|         <text>发消息</text>
 | ||
|       </view>
 | ||
|       <view class="action-btn" @click="startAudioCall">
 | ||
|         <i class="fas fa-phone-alt"></i>
 | ||
|         <text>语音通话</text>
 | ||
|       </view>
 | ||
|       <view class="action-btn" @click="startVideoCall">
 | ||
|         <i class="fas fa-video"></i>
 | ||
|         <text>视频通话</text>
 | ||
|       </view>
 | ||
|     </view>
 | ||
| 
 | ||
|     <!-- 资料信息卡片 -->
 | ||
|     <view class="info-card">
 | ||
|       <view class="card-header">
 | ||
|         <i class="fas fa-user-circle"></i>
 | ||
|         <text>个人资料</text>
 | ||
|       </view>
 | ||
|       <view class="info-list">
 | ||
|         <view class="info-item" v-if="user.phone" @click="copyToClipboard(user.phone, '手机号')">
 | ||
|           <view class="info-icon phone">
 | ||
|             <i class="fas fa-phone"></i>
 | ||
|           </view>
 | ||
|           <view class="info-content">
 | ||
|             <text class="info-label">手机号码</text>
 | ||
|             <text class="info-value">{{ user.phone }}</text>
 | ||
|           </view>
 | ||
|           <i class="fas fa-copy"></i>
 | ||
|         </view>
 | ||
|         <view class="info-item" v-if="user.wechat" @click="copyToClipboard(user.wechat, '微信号')">
 | ||
|           <view class="info-icon wechat">
 | ||
|             <i class="fab fa-weixin"></i>
 | ||
|           </view>
 | ||
|           <view class="info-content">
 | ||
|             <text class="info-label">微信</text>
 | ||
|             <text class="info-value">{{ user.wechat }}</text>
 | ||
|           </view>
 | ||
|           <i class="fas fa-copy"></i>
 | ||
|         </view>
 | ||
|         <view class="info-item" v-if="user.email" @click="copyToClipboard(user.email, '邮箱')">
 | ||
|           <view class="info-icon email">
 | ||
|             <i class="fas fa-envelope"></i>
 | ||
|           </view>
 | ||
|           <view class="info-content">
 | ||
|             <text class="info-label">邮箱</text>
 | ||
|             <text class="info-value">{{ user.email }}</text>
 | ||
|           </view>
 | ||
|           <i class="fas fa-copy"></i>
 | ||
|         </view>
 | ||
|       </view>
 | ||
|     </view>
 | ||
| 
 | ||
|     <!-- 更多功能卡片 -->
 | ||
|     <view class="more-card">
 | ||
|       <view class="card-header">
 | ||
|         <i class="fas fa-cog"></i>
 | ||
|         <text>更多功能</text>
 | ||
|       </view>
 | ||
|       <view class="more-list">
 | ||
|         <view class="more-item" @click="addToContacts">
 | ||
|           <view class="more-icon">
 | ||
|             <i class="fas fa-user-plus"></i>
 | ||
|           </view>
 | ||
|           <text>添加到通讯录</text>
 | ||
|           <i class="fas fa-chevron-right"></i>
 | ||
|         </view>
 | ||
|         <view class="more-item" @click="shareContact">
 | ||
|           <view class="more-icon">
 | ||
|             <i class="fas fa-share-alt"></i>
 | ||
|           </view>
 | ||
|           <text>发送名片</text>
 | ||
|           <i class="fas fa-chevron-right"></i>
 | ||
|         </view>
 | ||
|         <view class="more-item" @click="viewMoments">
 | ||
|           <view class="more-icon">
 | ||
|             <i class="fas fa-images"></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_10001',
 | ||
|         position: '产品经理',
 | ||
|         department: '产品部',
 | ||
|         phone: '13455668888',
 | ||
|         wechat: 'zhangsan_weixin',
 | ||
|         email: 'zhangsan@email.com',
 | ||
|         isOnline: true
 | ||
|       }
 | ||
|     };
 | ||
|   },
 | ||
|   computed: {
 | ||
|     // 从全局数据获取设备信息
 | ||
|     isMobile() {
 | ||
|       return getApp().globalData.isMobile;
 | ||
|     }
 | ||
|   },
 | ||
|   methods: {
 | ||
|     goBack() {
 | ||
|       uni.navigateBack();
 | ||
|     },
 | ||
|     onAvatarError(e) {
 | ||
|       this.user.avatar = '/static/imgs/default_avatar.png'
 | ||
|     },
 | ||
|     sendMessage() {
 | ||
|       uni.navigateTo({
 | ||
|         url: '/pages/message/chat?meteid=' + this.user.meteid
 | ||
|       });
 | ||
|     },
 | ||
|     startAudioCall() {
 | ||
|       uni.showToast({
 | ||
|         title: '语音通话功能暂未开放',
 | ||
|         icon: 'none'
 | ||
|       });
 | ||
|     },
 | ||
|     startVideoCall() {
 | ||
|       uni.showToast({
 | ||
|         title: '视频通话功能暂未开放',
 | ||
|         icon: 'none'
 | ||
|       });
 | ||
|     },
 | ||
|     copyToClipboard(text, type) {
 | ||
|       uni.setClipboardData({
 | ||
|         data: text,
 | ||
|         success: () => {
 | ||
|           uni.showToast({
 | ||
|             title: `${type}已复制`,
 | ||
|             icon: 'success'
 | ||
|           });
 | ||
|         }
 | ||
|       });
 | ||
|     },
 | ||
|     addToContacts() {
 | ||
|       uni.showToast({
 | ||
|         title: '已添加到通讯录',
 | ||
|         icon: 'success'
 | ||
|       });
 | ||
|     },
 | ||
|     shareContact() {
 | ||
|       uni.showToast({
 | ||
|         title: '已发送名片',
 | ||
|         icon: 'success'
 | ||
|       });
 | ||
|     },
 | ||
|     viewMoments() {
 | ||
|       uni.showToast({
 | ||
|         title: '朋友圈功能暂未开放',
 | ||
|         icon: 'none'
 | ||
|       });
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| 
 | ||
| <style scoped>
 | ||
| .user-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));
 | ||
|   }
 | ||
|   
 | ||
|   .user-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));
 | ||
|   }
 | ||
|   
 | ||
|   .user-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);
 | ||
| }
 | ||
| 
 | ||
| /* 浏览器环境下的固定定位 */
 | ||
| .user-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);
 | ||
| }
 | ||
| 
 | ||
| /* 浏览器环境下为内容添加顶部间距 */
 | ||
| .user-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);
 | ||
|   overflow: hidden;
 | ||
|   border: 1rpx solid var(--border-light);
 | ||
| }
 | ||
| 
 | ||
| .user-info {
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   padding: 40rpx 30rpx;
 | ||
|   position: relative;
 | ||
| }
 | ||
| 
 | ||
| .avatar-container {
 | ||
|   position: relative;
 | ||
|   margin-right: 30rpx;
 | ||
| }
 | ||
| 
 | ||
| .avatar {
 | ||
|   width: 160rpx;
 | ||
|   height: 160rpx;
 | ||
|   border-radius: 16rpx;
 | ||
|   background: var(--gray-light);
 | ||
|   box-shadow: var(--shadow);
 | ||
| }
 | ||
| 
 | ||
| .online-status {
 | ||
|   position: absolute;
 | ||
|   bottom: 8rpx;
 | ||
|   right: 8rpx;
 | ||
|   width: 24rpx;
 | ||
|   height: 24rpx;
 | ||
|   background: var(--success);
 | ||
|   border: 4rpx solid var(--white);
 | ||
|   border-radius: 50%;
 | ||
| }
 | ||
| 
 | ||
| .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);
 | ||
|   margin-bottom: 16rpx;
 | ||
| }
 | ||
| 
 | ||
| .meta-info {
 | ||
|   display: flex;
 | ||
|   gap: 8rpx;
 | ||
| }
 | ||
| 
 | ||
| .meta-item {
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   font-size: 24rpx;
 | ||
|   color: var(--text-secondary);
 | ||
|   margin-bottom: 8rpx;
 | ||
| }
 | ||
| 
 | ||
| .meta-item i {
 | ||
|   margin-right: 12rpx;
 | ||
|   font-size: 20rpx;
 | ||
| }
 | ||
| 
 | ||
| /* 功能按钮区域 */
 | ||
| .action-section {
 | ||
|   display: flex;
 | ||
|   gap: 20rpx;
 | ||
|   margin-bottom: 30rpx;
 | ||
| }
 | ||
| 
 | ||
| .action-btn {
 | ||
|   flex: 1;
 | ||
|   background: var(--surface);
 | ||
|   border-radius: 16rpx;
 | ||
|   padding: 24rpx 16rpx;
 | ||
|   display: flex;
 | ||
|   flex-direction: column;
 | ||
|   align-items: center;
 | ||
|   gap: 8rpx;
 | ||
|   box-shadow: var(--shadow);
 | ||
|   border: 1rpx solid var(--border-light);
 | ||
|   transition: all 0.3s ease;
 | ||
| }
 | ||
| 
 | ||
| .action-btn:active {
 | ||
|   transform: translateY(2rpx);
 | ||
|   box-shadow: var(--shadow-md);
 | ||
|   background: var(--surface-hover);
 | ||
| }
 | ||
| 
 | ||
| .action-btn.primary {
 | ||
|   background: var(--gradient-primary);
 | ||
|   color: var(--white);
 | ||
|   border: none;
 | ||
| }
 | ||
| 
 | ||
| .action-btn i {
 | ||
|   font-size: 32rpx;
 | ||
|   margin-bottom: 4rpx;
 | ||
| }
 | ||
| 
 | ||
| .action-btn text {
 | ||
|   font-size: 24rpx;
 | ||
|   font-weight: 500;
 | ||
| }
 | ||
| 
 | ||
| /* 信息卡片 */
 | ||
| .info-card, .more-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);
 | ||
| }
 | ||
| 
 | ||
| .info-list, .more-list {
 | ||
|   padding: 0;
 | ||
| }
 | ||
| 
 | ||
| .info-item, .more-item {
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   padding: 30rpx;
 | ||
|   border-bottom: 1rpx solid var(--border-light);
 | ||
|   transition: background-color 0.2s ease;
 | ||
| }
 | ||
| 
 | ||
| .info-item:last-child, .more-item:last-child {
 | ||
|   border-bottom: none;
 | ||
| }
 | ||
| 
 | ||
| .info-item:active, .more-item:active {
 | ||
|   background-color: var(--surface-hover);
 | ||
| }
 | ||
| 
 | ||
| .info-icon {
 | ||
|   width: 60rpx;
 | ||
|   height: 60rpx;
 | ||
|   border-radius: 12rpx;
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   justify-content: center;
 | ||
|   margin-right: 20rpx;
 | ||
| }
 | ||
| 
 | ||
| .info-icon.phone {
 | ||
|   background: var(--gradient-success);
 | ||
| }
 | ||
| 
 | ||
| .info-icon.wechat {
 | ||
|   background: var(--gradient-success);
 | ||
| }
 | ||
| 
 | ||
| .info-icon.email {
 | ||
|   background: var(--gradient-warning);
 | ||
| }
 | ||
| 
 | ||
| .info-icon i {
 | ||
|   color: var(--white);
 | ||
|   font-size: 24rpx;
 | ||
| }
 | ||
| 
 | ||
| .info-content {
 | ||
|   flex: 1;
 | ||
|   display: flex;
 | ||
|   flex-direction: column;
 | ||
|   gap: 4rpx;
 | ||
| }
 | ||
| 
 | ||
| .info-label {
 | ||
|   font-size: 24rpx;
 | ||
|   color: var(--text-secondary);
 | ||
| }
 | ||
| 
 | ||
| .info-value {
 | ||
|   font-size: 28rpx;
 | ||
|   color: var(--text-color);
 | ||
|   font-weight: 500;
 | ||
| }
 | ||
| 
 | ||
| .info-item i.fas.fa-copy, .more-item i.fas.fa-chevron-right {
 | ||
|   color: var(--text-muted);
 | ||
|   font-size: 24rpx;
 | ||
| }
 | ||
| 
 | ||
| .more-icon {
 | ||
|   width: 60rpx;
 | ||
|   height: 60rpx;
 | ||
|   border-radius: 12rpx;
 | ||
|   background: var(--gradient-primary);
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   justify-content: center;
 | ||
|   margin-right: 20rpx;
 | ||
| }
 | ||
| 
 | ||
| .more-icon i {
 | ||
|   color: var(--white);
 | ||
|   font-size: 24rpx;
 | ||
| }
 | ||
| 
 | ||
| .more-item text {
 | ||
|   flex: 1;
 | ||
|   font-size: 28rpx;
 | ||
|   color: var(--text-color);
 | ||
|   font-weight: 500;
 | ||
| }
 | ||
| </style>
 |