library-picturebook-activity/前后端接口差异对比.md
En b805f456a6 feat: 完善后端基础架构和登录功能
- 添加 Lombok 配置支持
- 完善枚举类和常量定义
- 新增工具类(TraceId、限流、OSS 等)
- 添加切面(日志、限流、TraceId)
- 更新数据库索引规范(应用层防重)
- 登录页面样式优化
- 前后端项目文档补充
2026-03-31 13:58:28 +08:00

415 lines
20 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.

# 前后端接口差异对比报告
> 分析时间2026-03-30
> 前端目录java-frontend/src/api/
> 后端目录java-backend/src/main/java/com/lesingle/creation/controller/
---
## 核心问题总结
### 1. 路径前缀不一致(最严重)
| 模块 | 前端路径前缀 | 后端路径前缀 | 差异 |
|:------|:------------|:------------|:-----|
| 竞赛管理 | `/contests` | `/api/contests` | 缺少 `/api` |
| 作业管理 | `/homework/homeworks` | `/api/homeworks` | 路径结构不同 |
| AI 3D | `/ai-3d` | `/api/ai-3d` | 缺少 `/api` |
**影响**:前端所有 API 请求都无法匹配到后端接口
### 2. HTTP 方法不一致
| 模块 | 前端方法 | 后端方法 | 接口 |
|:------|:--------|:--------|:-----|
| 竞赛更新 | PATCH | PUT | `/contests/{id}` |
| 团队更新 | PATCH | PUT | `/contests/teams/{id}` |
| 评审规则更新 | PATCH | PUT | `/contests/review-rules/{id}` |
| 作业更新 | PATCH | PUT | `/homework/homeworks/{id}` |
| AI 3D 重试 | POST | PUT | `/ai-3d/tasks/{id}/retry` |
### 3. 接口路径不一致
| 模块 | 前端路径 | 后端路径 | 说明 |
|:------|:--------|:--------|:-----|
| 作品列表 | `/contests/works` | `/api/contests/works/page` | 后端多了 `/page` |
| 作品提交 | `/contests/works/submit` | `/api/contests/works` | 路径不同 |
| 作业列表 | `/homework/homeworks` | `/api/homeworks/page` | 后端多了 `/page` |
| 作业提交 | `/homework/submissions` | `/api/homeworks/submit` | 路径不同 |
| 作业批改 | `/homework/scores` | `/api/homeworks/review` | 路径不同 |
| AI 3D 创建 | `/ai-3d/generate` | `/api/ai-3d` | 路径不同 |
| AI 3D 列表 | `/ai-3d/tasks` | `/api/ai-3d/page` | 后端多了 `/page` |
---
## 模块详细对比
### 一、竞赛管理模块 (contests.ts)
#### 1.1 活动管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/stats` | GET `/api/contests/stats` | ⚠️ | 路径前缀不一致 |
| GET `/contests` | GET `/api/contests` | ⚠️ | 路径前缀不一致 |
| GET `/contests/my-contests` | ❌ | ❌ | **后端缺失** |
| GET `/contests/{id}` | GET `/api/contests/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests` | POST `/api/contests` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/{id}` | PUT `/api/contests/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| PATCH `/contests/{id}/publish` | PATCH `/api/contests/{id}/publish` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/{id}/finish` | PATCH `/api/contests/{id}/finish` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/{id}/reopen` | PATCH `/api/contests/{id}/reopen` | ⚠️ | 路径前缀不一致 |
| DELETE `/contests/{id}` | DELETE `/api/contests/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.2 报名管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/registrations/stats` | GET `/api/contests/registrations/stats` | ⚠️ | 路径前缀不一致 |
| GET `/contests/registrations` | GET `/api/contests/registrations` | ⚠️ | 路径前缀不一致 |
| GET `/contests/registrations/my/{contestId}` | GET `/api/contests/registrations/my/{contestId}` | ⚠️ | 路径前缀不一致 |
| GET `/contests/registrations/{id}` | GET `/api/contests/registrations/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/registrations` | POST `/api/contests/registrations` | ⚠️ | 路径前缀不一致 |
| POST `/contests/registrations/{id}/teachers` | POST `/api/contests/registrations/{id}/teachers` | ⚠️ | 路径前缀不一致 |
| DELETE `/contests/registrations/{id}/teachers/{teacherUserId}` | ❌ | ❌ | **后端缺失** |
| PATCH `/contests/registrations/{id}/review` | PATCH `/api/contests/registrations/{id}/review` | ⚠️ | 路径前缀不一致 |
| DELETE `/contests/registrations/{id}` | DELETE `/api/contests/registrations/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.3 团队管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/teams/contest/{contestId}` | ❌ | ❌ | **后端缺失** |
| GET `/contests/teams/{id}` | GET `/api/contests/teams/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/teams` | POST `/api/contests/teams` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/teams/{id}` | PUT `/api/contests/teams/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| POST `/contests/teams/{teamId}/members` | POST `/api/contests/teams/{id}/members` | ⚠️ | 参数名不同 + 路径前缀 |
| DELETE `/contests/teams/{teamId}/members/{userId}` | DELETE `/api/contests/teams/{id}/members/{userId}` | ⚠️ | 参数名不同 + 路径前缀 |
| DELETE `/contests/teams/{id}` | DELETE `/api/contests/teams/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.4 作品管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/works/stats` | GET `/api/contests/works/stats` | ⚠️ | 路径前缀不一致 |
| GET `/contests/works` | GET `/api/contests/works/page` | ⚠️ | **路径不同** + 前缀 |
| GET `/contests/works/guided` | ❌ | ❌ | **后端缺失** |
| GET `/contests/works/{id}` | GET `/api/contests/works/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/works/submit` | POST `/api/contests/works` | ⚠️ | **路径不同** + 前缀 |
| GET `/contests/works/registration/{id}/versions` | ❌ | ❌ | **后端缺失** |
| DELETE `/contests/works/{id}` | DELETE `/api/contests/works/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.5 评审管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| POST `/contests/reviews/assign` | POST `/api/contests/reviews/assign` | ⚠️ | 路径前缀不一致 |
| POST `/contests/reviews/batch-assign` | POST `/api/contests/reviews/batch-assign` | ⚠️ | 路径前缀不一致 |
| POST `/contests/reviews/auto-assign` | ❌ | ❌ | **后端缺失** |
| POST `/contests/reviews/score` | POST `/api/contests/reviews/score` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/reviews/score/{scoreId}` | PUT `/api/contests/reviews/score/{scoreId}` | ⚠️ | 方法不同 + 路径前缀 |
| GET `/contests/reviews/assigned` | GET `/api/contests/reviews/my-assignments` | ⚠️ | **路径不同** + 前缀 |
| GET `/contests/reviews/progress/{contestId}` | ❌ | ❌ | **后端缺失** |
| GET `/contests/reviews/work-status/{contestId}` | ❌ | ❌ | **后端缺失** |
| GET `/contests/reviews/work/{workId}/scores` | GET `/api/contests/reviews/works/{workId}/scores` | ⚠️ | 路径不同 + 前缀 |
| GET `/contests/reviews/work/{workId}/final-score` | ❌ | ❌ | **后端缺失** |
| POST `/contests/reviews/replace-judge` | ❌ | ❌ | **后端缺失** |
| GET `/contests/reviews/judge/contests` | ❌ | ❌ | **后端缺失** |
| GET `/contests/reviews/judge/contests/{contestId}/works` | ❌ | ❌ | **后端缺失** |
#### 1.6 公告管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/notices/contest/{contestId}` | GET `/api/contests/notices/contest/{contestId}` | ⚠️ | 路径前缀不一致 |
| GET `/contests/notices` | GET `/api/contests/notices` | ⚠️ | 路径前缀不一致 |
| GET `/contests/notices/{id}` | GET `/api/contests/notices/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/notices` | POST `/api/contests/notices` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/notices/{id}` | PUT `/api/contests/notices/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| DELETE `/contests/notices/{id}` | DELETE `/api/contests/notices/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.7 评委管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/judges/contest/{contestId}` | GET `/api/contests/judges/contest/{contestId}` | ⚠️ | 路径前缀不一致 |
| GET `/contests/judges/{id}` | GET `/api/contests/judges/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/judges` | POST `/api/contests/judges` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/judges/{id}` | PUT `/api/contests/judges/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| DELETE `/contests/judges/{id}` | DELETE `/api/contests/judges/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.8 评审规则 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/contests/review-rules` | GET `/api/contests/review-rules` | ⚠️ | 路径前缀不一致 |
| GET `/contests/review-rules/select` | GET `/api/contests/review-rules/select` | ⚠️ | 路径前缀不一致 |
| GET `/contests/review-rules/{id}` | GET `/api/contests/review-rules/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/review-rules` | POST `/api/contests/review-rules` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/review-rules/{id}` | PUT `/api/contests/review-rules/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| DELETE `/contests/review-rules/{id}` | DELETE `/api/contests/review-rules/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/contests/review-rules/dimensions` | POST `/api/contests/review-rules/dimensions` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/review-rules/dimensions/{id}` | PUT `/api/contests/review-rules/dimensions/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| DELETE `/contests/review-rules/dimensions/{id}` | DELETE `/api/contests/review-rules/dimensions/{id}` | ⚠️ | 路径前缀不一致 |
#### 1.9 成果管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| POST `/contests/results/{contestId}/calculate-scores` | POST `/api/contests/results/{contestId}/calculate-scores` | ⚠️ | 路径前缀不一致 |
| POST `/contests/results/{contestId}/calculate-rankings` | POST `/api/contests/results/{contestId}/calculate-rankings` | ⚠️ | 路径前缀不一致 |
| PATCH `/contests/results/work/{workId}/award` | PATCH `/api/contests/results/work/{workId}/award` | ⚠️ | 路径前缀不一致 |
| POST `/contests/results/{contestId}/batch-set-awards` | POST `/api/contests/results/{contestId}/batch-set-awards` | ⚠️ | 路径前缀不一致 |
| POST `/contests/results/{contestId}/auto-set-awards` | POST `/api/contests/results/{contestId}/auto-set-awards` | ⚠️ | 路径前缀不一致 |
| POST `/contests/results/{contestId}/publish` | POST `/api/contests/results/{contestId}/publish` | ⚠️ | 路径前缀不一致 |
| POST `/contests/results/{contestId}/unpublish` | POST `/api/contests/results/{contestId}/unpublish` | ⚠️ | 路径前缀不一致 |
| GET `/contests/results/{contestId}` | GET `/api/contests/results/{contestId}` | ⚠️ | 路径前缀不一致 |
| GET `/contests/results/{contestId}/summary` | GET `/api/contests/results/{contestId}/summary` | ⚠️ | 路径前缀不一致 |
---
### 二、作业管理模块 (homework.ts)
#### 2.1 作业管理 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/homework/homeworks` | GET `/api/homeworks/page` | ❌ | **路径结构完全不同** |
| GET `/homework/homeworks/my` | ❌ | ❌ | **后端缺失** |
| GET `/homework/homeworks/{id}` | GET `/api/homeworks/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/homework/homeworks` | POST `/api/homeworks` | ⚠️ | 路径前缀不一致 |
| PATCH `/homework/homeworks/{id}` | PUT `/api/homeworks/{id}` | ⚠️ | 方法不同 + 路径前缀 |
| POST `/homework/homeworks/{id}/publish` | GET `/api/homeworks/{id}/publish` | ❌ | **方法不同** + 路径前缀 |
| POST `/homework/homeworks/{id}/unpublish` | ❌ | ❌ | **后端缺失** |
| DELETE `/homework/homeworks/{id}` | DELETE `/api/homeworks/{id}` | ⚠️ | 路径前缀不一致 |
#### 2.2 提交记录 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/homework/submissions` | ❌ | ❌ | **后端缺失** |
| GET `/homework/submissions/{id}` | ❌ | ❌ | **后端缺失** |
| GET `/homework/submissions/class-tree` | ❌ | ❌ | **后端缺失** |
| GET `/homework/submissions/my/{homeworkId}` | ❌ | ❌ | **后端缺失** |
| POST `/homework/submissions` | POST `/api/homeworks/submit` | ❌ | **路径不同** + 前缀 |
#### 2.3 评审规则 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| GET `/homework/review-rules` | GET `/api/homeworks/review-rules` | ⚠️ | 路径前缀不一致 |
| GET `/homework/review-rules/select` | ❌ | ❌ | **后端缺失** |
| GET `/homework/review-rules/{id}` | GET `/api/homeworks/review-rules/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/homework/review-rules` | POST `/api/homeworks/review-rules` | ⚠️ | 路径前缀不一致 |
| PATCH `/homework/review-rules/{id}` | ❌ | ❌ | **后端缺失** |
| DELETE `/homework/review-rules/{id}` | ❌ | ❌ | **后端缺失** |
#### 2.4 评分 API
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| POST `/homework/scores` | POST `/api/homeworks/review` | ❌ | **路径不同** + 前缀 |
| POST `/homework/scores/{submissionId}/violation` | ❌ | ❌ | **后端缺失** |
| POST `/homework/scores/{submissionId}/reset` | ❌ | ❌ | **后端缺失** |
---
### 三、AI 3D 模块 (ai-3d.ts)
| 前端接口 | 后端接口 | 状态 | 差异说明 |
|:---------|:---------|:-----|:---------|
| POST `/ai-3d/generate` | POST `/api/ai-3d` | ❌ | **路径不同** + 前缀 |
| GET `/ai-3d/tasks` | GET `/api/ai-3d/page` | ❌ | **路径不同** + 前缀 |
| GET `/ai-3d/tasks/{id}` | GET `/api/ai-3d/{id}` | ⚠️ | 路径前缀不一致 |
| POST `/ai-3d/tasks/{id}/retry` | PUT `/api/ai-3d/{id}/retry` | ❌ | **方法不同** + 路径前缀 |
| DELETE `/ai-3d/tasks/{id}` | ❌ | ❌ | **后端缺失** |
---
## 缺失接口汇总
### 后端需要补充的接口(按优先级)
#### P0 - 核心功能缺失
1. **竞赛管理**
- `GET /api/contests/my-contests` - 我参与的活动列表
2. **作品管理**
- `GET /api/contests/works/guided` - 教师指导的作品列表
- `GET /api/contests/works/registration/{id}/versions` - 作品版本列表
3. **评审管理**
- `POST /api/contests/reviews/auto-assign` - 自动分配评委
- `GET /api/contests/reviews/progress/{contestId}` - 评审进度统计
- `GET /api/contests/reviews/work-status/{contestId}` - 作品状态统计
- `GET /api/contests/reviews/work/{workId}/final-score` - 计算最终得分
- `POST /api/contests/reviews/replace-judge` - 替换评委
- `GET /api/contests/reviews/judge/contests` - 评委参与的活动列表
- `GET /api/contests/reviews/judge/contests/{contestId}/works` - 评委的作品列表
4. **作业管理**
- `GET /api/homeworks/my` - 我的作业列表(学生端)
- `POST /api/homeworks/homeworks/{id}/unpublish` - 取消发布作业
- `GET /api/homeworks/submissions` - 提交记录列表
- `GET /api/homeworks/submissions/{id}` - 提交记录详情
- `GET /api/homeworks/submissions/class-tree` - 班级树结构
- `GET /api/homeworks/submissions/my/{homeworkId}` - 我的提交记录
- `POST /api/homeworks/scores` - 提交评分
- `POST /api/homeworks/scores/{submissionId}/violation` - 标记违规
- `POST /api/homeworks/scores/{submissionId}/reset` - 重置评分
5. **评审规则**
- `GET /api/homeworks/review-rules/select` - 获取可选的评审规则
- `PUT /api/homeworks/review-rules/{id}` - 更新评审规则
- `DELETE /api/homeworks/review-rules/{id}` - 删除评审规则
6. **AI 3D**
- `DELETE /api/ai-3d/tasks/{id}` - 删除任务
#### P1 - 重要功能缺失
1. **报名管理**
- `DELETE /api/contests/registrations/{id}/teachers/{teacherUserId}` - 移除指导老师
2. **团队管理**
- `GET /api/contests/teams/contest/{contestId}` - 按活动查询团队列表
#### P2 - 辅助功能缺失
1. **其他缺失模块**(完全未实现)
- 认证模块 (Auth)
- 文件上传模块 (Upload)
- 系统日志模块 (Logs)
- 公共接口模块 (Public)
- 评委管理模块 (Judges Management)
- 学校组织模块 (School/Grade/Class/Department/Teacher/Student)
---
## 修复方案建议
### 方案一:修改前端 API 路径(推荐)
**优点**
- 后端遵循标准 RESTful 规范(`/api/` 前缀)
- 后端使用 PUT 进行全量更新,符合 REST 惯例
- 前端只需修改 API 客户端文件
**缺点**
- 需要修改前端所有 API 文件
**修改内容**
```typescript
// contests.ts - 所有路径添加 /api 前缀
- request.get("/contests/stats")
+ request.get("/api/contests/stats")
// homework.ts - 调整路径结构
- request.get("/homework/homeworks")
+ request.get("/api/homeworks/page")
- request.post("/homework/submissions")
+ request.post("/api/homeworks/submit")
// ai-3d.ts - 所有路径添加 /api 前缀
- request.post("/ai-3d/generate")
+ request.post("/api/ai-3d/generate")
```
### 方案二:修改后端 Controller
**优点**
- 前端代码无需修改
**缺点**
- 后端路径规范不统一
- 需要添加额外的路由映射
**修改内容**
```java
// ContestController.java - 添加额外路由
@RequestMapping("/contests") // 新增:兼容前端路径
@RequestMapping("/api/contests") // 保留:标准路径
// HomeworkController.java - 修改路径
@RequestMapping("/homework/homeworks") // 修改为与前端一致
@RequestMapping("/api/homeworks")
// 修改 HTTP 方法
@PutMapping("/{id}") @PatchMapping("/{id}")
```
### 方案三:双向调整(推荐)
**分阶段修复**
1. **阶段一**后端补充缺失接口P0 优先级)
2. **阶段二**:前端统一添加 `/api` 前缀
3. **阶段三**:统一 HTTP 方法(更新使用 PUT
---
## 修改清单
### 前端需要修改的文件
| 文件 | 修改内容 | 行数 |
|:------|:--------|:-----|
| `src/api/contests.ts` | 所有路径添加 `/api` 前缀,共 47 个接口 | ~1400 行 |
| `src/api/homework.ts` | 路径结构调整,共 24 个接口 | ~400 行 |
| `src/api/ai-3d.ts` | 所有路径添加 `/api` 前缀,共 5 个接口 | ~120 行 |
### 后端需要修改的 Controller
| Controller | 修改内容 |
|:----------|:--------|
| `ContestController.java` | 无需修改路径,需保持 `/api/contests` |
| `HomeworkController.java` | 无需修改路径,已使用 `/api/homeworks` |
| `AI3DTaskController.java` | 无需修改路径,已使用 `/api/ai-3d` |
### 后端需要补充的接口
共需补充 **28 个接口**,分布在以下 Controller
| Controller | 需补充接口数 |
|:----------|:------------|
| `ContestController.java` | 1 |
| `ContestWorkController.java` | 2 |
| `ContestReviewController.java` | 7 |
| `HomeworkController.java` | 11 |
| `HomeworkReviewRuleController.java` | 3 |
| `AI3DTaskController.java` | 1 |
| `ContestRegistrationController.java` | 1 |
| `ContestTeamController.java` | 1 |
| **新增 Controller** | |
| `AuthController.java` | 认证模块(完整) |
| `UploadController.java` | 文件上传(完整) |
| `SysLogController.java` | 系统日志(完整) |
| `PublicController.java` | 公共接口(完整) |
| `SchoolController.java` | 学校组织模块(完整) |
---
## 下一步行动
1. **确认 API 规范**
- 确认前后端统一使用 `/api/` 前缀
- 确认更新接口统一使用 PUT 方法
2. **补充缺失接口**(后端)
- 按优先级分批实现缺失接口
- 优先补充 P0 核心功能接口
3. **修改前端路径**(前端)
- 统一添加 `/api` 前缀
- 调整作业模块路径结构
4. **联调测试**
- 修复后进行前后端联调
- 使用 Swagger 文档验证接口
5. **生成 API 文档**
- 使用 Swagger/OpenAPI 生成标准文档
- 作为前后端对接的标准