# 平台“存档”Tab PRD 更新时间:`2026-04-20` ## 0. 目标 把原本堆在“我的”页中的“最近游玩 / 历史浏览”移出,新增平台一级主 Tab“存档”,用于承载当前账号在平台里玩过的所有游戏留下的最近可恢复存档。 这次改动的核心目标不是做复杂多槽位存档系统,而是先落地一个稳定、可跨设备同步、可直接继续游玩的账号级存档入口。 --- ## 1. 信息架构调整 ## 1.1 平台主导航 平台主导航从: - 首页 - 创作 - 我的 调整为: - 首页 - 创作 - 存档 - 我的 移动端底部导航与桌面端左侧纵向导航都必须同步调整。 ## 1.2 “我的”页调整 “我的”页删除以下内容块: - 最近游玩 - 历史浏览 “我的”页保留: - 账号资料与身份卡 - 数据看板 - 常用功能 - 设置与账号安全 说明: - 历史浏览本期直接从“我的”页移除,不再占据个人页首屏空间。 - 存档能力统一收口到平台一级“存档”Tab,不再同时在“我的”页重复展示。 --- ## 2. 存档定义 ## 2.1 本期存档口径 本期“存档”Tab 展示的是: - 当前账号在每个已游玩游戏 / 世界下保留的最近一个可恢复存档 不是: - 同一游戏下的完整多槽位存档管理页 - 手动重命名 / 置顶 / 删除存档系统 ## 2.2 世界唯一键 服务端必须按 `worldKey` 聚合最近存档: - 自定义世界:`custom:` - 内建世界:`builtin:` 同一账号、同一 `worldKey` 只保留最近一次成功保存的可恢复存档。 ## 2.3 生命周期 1. 玩家每次成功写入运行时快照时,同步刷新该世界的最近存档记录。 2. 删除当前活动快照时,不删除历史存档归档。 3. 点击“继续游玩”时,从该世界最近存档恢复为当前活动快照,再进入游戏。 --- ## 3. 界面设计 ## 3.1 存档 Tab 首屏结构 页面首屏直接展示存档列表,不再单独保留顶部“最近存档”摘要卡。 列表容器本身需要承担首屏入口作用: - 用户进入“存档”Tab 后第一屏就看到可恢复存档列表 - 不额外重复展示首个存档的大卡摘要 - 存档数量、排序状态如需表达,应收敛在列表标题或轻量状态信息中 不要在 UI 中默认堆规则说明文案,只保留简洁的状态表达。 ## 3.2 列表排序 列表按 `lastPlayedAt` 倒序。 最近更新的存档始终在最前面。 ## 3.3 列表项字段 每个列表项必须展示: - 游戏名称 - 最后游玩时间 - 游戏信息 ### 3.3.0 拼图存档字段与视觉层级 拼图玩法的存档列表项必须按作品维度展示,不把关卡名当作作品名: - 主标题展示作品名,来源为服务端存档投影的 `worldName`,视觉层级必须是卡片内最醒目的文本。 - 副标题展示当前可继续入口,格式为 `第 N 关 · 关卡名`;无关卡名时只展示 `第 N 关`。 - 卡片中不展示英文 `Archive` / `ARCHIVE` 标签。 - 封面缩略图固定为 `1:1` 正方形比例,使用当前可继续关卡图片。 - 封面图上不再覆盖“最近存档”标签;保存时间独立展示在信息区内。 ### 3.3.1 移动端卡片布局约束 - 移动端列表卡片中的封面只能作为独立缩略图或弱化背景层使用,不能直接占满整张卡片并压在正文信息下方。 - 标题、时间、摘要所在的信息区必须保持 `min-width: 0` 的可收缩布局,长标题不能把正文挤出屏幕外。 - 世界名称最多展示 2 行,游戏信息最多展示 3 行,超出后截断,不允许横向溢出。 - 时间标签、状态标签在窄屏下必须允许换行或独立成行,不能为了保持单行导致卡片内容错位。 - 列表卡片缩略图区域比例固定,文本区与缩略图区在移动端需要保持稳定对齐,避免出现上下参差和视觉歪斜。 其中“游戏信息”优先级如下: 1. `continueGameDigest` 2. 当前故事文本摘要 3. 世界简介 / 场景简介 4. 若都没有则给出简洁兜底文案 可附带展示封面,但封面不是必填验收项。 ## 3.4 点击行为 点击列表项后: 1. 调用后端恢复接口 2. 将所选存档切换为当前活动快照 3. 直接进入游戏继续游玩 前端不允许自行拼装恢复上下文。 ## 3.5 空状态 ### 已登录但无存档 - 展示轻量空态 - 引导去首页开始游玩 ### 未登录 - 展示登录态空壳 - 不请求受保护的云端存档列表接口 --- ## 4. 默认进入逻辑 当满足以下条件时,玩家进入网站后的平台首页默认进入“存档”Tab: 1. 当前处于登录状态 2. 当前账号至少存在一个存档 否则: - 仍默认进入“首页”Tab 注意: - 这个默认进入逻辑只在平台首屏初始化时执行,不能覆盖用户手动切换后的选择。 - 若平台首页的公开作品、个人数据、存档列表仍在异步加载中,用户已经手动切到“创作 / 存档 / 我的”时,请求完成后也不能把当前 Tab 回刷成默认 Tab。 --- ## 5. 后端设计 ## 5.1 新增数据表 建议新增 `profile_save_archives`: - `user_id` - `world_key` - `owner_user_id` - `profile_id` - `world_type` - `world_name` - `world_subtitle` - `summary_text` - `cover_image_src` - `saved_at` - `bottom_tab` - `game_state_json` - `current_story_json` - `updated_at` 约束: - 主键:`user_id + world_key` - 排序索引:`user_id + saved_at desc` ## 5.2 写入规则 每次 `/api/runtime/save/snapshot` 成功写入后: 1. 正常更新当前活动快照 2. 同步 upsert 对应 `world_key` 的存档归档 3. 继续保留原有个人看板 / 已玩作品同步逻辑 ## 5.3 列表接口 ### `GET /api/runtime/profile/save-archives` 返回: - 当前账号全部最近存档 字段至少包含: - `worldKey` - `worldName` - `worldSubtitle` - `summaryText` - `coverImageSrc` - `lastPlayedAt` - `worldType` - `profileId` - `ownerUserId` ## 5.4 恢复接口 ### `POST /api/runtime/profile/save-archives/:worldKey/resume` 用途: - 将指定存档归档恢复为当前活动快照 - 返回恢复后的快照 限制: - 恢复动作不能重复记账,不得再次累计个人资产流水 - 恢复动作不能重复累计已玩时长 - 恢复动作不能破坏现有快照水合逻辑 --- ## 6. 前端实现要求 1. `PlatformHomeView` 新增 `存档` 主 Tab。 2. `PreGameSelectionFlow` 在平台数据加载时同时拉取存档列表。 3. 已登录且有存档时,平台首屏默认选中 `存档` Tab。 4. “我的”页删除“最近游玩 / 历史浏览”两个区块。 5. 点击存档列表项时必须经过后端恢复接口,恢复成功后直接进入游戏。 6. 移动端优先,列表项点击区域不能过小。 --- ## 7. 验收标准 1. 已登录账号可以在“存档”Tab 看到所有已玩过世界的最近存档。 2. 列表按最近更新时间倒序。 3. 列表项可看到游戏名称、最后游玩时间和游戏信息。 4. 点击列表项后可直接继续对应游戏。 5. 已登录且至少有一个存档时,进入网站默认打开“存档”Tab。 6. 未登录时不请求云端存档列表,也不会出现受保护接口报错。