# 项目一键生成任务总览与跨会话恢复设计 **状态:** 已确认并实施 ## 1. 背景 一键生成页已经能够展示生成阶段、进度、失败原因、重试、源码预览和下载,但任务恢复依赖浏览器 `localStorage`。用户清理缓存、换浏览器或从“我的项目”重新进入时,无法可靠定位服务器上的生成任务。 “我的项目”也只展示草稿、已生成数据库和已预览等静态状态,不能回答三个最重要的问题:项目是否正在生成、生成到了哪一步、点击后能否继续查看同一个任务。 本轮回到 AI Software Factory 的用户主流程,不继续扩展 Plugin 交付基础设施。 ## 2. 目标 - “我的项目”展示每个项目最新的一键生成任务状态、进度和当前步骤。 - 用户点击进度入口后,生成页通过服务器任务 ID 恢复同一个任务。 - 新建一键生成任务后立即把任务 ID 写入路由,刷新或分享当前地址仍能定位任务。 - `localStorage` 继续作为旧入口的兼容兜底,但不再是唯一任务来源。 - 总览接口保持轻量,不返回请求提示词、生成结果、阶段清单或检查点大字段。 - 生成进度接口失败时,“我的项目”仍能正常展示项目数据。 ## 3. 非目标 - 不修改一键生成 Pipeline、Stage Handler、Prompt 或模型调用语义。 - 不新增数据库表或执行数据库迁移。 - 不在项目列表直接执行重试、取消、预览或下载;这些操作仍由生成工作台承接。 - 明文开发凭据和跳过 TLS 校验按用户决定继续暂缓,本轮不修改相关配置。 ## 4. 用户体验 “我的项目”新增“一键生成”列。每行固定展示状态文本、进度条、当前步骤或失败原因,以及一个紧凑图标入口。没有任务时入口用于开始生成;运行中用于查看进度;失败或等待重试时用于恢复处理;成功后用于查看结果。 入口路由格式为: ```text /generate?projectId={projectId}&mode=one-click&taskId={taskId} ``` 没有历史任务时省略 `taskId`。生成页优先按路由任务 ID 查询服务器;没有路由任务 ID 时才读取本地缓存中的旧任务记录。 ## 5. 服务端契约 新增接口: ```http GET /front/project/ai-tasks/one-click-overview ``` 接口从当前登录用户身份取数,并为每个项目返回 `generate_type = one_click_project` 的最新任务。最新任务按递增 `task_id` 判定,重试仍更新同一任务,不会制造额外列表项。 响应项只包含: | 字段 | 用途 | | --- | --- | | `taskId` | 恢复具体任务 | | `projectId` | 与项目列表关联 | | `generateType` | 防止任务类型混用 | | `status` | 状态展示与动作判断 | | `progress` | 进度条 | | `currentStep` | 当前阶段摘要 | | `errorMessage` | 失败摘要 | | `attempts` / `maxAttempts` | 重试信息 | | `createTime` / `updateTime` | 排序和审计摘要 | `requestPayload`、`resultPayload`、Prompt 身份、Stage Manifest 和 Checkpoint 不进入该响应。 ## 6. 数据流 ```mermaid sequenceDiagram participant U as 用户 participant L as 我的项目 participant A as FrontProject API participant G as 生成工作台 U->>L: 打开项目列表 par 项目数据 L->>A: GET /front/project and 最新一键任务 L->>A: GET /front/project/ai-tasks/one-click-overview end A-->>L: 项目与轻量任务总览 U->>L: 点击生成进度入口 L->>G: projectId + mode + taskId G->>A: GET /front/project/{projectId}/ai-tasks/{taskId} A-->>G: 完整任务状态 G->>G: 恢复进度、结果或轮询 ``` ## 7. 错误与并发处理 - 总览接口失败时只提示“生成进度暂时无法加载”,项目列表继续使用项目接口结果。 - 路由任务不存在、无权访问或类型不是一键生成时,生成页保留项目草稿并显示恢复错误。 - 项目切换时取消旧轮询;任务路由监听会忽略正在加载的项目和当前已显示的同一任务,避免重复轮询。 - 同一项目切换到另一个任务时先使旧轮询失效;即使新目标已经终态,旧轮询也不能覆盖路由指定任务。 - 新任务创建后先写入当前任务状态和本地兼容缓存,再同步路由并开始轮询。 - 路由同步失败不会中止已经在服务器创建的生成任务。 ## 8. 验收标准 - 项目列表一次加载即可展示每个项目最新的一键生成状态。 - 点击列表入口后,地址包含对应 `projectId` 和 `taskId`。 - 清除本地任务缓存后,使用该地址仍能从服务器恢复任务。 - 新建任务后地址中的 `taskId` 更新为新任务,不会在刷新后恢复旧任务。 - 同一项目切换不同 `taskId` 后,旧轮询不能覆盖当前任务或清除新任务的生成状态。 - 总览响应不包含请求和结果 Payload。 - 进度接口失败不影响项目列表主体。 - 前端契约测试、后端服务与控制器测试、生产构建全部通过。