From 02adeac5c14358c69e8a47c6dc29c41d63b09e3e Mon Sep 17 00:00:00 2001 From: huliyong <2783385703@qq.com> Date: Fri, 31 Oct 2025 00:47:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=85=8D=E8=B4=B9=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在多个组件中添加免费用户权限检查,当用户标记为免费用户时跳过会员限制 在首页和用户页面添加自动获取用户信息的逻辑 重构用户信息存储方式,使用vuex管理全局状态 --- mixins/config.js | 6 + pages/index/home.vue | 4 + pages/index/user.vue | 874 ++++++++++++++++++++-------------------- stores/index.js | 6 + subPages/home/AudioControls.vue | 10 +- subPages/home/book.vue | 20 +- 6 files changed, 479 insertions(+), 441 deletions(-) diff --git a/mixins/config.js b/mixins/config.js index dfcc980..0911345 100644 --- a/mixins/config.js +++ b/mixins/config.js @@ -1,3 +1,7 @@ + +import { mapState } from 'vuex' + + export default { data() { return { @@ -20,6 +24,8 @@ export default { }, }, computed: { + ...mapState(['userInfo']), + // 获取全局配置的文本 configParamInfo() { return key => this.$store.state.configList[key]?.info diff --git a/pages/index/home.vue b/pages/index/home.vue index 70fe2bc..c243cfd 100644 --- a/pages/index/home.vue +++ b/pages/index/home.vue @@ -418,6 +418,10 @@ export default { this.detectDevice() this.getArticleList() + + if (uni.getStorageSync('token')) { + this.$store.dispatch('getUserInfo'); + } // 先获取基础数据 await Promise.all([this.getBanner(), this.getSignup(), this.getCategory(), this.getLabel()]) diff --git a/pages/index/user.vue b/pages/index/user.vue index 565db28..23ec1d4 100644 --- a/pages/index/user.vue +++ b/pages/index/user.vue @@ -1,475 +1,481 @@ \ No newline at end of file diff --git a/stores/index.js b/stores/index.js index e3b1647..2400b57 100644 --- a/stores/index.js +++ b/stores/index.js @@ -136,6 +136,12 @@ const store = new Vuex.Store({ updateUserInfo({ commit }, userInfo) { commit('setUserInfo', userInfo) }, + async getUserInfo({ commit }) { + const res = await api.login.getUserInfo(); + if (res.code === 200) { + commit('setUserInfo', res.result); + } + }, } }) diff --git a/subPages/home/AudioControls.vue b/subPages/home/AudioControls.vue index ec1a9b1..1dd242d 100644 --- a/subPages/home/AudioControls.vue +++ b/subPages/home/AudioControls.vue @@ -188,6 +188,10 @@ export default { // 判断音频功能是否应该被禁用(会员限制页面且用户非会员) isAudioDisabled() { + // 免费用户不受音频播放限制 + if (this.userInfo && this.userInfo.freeUser === 'Y') { + return false; + } return this.currentPageRequiresMember && !this.isMember; }, @@ -2528,7 +2532,9 @@ export default { // 检查页面是否需要会员且用户非会员,如果是则跳过 const pageRequiresMember = this.pagePay[i] === 'Y'; - if (pageRequiresMember && !this.isMember) { + // 免费用户不受会员限制 + const isFreeUser = this.userInfo && this.userInfo.freeUser === 'Y'; + if (pageRequiresMember && !this.isMember && !isFreeUser) { continue; } @@ -2822,8 +2828,6 @@ export default { return; } - - // 重置播放状态 this.currentAudioIndex = 0; this.currentTime = 0; diff --git a/subPages/home/book.vue b/subPages/home/book.vue index d46322c..f881e29 100644 --- a/subPages/home/book.vue +++ b/subPages/home/book.vue @@ -12,7 +12,6 @@ {{ currentPageTitle }} - @@ -26,7 +25,7 @@ {{ currentPageTitle }} - + {{ pageTitles[index] }} 升级会员解锁 @@ -212,6 +211,11 @@ export default { pagePay: [], } }, + onShow() { + if (uni.getStorageSync('token')) { + this.$store.dispatch('getUserInfo'); + } + }, computed: { displayCourseList() { return this.isReversed ? [...this.courseList].reverse() : this.courseList; @@ -261,6 +265,10 @@ export default { // 当前页面是否需要会员 currentPageRequiresMember() { + // 免费用户不受会员限制 + if (this.userInfo && this.userInfo.freeUser === 'Y') { + return false; + } return this.pagePay[this.currentPage - 1] === 'Y'; }, @@ -395,12 +403,16 @@ export default { // 獲取用戶會員信息 判斷是否和傳參傳過來的會員id相同 async getMemberInfo() { + // 检查是否为免费用户 + if (this.userInfo && this.userInfo.freeUser === 'Y') { + this.isMember = true; // 免费用户享有会员权限 + return; + } + const memberRes = await this.$api.member.getUserMemberInfo() if (memberRes.code === 200) { this.isMember = memberRes.result.map(item => item.memberId).includes(this.memberId) - } - }, // 处理AudioControls组件的事件