diff --git a/changelogs/2026-04/2026-04-21_mp-common-config-merge-frontend-config.md b/changelogs/2026-04/2026-04-21_mp-common-config-merge-frontend-config.md new file mode 100644 index 0000000..7ce59eb --- /dev/null +++ b/changelogs/2026-04/2026-04-21_mp-common-config-merge-frontend-config.md @@ -0,0 +1,118 @@ +# /mp/common/config 接口返回全部公开配置(合并 sys_frontend_config) + +**日期**:2026-04-21 +**PR**:#1114(Closes #1112) +**合并到 dev commit**:767e5cb4 +**后端服务**:hl-user-service(已部署测试环境) +**影响前端**:小程序端「应用配置」接口字段扩展 + +--- + +## 为什么改 + +`/mp/common/config` 过去只返回 `version` / `minVersion` / `servicePhone` 三个 yml 硬编码字段,管理后台「前端配置」页面(`sys_frontend_config` 表)运营的所有配置(主题色、Logo、站点名、分页大小、页脚文本等)完全没在小程序端吐出。 + +改完后小程序端一个接口拿到全部公开配置。 + +--- + +## 接口签名变化 + +### `GET /mp/common/config` + +**契约不变**:响应仍是 `Result>`,`data` 字段类型保持 Map。 + +**data 内容扩展**: + +| 字段来源 | 说明 | +|---------|------| +| yml 基础(固定存在) | `version` / `minVersion` / `servicePhone` | +| `sys_frontend_config` 表 | **所有启用(status=1)且非 SECRET、未软删除的配置项**,key = `config_key`,value 按 `config_type` 做类型转换 | + +**类型转换规则**(后端已处理,前端直接使用): + +| config_type | JSON value 类型 | 示例 | +|------------|----------------|------| +| `NUMBER` | `number`(整数 Long / 小数 Double) | `"defaultPageSize": 20` | +| `BOOLEAN` | `boolean` | `"enableWatermark": false` | +| `JSON` | `object` / `array` | `"themeConfig": { ... }` | +| `TEXT` / `COLOR` / `IMAGE` | `string` | `"primaryColor": "#1890FF"` | +| 解析失败 | 原 `string`(降级兜底) | —— | + +**过滤规则**: +- `config_type = 'SECRET'` 的不返回(第三方 API key 等敏感配置) +- `status = 0`(停用)的不返回 +- `deleted_at IS NOT NULL`(软删除)的不返回 + +**冲突规则**: +- 若 `sys_frontend_config` 表存在 `config_key = 'version'`(或 `minVersion` / `servicePhone`),**DB 值覆盖 yml 默认值** +- 当前测试/正式环境 DB 不存在这三个 key,无实际冲突 + +--- + +## 测试环境实测响应 + +```bash +curl -sk "https://api.test.1814.love:9443/mp/common/config" +``` + +```json +{ + "code": 200, + "message": "成功", + "success": true, + "data": { + "version": "1.0.0-dev", + "minVersion": "1.0.0", + "servicePhone": "400-000-0000", + "primaryColor": "#1890FF", + "accentColor": "#FF6B35", + "backgroundColor": "#F5F7FA", + "textColor": "#303133", + "defaultPageSize": 20, + "cacheExpireMinutes": 30, + "enableWatermark": false, + "siteName": "呼籁旅行", + "logoUrl": "", + "footerText": "呼籁旅行 版权所有", + "copyrightYear": "2026", + "customerServicePhone": "" + } +} +``` + +--- + +## 前端影响 + +### 可以改(推荐) + +**以前**:小程序端可能自己在代码里写死主题色、站点名、分页大小等默认值。 +**现在**:这些配置直接从 `/mp/common/config` 读取,运营后台改完小程序端无需发版即可生效(缓存 30 分钟,运营端保存后自动失效)。 + +### 不需要改 + +- `version` / `minVersion` / `servicePhone` 三个原有字段**完全保留**,读取方式不变 +- 响应结构 `{code, message, data, success}` 不变 + +### 前端建议 + +1. `data` 类型建议声明为 `Record` 或按需定义强类型(已知 key 列表见上方实测响应) +2. 新 key 可能陆续增加(运营后台可以新增),前端按需解构即可,不要假设 data 只有固定字段 +3. NUMBER 类型已转为 JS number,不用再 `parseInt(...)`;BOOLEAN 已转为 js boolean,不用再比较字符串 `"true"` + +--- + +## 缓存行为 + +- 小程序端接口:`@MpCache(prefix="common:config", ttl=1800s)`,Redis key:`mp:common:config` +- 运营后台修改 `sys_frontend_config` 任一条 → `FrontendConfigService` 写路径触发 `depsManager.invalidateSource("table:sys_frontend_config")` → `MpCommonController` deps 命中该 source → 缓存被精准失效 +- 首次部署本次 PR 后,旧缓存(ttl 未到期)会阻挡新数据,已在部署时主动清理一次:`redis-cli -n 0 del mp:common:config` + +--- + +## 关联 + +- Issue:#1112 +- 非目标:本 PR **不改** `/mp/config`(分组查询接口,`MpConfigController`) +- 历史遗留:`MpCacheEvict.categoryMap` 中 `config → table:frontend_config`(少 `sys_` 前缀)与实际 deps `table:sys_frontend_config` 不一致,本次不动,留后续清理工单