diff --git a/changelogs/2026-04/28_fix_admin-frontend-config_value-type-enum-mismatch.md b/changelogs/2026-04/28_fix_admin-frontend-config_value-type-enum-mismatch.md new file mode 100644 index 0000000..25e26ee --- /dev/null +++ b/changelogs/2026-04/28_fix_admin-frontend-config_value-type-enum-mismatch.md @@ -0,0 +1,96 @@ +# fix: 前端配置「值类型」下拉与后端枚举不一致 — 待前端修复 + +**日期**: 2026-04-28 +**类型**: 前端 BUG — **后端零改动**, 改前端写死的下拉常量即可 +**影响端**: 管理后台 (admin) — 系统管理 → 前端配置 → 新增/编辑配置对话框 +**反馈来源**: 前端同事反馈「值类型对接不上」 + +--- + +## 现象 + +`admin.1814.love/frontend-config` 列表里已有数据的 `值类型(configType)` 列显示了 **TEXT** (站点名称) 和 **IMAGE** (Logo地址) 两种类型,但点「新增配置」弹窗的「值类型」下拉框里**选不出来这两个值**。 + +下拉框里的值: + +| 前端下拉显示 | 前端发给后端的 value | +|---|---| +| STRING - 字符串 | `STRING` ❌ | +| COLOR - 颜色 | `COLOR` ✅ | +| NUMBER - 数字 | `NUMBER` ✅ | +| BOOLEAN - 布尔 | `BOOLEAN` ✅ | +| JSON - JSON | `JSON` ✅ | +| SECRET - 密钥 | `SECRET` ✅ | +| URL - 链接 | `URL` ❌ | + +--- + +## 根因 + +**前端 `configType` 下拉选项写死了与后端不一致的枚举值。** + +后端 `sys_frontend_config.config_type` 字段权威枚举(Entity + schema.sql + `FrontendConfigConverter` 三处一致): + +``` +TEXT / COLOR / IMAGE / JSON / SECRET / NUMBER / BOOLEAN +``` + +后端引用: +- Entity 注释 `hl-user-service/src/main/java/com/hulalv/user/entity/SysFrontendConfig.java:28` +- schema `sql/frontend_config.sql:7` `'值类型: TEXT/COLOR/IMAGE/JSON/SECRET/NUMBER/BOOLEAN'` +- 转换器常量 `hl-user-service/src/main/java/com/hulalv/user/converter/FrontendConfigConverter.java:25-36` + +前端写错 2 项 + 缺 2 项: + +| 项 | 前端 | 后端权威 | 处理 | +|---|---|---|---| +| 字符串 | `STRING` | `TEXT` | **改 value 为 `TEXT`** | +| 图片 | (缺) | `IMAGE` | **新增 `IMAGE - 图片`** | +| 链接 | `URL` | (无此类型) | **删除 `URL`**(后端无对应转换逻辑,即使存进去也按 default 当字符串处理,语义不清) | +| 文本 | (缺,误用 STRING 顶替) | `TEXT` | 同第一行,改 value 即可 | + +--- + +## 前端需要做的修改 + +定位 `hl-ui` 仓库下「前端配置」新增/编辑对话框的 `configType` 下拉 options 常量,改成: + +```js +const CONFIG_TYPE_OPTIONS = [ + { value: 'TEXT', label: 'TEXT - 文本' }, + { value: 'COLOR', label: 'COLOR - 颜色' }, + { value: 'IMAGE', label: 'IMAGE - 图片' }, + { value: 'NUMBER', label: 'NUMBER - 数字' }, + { value: 'BOOLEAN', label: 'BOOLEAN - 布尔' }, + { value: 'JSON', label: 'JSON - JSON' }, + { value: 'SECRET', label: 'SECRET - 密钥' }, +] +``` + +注意: +1. **去掉 `STRING` 和 `URL`** —— 后端不识别(STRING 进 DB 后会按 default 当字符串渲染但与已有 TEXT 数据混杂; URL 同理) +2. **补上 `TEXT` 和 `IMAGE`** —— DB 里 siteName/footerText 等都是 TEXT, logoUrl 是 IMAGE + +--- + +## 验证 + +改完后到「新增配置」弹窗,下拉框 7 项应能完整覆盖: +- TEXT / COLOR / IMAGE / NUMBER / BOOLEAN / JSON / SECRET + +并能编辑列表里已有的 `siteName` (TEXT) 和 `logoUrl` (IMAGE),不会出现「值类型空白」或「保存后回显错误」。 + +--- + +## 后端约定(不会变) + +后端 `FrontendConfigConverter.convert(value, configType)` 按以下规则转换: + +| configType | 转换为 | +|---|---| +| `NUMBER` | Long / Double(含 `.` 走 Double) | +| `BOOLEAN` | Boolean | +| `JSON` | JSONObject / JSONArray | +| `TEXT` / `COLOR` / `IMAGE` / `SECRET` / 其他 | 原字符串 | + +任一 parse 失败都降级为原字符串,不抛异常。`configType` 不在白名单内时也不报错,直接当字符串。所以即使前端历史误传过 `STRING`/`URL`,接口不会 500,只是数据列表里类型列会显示出和下拉对不上的字符串值。