feat: 完善模块引导与学习进度体验

统一引导提示的持久化控制,补充学习进度入口与模块资源,避免用户返回页面时重复触发提示。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
zhongyidianandClaude Opus 4.7 committed 2026-05-08 09:44:59 +08:00
1 parent fc9633f371
commit 6f8252472f
114 files changed
+2758 -1798

No files matched your search

+67 -2
View File
@@ -8,8 +8,13 @@ export const INTERVIEW_KEY = 3
interface InterviewSavePayload {
viewed?: Record<string, boolean>
isGuideInterviewTask?: boolean
isGuideInterviewReturn?: boolean
isGuideInterviewStage2?: boolean
isGuideInterviewStage3?: boolean
isInterviewUnlock?: boolean
InterviewUnlockProgress?: number
interviewMenuVisible?: boolean
guideShown?: Record<string, boolean>
}
async function getYibanApi(): Promise<typeof import('@/utils/yiban') | null> {
@@ -37,18 +42,32 @@ export const useInterviewStore = defineStore(
//Interview-任务取景框引导
const isGuideInterviewTask = ref<boolean>(true)
//Interview-思路提点完成回到首页的一次性引导
const isGuideInterviewReturn = ref<boolean>(true)
//Interview-中期拍摄阶段菜单一次性引导
const isGuideInterviewStage2 = ref<boolean>(true)
//Interview-后期剪辑阶段菜单一次性引导
const isGuideInterviewStage3 = ref<boolean>(true)
//Interview-是否解锁完成前置(观看视频)
const isInterviewUnlock = ref<boolean>(false)
//Interview-发现与记录解锁进度
const InterviewUnlockProgress = ref<number>(0)
//Interview-菜单 Overlay 是否可见
const interviewMenuVisible = ref<boolean>(false)
const guideShown = ref<Record<string, boolean>>({})
//Actions
function saveInterviewStore(): void {
const payload: InterviewSavePayload = {
viewed: viewed.value,
isGuideInterviewTask: isGuideInterviewTask.value,
isGuideInterviewReturn: isGuideInterviewReturn.value,
isGuideInterviewStage2: isGuideInterviewStage2.value,
isGuideInterviewStage3: isGuideInterviewStage3.value,
isInterviewUnlock: isInterviewUnlock.value,
InterviewUnlockProgress: InterviewUnlockProgress.value
InterviewUnlockProgress: InterviewUnlockProgress.value,
interviewMenuVisible: interviewMenuVisible.value,
guideShown: guideShown.value
}
getYibanApi()
@@ -69,8 +88,13 @@ export const useInterviewStore = defineStore(
const data = JSON.parse(raw) as InterviewSavePayload
viewed.value = data.viewed ?? {}
isGuideInterviewTask.value = data.isGuideInterviewTask ?? true
isGuideInterviewReturn.value = data.isGuideInterviewReturn ?? true
isGuideInterviewStage2.value = data.isGuideInterviewStage2 ?? true
isGuideInterviewStage3.value = data.isGuideInterviewStage3 ?? true
isInterviewUnlock.value = data.isInterviewUnlock ?? false
InterviewUnlockProgress.value = data.InterviewUnlockProgress ?? 0
interviewMenuVisible.value = data.interviewMenuVisible ?? false
guideShown.value = data.guideShown ?? {}
} catch (error) {
console.error('Failed to load Interview store', error)
}
@@ -112,6 +136,21 @@ export const useInterviewStore = defineStore(
saveInterviewStore()
}
function setIsGuideInterviewReturn(value: boolean): void {
isGuideInterviewReturn.value = value
saveInterviewStore()
}
function setIsGuideInterviewStage2(value: boolean): void {
isGuideInterviewStage2.value = value
saveInterviewStore()
}
function setIsGuideInterviewStage3(value: boolean): void {
isGuideInterviewStage3.value = value
saveInterviewStore()
}
function setIsInterviewUnlock(value: boolean): void {
isInterviewUnlock.value = value
saveInterviewStore()
@@ -123,11 +162,27 @@ export const useInterviewStore = defineStore(
saveInterviewStore()
}
function setInterviewMenuVisible(value: boolean): void {
interviewMenuVisible.value = value
saveInterviewStore()
}
function markGuideShown(key: string): void {
if (!key) return
guideShown.value[key] = true
saveInterviewStore()
}
function resetInterviewState(): void {
viewed.value = {}
isGuideInterviewTask.value = true
isGuideInterviewReturn.value = true
isGuideInterviewStage2.value = true
isGuideInterviewStage3.value = true
isInterviewUnlock.value = false
InterviewUnlockProgress.value = 0
interviewMenuVisible.value = false
guideShown.value = {}
saveInterviewStore()
}
@@ -135,8 +190,13 @@ export const useInterviewStore = defineStore(
//State
markViewed,
setIsGuideInterviewTask,
setIsGuideInterviewReturn,
setIsGuideInterviewStage2,
setIsGuideInterviewStage3,
setIsInterviewUnlock,
setInterviewUnlockProgress,
setInterviewMenuVisible,
markGuideShown,
resetInterviewState,
loadInterviewStore,
saveInterviewStore,
@@ -145,8 +205,13 @@ export const useInterviewStore = defineStore(
progressPercent,
viewed,
isGuideInterviewTask,
isGuideInterviewReturn,
isGuideInterviewStage2,
isGuideInterviewStage3,
isInterviewUnlock,
InterviewUnlockProgress
InterviewUnlockProgress,
interviewMenuVisible,
guideShown
}
},
{