diff --git a/docs/project/11-java-migration-log.md b/docs/project/11-java-migration-log.md new file mode 100644 index 0000000..968156d --- /dev/null +++ b/docs/project/11-java-migration-log.md @@ -0,0 +1,117 @@ +# Java 后端转写 — 开发日志 + +## 2026-04-02 Day1:完整转写 + 联调 + 菜单修复 + +### 一、模块剥离 + +将学校端、教师端、学生端、3D建模模块代码从项目中剥离,备份至 `competition-management-system-stripped-modules/`。 + +- 移除后端:school/(6个子模块)、ai-3d/ +- 移除前端:views/school/、views/workbench/ai-3d/、views/model/ +- 移除 Prisma Schema:School/Grade/Department/Class/Teacher/Student/StudentInterestClass/AI3DTask 共8个模型 +- 清理跨模块引用:registrations.service(教师判断改为角色判断)、homework services(移除 class/grade 查询) +- 保留 API 存根文件:students.ts/teachers.ts/ai-3d.ts(赛事组件有引用) + +### 二、Java 后端转写(239个文件,~256个API) + +#### Phase 0:项目脚手架 +- Spring Boot 3.2 + Java 17 + MyBatis-Plus 3.5 +- JWT 认证 + Spring Security + AOP 权限注解 +- 统一响应 Result + PageResult + 全局异常处理 +- Flyway 迁移脚本(V1 表重命名 + V2 新审计字段) + +#### Phase 1:认证/用户/角色/权限/租户(~35接口) +- 6个实体 + 6个Mapper + 8个DTO + 5个Service + 5个Controller +- JWT payload 与 NestJS 兼容:{sub: userId, username, tenantId} + +#### Phase 2:菜单/字典/配置/日志(~25接口) +- 菜单树构建(4级嵌套)+ tenant_menus 过滤 +- 日志统计(Top10操作 + 按日聚合) + +#### Phase 3:赛事核心(~46接口) +- BizContest(35+字段,7个JSON列,JacksonTypeHandler) +- 报名 + 作品提交 + 团队 + 附件 + 公告 + +#### Phase 4:评审/计分/成果(~52接口) +- 4种计分策略:average / max / weighted / remove_max_min +- 自动分配(轮询,3评委/作品) +- Dense ranking 排名 + 自动奖项分配 +- 评委库管理 + +#### Phase 5:作业模块(~20接口) +#### Phase 6:公众端API(~55接口,9个Controller) +#### Phase 7:UGC + 用户子女(~15接口,9个实体) +#### Phase 8:文件上传/OSS(腾讯云COS + 本地回退) + +### 三、数据库适配 + +| 修复项 | 说明 | +|--------|------| +| configs 表添加 valid_state 列 | BaseEntity 映射需要 | +| t_contest_registration 表添加 valid_state 列 | 同上 | +| 所有表 modify_time 添加 DEFAULT CURRENT_TIMESTAMP(3) | 非BaseEntity表INSERT会报错 | +| SysLogMapper SQL 表名修正 | @Select 注解中用了新表名 | +| `rank` 加反引号 | MySQL 保留字 | +| gdlib 租户补全全套权限码(97个) | 缺少 work:submit 等权限 | +| JDBC characterEncoding=UTF-8 | 不支持 utf8mb4 | + +### 四、写操作测试(22/22通过) + +覆盖:用户CRUD、角色CRUD、赛事创建(含JSON)、报名、审核、作品提交、评委分配、评分、计算得分/排名/奖项、发布成果、公众注册、内容审核、文件上传。 + +修复:PATCH 方法去掉 @Valid(部分更新不应强制校验所有必填字段)、文件上传用绝对路径。 + +### 五、前端联调(20页面,69+ API调用,零错误) + +Playwright 自动化测试覆盖超管端、租户端、公众端所有核心页面。 + +修复:registrations/stats 和 works/stats 的 contestId 改为可选参数。 + +### 六、端到端链路验证(16/16通过) + +完整活动生命周期:租户创建活动 → 发布 → 公众报名 → 审核 → 提交作品 → 添加评委 → 分配 → 评分 → 计算得分 → 排名 → 奖项 → 发布成果 → 超管查看。 + +### 七、权限检查(67/67通过) + +所有端所有模块的读写接口权限测试,零403错误。 + +### 八、菜单修复 + +| 问题 | 根因 | 修复 | +|------|------|------| +| 超管端显示全部52个菜单 | getUserMenus 对超管返回所有菜单 | 超管也按 tenant_menus 过滤 | +| 超管端包含数据统计 | 错误分配,数据统计是租户端专属 | 从超管 tenant_menus 移除52/53/54 | +| gdlib 菜单包含超管模块 | 远程数据库分配错误 | 重置为正确的18条 | +| gdlib 登录跳到 /super/ | Java 后端只支持 X-Tenant-Id header | 增加 tenantCode body 参数支持 | +| Knife4j 启动报错 | 4.5.0 与 Spring Boot 3.2.5 不兼容 | 降为 4.4.0 | + +### 九、文档输出 + +- `docs/design/menu-config.md` — 各端菜单配置规范(完整ID表+登录信息+权限码) +- `docs/project/10-java-backend-test-plan.md` — 完整测试规划(190条用例) +- `backend-java/src/main/resources/db/init.sql` — 数据库初始化脚本(41张新表名) + +### 十、提交记录 + +| Commit | 内容 | +|--------|------| +| bead1cf | 剥离学校/教师/学生/3D模块 | +| 096d06a | Java 后端完整转写(239文件) | +| a6b0565 | 数据库导出 + 权限补全 | +| 58c232d | 表名规范化 + Flyway启用 | +| 5c0d87d | 干净的 init.sql 初始化脚本 | +| 5b5af63 | 超管端菜单修复 + Knife4j降版本 | +| fd9c739 | 租户端登录修复 + gdlib菜单修正 | +| e9676ea | 菜单配置规范文档 | +| 0b989b0 | 文档完善(全量ID表+调试指南) | + +--- + +### 明日待续 + +- [ ] P1测试:超管端各页面数据展示验证 +- [ ] P1测试:租户端活动全流程操作 +- [ ] P2测试:评委端评审流程 +- [ ] P2测试:公众端注册/报名/作品提交 +- [ ] 响应数据结构精调(如有前端解析不匹配) +- [ ] 生产环境部署配置