diff --git a/changelogs/2026-05/11_frontend_notice_admin_product-line-list-show-creator-name.md b/changelogs/2026-05/11_frontend_notice_admin_product-line-list-show-creator-name.md new file mode 100644 index 0000000..7f5d7ca --- /dev/null +++ b/changelogs/2026-05/11_frontend_notice_admin_product-line-list-show-creator-name.md @@ -0,0 +1,160 @@ +# 管理端主题列表: 卡片新增「创建人姓名」字段(企微昵称优先 fallback 用户名) + +> **服务**: hl-product-service-v2 (端口 8083) +> **PR**: 待开(后端开发中) +> **Issue**: [#1943](https://git.1814.love:8443/wx/HL/issues/1943) +> **日期**: 2026-05-11 +> **影响范围**: 管理后台「产品管理 → 主题列表」(/product/line) 卡片 +> **状态**: ⚠️ **预告 (Heads-up)** — 后端尚未合并,前端可同步开始;字段名/格式以本文为准,PR 合并后会再补一条"已上线"changelog + +--- + +## ⚠️ 关键变化 + +主题列表卡片每张多一个字段 `createdByName`(String,可能为 null),用于显示是谁创建了这个主题。 + +**显示规则(后端已实现)**: +- 创建人 admin_user 绑定了企业微信 → 返回**企业微信昵称** +- 未绑企微 → 返回 **admin_user.username**(用户名兜底) +- 极端情况(user-service 降级 / admin 已删)→ 返回 null,前端可显示「-」或隐藏该行 + +前端**无需自己 fallback**,后端已聚合好,前端直接展示 `createdByName` 即可。 + +--- + +## 一、背景 + +超级管理员/运营组长视角下,主题列表 27 张卡片看不出谁建的,特别是私人定制类主题(不同销售各自开),需要快速识别 owner。 + +--- + +## 二、变更接口清单 + +| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | +|---|------|------|------|----------|------| +| 1 | 主题列表 | GET | `/admin/product/line/list` | 响应体新增字段 | 每条多 `createdByName` | +| 2 | 主题详情 | GET | `/admin/product/line/{lineId}` | 响应体新增字段 | 多 `createdByName` | + +后端 0 个 break、0 个删除、0 个语义变化。仅追加字段,前端不接也不会报错。 + +--- + +## 三、接口详情 + +### 1. 主题列表 `GET /admin/product/line/list` + +**VO**: `ProductLineRespVO` + +#### 出参(仅列出新增/相关字段) + +| 字段 | 类型 | 说明 | +|------|------|------| +| `lineId` | Long | 主题 ID(已有) | +| `name` | String | 主题名(已有) | +| `createdBy` | Long | 创建人 admin_id(已有,前端无需用) | +| **`createdByName`** | **String** | **🆕 创建人显示名(企微昵称优先 fallback username,可能 null)** | +| `createTime` | DateTime | 创建时间(已有) | +| ... | ... | 其他字段不变 | + +#### 响应示例 + +```json +{ + "code": 200, + "message": "成功", + "success": true, + "data": [ + { + "lineId": 2045311111111111111, + "name": "游牧的森林", + "createdBy": 1002, + "createdByName": "王宇", + "createTime": "2026-04-17 12:59:24", + "...其他字段": "..." + }, + { + "lineId": 2045322222222222222, + "name": "嗨冰雪", + "createdBy": 1003, + "createdByName": "test_admin", + "createTime": "..." + }, + { + "lineId": 2045333333333333333, + "name": "私人定制", + "createdBy": 1099, + "createdByName": null, + "...": "..." + } + ] +} +``` + +### 2. 主题详情 `GET /admin/product/line/{lineId}` + +同样追加 `createdByName` 字段,结构与列表一致。 + +--- + +## 四、前端实现要点 + +### UI 位置(建议) + +主题卡片当前布局(图示): +``` +[封面图] +[主题名] [核心产品/私人定制 标签] +[简介] +[季节/标签 chips] +[版本数] [排序] +[启用] [创建时间] +[👁 编辑 删除按钮] +``` + +建议在「创建时间」一行旁边或上面加一行「创建人: xxx」,排版方式由前端拍板。 + +### Null 处理 + +- `createdByName === null` → 显示「-」或不显示该行(不要显示「null」字样) +- 不要尝试自己用 createdBy ID 调 user-service 兜底 —— 后端已经处理过,再调也是相同结果 + +### 主题详情页 + +如果详情页也想展示创建人,同样读 `createdByName` 字段。 + +--- + +## 五、不影响范围 + +- ✅ MP 端任何接口:0 改动(C 端不需要看创建人) +- ✅ 主题创建/编辑/删除接口:0 改动(写入侧不受影响) +- ✅ 现有筛选条件(关键字/状态/主题类型):0 改动 +- ✅ 历史 27 条主题数据:无需迁移(createdBy 已写入,靠 enrich 实时取,老数据如 createdBy 已删则返 null) +- ✅ 装备模板下拉、产品列表、其他列表:本次不涉及 + +--- + +## 六、降级/边界 + +- user-service 降级(Feign 失败)→ 后端 catch 异常,所有 createdByName 返 null,列表照常返回,**不阻断页面** +- batchGetAdminInfo 返空(admin 已删)→ 该条 createdByName = null +- admin_user 未绑企微 → wechatName 为 null,自动 fallback username + +--- + +## 七、相关历史 + +| PR | Issue | 说明 | 是否仍有效 | +|----|-------|------|------------| +| 待开 PR | #1943 | 主题列表/详情新增 createdByName | 🚧 开发中 | + +参考类似实现:产品列表 `ProductQueryService.enrichCreatedByName():243-267`(已上线,前端已使用 `createdByName` 字段)。 + +--- + +## 八、相关文档 + +- 关联 Issue: [wx/HL#1943](https://git.1814.love:8443/wx/HL/issues/1943) +- Feign 接口: `hl-common/hl-common-feign/.../UserFeignClient.java:36-37` +- AdminBasicDTO: `hl-common/hl-common-core/.../AdminBasicDTO.java:17,25-26` +- 仿写模板: `hl-product-service-v2/.../ProductQueryService.java:243-267`