diff --git a/changelogs/2026-05/06_fix_user_review_report_reason_dict.md b/changelogs/2026-05/06_fix_user_review_report_reason_dict.md new file mode 100644 index 0000000..6d03b67 --- /dev/null +++ b/changelogs/2026-05/06_fix_user_review_report_reason_dict.md @@ -0,0 +1,82 @@ +# 补回 review_report_reason 字典 (Flyway baseline 屏蔽 V007 漏空) + +**日期**: 2026-05-06 +**类型**: fix (后端 DB 字典补漏,无代码改动,无前端影响) +**PR**: wx/HL #1739 (已合并 dev) +**关联工单**: 无独立工单 (历史漏空,前端反馈"测试服 review_report_reason 字典没有"后直接修) +**引入**: 三 PR 叠加 — #1667 + #1681 + #1684 + +## 问题 + +测试服评价举报原因字典 `review_report_reason` 缺失,前端举报弹窗下拉框拉空(或显示英文 enum value 像乱码)。 + +实测证据(测试服 admin token round-trip): +- `/admin/dict/all` 返回 156 条字典类型,**不含** `review_report_reason` +- `/admin/dict/type/10080` 返 `code=404, 字典类型不存在` +- `/admin/dict/data/review_report_reason` 返 `code=200, data=[]` + +## 根因(三 PR 叠加导致永久漏空) + +| PR | 动作 | +|---|---| +| #1667 (wx-security Phase 2B) | 加入 `V20260505_007__init_review_report_reason_dict.sql` 字典初始化 SQL | +| #1681 (oneshot 补漏) | 手工跑 V001/V002/V004/V008/V009 V*.sql,**oneshot 文件第 16 行注释明确跳过 V007**(`V007 init_review_report_reason_dict (sys_dict_data INSERT, 评估后再决定)`) | +| #1684 (Flyway 阶段 2) | `application.yml` 设 `baseline-version: 20260505.009` + `baseline-on-migrate: true`,首次启动写 baseline,**所有 ≤ baseline 的 V*.sql 永远不会被 Flyway 自动 apply**,包括 V20260505_007 | + +净结果:V20260505_007 既没被 oneshot 手工跑,也被 Flyway baseline 屏蔽自动 apply,字典数据从未落库。 + +## 修复 + +新增 `V20260507_001__init_review_report_reason_dict.sql`(版本号 > baseline 20260505.009 → Flyway 自动 apply)。 + +| 项 | 取值 | +|---|---| +| `dict_type_id` | 10080(V007 原计划占用,测试服 type/10080 返 404 已确认空闲) | +| `dict_data_id` | 100801~100807(7 条) | +| 幂等 | `INSERT IGNORE` — prod 若曾手工跑过 V007 则静默跳过不抛错 | + +字典值集与代码 `ReviewReportReason.ALLOWED` 严格一致:`SPAM`/`INSULT`/`PORN`/`POLITICS`/`FAKE`/`LEAK_PRIVACY`/`OTHER`。 + +## 影响范围 + +- **后端**: hl-user-service 一服务部署即生效 +- **前端**: 无代码改动需求 — mmg/yst 不用动 +- **数据**: 仅 `sys_dict_type` 加 1 条 + `sys_dict_data` 加 7 条 +- **回滚**: 删除 sys_dict_type/sys_dict_data 对应行 + 删 flyway_schema_history 中 V20260507_001 行 + +## 验证 + +### 测试服 round-trip(dev 部署后) + +```bash +# 期望: data 含 7 条字典数据 +curl -sk -H "Authorization: Bearer " \ + "https://api.test.1814.love:9443/admin/dict/data/review_report_reason" +# 期望返回: {"code":200,"data":[{"dictValue":"SPAM","dictLabel":"广告/营销",...}, ...7 条]} +``` + +### Redis 缓存清理(必要) + +直接 SQL INSERT 字典不会触发应用层 D3 反向索引 invalidate,user-service 部署完成后需清三件: + +```bash +redis-cli -n 0 DEL cache:dict:data:list +redis-cli -n 0 DEL cache:dict:data:by-type +redis-cli -n 0 DEL "cache:dict:data:review_report_reason" +``` + +## 部署计划 + +- ✅ dev 测试服: PR 合并后自动部署(本 changelog 写时正在 deploy panel 部署中) +- ⏳ prod: 用户手动合 dev → main 后,通过 Deploy Panel 触发 hl-user-service prod 部署。Flyway 会自动 apply V20260507_001;若 prod 此前已手工跑过 V007,`INSERT IGNORE` 兜底跳过 + +## 经验沉淀 + +落 `memory/experience/backend-dev/flyway-baseline-version-permanently-skips-old-v-sql.md`(若不存在则新建): + +**Flyway baseline-version 永久屏蔽 ≤ baseline 的 V*.sql**:接入 Flyway 时 baseline 写哪个版本,就意味着该版本 + 之前的 V*.sql 即使在 migration 目录里也永远不会被自动 apply。**接入 Flyway 前必须确认 baseline 之前的 V*.sql 在 prod/test 是否真的全部跑过**,任何一条漏跑就要么先补跑,要么发新版本号 > baseline 的 V*.sql 重做(本次踩坑)。 + +## 通知 + +- mmg(前端): 测试服部署 + 缓存清理后,举报弹窗下拉框应显 7 项中文(广告/营销、辱骂/人身攻击 等),不再空/英文 +- 用户: 部署完成 + round-trip 验收通过后告知,可挂 prod 部署