feat: 通知 mmg - 轮播图主题无数据修复 + 字典/菜单产品线改名为主题 (PR #1837)

这个提交包含在:
API Changelog Bot 2026-05-07 19:13:21 +08:00
父节点 f839745b84
当前提交 acb881a121

查看文件

@ -0,0 +1,88 @@
# 修复轮播图「链接目标=主题」无数据 + 字典/菜单产品线统一改名为主题
**日期**: 2026-05-07
**类型**: 后端 BUG 修复 + DB 文案改名(前端有少量配合改动)
**模块**: hl-product-service-v2 + hl-user-serviceDB migration
**关联**: Issue #1836 / PR #1837 (已合并 dev)
**通知**: @mmg
---
## 后端修了什么
### 1. BUG 修复 — 轮播图编辑「链接类型=产品线」点击「链接目标」弹窗显示"无数据"
**根因**`ProductLinePageReqVO.productType` 字段 `String` 类型,Mapper 用 `eqIfPresent``=` 等值匹配。前端 `EditModal.vue` 发的请求是 `?productType=CORE,GROUP`(逗号分隔多值),后端按字面值 `'CORE,GROUP'``=` 比较 → 永远 0 条。
**修法**:保留 `productType` (String) 兼容单值,新增 `getProductTypeList()` 拆分逗号;Mapper 改 `inIfPresent`
- 单值 `?productType=CORE` 兼容仍正常(拼出 `IN ('CORE')` 等价 `= 'CORE'`
- 多值 `?productType=CORE,GROUP` 拼出 `IN ('CORE','GROUP')` 返回正确结果
### 2. DB 文案改名 — 用户原话:"产品线(字典)改为主题"
| 表 | 改了什么 | 改前 | 改后 |
|---|---|---|---|
| `sys_dict_data` | dict_type=`banner_link_type`, dict_value=`PRODUCT_LINE` 的 dict_label | 产品线 | **主题** |
| `sys_menu` | menu_id=520 模块名 | 产品线管理 | **主题管理** |
| `sys_menu` | menu_id=5201 按钮 | 新增产品线 | **新增主题** |
| `sys_menu` | menu_id=5202 按钮 | 编辑产品线 | **编辑主题** |
| `sys_menu` | menu_id=5203 按钮 | 删除产品线 | **删除主题** |
### 3. 内部命名保持不变API 契约稳定)
- 类名 `ProductLine*` / 表名 `product_line` / URL `/admin/product/line/**` / 字段 `lineId/productType` / 枚举 value `PRODUCT_LINE` 全部不动
- 前端调 API 不需要任何改动,请求/响应字段名 0 变化
---
## 前端要做什么(可选 / 渐进式)
后端 + DB 改完后,前端**理论上无需任何代码改动**就能看到新文案:
- 字典 `banner_link_type` 的 label 通过 `getDictDataByType` 接口加载,前端 `<el-option>` 显示的是 `dictLabel`,部署后自动显示「主题」
- 后台菜单从 `sys_menu` 加载,部署后自动显示「主题管理」+「新增/编辑/删除主题」按钮
- 前端字典 store`hl-ui/src/stores/dict.js``pinia-plugin-persistedstate`)做了 localStorage 持久化,**用户首次进入会读旧的"产品线"label**,需要硬刷新Ctrl+Shift+R或退出重登才会拿到新字典
### 但这些 .vue 里的硬编码"产品线"中文,建议 mmg 一并改为"主题"统一术语
参考之前 changelog `07_frontend_notice_topic-filter-empty.md` 已经在叫"主题"。grep 全仓 `"产品线"` 中文字面量一处一处对:
| 文件 | 大约位置 | 当前 | 建议改为 |
|---|---|---|---|
| `hl-ui/src/views/mp-config/home/banner/EditModal.vue` | ~333 行 `label:'产品线'` | 产品线 | 主题 |
| `hl-ui/src/views/product/line/index.vue` | 页面标题 / 表头 | 产品线管理 | 主题管理 |
| `hl-ui/src/views/product/list/index.vue` | 关联显示 | 产品线 | 主题 |
| 其他 | 表头/按钮/placeholder/tooltip | "产品线" | "主题" |
预计涉及 14 个 .vue 文件(前期 Explore 调研结果),都属用户可见硬编码文案。
### 时间紧不改也能用
后端 + 字典 + 菜单都已经改名,前端 .vue 硬编码"产品线"不改的话,会出现"主题列表里某些 label 写产品线"这种术语混乱,但功能完全正常。
---
## round-trip 验证(部署完成后)
合并后 webhook 自动部署到测试服 `https://api.test.1814.love:9443`。验证清单:
```bash
TOKEN=$(cat /d/work2/HL/.tmp/admin_token.txt | tr -d '\n\r ')
# 1. 多值过滤已修复(之前 total=0,现在应 >0
curl -k -s "https://api.test.1814.love:9443/admin/product/line/list?status=ACTIVE&productType=CORE,GROUP" \
-H "Authorization: Bearer $TOKEN" | python -c "import json,sys; d=json.load(sys.stdin); print('total=',d['data']['total'])"
# 2. 单值兼容
curl -k -s "https://api.test.1814.love:9443/admin/product/line/list?productType=CORE" \
-H "Authorization: Bearer $TOKEN" | python -c "import json,sys; d=json.load(sys.stdin); print('total=',d['data']['total'])"
# 3. 字典 banner_link_type label 改名
curl -k -s "https://api.test.1814.love:9443/internal/dict/data?dictType=banner_link_type" | grep -o '"PRODUCT_LINE"[^}]*"dictLabel":"[^"]*"'
# 期望: "PRODUCT_LINE" ... "dictLabel":"主题"
```
管理后台手动验证:
- [ ] 轮播图编辑「链接类型」下拉显示「主题」
- [ ] 选「主题」后「链接目标」弹窗能加载列表(不再"无数据"
- [ ] 后台左侧菜单显示「主题管理」+ 三个按钮「新增/编辑/删除主题」