# 修复轮播图「链接目标=主题」无数据 + 字典/菜单产品线统一改名为主题

**日期**: 2026-05-07
**类型**: 后端 BUG 修复 + DB 文案改名（前端有少量配合改动）
**模块**: hl-product-service-v2 + hl-user-service（DB 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":"主题"
```

管理后台手动验证：
- [ ] 轮播图编辑「链接类型」下拉显示「主题」
- [ ] 选「主题」后「链接目标」弹窗能加载列表（不再"无数据"）
- [ ] 后台左侧菜单显示「主题管理」+ 三个按钮「新增/编辑/删除主题」
