38 lines
1.3 KiB
Markdown
38 lines
1.3 KiB
Markdown
# Phase 15 Completion Report
|
||
|
||
## Status
|
||
✅ Completed
|
||
|
||
## Implemented
|
||
|
||
### P15-T01 ~ P15-T08: 签到核心
|
||
- [x] `CheckinService` — Token生成/扫码签到/手工签到/签到统计
|
||
- [x] `CheckinController` — 4个API端点
|
||
- [x] HMAC-SHA256 签名Token(不含敏感明文)
|
||
- [x] Redis缓存防重放(Token单次使用)
|
||
- [x] Token过期检查(默认30分钟)
|
||
- [x] 重复签到幂等处理
|
||
- [x] 审计日志记录
|
||
|
||
### Miniapp 页面
|
||
- [x] U31 签到码页 — Token展示 + 复制 + 刷新
|
||
|
||
## Core Invariants 已保护
|
||
- ✅ **二维码不含敏感明文** — Token为HMAC签名,不暴露userId/身份证/手机号
|
||
- ✅ **Token过期不可用** — 服务端校验时间戳
|
||
- ✅ **重复签到幂等** — 已签到用户再次扫码返回成功而非新增记录
|
||
- ✅ **仅approved用户可签到** — 未审核通过不能签到
|
||
- ✅ **志愿者Scope限制** — 通过Operator权限控制
|
||
|
||
## API 端点(4个)
|
||
POST /activities/{id}/checkin-token(生成签到码)
|
||
POST /activities/operator/checkin/scan(扫码签到)
|
||
POST /activities/operator/{id}/checkin/manual(手工签到)
|
||
GET /activities/operator/{id}/checkin-stats(签到统计)
|
||
|
||
## Tests
|
||
- `CheckinServiceTest`: 4 个用例
|
||
|
||
## Next Phase
|
||
Phase 16: 活动反馈与互选(activity_feedback + activity_interests + 双向互选Match)
|