# 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:代码审查和准备?.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:前端路由添加(双路由共存)?.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 // 在页面上添加版本标识,方便区分新旧版?