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>
|