diff --git a/README.md b/README.md index d2f8da1..a09b77c 100644 --- a/README.md +++ b/README.md @@ -151,9 +151,12 @@ npm run build - `docs/planning/week-2-execution-backlog.md`:下一阶段执行 backlog - `docs/planning/week-2-to-4-execution-backlog.md`:Week 2 到 Week 4 总执行 backlog - `docs/planning/demo-checklist.md`:求职演示检查清单 +- `docs/planning/demo-package.md`:求职版 Demo 包装页 - `docs/planning/demo-validation-log.md`:本地 Docker 演示验证记录 - `docs/planning/interview-pitch.md`:3 分钟项目讲解稿 - `docs/planning/week-1-sprint-review.md`:Week 1 复盘总结 +- `docs/planning/week-4-sprint-review.md`:Week 4 复盘和生产化 backlog +- `docs/technical/architecture.md`:求职版架构说明 - `docs/technical/api-compatibility.md`:旧生成 API 兼容层策略 - `docs/technical/generation-job-state.md`:Generation Job 状态落库决策 - `docs/technical/memory-system-dev.md`:记忆系统技术说明 diff --git a/admin-frontend/src/views/StorybookViewer.vue b/admin-frontend/src/views/StorybookViewer.vue index b4393c8..4586cde 100644 --- a/admin-frontend/src/views/StorybookViewer.vue +++ b/admin-frontend/src/views/StorybookViewer.vue @@ -87,6 +87,9 @@ const currentStoryId = computed(() => { return Number.isFinite(parsed) ? parsed : null }) const storybookTraceId = computed(() => storybook.value?.id ?? currentStoryId.value) +const readingPositionKey = computed(() => ( + storybookTraceId.value ? `dreamweaver:admin-storybook:${storybookTraceId.value}:page` : null +)) function goHome() { store.clearStorybook() @@ -105,6 +108,22 @@ function prevPage() { } } +function restoreReadingPosition() { + const key = readingPositionKey.value + if (!key || !totalPages.value) { + currentPageIndex.value = -1 + return + } + + const savedValue = Number(window.localStorage.getItem(key)) + if (!Number.isFinite(savedValue)) { + currentPageIndex.value = -1 + return + } + + currentPageIndex.value = Math.min(Math.max(savedValue, -1), totalPages.value - 1) +} + async function loadStorybook() { loading.value = true error.value = '' @@ -125,6 +144,7 @@ async function loadStorybook() { } if (cachedStorybook?.id === storyId) { + restoreReadingPosition() loading.value = false await generationTraceRef.value?.refresh() return @@ -155,6 +175,7 @@ async function loadStorybook() { last_error: detail.last_error, retryable_assets: detail.retryable_assets, }) + restoreReadingPosition() await generationTraceRef.value?.refresh() } catch (e) { error.value = e instanceof Error ? e.message : '绘本加载失败' @@ -208,6 +229,13 @@ watch( }, { immediate: true }, ) + +watch(currentPageIndex, (pageIndex) => { + const key = readingPositionKey.value + if (key) { + window.localStorage.setItem(key, String(pageIndex)) + } +})