From d7634a558f02ee0f9c9211643ffa7098d0f60b8c Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Tue, 21 Apr 2026 16:39:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=B6=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E6=B8=85=E9=99=A4=E5=AD=98=E5=82=A8=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/pages/login/login.vue | 3 +- frontend/pages/tasks/guide.vue | 13 +++++- frontend/store/modules/user.js | 18 ++++++++ frontend/utils/guideConfig.js | 83 ++++++++++++++++++++++++++-------- 4 files changed, 95 insertions(+), 22 deletions(-) diff --git a/frontend/pages/login/login.vue b/frontend/pages/login/login.vue index 730f163..ab3937e 100644 --- a/frontend/pages/login/login.vue +++ b/frontend/pages/login/login.vue @@ -109,6 +109,7 @@ import { ref } from 'vue'; import { useStore } from 'vuex'; import { validatePhone, validatePassword } from '@/utils/validator'; import { AGREEMENT_CONTENT } from '@/utils/agreement'; +import { resetAllGuides } from '@/utils/guideConfig'; const store = useStore(); @@ -137,9 +138,9 @@ const togglePassword = () => { // 跳转到注册页面 const goToRegister = () => { // 清除新手引导相关数据 + resetAllGuides(); uni.removeStorageSync('is_new_user'); uni.removeStorageSync('has_seen_welcome'); - uni.removeStorageSync('guide_shown_square_home'); uni.navigateTo({ url: '/pages/register/register' diff --git a/frontend/pages/tasks/guide.vue b/frontend/pages/tasks/guide.vue index c8f0766..1ec23d4 100644 --- a/frontend/pages/tasks/guide.vue +++ b/frontend/pages/tasks/guide.vue @@ -119,7 +119,18 @@ const backButtonTop = computed(() => { }) const handleBack = () => { - uni.navigateBack() + // 获取页面栈 + const pages = getCurrentPages(); + if (pages.length > 1) { + // 有上一页,执行返回 + uni.navigateBack(); + } else { + uni.removeStorageSync('is_new_user') + // 没有上一页,跳转到square页面 + uni.reLaunch({ + url: '/pages/square/square' + }); + } } const loading = ref(true) diff --git a/frontend/store/modules/user.js b/frontend/store/modules/user.js index e2ee8bc..c001975 100644 --- a/frontend/store/modules/user.js +++ b/frontend/store/modules/user.js @@ -1,5 +1,6 @@ import { loginApi, registerApi, getOssPresignedUrlApi } from '@/utils/api' import { downloadAndCacheAvatar } from '@/utils/avatarCache' +import { resetAllGuides } from '@/utils/guideConfig' const state = { token: uni.getStorageSync('access_token') || '', @@ -56,12 +57,29 @@ const mutations = { state.token = '' state.userInfo = null state.starId = null + // 获取当前 userId 用于清除引导数据(需要在清除 user 数据之前获取) + const userStr = uni.getStorageSync('user') + let userId = null + if (userStr) { + try { + const user = JSON.parse(userStr) + userId = user?.uid || null + } catch (e) {} + } + // 清除所有引导相关存储(传入 userId 确保正确清除) + resetAllGuides(userId) + // 清除 storage uni.removeStorageSync('access_token') uni.removeStorageSync('user') uni.removeStorageSync('star_id') // 清除登录手机号 uni.removeStorageSync('login_mobile') + // 清除 gallery_owner_id + uni.removeStorageSync('gallery_owner_id') + // 清除每日登录打卡记录 + const today = new Date().toISOString().split('T')[0] + uni.removeStorageSync(`daily_login_completed_${today}`) } } diff --git a/frontend/utils/guideConfig.js b/frontend/utils/guideConfig.js index c8b68b8..6a315f4 100644 --- a/frontend/utils/guideConfig.js +++ b/frontend/utils/guideConfig.js @@ -307,6 +307,38 @@ export function getAllGuideKeys() { return Object.keys(guideConfig) } +/** + * 获取当前 userId(从 localStorage 读取) + * @returns {number|null} + */ +function getCurrentUserId() { + const userStr = uni.getStorageSync('user') + if (userStr) { + try { + const user = JSON.parse(userStr) + return user?.uid || null + } catch (e) { + return null + } + } + return null +} + +/** + * 生成带 userId 的存储 key + * @param {string} prefix 前缀 + * @param {string} key 引导key + * @returns {string} + */ +function makeUserIdKey(prefix, key) { + const userId = getCurrentUserId() + if (userId) { + return `${prefix}_${userId}_${key}` + } + // 如果没有 userId,使用默认值确保不会跨账号混淆 + return `${prefix}_default_${key}` +} + /** * 检查是否需要显示某个引导 * @param {string} key 引导key @@ -370,22 +402,33 @@ export function markGuideAsShown(key) { * @param {string} key 引导key */ export function resetGuide(key) { - const storageKey = `guide_shown_${key}` - uni.removeStorageSync(storageKey) + uni.removeStorageSync(`guide_shown_${key}`) + uni.removeStorageSync(makeUserIdKey('guide_done', key)) + uni.removeStorageSync(makeUserIdKey('guide_step', key)) + uni.removeStorageSync(makeUserIdKey('guide_rewards_claimed', key)) } /** - * 重置所有引导(用于调试) + * 重置所有引导 + * @param {number|string|null} userId 用户ID,如果不传则从 storage 读取 */ -export function resetAllGuides() { +export function resetAllGuides(userId = null) { const keys = getAllGuideKeys() + // 如果没有传入 userId,从 storage 读取 + if (userId === null) { + userId = getCurrentUserId() + } keys.forEach(key => { - const storageKey = `guide_shown_${key}` - uni.removeStorageSync(storageKey) - uni.removeStorageSync(`guide_done_${key}`) - uni.removeStorageSync(`guide_step_${key}`) + uni.removeStorageSync(`guide_shown_${key}`) + if (userId) { + uni.removeStorageSync(`guide_done_${userId}_${key}`) + uni.removeStorageSync(`guide_step_${userId}_${key}`) + uni.removeStorageSync(`guide_completed_steps_${userId}_${key}`) + } }) - uni.removeStorageSync('guide_rewards_claimed') + if (userId) { + uni.removeStorageSync(`guide_rewards_claimed_${userId}`) + } } // ==================== 新增:状态管理函数 ==================== @@ -396,7 +439,7 @@ export function resetAllGuides() { * @returns {boolean} */ export function isGuideDone(key) { - return uni.getStorageSync(`guide_done_${key}`) === true + return uni.getStorageSync(makeUserIdKey('guide_done', key)) === true } /** @@ -405,7 +448,7 @@ export function isGuideDone(key) { * @returns {boolean} */ export function isGuideRewardClaimed(key) { - const claimed = uni.getStorageSync('guide_rewards_claimed') || [] + const claimed = uni.getStorageSync(makeUserIdKey('guide_rewards_claimed', '')) || [] return claimed.includes(key) } @@ -450,7 +493,7 @@ export function getClaimableRewardCount() { * @param {string} key 引导key */ export function markGuideDone(key) { - uni.setStorageSync(`guide_done_${key}`, true) + uni.setStorageSync(makeUserIdKey('guide_done', key), true) } /** @@ -475,9 +518,9 @@ export function claimGuideReward(key) { } // 标记已领取 - const claimed = uni.getStorageSync('guide_rewards_claimed') || [] + const claimed = uni.getStorageSync(makeUserIdKey('guide_rewards_claimed', '')) || [] claimed.push(key) - uni.setStorageSync('guide_rewards_claimed', claimed) + uni.setStorageSync(makeUserIdKey('guide_rewards_claimed', ''), claimed) // 发放奖励(需要调用后端接口,这里先本地记录) console.log(`[Guide] 领取奖励: ${key}`, config.reward) @@ -568,7 +611,7 @@ export function getGuideStatusList() { * @returns {number} 当前步骤索引,默认0 */ export function getGuideCurrentStep(key) { - return uni.getStorageSync(`guide_step_${key}`) || 0 + return uni.getStorageSync(makeUserIdKey('guide_step', key)) || 0 } /** @@ -577,7 +620,7 @@ export function getGuideCurrentStep(key) { * @param {number} step 步骤索引 */ export function setGuideCurrentStep(key, step) { - uni.setStorageSync(`guide_step_${key}`, step) + uni.setStorageSync(makeUserIdKey('guide_step', key), step) } /** @@ -597,11 +640,11 @@ export function getNextUndoneGuideKey() { * @param {number} stepIndex 步骤索引 */ export function completeSubStep(key, stepIndex) { - const completed = uni.getStorageSync(`guide_completed_steps_${key}`) || [] + const completed = uni.getStorageSync(makeUserIdKey('guide_completed_steps', key)) || [] if (!completed.includes(stepIndex)) { completed.push(stepIndex) completed.sort((a, b) => a - b) - uni.setStorageSync(`guide_completed_steps_${key}`, completed) + uni.setStorageSync(makeUserIdKey('guide_completed_steps', key), completed) } } @@ -611,7 +654,7 @@ export function completeSubStep(key, stepIndex) { * @returns {number[]} */ export function getCompletedSteps(key) { - return uni.getStorageSync(`guide_completed_steps_${key}`) || [] + return uni.getStorageSync(makeUserIdKey('guide_completed_steps', key)) || [] } /** @@ -672,7 +715,7 @@ export function hasGuideProgress(key) { * @param {string} key 引导key */ export function clearSubStepProgress(key) { - uni.removeStorageSync(`guide_completed_steps_${key}`) + uni.removeStorageSync(makeUserIdKey('guide_completed_steps', key)) } /**