|
|
@@ -4,8 +4,13 @@
|
|
|
<div v-if="accountInfo" class="user-main">
|
|
|
<van-image round width="60" height="60" :src="accountInfo.avatarUrl" />
|
|
|
<div class="user-info">
|
|
|
- <h3 class="nickname">{{ accountInfo.screenName }}</h3>
|
|
|
- <div class="level-tag">正式会员</div>
|
|
|
+ <h3 class="nickname" :style="{ color: userInfo?.vip ? '#fb7299' : '#212121' }">
|
|
|
+ {{ accountInfo.screenName }}
|
|
|
+ </h3>
|
|
|
+
|
|
|
+ <div :class="['level-tag', { 'is-vip': userInfo?.vip }]">
|
|
|
+ {{ userInfo?.vip ? '年度大会员' : '正式会员' }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<van-button size="small" class="logout-btn" @click="handleLogout">退出</van-button>
|
|
|
</div>
|
|
|
@@ -38,13 +43,15 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="vip-banner">
|
|
|
- <div class="banner-card">
|
|
|
+ <div class="banner-card" :class="{ 'is-vip-card': userInfo?.vip }">
|
|
|
<div class="vip-logo">大</div>
|
|
|
<div class="banner-text">
|
|
|
- <p class="p1">开通大会员</p>
|
|
|
- <p class="p2">了解更多权益 ></p>
|
|
|
+ <p class="p1">{{ userInfo?.vip ? '大会员尊享中' : '开通大会员' }}</p>
|
|
|
+ <p class="p2">{{ userInfo?.vip ? '查看我的大会员特权 >' : '了解更多权益 >' }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="go-btn" @click="showVipPopup = true">
|
|
|
+ {{ userInfo?.vip ? '立即续费 >' : '立即开通 >' }}
|
|
|
</div>
|
|
|
- <div class="go-btn" @click="showVipPopup = true">立即开通 ></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -122,17 +129,25 @@
|
|
|
|
|
|
<div class="more-services">
|
|
|
<div class="group-title">更多服务</div>
|
|
|
- <van-cell title="我的网盘" is-link @click="handleNavToDisk">
|
|
|
- <template #icon><van-icon name="points" class="list-icon" /></template>
|
|
|
+ <van-cell
|
|
|
+ v-if="userInfo?.vip"
|
|
|
+ title="大会员有效期至"
|
|
|
+ :value="userInfo.vipDueDate || '2025-12-31'"
|
|
|
+ label="感谢支持,尊享特权已开启"
|
|
|
+ >
|
|
|
+ <template #icon><van-icon name="gem-o" class="list-icon" /></template>
|
|
|
+ </van-cell>
|
|
|
+ <van-cell title="我的钱包" is-link to="/wallet">
|
|
|
+ <template #icon><van-icon name="balance-o" class="list-icon" /></template>
|
|
|
</van-cell>
|
|
|
- <van-cell title="联系客服" is-link>
|
|
|
- <template #icon><van-icon name="service-o" class="list-icon" /></template>
|
|
|
+ <van-cell title="我的主页" is-link :to="`/user/${accountInfo.userIdStr}`">
|
|
|
+ <template #icon><van-icon name="manager-o" class="list-icon" /></template>
|
|
|
</van-cell>
|
|
|
<van-cell title="设置" is-link @click="showSettings = true">
|
|
|
<template #icon><van-icon name="setting-o" class="list-icon" /></template>
|
|
|
</van-cell>
|
|
|
- <van-cell title="我的NFT" is-link>
|
|
|
- <template #icon><van-icon name="diamond-o" class="list-icon" /></template>
|
|
|
+ <van-cell title="我的网盘" is-link @click="handleNavToDisk">
|
|
|
+ <template #icon><van-icon name="points" class="list-icon" /></template>
|
|
|
</van-cell>
|
|
|
</div>
|
|
|
|
|
|
@@ -166,11 +181,18 @@
|
|
|
|
|
|
<script>
|
|
|
import { mapState } from 'vuex'
|
|
|
+import { getUserInfo, requireRole } from '@/api/user'
|
|
|
|
|
|
export default {
|
|
|
- name: 'UserPage',
|
|
|
+ name: 'Account',
|
|
|
data() {
|
|
|
return {
|
|
|
+ userInfo: {
|
|
|
+ signature: '',
|
|
|
+ follower: '',
|
|
|
+ following: '',
|
|
|
+ vip: false
|
|
|
+ },
|
|
|
showVipPopup: false,
|
|
|
activePlan: 1, // 默认选中第二个(连续包年)
|
|
|
vipPlans: [
|
|
|
@@ -185,7 +207,17 @@ export default {
|
|
|
computed: {
|
|
|
...mapState(['accountInfo'])
|
|
|
},
|
|
|
+ created() {
|
|
|
+ this.getUserInfo()
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ getUserInfo() {
|
|
|
+ getUserInfo(this.accountInfo.userIdStr).then((resp) => {
|
|
|
+ if (resp.code === 0) {
|
|
|
+ this.userInfo = resp.data
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
handlePay() {
|
|
|
this.$toast.loading({
|
|
|
message: '发起支付...',
|
|
|
@@ -218,8 +250,9 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
handleNavToDisk() {
|
|
|
+ const requireRole = 'tnb_disk'
|
|
|
const roles = this.accountInfo.roles
|
|
|
- if (roles.includes('tnb_disk')) {
|
|
|
+ if (roles.includes(requireRole)) {
|
|
|
// 权限校验通过
|
|
|
this.$router.push('/disk')
|
|
|
} else {
|
|
|
@@ -234,7 +267,7 @@ export default {
|
|
|
})
|
|
|
.then(() => {
|
|
|
// 3. 用户点击了“立即申请”
|
|
|
- this.applyForDiskRole()
|
|
|
+ this.applyForDiskRole(requireRole)
|
|
|
})
|
|
|
.catch(() => {
|
|
|
// 用户点击了“再想想” (取消)
|
|
|
@@ -242,28 +275,40 @@ export default {
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
- async applyForDiskRole() {
|
|
|
+ async applyForDiskRole(role) {
|
|
|
this.$toast.loading({
|
|
|
message: '提交申请中...',
|
|
|
forbidClick: true,
|
|
|
duration: 0
|
|
|
})
|
|
|
|
|
|
- try {
|
|
|
- // 模拟调用后端申请接口
|
|
|
- // const res = await this.$api.requestPermission({ role: 'role_disk' });
|
|
|
- // 模拟延迟
|
|
|
- await new Promise((resolve) => setTimeout(resolve, 1500))
|
|
|
+ const payload = { role: role }
|
|
|
|
|
|
- // 假设申请成功(实际应根据 res.code 判断)
|
|
|
- this.$toast.clear()
|
|
|
- this.$dialog.alert({
|
|
|
- title: '申请已提交',
|
|
|
- message: '您的开通申请已进入后台审核,请耐心等待 1-2 个工作日。',
|
|
|
- confirmButtonText: '知道了'
|
|
|
- })
|
|
|
+ try {
|
|
|
+ const resp = await requireRole(payload)
|
|
|
+ if (resp.code === 0) {
|
|
|
+ this.$toast.clear()
|
|
|
+ // --- 关键步骤:直接修改 Store ---
|
|
|
+ // 这里的 'UPDATE_ROLES' 对应上面 store 里的 mutation 名
|
|
|
+ this.$store.commit('UPDATE_ROLES', role)
|
|
|
+
|
|
|
+ this.$dialog
|
|
|
+ .alert({
|
|
|
+ title: '申请成功',
|
|
|
+ message: '您的权限已即时开通,现在可以访问网盘了。',
|
|
|
+ confirmButtonText: '太棒了'
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ // 如果是在网盘点击触发的,申请完可以直接跳转
|
|
|
+ if (role === 'tnb_disk') {
|
|
|
+ this.$router.push('/disk')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.$toast.fail(resp.msg || '申请提交失败,请稍后重试')
|
|
|
+ }
|
|
|
} catch (error) {
|
|
|
- this.$toast.fail('申请提交失败,请稍后重试')
|
|
|
+ this.$toast.fail('网络错误,请稍后重试')
|
|
|
}
|
|
|
},
|
|
|
// 退出登录
|
|
|
@@ -315,10 +360,14 @@ export default {
|
|
|
display: inline-block;
|
|
|
font-size: 10px;
|
|
|
color: #fff;
|
|
|
- background: #fb7299;
|
|
|
+ background: #bfbfbf; // 默认普通会员灰色
|
|
|
padding: 1px 6px;
|
|
|
border-radius: 2px;
|
|
|
margin-top: 6px;
|
|
|
+
|
|
|
+ &.is-vip {
|
|
|
+ background: #fb7299; // 大会员粉色
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.logout-btn {
|
|
|
@@ -400,6 +449,20 @@ export default {
|
|
|
color: #fb7299;
|
|
|
font-weight: 500;
|
|
|
}
|
|
|
+
|
|
|
+ .is-vip-card {
|
|
|
+ background: linear-gradient(90deg, #fb7299, #ff92b4);
|
|
|
+ border: none;
|
|
|
+ .vip-logo {
|
|
|
+ background: #fff;
|
|
|
+ color: #fb7299;
|
|
|
+ }
|
|
|
+ .p1,
|
|
|
+ .p2,
|
|
|
+ .go-btn {
|
|
|
+ color: #fff !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|