feat(mp): /mp/common/config 接口返回全部公开配置 (PR #1114, Closes #1112)

- 扩展 data 字段: yml 3 基础 + sys_frontend_config 全部启用+非SECRET+未软删
- 类型按 config_type 自动转换: NUMBER→number, BOOLEAN→boolean, JSON→object/array
- 契约 Result<Map<String,Object>> 不变, 前端零破坏可直接用新字段

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
这个提交包含在:
API Changelog Bot 2026-04-21 17:46:18 +08:00
父节点 98bb0e4b5d
当前提交 d13963bb07

查看文件

@ -0,0 +1,118 @@
# /mp/common/config 接口返回全部公开配置(合并 sys_frontend_config
**日期**2026-04-21
**PR**#1114Closes #1112
**合并到 dev commit**767e5cb4
**后端服务**hl-user-service已部署测试环境
**影响前端**:小程序端「应用配置」接口字段扩展
---
## 为什么改
`/mp/common/config` 过去只返回 `version` / `minVersion` / `servicePhone` 三个 yml 硬编码字段,管理后台「前端配置」页面(`sys_frontend_config`运营的所有配置主题色、Logo、站点名、分页大小、页脚文本等完全没在小程序端吐出。
改完后小程序端一个接口拿到全部公开配置。
---
## 接口签名变化
### `GET /mp/common/config`
**契约不变**:响应仍是 `Result<Map<String, Object>>``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<string, any>` 或按需定义强类型(已知 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` 不一致,本次不动,留后续清理工单