diff --git a/changelogs/2026-05/15_frontend_admin_picker_remove_season_filter_keep_matching_tag.md b/changelogs/2026-05/15_frontend_admin_picker_remove_season_filter_keep_matching_tag.md deleted file mode 100644 index 269bfa3..0000000 --- a/changelogs/2026-05/15_frontend_admin_picker_remove_season_filter_keep_matching_tag.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -date: 2026-05-15 -type: frontend-feature -module: admin-product-v2-itinerary-picker -priority: medium -backend_pr: null -backend_issue: null -supersedes: - - "14_frontend_feature_admin_scenic-season-filter-and-tags.md" - - "14_frontend_feature_admin_activity-season-filter-and-tags.md" -notify: ["@mmg"] -status: pending ---- - -# 产品设计「从资源库添加活动」弹窗 — 去掉季节筛选 + 标签只显示匹配项 - -## 业务变更 - -用户(产品)05-15 反转了 05-14 刚定的"按产品线季节过滤"需求。新需求: - -1. **去掉筛选** — 弹窗列表展示当前 tab 下**全部**资源(景区/游玩项目/餐厅/服务),不再按当前产品线的 `seasons` 过滤 -2. **标签只显示匹配项** — 资源行右侧的季节标签,只渲染"当前产品季节 ∩ 资源支持季节"的交集。 - - 例:产品季节 = `["summer"]`,资源支持 `["spring","summer","autumn"]` → 只显示 `summer` 一个标签 - - 例:产品季节 = `["summer"]`,资源支持 `["spring","autumn","winter"]` → **不显示任何季节标签**(没交集) -3. **范围** — 弹窗 4 个 tab(景区景点 / 游玩项目 / 餐厅 / 服务)全部按此规则。 - -## 后端 — 完全不用动 - -后端的 `seasons` query 参数本来就是**可选**(空/不传 = 不过滤),所以: - -| 接口 | 行为 | -|------|------| -| `GET /admin/scenic/spots` | 不传 `seasons` 参数即可,返全部景区 | -| `GET /admin/activity/items` | 不传 `seasons` 参数即可,返全部游玩项目 | -| `GET /admin/restaurant/items` | 本就无 seasons 参数 | -| `GET /admin/service/items` | 本就无 seasons 参数 | - -VO 中 `seasons: List` 字段保留(前端要用它做交集渲染),无变化。 - -> ⚠️ 副作用:不传 `seasons` 后,景区/活动列表的 `coverUrl` 会回落到主表的默认封面,不再按季节切图。这是用户预期的(整体去掉季节相关效果)。 - -## 前端实现要点 - -### 弹窗调用列表接口 - -```js -// 旧(05-14 版,需删掉透传 seasons 的逻辑): -// const params = new URLSearchParams() -// productLineSeasons.forEach(s => params.append('seasons', s)) -// await api.get(`/admin/scenic/spots?${params}&pageSize=20`) - -// 新: -await api.get('/admin/scenic/spots', { params: { pageSize: 20 } }) -``` - -同样适用 `/admin/activity/items`。 - -### 季节标签渲染逻辑 - -```js -// 取交集 -const productSeasons = currentProductLine.seasons || [] // 当前产品线季节 -const resourceSeasons = vo.seasons || [] // 资源支持季节 -const visibleSeasons = resourceSeasons.filter(s => productSeasons.includes(s)) - -// 4 色保持不变(与 05-14 版一致): -// spring → #67C23A / summer → #409EFF / autumn → #E6A23C / winter → #909399 - -// 不再显示春夏秋冬全部 4 个标签 — 只渲染 visibleSeasons -``` - -### 节点卡片(已选节点) - -**已添加进行程的节点卡片的季节标签**,**同样规则**:只显示与当前产品线季节匹配的部分。 -节点 VO `InternalProductDetailVO.NodeItem.seasons` 字段保留,前端做同样的交集过滤渲染。 - -### 餐厅/服务 tab - -后端这两个接口本来就没有 `seasons` 字段(VO 无 `seasons`),所以餐厅/服务 tab: -- 列表本来就不会按季节过滤(无变化) -- 资源行右侧**无季节标签**渲染(无变化) -- 但**主题标签**(如"自然风光""历史人文")若仍存在,**保持现状**(用户本次只反转季节相关行为) - -## 涉及前端文件 (仅供参考定位) - -- 弹窗组件: `D:\work2\hl-ui\src\views\product-v2\` 下行程编辑器子组件(05-14 改过的位置) -- 季节标签组件: 05-14 新建的季节 Tag 组件,渲染逻辑改成交集即可 - -## 关联 - -- 推翻 (supersedes): 05-14 的 `frontend_feature_admin_scenic-season-filter-and-tags.md`(后端 #2229)、`frontend_feature_admin_activity-season-filter-and-tags.md`(后端 #2234) -- 后端 PR #2229 / #2234 **不回滚**,新增的 `seasons` 子表 / VO 字段 / query 参数全部保留(前端不传即可,未来若再要可直接复用)