diff --git a/changelogs/2026-04/27_fix_admin-product-line_filter-by-product-type.md b/changelogs/2026-04/27_fix_admin-product-line_filter-by-product-type.md new file mode 100644 index 0000000..3439241 --- /dev/null +++ b/changelogs/2026-04/27_fix_admin-product-line_filter-by-product-type.md @@ -0,0 +1,48 @@ +# 主题列表(产品线)按主题类型筛选 + +**日期**: 2026-04-27 +**PR**: #1457 (Closes #1456) +**影响端**: 管理端 admin + +## 背景 + +管理后台「前端配置 → 主题列表」(项目术语「主题」=「产品线」, 接口 `/admin/product/line/list`) 筛选「主题类型 = 小蒙马」点搜索, 28 条返回不变, 后端忽略 `productType` 参数。 + +## 根因 + +后端双重缺失: +1. `ProductLinePageReqVO` 未声明 `productType` 字段, Spring 自动绑定丢弃 query +2. `ProductLineMapper` 的 `selectPage` + `selectPageWithCount` 也没消费 `productType` 字段做 WHERE 过滤 + +## 接口变化 + +`GET /admin/product/line/list` query 参数**新增 1 个可选参数**: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `productType` | String | 否 | 产品类型过滤 (字典 `product_type`: `CORE`=核心 / `GROUP`=小蒙马 / `CUSTOM`=定制) | + +不传时行为与原来一致(返回所有产品线)。 + +## 前端改动 + +筛选下拉「主题类型」选「小蒙马」时,发出 `?productType=GROUP`,本 PR 后端补齐过滤后**前端无需改动**自动生效。 + +## 验证 (测试服) + +修复前 curl 实证: +``` +?productType=GROUP total=28 (BUG, 期望 3) +?productType=CORE total=28 (BUG, 期望 5) +DB 实际分布: CORE=5 / GROUP=3 / CUSTOM=8 / NULL=12 +``` + +修复后期望: `productType=GROUP` 返 3 条, `=CORE` 返 5 条, `=CUSTOM` 返 8 条。 + +## 数据权限边界 + +`productType` 过滤放在 `applyDataScopeFilter` **之前**, 复合 SQL 形如 `productType=? AND (datascope-OR-block)`, 超管 short-circuit, 普通管理员选 GROUP 在 datascope 收紧后仍命中 — 数据权限边界完整保留。 + +## C 端 + +`/internal` 同名筛选 `selectMpPage` 早已支持 productType 过滤, admin 漏掉, 修复后两端能力一致。