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

590 lines
13 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="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>