forked from baskbuddy/zhangshun
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.5 KiB
4.5 KiB
评价审核与防刷基础模块接口说明
轻松聘 (mydreamjob) · 评价审核与防刷基础模块 基础路径:
/api/v1· 审核管理接口仅 ADMIN;评价公开接口保持原路径
1. 概述
在岗位评价基础上加入确定性规则预审(非 AI)与管理员审核:
- 无风险评价 →
moderationStatus = AUTO_APPROVED,行为与旧版一致(同步 200、公开展示); - 命中规则 → 评价仍保存成功,
moderationStatus = PENDING,不进入公开列表/详情/汇总; - 管理员可
APPROVED(进入公开)或REJECTED(永不公开); - 公开查询只返回
status=PUBLISHED且moderationStatus ∈ {AUTO_APPROVED, APPROVED}。
审核状态值:AUTO_APPROVED / PENDING / APPROVED / REJECTED。
2. 防刷规则(确定性 MVP)
| 原因码 | 规则 | 权重 |
|---|---|---|
SENSITIVE_WORD |
内容包含配置中的敏感词(app.review-moderation.sensitive-words) |
+2 |
CONTACT_INFO |
包含手机号 / QQ / 微信 / 外链 | +2 |
PATTERN_ANOMALY |
连续重复字符或异常超长(≥800 字) | +1 |
RAPID_SUBMISSION |
同一用户窗口期内重复提交(默认 60s 内 ≥3) | +1 |
DUPLICATE_CONTENT |
同岗位窗口期内出现相同内容 SHA-256(默认 300s) | +2 |
ABUSIVE_BATCH |
同一 IP/User-Agent 哈希窗口期批量(默认 300s 内 ≥5) | +2 |
- 敏感词来自配置项,不硬编码在 Controller;命中时只返回原因码,不返回敏感词原文;
- 原始 IP / User-Agent 不落明文,仅存 SHA-256 哈希;
- 内容哈希只用于风险识别,不影响正常评价。
3. 公开查询兼容(不变路径)
GET /jobs/{jobId}/reviews/GET /jobs/{jobId}/reviews/{reviewId}/GET /jobs/{jobId}/reviews/summary仅返回/统计AUTO_APPROVED与APPROVED的评价;PENDING/REJECTED不公开。- 八维
dimensionScores与dimensionSummary逻辑不变。
4. 审核管理接口(仅 ADMIN,身份来自 JWT)
4.1 待审列表 GET /admin/reviews/pending
- 仅 ADMIN(非 ADMIN → 403,未登录 → 401);分页;
- 可选筛选:
jobId、riskLevel(LOW/MEDIUM/HIGH)、createdFrom、createdTo; - 返回:
reviewId, jobId, studentUserId, rating, content, tags, dimensionScores, moderationStatus, reasonCodes, riskLevel, moderationScore, createdAt; - 不返回明文 IP / User-Agent / 内部哈希。
4.2 审核决策 POST /admin/reviews/{reviewId}/decision
{ "decision": "APPROVED|REJECTED", "reason": "人工审核说明(可选)" }
- 仅 ADMIN;仅
PENDING可审,已审核重复提交 → 409REVIEW_ALREADY_DECIDED; APPROVED→ 进入公开列表/汇总;REJECTED→ 永不公开;- 决策写入
review_moderation_history与audit_logs;审核人从 JWT 获取。
4.3 审核历史 GET /admin/reviews/history
- 仅 ADMIN;分页;返回
id, reviewId, action, actorUserId, reasonCodes, reason, createdAt(含自动预审标记与管理员决策)。
5. 权限
| 操作 | ADMIN | 学生本人 | 其他学生 | 企业 | 未登录 |
|---|---|---|---|---|---|
| 创建评价 | — | ✅ | 403(重复→409) | 403 | 401 |
| 评价列表/详情/汇总 | 公开 | 公开 | 公开 | 公开 | ✅ |
| 待审/决策/历史 | ✅ | 403 | 403 | 403 | 401 |
审核人/操作者一律来自 JWT,不信任请求体 userId。
6. 数据库(V18)
V18__job_review_moderation.sql:
job_reviews增加:moderation_status(默认AUTO_APPROVED,历史数据自动生效)、moderation_reason(原因码 JSON)、moderation_score、moderation_updated_at、risk_level、content_hash、ip_hash、ua_hash(SHA-256,不存明文);moderation_status建索引;- 新表
review_moderation_history(自动预审标记 + 管理员决策,级联删除); - 不改既有表结构,V1-V17 历史迁移不动。
7. 测试
覆盖:普通评价 AUTO_APPROVED 且公开、敏感词/联系方式 PENDING 且不公开、内容哈希风险、IP/UA 仅存哈希、审核通过后公开、审核拒绝不公开、非 ADMIN 403、未登录 401、重复审核 409、历史迁移默认 AUTO_APPROVED、维度仍可保存读取、并发重复仅一条成功、审核写入 audit_logs、既有 526 测试回归。
8. 已知限制
- 规则为确定性 MVP,不声称 AI;权重/窗口为默认配置,可按运营调整。
moderation_reason仅存原因码,敏感词原文不落库、不返回。- 已审核(
APPROVED/REJECTED)评价如需复审需产品确认(当前不可重复决策)。 - OpenAPI 快照:
docs/openapi-rc.json由 H2 集成测试上下文导出(59 路径),现网可用GET /api/v1/v3/api-docs重新导出。