fix(frontend): clear all daily_login_completed_* keys on logout

登出时清理 daily_login 本地缓存的 key 写错:实际清的是
daily_login_completed_${today},但 Header.vue 写入的 key 是
daily_login_completed_${date}_${uid}_${starId},格式不匹配导致
根本没清掉任何东西,跨账号/重装场景会留旧去重残留,新一天本应触发
的 daily_login 上报被本地 cache 误判成'已报'。

改成模糊匹配所有 daily_login_completed_*(uni 没有'按前缀删'接口,
getStorageInfoSync + filter + 循环 remove,模式同
utils/preloadApi/storage.js#clearForUser)。

注:daily_login 仍保留前端去重(spec §3 要求);其他 daily 任务
(daily_browse_asset / daily_place_asset) 本来就没前端去重,完全
靠后端 ProcessTaskEvent 幂等(status=completed/claimed 跳过)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
zerosaturation 2026-07-27 16:36:58 +08:00
parent 89d5d12450
commit ab1810e433

View File

@ -97,9 +97,19 @@ const mutations = {
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}`)
// 清除每日登录打卡记录(模糊匹配所有 daily_login_completed_*,避免 key 格式拼接错位)
// Header.vue 写入的 key 是 daily_login_completed_${date}_${uid}_${starId},
// 按单日 key 删除会漏清历史/跨账号残留,必须按前缀清。
// 注意:uni 没有"按前缀删"接口,需 getStorageInfoSync 拿所有 key 后过滤(同 preloadApi/storage.js#clearForUser 模式)
try {
const info = uni.getStorageInfoSync()
const toRemove = (info.keys || []).filter((k) => k.startsWith('daily_login_completed_'))
toRemove.forEach((k) => {
try { uni.removeStorageSync(k) } catch (_) { /* skip 单个失败 */ }
})
} catch (e) {
console.warn('[user/logout] clear daily_login cache failed:', e)
}
// 重置 TopfansWelcome 相关标记让登出后再登录quickLogin / 注册)能再次展示欢迎页
// 同时清掉 storage 和内存标记,避免 password 登录误触发(见 store/modules/user.js 注释表)