247 lines
6.5 KiB
Vue
247 lines
6.5 KiB
Vue
<template>
|
||
<view class="safe-area-top box-border min-h-screen">
|
||
<view class="flex flex-col p-4 space-y-6">
|
||
<!-- 用户信息卡片 -->
|
||
<view
|
||
class="profile-section group relative flex items-center gap-4 rounded-xl bg-white p-6 shadow-lg transition-all hover:shadow-xl"
|
||
@click="!isLoggedIn ? redirectToLogin() : null">
|
||
<view class="relative">
|
||
<!-- 头像容器添加overflow-hidden解决边框问题 -->
|
||
<view class="flex items-center justify-center overflow-hidden rounded-full p-0.5"
|
||
:class="levelGradient.border">
|
||
<image :src="userAvatar || headShot" alt="User Avatar" class="h-24 w-24 rounded-full border-4 border-white">
|
||
</image>
|
||
</view>
|
||
|
||
<!-- 代理标识 -->
|
||
<view v-if="isAgent" class="absolute -bottom-2 -right-2">
|
||
<view class="flex items-center justify-center rounded-full px-3 py-1 text-xs font-bold text-white shadow-sm"
|
||
:class="levelGradient.badge">
|
||
{{ levelNames[level] }}
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view class="space-y-1">
|
||
<view class="text-2xl font-bold text-gray-800">
|
||
{{ isLoggedIn ? maskName(userName) : '点击登录' }}
|
||
</view>
|
||
<view v-if="isAgent" class="text-sm font-medium" :class="levelGradient.text">
|
||
🎖️ {{ levelText[level] }}
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<VipBanner v-if="isAgent && level === 'normal'" />
|
||
<!-- 功能菜单 -->
|
||
<view class="features-section space-y-3">
|
||
<template v-if="isAgent && ['VIP', 'SVIP'].includes(level)">
|
||
<button
|
||
class="feature-item bg-gradient-to-r from-purple-200/80 to-pink-200/80 hover:from-purple-300/80 hover:to-pink-300/80 text-purple-700"
|
||
@click="toVipConfig">
|
||
⚙️ 代理报告配置
|
||
</button>
|
||
</template>
|
||
|
||
<button class="feature-item hover:bg-blue-50" @click="toHistory">
|
||
📃 我的报告
|
||
</button>
|
||
<button class="feature-item hover:bg-blue-50" @click="toUserAgreement">
|
||
📜 用户协议
|
||
</button>
|
||
<button class="feature-item hover:bg-blue-50" @click="toService">
|
||
💬 联系客服
|
||
</button>
|
||
<button class="feature-item hover:bg-red-50 text-red-600" @click="handleLogout">
|
||
⏏️ 退出登录
|
||
</button>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ref, computed, onBeforeMount } from 'vue'
|
||
import headShot from "@/static/image/head_shot.webp"
|
||
|
||
// 用户数据
|
||
const userName = ref('')
|
||
const userAvatar = ref('')
|
||
const isLoggedIn = ref(false)
|
||
|
||
// 代理数据
|
||
const isAgent = ref(false)
|
||
const level = ref('normal')
|
||
|
||
|
||
// 检查平台环境
|
||
onBeforeMount(() => {
|
||
// 从缓存获取用户信息
|
||
const token = uni.getStorageSync('token')
|
||
if (token) {
|
||
isLoggedIn.value = true
|
||
// 从缓存获取用户信息
|
||
const userInfo = uni.getStorageSync('userInfo')
|
||
console.log("userInfo", userInfo)
|
||
if (userInfo) {
|
||
userName.value = userInfo.nickName || '用户'
|
||
userAvatar.value = userInfo.avatar || ''
|
||
}
|
||
|
||
// 从缓存获取代理信息
|
||
const agentInfo = uni.getStorageSync('agentInfo')
|
||
if (agentInfo?.isAgent) {
|
||
isAgent.value = agentInfo.isAgent
|
||
level.value = agentInfo.level || 'normal'
|
||
}
|
||
}
|
||
})
|
||
|
||
const levelNames = {
|
||
normal: '普通代理',
|
||
VIP: 'VIP代理',
|
||
SVIP: 'SVIP代理'
|
||
}
|
||
|
||
const levelText = {
|
||
normal: '基础代理特权',
|
||
VIP: '高级代理特权',
|
||
SVIP: '尊享代理特权'
|
||
}
|
||
|
||
const levelGradient = computed(() => ({
|
||
border: {
|
||
'normal': 'bg-green-300',
|
||
'VIP': 'bg-gradient-to-r from-yellow-400 to-amber-500',
|
||
'SVIP': 'bg-gradient-to-r from-purple-400 to-pink-400 shadow-[0_0_15px_rgba(163,51,200,0.2)]'
|
||
}[level.value],
|
||
|
||
badge: {
|
||
'normal': 'bg-green-500',
|
||
'VIP': 'bg-gradient-to-r from-yellow-500 to-amber-600',
|
||
'SVIP': 'bg-gradient-to-r from-purple-500 to-pink-500'
|
||
}[level.value],
|
||
|
||
text: {
|
||
'normal': 'text-green-600',
|
||
'VIP': 'text-amber-600',
|
||
'SVIP': 'text-purple-600'
|
||
}[level.value]
|
||
}))
|
||
|
||
function maskName(name) {
|
||
if (!name || name.length < 11) return name
|
||
return name.substring(0, 3) + "****" + name.substring(7)
|
||
}
|
||
|
||
function toHistory() {
|
||
uni.navigateTo({
|
||
url: '/pages/queryHistory'
|
||
})
|
||
}
|
||
|
||
function toUserAgreement() {
|
||
uni.navigateTo({
|
||
url: '/pages/agreement?type=user'
|
||
})
|
||
}
|
||
|
||
function redirectToLogin() {
|
||
uni.navigateTo({
|
||
url: '/pages/login'
|
||
})
|
||
}
|
||
|
||
function handleLogout() {
|
||
uni.removeStorageSync('token')
|
||
uni.removeStorageSync('refreshAfter')
|
||
uni.removeStorageSync('accessExpire')
|
||
uni.removeStorageSync('userInfo')
|
||
uni.removeStorageSync('agentInfo')
|
||
|
||
// 重置状态
|
||
isLoggedIn.value = false
|
||
userName.value = ''
|
||
userAvatar.value = ''
|
||
isAgent.value = false
|
||
level.value = 'normal'
|
||
|
||
uni.reLaunch({
|
||
url: '/pages/index'
|
||
})
|
||
}
|
||
|
||
function toService() {
|
||
// #ifdef APP-PLUS
|
||
plus.runtime.openURL('https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9')
|
||
// #endif
|
||
|
||
// #ifdef H5
|
||
window.location.href = 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9'
|
||
// #endif
|
||
|
||
// #ifdef MP
|
||
uni.setClipboardData({
|
||
data: 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9',
|
||
success: function () {
|
||
uni.showToast({
|
||
title: '客服链接已复制,请在浏览器中打开',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|
||
// #endif
|
||
}
|
||
|
||
function toVipConfig() {
|
||
uni.navigateTo({
|
||
url: '/pages/agentVipConfig'
|
||
})
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.profile-section {
|
||
background: linear-gradient(135deg, #ffffff 50%, rgba(236, 253, 245, 0.3));
|
||
border: 1px solid rgba(209, 213, 219, 0.2);
|
||
}
|
||
|
||
.profile-section .relative>view:first-child {
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.feature-item {
|
||
transition:
|
||
transform 0.2s ease,
|
||
background 0.3s ease,
|
||
box-shadow 0.3s ease;
|
||
display: flex;
|
||
width: 100%;
|
||
align-items: center;
|
||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||
margin-right: 0.75rem;
|
||
border-radius: 0.75rem;
|
||
background-color: #ffffff;
|
||
padding: 1rem 1.5rem;
|
||
text-align: left;
|
||
color: #4b5563;
|
||
transition-property: all;
|
||
transition-duration: 300ms;
|
||
}
|
||
|
||
.feature-item:active {
|
||
transform: scale(1.02);
|
||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||
}
|
||
|
||
.border-gradient-to-r {
|
||
border-image: linear-gradient(to right, var(--tw-gradient-from), var(--tw-gradient-to)) 1;
|
||
}
|
||
|
||
.shadow-glow {
|
||
box-shadow: 0 0 8px rgba(163, 51, 200, 0.2);
|
||
}
|
||
</style>
|
||
|
||
<route lang="json">{
|
||
"layout": "home"
|
||
}</route>
|