feat: add practice session resume

This commit is contained in:
Codex
2026-06-29 15:19:35 +08:00
parent b96897b2be
commit 07a6edeea2
12 changed files with 291 additions and 12 deletions

View File

@@ -153,6 +153,7 @@ tenant:<tenantId>:theme
| 分类树 | `/api/catalog/content-nodes?entryId=...&parentId=root` |
| 题目列表 | `/api/catalog/question-collections``/api/catalog/question-collections/questions` |
| 开始练习 | `POST /api/learning/practice-sessions` |
| 恢复练习 | `GET /api/learning/practice-sessions/detail?practiceSessionId=...` |
| 提交答案 | `POST /api/learning/answers` |
| 交卷/报告 | `POST /api/learning/practice-sessions/submit``GET /api/learning/practice-sessions/report``GET /api/learning/practice-reports` |
| 错题本 | `GET /api/learning/wrong-questions``POST /api/learning/wrong-questions/resolve` |
@@ -232,6 +233,44 @@ tenant:<tenantId>:theme
- `PRACTICE_SESSION_QUESTION_FORBIDDEN`:说明提交答案的题目不在本次 session 快照内,应清理本地异常进度并重新开始。
- 提交答案必须传 `practiceSessionId`;后端会拒绝不属于本人有效 session 的题目。
### 断点续练
Taro 可以缓存当前题号和答题卡用于刷新恢复体验,但跨设备、清缓存、小程序重启后的权威恢复必须调用:
```text
GET /api/learning/practice-sessions/detail?practiceSessionId=<sessionId>
```
响应会返回:
```json
{
"item": {
"id": "...",
"status": "active",
"questionIds": ["..."],
"questions": [],
"answersByQuestion": {
"<questionId>": {
"selectedOptions": ["1"],
"answerText": null,
"isCorrect": true,
"answeredAt": "..."
}
},
"expiresAt": "..."
}
}
```
前端处理规则:
- 继续练习入口优先从 `GET /api/learning/practice-sessions/history?status=active` 获取未完成 session再带 `practiceSessionId` 进入练习页。
- 练习页如果 URL 有 `practiceSessionId`,先调用 detail 恢复后端题目快照和最新答案,不要新建 session。
- `answersByQuestion` 是同一题的最新答题记录,答题卡、正确/错误统计和解析展示以它为准。
- 倒计时以 `expiresAt` 计算剩余时间;不要用本地启动时间重新生成考试时长。
- detail 只返回当前用户自己的 session跨用户或跨租户读取会返回 `PRACTICE_SESSION_NOT_FOUND`
## 提交答案契约
客观题、主观题都统一调用: