# PKB个人知识库 - 超级安全迁移执行计划 > **创建日期:** 2026-01-06 > **目标:** 将PKB从旧架构迁移到新架构,确保零风险、可回滚、可验证 > **原则:** 保守、渐进、每步可验证、随时可回滚 --- ## 🎯 迁移目标 将PKB从旧架构迁移到新架构,同时: - ✅ 保持现有功能100%可用 - ✅ 不影响正在使用的用户 - ✅ 每一步都可以验证和回滚 - ✅ 数据零损失 --- ## 📊 当前状态分析 ### 旧架构位置 ``` 后端:backend/src/legacy/ ├─ controllers/knowledgeBaseController.ts ├─ services/knowledgeBaseService.ts └─ routes/knowledgeBases.ts 前端:frontend/src/ └─ pages/KnowledgePage.tsx 数据库:✅ pkb_schema(已在独立Schema,无需迁移) ``` ### 新架构位置 ``` 后端:backend/src/modules/pkb/ ├─ controllers/ ├─ services/ └─ routes/ 前端:frontend-v2/src/modules/pkb/ ├─ pages/ ├─ components/ └─ api/ ``` --- ## 🚀 分阶段执行计划 ### ⏱️ 时间估算 | 阶段 | 任务 | 预估时间 | 可回滚 | 风险 | |-----|------|---------|--------|-----| | **阶段0** | 代码审查和准备 | 0.5天 | N/A | 无 | | **阶段1** | 后端代码复制(不删除旧代码) | 0.5天 | ✅ | 极低 | | **阶段2** | 后端API路由添加(双路由共存) | 0.5天 | ✅ | 极低 | | **阶段3** | 后端功能验证 | 0.5天 | ✅ | 低 | | **阶段4** | 前端代码复制 | 0.5天 | ✅ | 极低 | | **阶段5** | 前端路由添加(双路由共存) | 0.5天 | ✅ | 极低 | | **阶段6** | 前端功能验证 | 0.5天 | ✅ | 低 | | **阶段7** | 灰度发布(功能开关) | 1天 | ✅ | 中 | | **阶段8** | 全量切换 | 0.5天 | ✅ | 低 | | **阶段9** | 清理旧代码(可选) | 0.5天 | ⚠️ | 低 | **总计:约 5-6天(保守估计)** --- ## 📝 阶段0:代码审查和准备(0.5天) ### 目标 - 理解现有代码的所有功能点 - 确认依赖关系 - 制定详细的迁移清单 ### 任务清单 #### Task 0.1:审查旧代码结构 ```bash # 后端代码审查 - [ ] 阅读 knowledgeBaseController.ts(所有API端点) - [ ] 阅读 knowledgeBaseService.ts(所有业务逻辑) - [ ] 阅读 knowledgeBases.ts(路由定义) - [ ] 列出所有API端点和功能 # 前端代码审查 - [ ] 阅读 KnowledgePage.tsx(UI和交互) - [ ] 列出所有用户操作流程 - [ ] 确认状态管理方式 ``` #### Task 0.2:确认数据库Schema ```bash - [ ] 验证pkb_schema表结构 - [ ] 确认Prisma模型定义 - [ ] 检查是否有旧数据 - [ ] 确认索引和约束 ``` #### Task 0.3:创建功能清单 ```bash - [ ] 列出所有功能(CRUD、上传、检索等) - [ ] 创建测试用例 - [ ] 准备测试数据 ``` ### 验证标准 - ✅ 所有代码已阅读并理解 - ✅ 功能清单已创建 - ✅ 测试用例已准备 ### 回滚方案 - 无需回滚(只是阅读代码) --- ## 📝 阶段1:后端代码复制(0.5天) ### 目标 - 将旧代码复制到新位置 - **不删除、不修改旧代码** - 确保新代码可以独立编译 ### 任务清单 #### Task 1.1:创建新目录结构 ```bash # 创建目录 mkdir -p backend/src/modules/pkb/controllers mkdir -p backend/src/modules/pkb/services mkdir -p backend/src/modules/pkb/routes mkdir -p backend/src/modules/pkb/types mkdir -p backend/src/modules/pkb/utils ``` #### Task 1.2:复制Controller代码 ```bash # 复制文件(保留旧文件) cp backend/src/legacy/controllers/knowledgeBaseController.ts \ backend/src/modules/pkb/controllers/knowledgeBaseController.ts # 验证:旧文件仍存在 ls -la backend/src/legacy/controllers/knowledgeBaseController.ts ``` #### Task 1.3:复制Service代码 ```bash cp backend/src/legacy/services/knowledgeBaseService.ts \ backend/src/modules/pkb/services/knowledgeBaseService.ts ``` #### Task 1.4:复制Route代码 ```bash cp backend/src/legacy/routes/knowledgeBases.ts \ backend/src/modules/pkb/routes/knowledgeBases.ts ``` #### Task 1.5:更新导入路径 ```typescript // 在新代码中,更新所有 import 路径 // 从: import { xxx } from '../../legacy/...' // 到: import { xxx } from '../services/...' // 但是:依赖common层的保持不变 import { prisma } from '../../../../common/database/prisma'; ``` #### Task 1.6:编译验证 ```bash # 编译检查(不运行) cd backend npm run build # 检查是否有编译错误 # 如果有错误,只修复导入路径问题,不修改逻辑 ``` ### 验证标准 - ✅ 新代码编译通过 - ✅ 旧代码完全未动 - ✅ 旧系统仍可正常运行 ### 回滚方案 ```bash # 如果出问题,直接删除新目录 rm -rf backend/src/modules/pkb # 旧代码完全未动,系统继续运行 ``` --- ## 📝 阶段2:后端API路由添加(双路由共存)(0.5天) ### 目标 - 在新位置添加API路由 - **旧路由保持不变,继续工作** - 新旧路由同时可用 ### 任务清单 #### Task 2.1:注册新路由(不影响旧路由) ```typescript // backend/src/index.ts 或 routes/index.ts // 旧路由(保持不变) import legacyKnowledgeRoutes from './legacy/routes/knowledgeBases'; app.use('/api/v1/knowledge', legacyKnowledgeRoutes); // 新路由(新增) import newKnowledgeRoutes from './modules/pkb/routes/knowledgeBases'; app.use('/api/v2/knowledge', newKnowledgeRoutes); // 使用v2路径 ``` #### Task 2.2:确认路由隔离 ```bash # 新路由路径:/api/v2/knowledge/* # 旧路由路径:/api/v1/knowledge/* # 两者完全独立,互不干扰 ``` #### Task 2.3:添加健康检查端点 ```typescript // 在新路由中添加健康检查 router.get('/health', (req, res) => { res.json({ status: 'ok', module: 'pkb-v2', timestamp: new Date().toISOString() }); }); ``` ### 验证标准 #### 验证新路由可用 ```bash # 启动服务器 npm run dev # 测试新路由健康检查 curl http://localhost:3000/api/v2/knowledge/health # 期望返回:{"status":"ok","module":"pkb-v2",...} # 确认旧路由仍工作 curl http://localhost:3000/api/v1/knowledge/xxx # 期望返回:正常数据 ``` #### 验证旧路由未受影响 ```bash # 使用Postman或curl测试所有旧API # 确保所有功能正常 # 例如: curl -X GET http://localhost:3000/api/v1/knowledge/list curl -X POST http://localhost:3000/api/v1/knowledge/create # ... 测试所有端点 ``` ### 回滚方案 ```typescript // 如果新路由有问题,直接注释掉新路由注册 // import newKnowledgeRoutes from './modules/pkb/routes/knowledgeBases'; // app.use('/api/v2/knowledge', newKnowledgeRoutes); // 注释掉 // 旧路由继续工作,用户无感知 ``` --- ## 📝 阶段3:后端功能验证(0.5天) ### 目标 - 验证新后端所有功能 - 对比新旧API返回结果 - 确保新后端与旧后端行为完全一致 ### 任务清单 #### Task 3.1:准备测试环境 ```bash # 创建测试用户 # 准备测试数据(知识库、文档) # 准备Postman测试集合 ``` #### Task 3.2:逐个测试API端点 ```bash 测试清单: - [ ] GET /api/v2/knowledge/list - 获取知识库列表 - [ ] POST /api/v2/knowledge/create - 创建知识库 - [ ] GET /api/v2/knowledge/:id - 获取知识库详情 - [ ] PUT /api/v2/knowledge/:id - 更新知识库 - [ ] DELETE /api/v2/knowledge/:id - 删除知识库 - [ ] POST /api/v2/knowledge/:id/upload - 上传文档 - [ ] GET /api/v2/knowledge/:id/documents - 获取文档列表 - [ ] DELETE /api/v2/knowledge/:id/documents/:docId - 删除文档 - [ ] POST /api/v2/knowledge/:id/query - RAG检索 - [ ] GET /api/v2/knowledge/:id/batch-tasks - 批处理任务列表 - [ ] POST /api/v2/knowledge/:id/batch-tasks - 创建批处理任务 ``` #### Task 3.3:对比测试(新旧API) ```bash # 对于每个API,使用相同参数同时调用新旧接口 # 对比返回结果是否一致 # 示例: curl /api/v1/knowledge/list > old_result.json curl /api/v2/knowledge/list > new_result.json diff old_result.json new_result.json ``` #### Task 3.4:边界测试 ```bash - [ ] 测试无效参数 - [ ] 测试权限控制 - [ ] 测试并发请求 - [ ] 测试大文件上传 - [ ] 测试错误处理 ``` #### Task 3.5:性能测试 ```bash # 简单的性能对比 - [ ] 测试响应时间 - [ ] 测试内存使用 - [ ] 确认无明显性能劣化 ``` ### 验证标准 - ✅ 所有API端点测试通过 - ✅ 新旧API返回结果一致 - ✅ 边界情况处理正确 - ✅ 性能无明显下降 ### 发现问题的处理 ```bash 如果发现问题: 1. 记录问题详情 2. 修复新代码 3. 重新测试 4. 不影响旧系统(旧路由继续工作) 5. 可以随时暂停迁移 ``` ### 回滚方案 - 发现严重问题时,停止使用新路由 - 旧路由继续工作 - 有时间慢慢修复新代码 --- ## 📝 阶段4:前端代码复制(0.5天) ### 目标 - 将旧前端代码复制到新位置 - **不删除、不修改旧代码** - 确保新代码可以独立编译 ### 任务清单 #### Task 4.1:创建新目录结构 ```bash mkdir -p frontend-v2/src/modules/pkb/pages mkdir -p frontend-v2/src/modules/pkb/components mkdir -p frontend-v2/src/modules/pkb/api mkdir -p frontend-v2/src/modules/pkb/types mkdir -p frontend-v2/src/modules/pkb/hooks ``` #### Task 4.2:复制页面代码 ```bash cp frontend/src/pages/KnowledgePage.tsx \ frontend-v2/src/modules/pkb/pages/KnowledgePage.tsx ``` #### Task 4.3:创建API服务 ```typescript // frontend-v2/src/modules/pkb/api/knowledgeApi.ts // 创建新的API调用层,指向 /api/v2/knowledge/* ``` #### Task 4.4:更新导入路径 ```typescript // 更新所有import路径 // 但保持调用相同的UI组件库 ``` #### Task 4.5:编译验证 ```bash cd frontend-v2 npm run build # 检查编译错误 ``` ### 验证标准 - ✅ 新代码编译通过 - ✅ 旧前端完全未动 - ✅ 旧前端仍可正常访问 ### 回滚方案 ```bash # 删除新目录 rm -rf frontend-v2/src/modules/pkb # 旧前端继续工作 ``` --- ## 📝 阶段5:前端路由添加(双路由共存)(0.5天) ### 目标 - 在新前端添加路由 - **旧路由保持不变** - 新旧页面同时可用 ### 任务清单 #### Task 5.1:注册新路由 ```typescript // frontend-v2/src/router/index.ts // 旧路由(保持不变)- 如果旧前端还在运行 // 访问:http://localhost:5173/knowledge // 新路由(新增) { path: '/pkb', // 使用新路径 component: () => import('@/modules/pkb/pages/KnowledgePage.tsx'), meta: { title: 'PKB个人知识库(新版)' } } ``` #### Task 5.2:更新API调用 ```typescript // 确保新前端调用的是 /api/v2/knowledge/* 路由 const API_BASE = '/api/v2/knowledge'; ``` #### Task 5.3:添加版本标识 ```typescript // 在页面上添加版本标识,方便区分新旧版本