# 实施计划:从正式系统恢复源码 ## 概述 **重要发现**: - 生产容器使用 Next.js standalone 模式部署,只包含编译后的代码 - **2.2.0版本的TypeScript源码已丢失** - 服务器上只有1.0.0版本的旧源码 **恢复策略**: 1. ✅ 从生产容器提取编译后的代码(已完成) 2. **反编译编译后的JavaScript代码,恢复TypeScript源码** 3. 对比本地1.0.0源码,补充缺失部分 4. 重建完整的2.2.0版本源码 5. 在影子系统测试验证 6. 部署到生产系统 本计划描述了从编译代码反编译恢复源码、构建验证、部署测试的完整步骤。 ## 任务 - [x] 1. 连接正式系统并提取编译后的代码(只读操作) - ✅ 已确认:生产容器只有编译后的代码(.next目录) - ✅ 已下载:编译后的API代码(nextjs-api-compiled.tar.gz) - ✅ 已下载:完整的.next构建目录(nextjs-full-build.tar.gz) - ✅ 已下载:生产配置文件(package.json等) - 📋 结论:**必须通过反编译恢复源码** - _需求: 1.1, 1.2, 1.3, 1.4_ - [ ] 2. 反编译JavaScript代码恢复TypeScript源码 - [ ] 2.1 分析编译后的代码结构 - 查看 nextjs-build/.next/server/app 目录结构 - 识别所有API路由文件 - 识别所有页面组件文件 - 列出需要反编译的文件清单 - _需求: 2.1_ - [ ] 2.2 反编译API路由代码 - 反编译 app/api/materials/route.js → route.ts - 反编译 app/api/materials/stats/route.js → route.ts - 反编译 app/api/materials/download/route.js → route.ts - 反编译 app/api/materials/upload/route.js → route.ts - 反编译 app/api/categories/route.js → route.ts - 反编译其他API路由文件 - _需求: 2.1, 2.2_ - [ ] 2.3 反编译页面组件代码 - 反编译 app/page.js → page.tsx - 反编译 app/profile/page.js → page.tsx - 反编译 app/admin/page.js → page.tsx - 反编译 app/edit/[id]/page.js → page.tsx - 反编译其他页面文件 - _需求: 2.1, 2.2_ - [ ] 2.4 反编译工具库代码 - 从编译代码中提取 lib/prisma.ts - 从编译代码中提取 lib/s3.ts - 从编译代码中提取其他lib文件 - _需求: 2.1, 2.2_ - [ ] 2.5 对比本地1.0.0源码 - 对比反编译代码与本地代码的差异 - 识别新增的功能和文件 - 识别修改的逻辑 - 生成差异报告 - _需求: 2.3_ - [ ] 2.6 补充缺失的源码文件 - 从本地1.0.0复制未改动的文件 - 合并反编译代码和本地代码 - 补充类型定义文件 - 补充配置文件 - _需求: 2.3_ - [ ] 2.7 重建完整的项目结构 - 创建完整的 app/ 目录结构 - 创建完整的 components/ 目录 - 创建完整的 lib/ 目录 - 创建完整的 prisma/ 目录 - 确保所有import路径正确 - _需求: 2.4_ - [ ] 3. 检查点 - 审查反编译结果 - 确认所有关键文件都已反编译 - 确认代码逻辑完整 - 询问用户是否继续构建 - [ ] 4. 验证环境配置(关键步骤!) - [ ] 4.1 检查 `.env` 文件 - ⚠️ **必须确认**以下配置: - `DATABASE_URL` 包含 `lobechat_stage`(不是 `lobechat`) - `REDIS_PORT=6380`(不是 `6379`) - `NEXTAUTH_URL` 指向影子系统端口 5320 - _需求: 4.1, 4.3_ - [ ] 4.2 检查部署脚本 - 确认 `deploy-local-build.ps1` 存在 - 确认使用 `-Target shadow` 参数会操作影子系统容器 - _需求: 4.1, 4.3_ - [ ] 5. 验证文件完整性 - [ ] 5.1 检查关键 API 路由 - 验证 app/api/materials/route.ts 存在 - 验证 app/api/materials/download/route.ts 存在 - 验证 app/api/materials/favorite/route.ts 存在 - 验证 app/api/user/materials/route.ts 存在 - 验证 app/api/admin/users/route.ts 存在 - _需求: 3.1_ - [ ] 5.2 检查关键页面组件 - 验证 app/page.tsx 存在 - 验证 app/profile/page.tsx 存在 - 验证 app/admin/page.tsx 存在 - 验证 app/edit/[id]/page.tsx 存在 - _需求: 3.2_ - [ ] 5.3 检查工具库文件 - 验证 lib/prisma.ts 存在 - 验证 lib/s3.ts 存在 - 验证 lib/chunk-upload.ts 存在 - 验证 lib/image-processor.ts 存在 - 验证 lib/video-processor.ts 存在 - _需求: 3.3_ - [ ] 5.4 生成功能完整性报告 - 列出所有已验证的文件 - 标注缺失的文件(如有) - _需求: 3.4_ - [ ] 6. 检查点 - 审查完整性报告 - 确认所有关键文件都已恢复 - 询问用户是否继续构建 - [ ] 7. 安装依赖并构建项目 - [ ] 7.1 安装 npm 依赖 - 执行 `npm install` - 检查是否有依赖安装错误 - _需求: 5.1_ - [ ] 7.2 执行项目构建 - 执行 `npm run build` - 监控构建过程 - _需求: 5.2_ - [ ] 7.3 处理构建错误(如有) - 查看构建日志 - 识别错误原因 - 修复错误并重新构建 - _需求: 5.3_ - [ ] 7.4 验证构建输出 - 检查 .next 目录是否存在 - 检查 .next/server 目录是否包含必要文件 - 检查 .next/static 目录是否包含静态资源 - _需求: 5.4_ - [ ] 8. 检查点 - 确认构建成功并验证环境配置 - 确认构建无错误 - ⚠️ **关键检查**: 打开 `.env` 文件,逐行验证: - [ ] `DATABASE_URL` 包含 `lobechat_stage` - [ ] `REDIS_PORT=6380` - [ ] `NEXTAUTH_URL` 包含端口 `5320` - [ ] 没有任何配置指向正式系统 - 询问用户确认环境配置正确后再继续部署 - [ ] 9. 部署到影子系统(严格验证环境隔离) - [ ] 9.1 部署前最终检查 - ⚠️ **停止!先完成以下检查**: - [ ] 确认 `deploy-local-build.ps1` 脚本存在 - [ ] 打开脚本,确认 `-Target shadow` 参数会: - 操作容器 `youyidian-3d-material-shadow`(不是 `youyidian-3d-material`) - 使用端口 `5320`(不是 `4320`) - 使用数据库 `lobechat_stage`(不是 `lobechat`) - [ ] 确认 `.env` 文件配置正确(再次检查) - _需求: 6.1, 6.2_ - [ ] 9.2 执行部署脚本 - 运行 `.\deploy-local-build.ps1 -Target shadow` - 监控部署过程,注意任何错误信息 - ⚠️ 如果看到任何关于正式系统的提示,**立即停止** - _需求: 6.1, 6.2_ - [ ] 9.3 验证容器状态 - 检查影子系统容器 `youyidian-3d-material-shadow` 是否正在运行 - 检查容器日志是否有错误 - ⚠️ **同时检查**正式系统容器 `youyidian-3d-material` 状态,确认未受影响 - _需求: 6.3_ - [ ] 9.4 验证网络访问 - 使用浏览器访问 http://192.168.58.20:5320 - 确认页面能够正常加载 - ⚠️ **不要访问** http://192.168.58.20:4320(正式系统) - _需求: 6.4_ - [ ] 9.5 验证数据库连接 - 在影子系统上执行一个简单操作(如查看素材列表) - 通过数据库工具连接 `lobechat_stage`,确认有新的操作记录 - ⚠️ **同时检查** `lobechat` 数据库,确认没有新的记录(证明影子系统没有连接到正式数据库) - _需求: 6.3_ - [ ] 10. 功能测试 - 用户认证 - [ ] 10.1 测试钉钉登录 - 点击钉钉登录按钮 - 完成钉钉授权流程 - 验证登录成功 - _需求: 7.1_ - [ ] 10.2 测试邮箱登录 - 使用测试账号登录 - 验证登录成功 - _需求: 7.1_ - [ ] 11. 功能测试 - 素材管理 - [ ] 11.1 测试素材浏览 - 访问首页 - 验证瀑布流布局正常显示 - 验证素材卡片信息完整 - _需求: 7.2_ - [ ] 11.2 测试素材筛选 - 测试按素材类型筛选 - 测试按使用店铺筛选 - 测试按场景类别筛选 - 测试按产品类别筛选 - 测试按月份筛选 - _需求: 7.3_ - [ ] 11.3 测试搜索功能 - 在搜索框输入关键词 - 验证防抖处理(输入后500ms才触发搜索) - 验证搜索结果正确 - _需求: 7.4_ - [ ] 11.4 测试滚动位置保存 - 滚动到页面中间位置 - 点击某个素材进入详情页 - 返回首页 - 验证滚动位置保持不变 - _需求: 7.5_ - [ ] 11.5 测试素材上传 - 点击上传按钮 - 选择素材类型 - 上传文件 - 验证上传成功 - _需求: 7.2_ - [ ] 11.6 测试素材下载 - 点击下载按钮 - 验证下载开始 - 验证下载完成 - _需求: 7.2_ - [ ] 11.7 测试模特类素材下载 - 找到一个模特类素材 - 点击下载按钮 - 验证自动打包成 ZIP 文件 - 验证 ZIP 文件包含所有图片 - _需求: 7.6_ - [ ] 11.8 测试素材编辑 - 点击编辑按钮 - 修改素材信息 - 保存修改 - 验证修改成功 - _需求: 7.2_ - [ ] 11.9 测试点赞功能 - 点击点赞按钮 - 验证点赞数增加 - 再次点击取消点赞 - 验证点赞数减少 - _需求: 7.2_ - [ ] 11.10 测试收藏功能 - 点击收藏按钮 - 验证收藏成功提示 - 在个人中心查看收藏列表 - 验证素材已收藏 - _需求: 7.2_ - [ ] 12. 功能测试 - 管理员功能 - [ ] 12.1 测试用户管理 - 访问管理员页面 - 查看用户列表 - 测试用户搜索 - 测试权限管理 - _需求: 7.7_ - [ ] 12.2 测试素材管理 - 查看所有素材列表 - 测试素材编辑 - 测试素材删除(软删除) - _需求: 7.7_ - [ ] 12.3 测试回收站 - 查看回收站 - 测试恢复素材 - 测试永久删除 - _需求: 7.7_ - [ ] 12.4 测试分类管理 - 测试使用店铺管理 - 测试场景类别管理 - 测试平台分类管理 - 测试产品类别管理 - _需求: 7.7_ - [ ] 13. 功能测试 - 辅助功能 - [ ] 13.1 测试排行榜 - 打开排行榜面板 - 查看下载榜 - 查看上传榜 - 查看点赞榜 - 测试拖动功能 - _需求: 7.7_ - [ ] 13.2 测试 AI 聊天 - 打开 AI 聊天窗口 - 发送测试消息 - 验证 AI 回复 - _需求: 7.7_ - [ ] 13.3 测试网络诊断 - 打开网络诊断弹窗 - 执行下载测速 - 执行上传测速 - 查看诊断结果 - _需求: 7.7_ - [ ] 14. 检查点 - 审查测试结果并验证正式系统未受影响 - 汇总所有测试结果 - 识别失败的测试项 - ⚠️ **关键验证**: - [ ] 访问正式系统 http://192.168.58.20:4320,确认正常运行 - [ ] 检查正式系统数据库 `lobechat`,确认没有测试数据 - [ ] 检查正式系统容器日志,确认没有异常 - 询问用户是否需要修复失败的测试项 - [ ] 15. 生成测试报告 - [ ] 15.1 创建功能测试报告 - 列出所有测试项 - 标注通过/失败状态 - 记录测试时间 - _需求: 7.1-7.7_ - [ ] 15.2 对比正式系统和影子系统 - 列出功能差异 - 分析差异原因 - 提出修复建议 - _需求: 7.1-7.7_ - [ ] 16. 更新文档 - [ ] 16.1 更新功能恢复进度文档 - 记录恢复的文件列表 - 记录测试结果 - 更新完成状态 - _需求: 8.1, 8.4_ - [ ] 16.2 记录问题和解决方案 - 记录遇到的问题 - 记录解决方案 - 提供参考链接 - _需求: 8.2_ - [ ] 16.3 更新部署文档 - 更新部署步骤 - 更新配置说明 - 更新注意事项 - _需求: 8.3_ - [ ] 17. 最终检查点 - 确认所有功能已恢复 - 确认所有测试已通过 - 确认文档已更新 - 询问用户是否可以部署到正式系统 - [ ] 18. (可选)修复已知BUG - ⚠️ **注意**: 此任务仅在源码恢复完成后,如果需要修复BUG时执行 - [ ] 18.1 修复统计API(如需要) - 文件: `app/api/materials/stats/route.ts` - 问题: 统计可能包含软删除数据 - 修复: 添加 `where: { deletedAt: null }` 过滤 - _需求: 可选_ - [ ] 18.2 修复分页API(如需要) - 文件: `app/api/materials/route.ts` - 问题: 分页逻辑可能有问题 - 修复: 确认 skip 和 take 参数正确应用 - _需求: 可选_ - [ ] 18.3 修复分类统计(如需要) - 文件: `app/api/categories/route.ts` - 问题: 分类统计可能包含软删除数据 - 修复: 添加 `deletedAt: null` 过滤 - _需求: 可选_ ## ⚠️ 重要注意事项 ### 🔴 环境隔离 - 绝对不能混淆! **正式系统配置(端口 4320):** - 数据库:`lobechat`(192.168.58.20:5432) - Redis:端口 `6379` - 容器名:`youyidian-3d-material` - 文件存储:容器内 `/app/uploads` - S3存储:`https://s3.yydd.ai/gongxiangpan`(生产数据) **影子系统配置(端口 5320):** - 数据库:`lobechat_stage`(192.168.58.20:5432) - Redis:端口 `6380` - 容器名:`youyidian-3d-material-shadow` - 文件存储:容器内 `/app/uploads`(独立目录) - S3存储:`https://s3.yydd.ai/gongxiangpan`(可能共享,但要注意文件前缀) ### 🚨 关键操作规则 1. **只读访问正式系统**: - 只从正式系统**读取**源码文件 - 绝对不要修改正式系统的任何文件 - 绝对不要在正式系统容器内执行写操作 2. **环境变量检查**: - 提取源码后,**必须**检查 `.env` 文件 - **必须**确认数据库连接指向 `lobechat_stage` - **必须**确认 Redis 端口是 `6380` - **绝对不要**使用正式系统的 `.env` 配置 3. **数据库隔离**: - 影子系统**只能**连接 `lobechat_stage` 数据库 - 部署前**必须**验证数据库配置 - 如果连接错误,**立即停止**部署 4. **文件存储隔离**: - 影子系统的 uploads 目录与正式系统完全独立 - 不要挂载正式系统的 uploads 目录 - S3 存储如果共享,要注意文件命名避免冲突 5. **部署验证**: - 部署到影子系统前,**必须**检查 `deploy-local-build.ps1` 脚本 - **必须**确认使用 `-Target shadow` 参数 - **必须**确认脚本不会影响正式系统容器 6. **测试隔离**: - 所有测试**只在**影子系统(5320端口)进行 - 测试数据**只写入** `lobechat_stage` 数据库 - 绝对不要在正式系统上进行任何测试操作 ### 📋 部署前检查清单 在执行任务 9(部署到影子系统)之前,**必须**完成以下检查: - [ ] 确认 `.env` 文件中 `DATABASE_URL` 包含 `lobechat_stage` - [ ] 确认 `.env` 文件中 `REDIS_PORT=6380` - [ ] 确认 `deploy-local-build.ps1` 使用 `-Target shadow` 参数 - [ ] 确认部署脚本不会操作 `youyidian-3d-material` 容器 - [ ] 确认部署脚本只操作 `youyidian-3d-material-shadow` 容器 - [ ] 确认 Docker Compose 配置(如有)使用正确的端口和数据库 ### 🛡️ 安全措施 1. **备份**: 虽然只读访问正式系统,但建议先备份正式系统数据库 2. **监控**: 部署后监控正式系统,确认没有受到影响 3. **回滚**: 如果影子系统出现问题,可以快速停止容器,不影响正式系统 ## 预计时间 - 任务 1: 提取编译代码 - ✅ 已完成 - 任务 2: 反编译恢复源码 - **120 分钟**(核心任务) - 任务 3-4: 环境配置和验证 - 20 分钟 - 任务 5-6: 文件完整性验证 - 20 分钟 - 任务 7-8: 构建验证 - 15 分钟 - 任务 9: 部署到影子系统 - 20 分钟 - 任务 10-13: 功能测试 - 60 分钟 - 任务 14-17: 报告和文档 - 25 分钟 **总计**: 约 **4.5 小时**(反编译是最耗时的部分)