# 后端代码分层 - 详细迁移计划 > **文档版本:** v1.0 > **创建日期:** 2025-11-13 > **任务编号:** 任务19(Week 2 Day 8-9) > **目标:** 将现有扁平化后端代码重组为 platform/common/modules 三层架构 --- ## 📋 总体目标 ### 设计原则 1. ✅ **稳妥第一** - 一步一步迁移,每步验证 2. ✅ **只做重组** - 不增加新功能,不修改业务逻辑 3. ✅ **保持兼容** - API路径不变,功能不变 4. ✅ **可回退** - Git commit记录每一步,可随时回退 ### 目标架构 ``` backend/src/ ├── platform/ # 🏛️ 平台层(本次只创建目录,暂不实现) │ ├── auth/ │ └── users/ │ ├── common/ # 🔧 通用能力层 │ ├── llm/ # LLM适配器和Gateway │ ├── document/ # 文档处理客户端 │ ├── rag/ # RAG/Dify客户端 │ ├── middleware/ # 中间件 │ ├── utils/ # 工具函数 │ └── types/ # 通用类型 │ ├── modules/ # 📦 业务模块层 │ ├── aia/ # AI智能问答模块 │ ├── pkb/ # 个人知识库模块 │ └── rvw/ # 稿件审查模块 │ ├── config/ # 配置(保留) └── index.ts # 主入口(重写) ``` --- ## 📊 现有代码清单 ### 1. adapters/ - LLM适配器(4个文件) - ✅ `DeepSeekAdapter.ts` - DeepSeek-V3适配器 - ✅ `QwenAdapter.ts` - Qwen3/Qwen-Long适配器 - ✅ `LLMFactory.ts` - LLM工厂类 - ✅ `types.ts` - 适配器接口定义 ### 2. clients/ - 外部服务客户端(3个文件) - ✅ `DifyClient.ts` - Dify RAG客户端 - ✅ `ExtractionClient.ts` - Python文档提取服务客户端 - ✅ `types.ts` - 客户端类型定义 ### 3. controllers/ - 控制器(8个文件) - ✅ `projectController.ts` - 项目管理 - ✅ `agentController.ts` - 智能体管理 - ✅ `conversationController.ts` - 对话管理 - ✅ `chatController.ts` - 通用对话 - ✅ `knowledgeBaseController.ts` - 知识库管理 - ✅ `documentController.ts` - 文档管理 - ✅ `batchController.ts` - 批处理 - ✅ `reviewController.ts` - 稿件审查 ### 4. services/ - 服务(8个文件) - ✅ `projectService.ts` - 项目服务 - ✅ `agentService.ts` - 智能体服务 - ✅ `conversationService.ts` - 对话服务 - ✅ `knowledgeBaseService.ts` - 知识库服务 - ✅ `documentService.ts` - 文档服务 - ✅ `batchService.ts` - 批处理服务 - ✅ `tokenService.ts` - Token计数服务 - ✅ `reviewService.ts` - 审查服务 ### 5. routes/ - 路由(7个文件) - ✅ `projects.ts` - 项目路由 - ✅ `agents.ts` - 智能体路由 - ✅ `conversations.ts` - 对话路由 - ✅ `chatRoutes.ts` - 通用对话路由 - ✅ `knowledgeBases.ts` - 知识库路由 - ✅ `batchRoutes.ts` - 批处理路由 - ✅ `reviewRoutes.ts` - 审查路由 ### 6. middleware/ - 中间件(1个文件) - ✅ `validateProject.ts` - 项目验证中间件 ### 7. utils/ - 工具函数(1个文件) - ✅ `jsonParser.ts` - JSON解析工具 ### 8. templates/ - 模板(1个文件) - ✅ `clinicalResearch.ts` - 临床研究模板 ### 9. config/ - 配置(2个文件) - ✅ `database.ts` - 数据库配置 - ✅ `env.ts` - 环境变量配置 ### 10. types/ - 类型(空目录) ### 11. scripts/ - 脚本(2个文件) - ✅ `create-mock-user.ts` - 创建模拟用户 - ✅ `test-dify-client.ts` - 测试Dify客户端 --- ## 🗺️ 详细迁移映射表 ### 阶段1:迁移 common/ 通用能力层 #### 1.1 common/llm/ - LLM适配器 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/adapters/types.ts` | `src/common/llm/adapters/types.ts` | 适配器接口 | | `src/adapters/DeepSeekAdapter.ts` | `src/common/llm/adapters/DeepSeekAdapter.ts` | DeepSeek适配器 | | `src/adapters/QwenAdapter.ts` | `src/common/llm/adapters/QwenAdapter.ts` | Qwen适配器 | | `src/adapters/LLMFactory.ts` | `src/common/llm/adapters/LLMFactory.ts` | LLM工厂 | #### 1.2 common/document/ - 文档处理 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/clients/ExtractionClient.ts` | `src/common/document/ExtractionClient.ts` | 文档提取客户端 | | `src/services/tokenService.ts` | `src/common/document/TokenService.ts` | Token计数服务 | | `src/clients/types.ts` | `src/common/document/types.ts` | 文档相关类型 | #### 1.3 common/rag/ - RAG引擎 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/clients/DifyClient.ts` | `src/common/rag/DifyClient.ts` | Dify客户端 | #### 1.4 common/middleware/ - 中间件 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/middleware/validateProject.ts` | `src/common/middleware/validateProject.ts` | 项目验证中间件 | #### 1.5 common/utils/ - 工具函数 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/utils/jsonParser.ts` | `src/common/utils/jsonParser.ts` | JSON解析工具 | #### 1.6 common/types/ - 通用类型 | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/types/` | `src/common/types/` | (目前为空,预留) | --- ### 阶段2:迁移 modules/ 业务模块层 #### 2.1 modules/aia/ - AI智能问答模块 **Controllers:** | 原路径 | 新路径 | |--------|--------| | `src/controllers/projectController.ts` | `src/modules/aia/controllers/projectController.ts` | | `src/controllers/agentController.ts` | `src/modules/aia/controllers/agentController.ts` | | `src/controllers/conversationController.ts` | `src/modules/aia/controllers/conversationController.ts` | | `src/controllers/chatController.ts` | `src/modules/aia/controllers/chatController.ts` | **Services:** | 原路径 | 新路径 | |--------|--------| | `src/services/projectService.ts` | `src/modules/aia/services/projectService.ts` | | `src/services/agentService.ts` | `src/modules/aia/services/agentService.ts` | | `src/services/conversationService.ts` | `src/modules/aia/services/conversationService.ts` | **Routes:** | 原路径 | 新路径 | |--------|--------| | `src/routes/projects.ts` | `src/modules/aia/routes/projects.ts` | | `src/routes/agents.ts` | `src/modules/aia/routes/agents.ts` | | `src/routes/conversations.ts` | `src/modules/aia/routes/conversations.ts` | | `src/routes/chatRoutes.ts` | `src/modules/aia/routes/chatRoutes.ts` | **其他:** | 原路径 | 新路径 | 说明 | |--------|--------|------| | `src/templates/clinicalResearch.ts` | `src/modules/aia/templates/clinicalResearch.ts` | 批处理模板 | **新增文件:** - `src/modules/aia/routes/index.ts` - 模块路由统一导出 --- #### 2.2 modules/pkb/ - 个人知识库模块 **Controllers:** | 原路径 | 新路径 | |--------|--------| | `src/controllers/knowledgeBaseController.ts` | `src/modules/pkb/controllers/knowledgeBaseController.ts` | | `src/controllers/documentController.ts` | `src/modules/pkb/controllers/documentController.ts` | | `src/controllers/batchController.ts` | `src/modules/pkb/controllers/batchController.ts` | **Services:** | 原路径 | 新路径 | |--------|--------| | `src/services/knowledgeBaseService.ts` | `src/modules/pkb/services/knowledgeBaseService.ts` | | `src/services/documentService.ts` | `src/modules/pkb/services/documentService.ts` | | `src/services/batchService.ts` | `src/modules/pkb/services/batchService.ts` | **Routes:** | 原路径 | 新路径 | |--------|--------| | `src/routes/knowledgeBases.ts` | `src/modules/pkb/routes/knowledgeBases.ts` | | `src/routes/batchRoutes.ts` | `src/modules/pkb/routes/batchRoutes.ts` | **新增文件:** - `src/modules/pkb/routes/index.ts` - 模块路由统一导出 --- #### 2.3 modules/rvw/ - 稿件审查模块 **Controllers:** | 原路径 | 新路径 | |--------|--------| | `src/controllers/reviewController.ts` | `src/modules/rvw/controllers/reviewController.ts` | **Services:** | 原路径 | 新路径 | |--------|--------| | `src/services/reviewService.ts` | `src/modules/rvw/services/reviewService.ts` | **Routes:** | 原路径 | 新路径 | |--------|--------| | `src/routes/reviewRoutes.ts` | `src/modules/rvw/routes/reviewRoutes.ts` | **新增文件:** - `src/modules/rvw/routes/index.ts` - 模块路由统一导出 --- ### 阶段3:创建 platform/ 平台层(仅骨架) **目录结构:** ``` src/platform/ ├── auth/ │ └── README.md # 说明:Week 3实现 └── users/ └── README.md # 说明:Week 3实现 ``` --- ### 阶段4:保留原位置的文件 | 路径 | 说明 | |------|------| | `src/config/` | 配置文件保持原位 | | `src/index.ts` | 主入口文件(需要重写导入路径) | | `src/scripts/` | 工具脚本保持原位 | --- ## 🔧 TypeScript路径别名配置 ### tsconfig.json 新增配置 ```json { "compilerOptions": { "baseUrl": ".", "paths": { "@platform/*": ["src/platform/*"], "@common/*": ["src/common/*"], "@modules/*": ["src/modules/*"], "@config/*": ["src/config/*"] } } } ``` --- ## 📝 导入路径更新规则 ### 1. common层内部导入 ```typescript // 旧: import { LLMFactory } from '../adapters/LLMFactory.js' // 新: import { LLMFactory } from '@common/llm/adapters/LLMFactory.js' ``` ### 2. modules层导入common层 ```typescript // 旧: import { LLMFactory } from '../../adapters/LLMFactory.js' // 新: import { LLMFactory } from '@common/llm/adapters/LLMFactory.js' ``` ### 3. 模块内部导入 ```typescript // 旧: import { projectService } from '../services/projectService.js' // 新: import { projectService } from '@modules/aia/services/projectService.js' // 或者相对路径(如果在同一模块内): import { projectService } from '../services/projectService.js' ``` --- ## ⚠️ 关键注意事项 ### 1. 保持 .js 扩展名 - ✅ TypeScript ES模块需要保留 `.js` 扩展名 - ✅ 所有导入路径末尾必须加 `.js` ### 2. Prisma Client 导入 ```typescript // 保持不变: import { prisma } from '@config/database.js' ``` ### 3. 外部依赖导入 ```typescript // Fastify、Prisma等外部包导入不变 import Fastify from 'fastify' import { PrismaClient } from '@prisma/client' ``` ### 4. 类型导入 ```typescript // 使用 type 关键字导入类型 import type { FastifyRequest, FastifyReply } from 'fastify' ``` --- ## 🚀 执行步骤(分11个阶段) ### ✅ 阶段1:代码调研与规划(已完成) - [x] 了解现有代码结构 - [x] 创建迁移映射表 - [x] 制定详细计划 ### ⏳ 阶段2:备份与安全 - [ ] Git status 检查工作区状态 - [ ] Git commit 当前代码(作为回退点) - [ ] 创建新分支 `feature/backend-layering` ### ⏳ 阶段3:创建新目录结构 - [ ] 创建 `src/platform/`(空) - [ ] 创建 `src/common/` 及子目录 - [ ] 创建 `src/modules/` 及子目录 ### ⏳ 阶段4:配置TypeScript路径别名 - [ ] 更新 `tsconfig.json` - [ ] 测试编译 ### ⏳ 阶段5:迁移common层 - [ ] 迁移 `common/llm/` - [ ] 迁移 `common/document/` - [ ] 迁移 `common/rag/` - [ ] 迁移 `common/middleware/` - [ ] 迁移 `common/utils/` - [ ] 更新所有导入路径 ### ⏳ 阶段6:迁移modules层 - [ ] 迁移 `modules/aia/` - [ ] 迁移 `modules/pkb/` - [ ] 迁移 `modules/rvw/` - [ ] 创建各模块的 `routes/index.ts` - [ ] 更新所有导入路径 ### ⏳ 阶段7:创建platform层骨架 - [ ] 创建 `platform/auth/README.md` - [ ] 创建 `platform/users/README.md` ### ⏳ 阶段8:更新主入口文件 - [ ] 重写 `src/index.ts` - [ ] 更新路由注册逻辑 ### ⏳ 阶段9:编译测试与验证 - [ ] 运行 `npm run build` - [ ] 检查编译错误 - [ ] 修复类型错误 ### ⏳ 阶段10:功能测试(API冒烟测试) - [ ] 启动后端服务 `npm run dev` - [ ] 测试健康检查 `/health` - [ ] 测试AIA模块API(至少1个端点) - [ ] 测试PKB模块API(至少1个端点) - [ ] 测试RVW模块API(至少1个端点) ### ⏳ 阶段11:文档更新与总结 - [ ] 更新 `前后端模块化架构设计-V2.md` - [ ] 创建 `后端代码分层实施报告.md` - [ ] 更新 `下一阶段行动计划-V2.2-完整版.md` - [ ] Git commit 最终代码 - [ ] 标记任务19完成 --- ## 📊 风险评估与应对 ### 风险1:导入路径错误导致编译失败 **应对:** - ✅ 每迁移一个文件,立即更新其导入路径 - ✅ 阶段性编译验证(每完成一层就编译一次) ### 风险2:运行时错误(路径解析问题) **应对:** - ✅ 保留 `.js` 扩展名 - ✅ 配置 `tsconfig.json` 的 `paths` 映射 - ✅ 启动测试验证 ### 风险3:循环依赖 **应对:** - ✅ 遵循依赖方向:modules → common → platform - ✅ 不允许反向依赖 ### 风险4:功能回归 **应对:** - ✅ 保持业务逻辑完全不变 - ✅ API冒烟测试验证核心功能 - ✅ Git记录每步,可随时回退 --- ## 🎯 成功标准 ### 编译成功 - ✅ `npm run build` 无错误 - ✅ 无TypeScript类型错误 - ✅ 无ESLint错误 ### 运行成功 - ✅ `npm run dev` 正常启动 - ✅ 健康检查返回正常 - ✅ 数据库连接正常 ### 功能正常 - ✅ AIA模块API正常响应 - ✅ PKB模块API正常响应 - ✅ RVW模块API正常响应 - ✅ 流式输出正常 - ✅ 文件上传正常 ### 架构清晰 - ✅ 三层架构目录清晰 - ✅ 模块边界明确 - ✅ 导入路径一致 --- **创建人:** AI助手 **审核人:** 待审核 **开始时间:** 2025-11-13 **预计完成时间:** 1-2天