16 KiB
实施计划:从正式系统恢复源码
概述
重要发现:
- 生产容器使用 Next.js standalone 模式部署,只包含编译后的代码
- 2.2.0版本的TypeScript源码已丢失
- 服务器上只有1.0.0版本的旧源码
恢复策略:
- ✅ 从生产容器提取编译后的代码(已完成)
- 反编译编译后的JavaScript代码,恢复TypeScript源码
- 对比本地1.0.0源码,补充缺失部分
- 重建完整的2.2.0版本源码
- 在影子系统测试验证
- 部署到生产系统
本计划描述了从编译代码反编译恢复源码、构建验证、部署测试的完整步骤。
任务
-
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_stageREDIS_PORT=6380NEXTAUTH_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(可能共享,但要注意文件前缀)
🚨 关键操作规则
-
只读访问正式系统:
- 只从正式系统读取源码文件
- 绝对不要修改正式系统的任何文件
- 绝对不要在正式系统容器内执行写操作
-
环境变量检查:
- 提取源码后,必须检查
.env文件 - 必须确认数据库连接指向
lobechat_stage - 必须确认 Redis 端口是
6380 - 绝对不要使用正式系统的
.env配置
- 提取源码后,必须检查
-
数据库隔离:
- 影子系统只能连接
lobechat_stage数据库 - 部署前必须验证数据库配置
- 如果连接错误,立即停止部署
- 影子系统只能连接
-
文件存储隔离:
- 影子系统的 uploads 目录与正式系统完全独立
- 不要挂载正式系统的 uploads 目录
- S3 存储如果共享,要注意文件命名避免冲突
-
部署验证:
- 部署到影子系统前,必须检查
deploy-local-build.ps1脚本 - 必须确认使用
-Target shadow参数 - 必须确认脚本不会影响正式系统容器
- 部署到影子系统前,必须检查
-
测试隔离:
- 所有测试只在影子系统(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: 反编译恢复源码 - 120 分钟(核心任务)
- 任务 3-4: 环境配置和验证 - 20 分钟
- 任务 5-6: 文件完整性验证 - 20 分钟
- 任务 7-8: 构建验证 - 15 分钟
- 任务 9: 部署到影子系统 - 20 分钟
- 任务 10-13: 功能测试 - 60 分钟
- 任务 14-17: 报告和文档 - 25 分钟
总计: 约 4.5 小时(反编译是最耗时的部分)