fix: 引导强播标记改为一次性消费, 杜绝看完引导后刷新又弹且不上报
ci/woodpecker/tag/build Pipeline was successful

?guide=1 强播标记此前写入 sessionStorage 后在整页加载时只置位不清除,
同一标签页后续普通刷新被残留标记误判为强播: 关闭引导不写库、刷新又弹。
现 MobileLayout 读取标记后立即消费(removeItem), 仅当次加载内强播生效,
刷新后回到数据库判定(未看过 v2 才弹, 关闭即上报写库)。
This commit is contained in:
becomer
2026-09-03 16:51:13 +08:00
parent 111cc0439c
commit 8eaaf5781a
+9 -4
View File
@@ -55,12 +55,13 @@ const showDetail = ref(false)
const detailItem = ref<AnnouncementItem | null>(null)
// 新手引导:是否展示由后端数据库记录判定(用户 guideVersion 未达当前版本即展示,
// 完成/关闭后上报写库,跨设备不再重复打扰)。仅保留会话级测试强播入口。
// 完成/关闭后上报写库,跨设备不再重复打扰)。测试强播入口 ?guide=1 保留:
// main.ts 将其写入 sessionStorage(一次性,本组件读取即消费),仅当次加载生效。
const GUIDE_FORCE_KEY = 'xz_guide_force'
/** 与后端 handler.GuideCompleteVersion 一致 */
const GUIDE_VERSION = 'v2'
const showGuide = ref(false)
// 本次展示是否来自测试强播(?guide=1):强播关闭时不写库,便于反复测试
// 本次展示是否来自测试强播(?guide=1,仅当次加载):强播关闭时不写库,可反复重播
const guideForced = ref(false)
// 邀请奖励规则(供引导第 4 步动态展示;接口失败保持 null,气泡用泛指文案)
const inviterRewardPerInvite = ref<number | null>(null)
@@ -201,6 +202,11 @@ async function handleForcePopupDismiss() {
}
onMounted(async () => {
// 强播标记一次性消费:仅本次整页加载(URL 带 ?guide=1)内优先展示且关闭不写库;
// 读取后立即清除,避免会话残留把后续普通访问(刷新/重开)误判为强播——
// 否则会出现"看完引导后刷新又弹、且永不上报完成"的假象
guideForced.value = sessionStorage.getItem(GUIDE_FORCE_KEY) === '1'
sessionStorage.removeItem(GUIDE_FORCE_KEY)
try {
const res = await authApi.getUserInfo()
const data = res.data.data
@@ -211,8 +217,7 @@ onMounted(async () => {
return
}
// 新手引导:数据库判定该用户未看过当前版本引导则展示(跨设备一致);
// 测试强播(?guide=1 会话标记)优先且不写库,可反复重播
guideForced.value = sessionStorage.getItem(GUIDE_FORCE_KEY) === '1'
// 本次若来自 ?guide=1 强播则优先展示(guideForced 已消费,下次加载不再生效)
if (guideForced.value || needGuide(data)) {
showGuide.value = true
// 引导气泡中展示邀请奖励数值(第 4 步)