feat: add automatic badge awards

This commit is contained in:
Codex
2026-06-30 02:50:13 +08:00
parent 9a8a85a8c0
commit e035f5be9a
14 changed files with 523 additions and 26 deletions

View File

@@ -647,7 +647,17 @@ GET /api/tenant-admin/badge-grants?userId=...&badgeId=...
POST /api/tenant-admin/badge-grants
```
`PUT /api/tenant-admin/badges` 支持同租户内 `legacyId` 幂等更新;如果 `id``legacyId` 指向不同记录会返回 `BADGE_ID_CONFLICT``POST /api/tenant-admin/badge-grants` 对同一用户同一勋章幂等,不会重复生成多条发放记录。当前后端支持手动发放,自动发放规则后续由 worker/事件流补齐。
`PUT /api/tenant-admin/badges` 支持同租户内 `legacyId` 幂等更新;如果 `id``legacyId` 指向不同记录会返回 `BADGE_ID_CONFLICT``POST /api/tenant-admin/badge-grants` 对同一用户同一勋章幂等,不会重复生成多条发放记录。
当前后端已支持第一批自动发放规则:
| unlockType | 推荐 conditionField | 触发时机 |
| --- | --- | --- |
| `check_in` | `checkInStreak` | `POST /api/profile/check-in` 真实签到成功后 |
| `score` | `score` | 签到加分或反馈奖励积分成功后 |
| `feedback_resolved` | `feedbackResolvedCount` | 租户后台把反馈处理为 `resolved` 后 |
规则使用 `conditionOperator` 的合法值 `gte``gt``lte``lt``eq``conditionValue` 为数字。触发成功的接口会返回 `autoBadges`,前端可据此弹出“获得勋章”提示;如果是重复签到、重复处理反馈或已获得过同一勋章,后端不会重复返回同一发放记录。
### 模考交卷与报告
@@ -1117,7 +1127,17 @@ POST /api/profile/check-in
"pointsAdded": 10,
"streak": 1,
"score": 10,
"lastCheckInDate": "2026-06-29"
"lastCheckInDate": "2026-06-29",
"autoBadges": [
{
"badgeId": "...",
"badge": {
"name": "连续签到",
"category": "activity",
"iconUrl": "https://..."
}
}
]
}
}
```
@@ -1127,6 +1147,7 @@ POST /api/profile/check-in
- `alreadyCheckedIn=true` 时展示今日已签到,不要本地再加分。
- 积分明细调用 `GET /api/profile/score-events`
- 积分最终余额以后端 `score` 和流水为准,前端只做展示。
- 如响应包含 `autoBadges`,可展示获得勋章弹层;不要在前端根据连续天数或积分自行判断勋章是否解锁。
题目页、资料页或视频页可提交反馈:
@@ -1145,7 +1166,7 @@ POST /api/profile/check-in
- `questionId` 如存在,后端会校验题目必须属于当前租户。
- 反馈状态由租户后台处理,学生可用 `GET /api/profile/feedbacks` 查看自己的反馈历史。
- 租户后台处理反馈时,奖励积分由后端 `idempotency_key` 保证不会重复发放,前端不要重复叠加。
- 租户后台处理反馈时,奖励积分由后端 `idempotency_key` 保证不会重复发放,前端不要重复叠加;状态处理响应可能返回 `autoBadges`,后台或学生消息中心后续可据此做获得勋章提醒
## 题库新模型接入方式