This commit is contained in:
2026-04-10 15:37:02 +08:00
parent 161cd32277
commit f19e482c8f
233 changed files with 43987 additions and 5127 deletions

View File

@@ -0,0 +1,588 @@
# Express 后端化并行任务拆分规划2026-04-08
## 1. 目的
这份文档用于把 [EXPRESS_BACKEND_REFACTOR_PLAN_2026-04-08.md](./EXPRESS_BACKEND_REFACTOR_PLAN_2026-04-08.md) 进一步拆成可并行推进、尽量互不冲突的任务流。
目标不是把大重构拆成很多零碎 TODO而是把它拆成
- 可以同时开工
- 写入边界清晰
- 交付物明确
- 依赖关系稳定
- 最后容易集成
---
## 2. 并行拆分原则
## 2.1 基本原则
- 每条任务尽量拥有独占目录或独占模块,不去抢同一批热点文件。
- 热点集成文件只由“集成岗”或最后一轮集成处理,不作为多个任务的日常编辑目标。
- 先搭协议边界,再迁规则执行,再收缩前端。
- 前端与后端可以并行推进,但前提是先冻结 contract。
- 编辑器链路和正式运行时链路分开拆,避免互相阻塞。
## 2.2 当前最容易冲突的文件
以下文件建议默认只由集成岗或最后一轮联调处理:
- `server-node/src/context.ts`
- `server-node/src/routes/runtimeRoutes.ts`
- `server-node/src/app.ts`
- `src/services/apiClient.ts`
- `src/hooks/useStoryGeneration.ts`
- `src/hooks/useGameFlow.ts`
- `src/components/GameShell.tsx`
其他任务如果必须影响这些文件,优先通过:
- 新增独立模块
- 新增 adapter
- 新增中间层入口
而不是直接在热点文件中大改。
---
## 3. 建议并行批次
## 批次 A可立即并行开工
- 任务 0集成岗与接口冻结
- 任务 1共享 contract 与目录抽离
- 任务 2PostgreSQL 持久化基线收口
- 任务 3服务端 HTTP 基础设施与统一响应壳层
- 任务 8编辑器 API 归口与工具链隔离
- 任务 9测试、观测与部署基线
## 批次 B在 contract 初版落地后并行开工
- 任务 4服务端 AI 编排收口
- 任务 5运行时领域模块 AStory / Combat / NPC
- 任务 6运行时领域模块 BInventory / Quest / Build / Runtime Item
- 任务 7前端 SDK、鉴权、持久化瘦身
## 批次 C在服务端 action 和 view model 稳定后开工
- 任务 10前端主流程壳层与大 hook 瘦身
---
## 4. 任务拆分
## 任务 0集成岗与接口冻结
### 目标
负责冻结边界、维护接口文档、控制热点文件的合并节奏,避免多人同时改核心入口。
### 独占范围
- `docs/planning/**`
- `docs/technical/**`
- 最终集成时的热点入口文件
### 主要输出
- 统一任务看板
- contract 版本表
- 热点文件编辑规则
- 每日或每阶段集成清单
### 验收标准
- 团队知道哪些文件不能多人同时改
- 每条任务都有明确的上游 contract 与下游接入点
---
## 任务 1共享 Contract 与目录抽离
### 目标
先把前后端共同识别的类型、schema、响应结构、错误结构抽出来切断 `server-node -> src/**` 的长期反向依赖。
### 独占范围
- `packages/shared/**`
- 新建的共享类型、schema、contract 目录
### 可改边界
- `server-node/src/**` 中的 import 替换入口
- `src/**` 中的 import 替换入口
### 暂不负责
- 具体业务规则迁移
- 前端页面行为调整
- 数据库实现细节
### 主要输出
- 统一 API envelope
- 统一错误对象
- 统一 action / response contract
- 统一领域类型和状态枚举
### 验收标准
- 新增服务端模块不需要继续直接依赖前端目录里的实现细节
- 前后端都以共享 contract 为边界协作
### 并行关系
- 可与任务 2、任务 3、任务 8、任务 9 同时启动
- 是任务 4、任务 5、任务 6、任务 7 的上游基础
---
## 任务 2PostgreSQL 持久化基线收口
### 目标
把“已经切到 PostgreSQL”的状态收成真正稳定的后端基线清掉 SQLite 残留口径与仓储层耦合问题。
### 独占范围
- `server-node/src/config.ts`
- `server-node/src/db.ts`
- `server-node/src/repositories/**`
- `server-node/src/app.test.ts`
- `.env.example`
### 暂不负责
- 剧情规则
- 选项结算
- 前端状态瘦身
### 主要输出
- PostgreSQL 连接配置
- 仓储层接口统一
- 数据表初始化/迁移方案
- 运行时持久化测试基线
- 文档中的数据库现状统一
### 验收标准
- 后端运行时数据完全以后端数据库为准
- 配置、日志、测试、文档里不再把 SQLite 写成当前正式现状
### 并行关系
- 可与任务 1、任务 3、任务 8、任务 9 同时启动
- 为任务 5、任务 6、任务 7 提供稳定持久化基础
---
## 任务 3服务端 HTTP 基础设施与统一响应壳层
### 目标
建立统一的服务端响应结构、错误结构、请求链路日志、版本字段和中间件壳层。
### 独占范围
- `server-node/src/http.ts`
- `server-node/src/errors.ts`
- `server-node/src/middleware/**`
- `server-node/src/app.ts`
### 可改边界
- 为 route 层提供新的响应 helper
- 为后续 action 接口提供统一 envelope
### 暂不负责
- 具体 story / combat / quest 业务逻辑
- 前端页面层接入
### 主要输出
- 统一 JSON 响应格式
- 统一错误格式
- `requestId`
- `latency` 与关键日志字段
- 路由级版本与元信息壳层
### 验收标准
- 后端所有新接口都能套用同一层响应约定
- 前端不需要为不同接口写多套错误解析逻辑
### 并行关系
- 可与任务 1、任务 2、任务 8、任务 9 同时启动
- 是任务 4、任务 5、任务 6、任务 7 的共同基础
---
## 任务 4服务端 AI 编排收口
### 目标
把正式运行时的 prompt 组装、模型调用、容错、SSE 转发都收回后端,浏览器不再保留正式运行时 AI fallback。
### 独占范围
- `server-node/src/services/llmClient.ts`
- `server-node/src/services/chatService.ts`
- `server-node/src/services/storyService.ts`
- `server-node/src/services/customWorldGenerationService.ts`
- `server-node/src/services/questService.ts`
- `server-node/src/services/runtimeItemService.ts`
### 可新增目录
- `server-node/src/modules/ai/**`
### 暂不负责
- 前端主流程组件
- 数据库存储实现
### 主要输出
- 后端统一 AI orchestration 层
- 流式接口统一适配
- prompt 复用策略
- 前端 fallback 清理清单
### 验收标准
- 正式运行时不再依赖浏览器端大体量 AI 实现作为兜底
- AI 失败、超时、流式中断都能在后端统一处理
### 并行关系
- 建议在任务 1、任务 3 有初版后启动
- 可与任务 5、任务 6、任务 7 并行
---
## 任务 5运行时领域模块 AStory / Combat / NPC
### 目标
把剧情推进、战斗结算、NPC 交互这些最核心的运行时状态迁移到后端领域模块。
### 独占范围
- `server-node/src/modules/story/**`
- `server-node/src/modules/combat/**`
- `server-node/src/modules/npc/**`
### 可改边界
- 为 route/action 层提供服务接口
- 为前端提供 view model 所需聚合结果
### 暂不负责
- 背包、Build、任务奖励编排
- 编辑器接口
### 主要输出
- story action resolver
- combat resolution service
- npc interaction service
- 统一返回给 UI 的 presentation/view model 结构
### 验收标准
- 前端不再本地决定 function 合法性、战斗结果、NPC 关键关系变化
- 点击选项时,后端能返回完整下一步展示结果
### 并行关系
- 依赖任务 1、任务 3
- 可与任务 4、任务 6、任务 7 并行
---
## 任务 6运行时领域模块 BInventory / Quest / Build / Runtime Item
### 目标
把任务推进、运行时物品、背包/装备、Build 收益等剩余核心规则迁到后端。
### 独占范围
- `server-node/src/modules/inventory/**`
- `server-node/src/modules/quest/**`
- `server-node/src/modules/build/**`
- `server-node/src/modules/runtime-item/**`
### 可改边界
- 调用任务 2 的仓储层
- 使用任务 1 的共享 contract
### 暂不负责
- 前端页面层改造
- Story / Combat / NPC 主链路
### 主要输出
- inventory mutation service
- quest signal progression service
- build calculation service
- runtime item resolution service
### 验收标准
- 背包、任务、Build、运行时物品不再由前端保留正式结算逻辑
- 这些领域能独立测试,不依赖 UI hook
### 并行关系
- 依赖任务 1、任务 2、任务 3
- 可与任务 4、任务 5、任务 7 并行
---
## 任务 7前端 SDK、鉴权、持久化瘦身
### 目标
让前端从“业务执行层”退回“API 消费层 + 表现层状态协调层”。
### 独占范围
- `src/services/apiClient.ts`
- `src/services/authService.ts`
- `src/services/storageService.ts`
- `src/services/aiService.ts`
- `src/hooks/useGamePersistence.ts`
- `src/hooks/useGameSettings.ts`
### 暂不负责
- 页面组件大范围重构
- `useStoryGeneration.ts` 主流程瘦身
### 主要输出
- 轻量前端 SDK
- 统一鉴权请求层
- 统一错误态与重试策略
- 远端快照/设置消费层
- 正式运行时浏览器 fallback 下线方案
### 验收标准
- 前端服务层不再保留完整正式规则或正式 AI 编排
- 存档与设置以后端返回结果为准
### 并行关系
- 依赖任务 1、任务 3
- 可与任务 4、任务 5、任务 6 并行
- 为任务 10 提供稳定的 API 消费层
---
## 任务 8编辑器 API 归口与工具链隔离
### 目标
把编辑器的写盘、生成、任务查询能力从“散落接口”整理成清晰的编辑器后端模块,避免继续污染正式运行时。
### 独占范围
- `src/editor/shared/**`
- `src/components/preset-editor/**`
- `src/components/npcVisualEditorPersistence.ts`
- `src/components/preset-editor/characterAssetStudioPersistence.ts`
- `scripts/dev-server/**`
- `server-node/src/modules/editor/**`
- `server-node/src/modules/assets/**`
### 暂不负责
- 主游戏运行时 action 逻辑
- 正式剧情流转
### 主要输出
- `/api/editor/*``/api/assets/*` 命名空间
- 统一 editor client SDK
- 写接口权限边界
- 编辑器工具链迁移清单
### 验收标准
- 编辑器组件不再散落直连多个写接口
- 编辑器 API 与运行时 API 的职责边界清晰
### 并行关系
- 可与任务 1、任务 2、任务 3、任务 9 同时启动
- 与任务 5、任务 6、任务 10 基本不冲突
---
## 任务 9测试、观测与部署基线
### 目标
为整个后端化改造提供自动回归、链路日志和部署基线,避免“功能迁过去了但不可验证”。
### 独占范围
- `server-node/src/**/*.test.ts`
- `scripts/**`
- 部署与运维相关文档
- 反向代理与 smoke 测试脚本
### 暂不负责
- 具体业务模块实现
### 主要输出
- 后端接口测试
- 关键主链路 smoke
- request/response 日志校验
- 同域部署基线
- 回滚、备份、迁移检查清单
### 验收标准
- `web + server` 改造过程有最小自动回归保护
- 关键接口失败时能追踪到请求链路
### 并行关系
- 可与任务 1、任务 2、任务 3、任务 8 同时启动
- 后续持续跟进任务 4、任务 5、任务 6、任务 7、任务 10 的交付
---
## 任务 10前端主流程壳层与大 Hook 瘦身
### 目标
在服务端 action 和前端 SDK 稳定后,把 `GameShell``useStoryGeneration` 这一层改成真正的表现层协调器。
### 独占范围
- `src/hooks/useStoryGeneration.ts`
- `src/hooks/story/**`
- `src/hooks/useGameFlow.ts`
- `src/components/GameShell.tsx`
- `src/components/AdventurePanel.tsx`
- `src/components/NpcModals.tsx`
- `src/components/auth/**`
### 暂不负责
- 数据库、服务端仓储
- 编辑器 API
### 主要输出
- 面向 action/view model 的前端流程层
- 页面表现态与业务态分离
- 大 hook 拆分后的协调层
- 更容易测试和替换的主流程壳层
### 验收标准
- 前端主流程不再直接吞下完整运行时规则
- 页面层主要消费后端 view model而不是本地自算结果
### 并行关系
- 依赖任务 5、任务 6、任务 7 至少有一轮稳定输出
- 是最后一批大规模前端接入任务
---
## 5. 推荐协作顺序
## 第一步:先定边界
先启动:
- 任务 0
- 任务 1
- 任务 2
- 任务 3
这一轮完成后,团队会得到:
- 统一 contract
- 稳定数据库基线
- 稳定后端响应壳层
- 稳定任务分工边界
## 第二步:领域层和工具层分头推进
在第一步基础上并行启动:
- 任务 4
- 任务 5
- 任务 6
- 任务 7
- 任务 8
- 任务 9
这一轮是整个改造的主生产阶段。
## 第三步:最后收前端主流程
最后启动:
- 任务 10
原因很简单:
- 如果太早改 `useStoryGeneration``GameShell`,前端还没有稳定的 action contract 和 view model会反复返工。
---
## 6. 建议的多人分工方式
如果是 4 人并行,建议:
- 1 人负责任务 1 + 任务 0 的 contract/集成
- 1 人负责任务 2 + 任务 3 的后端基建
- 1 人负责任务 4 + 任务 5 的运行时主链
- 1 人负责任务 8 + 任务 9之后转入任务 7 或任务 10
如果是 6 人并行,建议:
- 1 人负责任务 0 + 任务 1
- 1 人负责任务 2
- 1 人负责任务 3 + 任务 9
- 1 人负责任务 4
- 1 人负责任务 5
- 1 人负责任务 6 + 任务 8
前端主流程任务 10 建议在第二轮由最熟悉当前 UI 壳层的人接手。
---
## 7. 合并规则建议
- 每条任务优先新增目录和新模块,少直接改热点文件。
- 热点文件统一在集成窗口合并,不在多个任务里同步推进。
- 任何任务如果需要改 `useStoryGeneration.ts`,默认先暂停并和任务 10 对齐。
- 任何任务如果需要改 `server-node/src/routes/runtimeRoutes.ts`,默认先走任务 0 的接口冻结表。
- 编辑器链路和正式运行时链路不要混在同一个 PR 里。
---
## 8. 一句话结论
这次重构最稳的并行方式不是“大家一起改前后端”,而是:
**先用 contract、数据库基线和 HTTP 壳层把边界钉死,再让服务端领域迁移、编辑器归口、前端瘦身分轨并行,最后由主流程壳层统一接入。**