library-picturebook-activity/docs/project/11-java-migration-log.md
aid c99738fc46 新增 Java 转写开发日志 Day1
记录完整开发过程:模块剥离→转写(8个Phase)→数据库适配→写操作测试→
前端联调→端到端验证→权限检查→菜单修复→文档输出,含明日待续清单

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:16:15 +08:00

118 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Java 后端转写 — 开发日志
## 2026-04-02 Day1完整转写 + 联调 + 菜单修复
### 一、模块剥离
将学校端、教师端、学生端、3D建模模块代码从项目中剥离备份至 `competition-management-system-stripped-modules/`
- 移除后端school/6个子模块、ai-3d/
- 移除前端views/school/、views/workbench/ai-3d/、views/model/
- 移除 Prisma SchemaSchool/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<T> + PageResult<T> + 全局异常处理
- 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接口
- BizContest35+字段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 7UGC + 用户子女(~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测试公众端注册/报名/作品提交
- [ ] 响应数据结构精调(如有前端解析不匹配)
- [ ] 生产环境部署配置