1. 页面概览
系统设置页是 AIP 管理后台的键值型系统参数维护入口,路由 /admin/settings,仅管理员可访问。它读写 system_settings 表中的配置项(如 LLM 密钥、SECRET_KEY、CORS 白名单、并发上限等),支持设置项列表展示、新增/编辑(key 提供候选列表也可自由输入)、删除。页面上方还内嵌「PII 脱敏配置」卡片,专门维护 PII_PATTERNS(JSON:PII 类型 → 正则),控制日志与提示词中的敏感信息脱敏。
页面为"新增/编辑弹窗 + 列表表格"的经典 CRUD 形态。所有设置修改都是落库存储,重启 AIP 服务后生效;结构化 NLQ 任务(text2sql/图表解读)的输出始终不脱敏。
2. 访问入口
2.1 路由与菜单
path /admin/settings、name AdminSettings、title 系统设置;挂载在父路由 /admin(AdminLayout)下,侧边栏菜单项「系统设置」。源码 action/web/src/views/SettingsPage.vue。
2.2 认证与权限
父路由 requiresAuth: true, requiresAdmin: true;后端 /settings 系列全挂 admin 组(authMiddleware + adminMiddleware),非管理员 403。请求经 aipClient.js 附带 aip_token。
2.3 端口与 API 前缀
AIP 后端 18080,前缀 /aip-api(baseURL /aip-api/v1,Vite 代理重写为 /api/v1)。
3. 界面布局
系统设置 [新增设置]
[操作结果提示 alert(可关闭)]
[提示:系统设置将在服务重启后生效。]
PII 脱敏配置:PII 脱敏配置 [已配置/未配置]
当前配置(JSON 预览)| 编辑 PII_PATTERNS(JSON)textarea
[保存 PII_PATTERNS] [删除配置(关闭脱敏)]
设置列表:Key | Value | Type | 描述 | 操作[编辑][删除]
新增/编辑弹窗:Key*(datalist+自由输入) | Value | Type | 描述
[取消] [创建/保存]
- PII 脱敏配置:查看/编辑/删除
PII_PATTERNS正则集合,唯一的专用配置块。 - 设置列表:展示全部设置项,每行「编辑」「删除」。
- 新增/编辑弹窗:Key 必填(候选列表或自由输入),Value/Type/描述可配置。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| 新增设置按钮 | 页面头部 | 打开空表单弹窗创建新设置项 |
| 保存 PII_PATTERNS 按钮 | PII 卡片 | 校验 JSON 后 PUT /settings 写入;保存中显示"保存中..." |
| 删除配置(关闭脱敏)按钮 | PII 卡片 | confirm 确认后 DELETE /settings/PII_PATTERNS |
| PII textarea | PII 卡片 | JSON 编辑框,占位含 EMAIL/PHONE_NUMBER 两个正则;须合法 JSON |
| 编辑 / 删除按钮 | 表格每行 | 编辑回填弹窗;删除有 confirm 二次确认,不可撤销 |
| Key 输入框(datalist) | 弹窗 | 候选:OPENAI_API_KEY、DEEPSEEK_API_KEY、DEEPSEEK_BASE_URL、DASHSCOPE_API_KEY、ANTHROPIC_API_KEY、SECRET_KEY、CORS_ORIGINS、MAX_CONCURRENT、PII_PATTERNS、AUTH_KEY,可自由输入 |
| Type 下拉框 | 弹窗 | string/integer/boolean/json,默认 string |
| 创建 / 保存按钮 | 弹窗 | 新增文案「创建」,编辑「保存」;Key 空拦截"Key 必填" |
5. 后端关联
5.1 端点表
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /settings | 列出全部设置项,返回 {"settings": [...]} |
| PUT | /settings | 新增或更新(按 setting_key upsert),body {key, value, type, description} |
| GET | /settings/:key | 获取单个设置,不存在返回 404 |
| DELETE | /settings/:key | 删除单个设置,返回 {"deleted": true} |
5.2 请求与响应
设置项字段为 key/value/type/description;GET /settings/PII_PATTERNS 返回 {"setting": {...}},404 表示未配置(脱敏关闭)。PII 以 type: 'json' 存储正则文本。
5.3 关键机制
- 设置以字符串值存储(布尔、JSON 也是文本);
PII_PATTERNS保存前先JSON.parse校验,非法提示"PII_PATTERNS 不是合法 JSON"。脱敏仅对配置里显式列出的类型生效,未配置时整体关闭。 - 后端位置:处理函数在
action/products/aip/server/handlers_admin.go(handleListSettings/handleUpsertSetting/handleGetSetting/handleDeleteSetting),路由注册于server.goadmin 组。
6. 权限与安全
- 认证:JWT Bearer Token(
aip_token),401 清 Token 跳登录。 - 管理员专属:前端
requiresAdmin守卫 + 后端 admin 组双重校验,读写操作同级受控,未授权 403/401。 - 敏感值防护:
SECRET_KEY等密钥明文存设置表,页面明文展示;删除操作confirm二次确认且不可撤销。
7. 常见问题与排错
问题 1:保存设置提示"保存失败:..."
- 现象:弹窗内点「创建/保存」报错。
- 原因:Key 为空被前端拦截,或请求体非法(Type 非枚举值)。
- 处理:确认 Key 必填且 Type 从四个候选值选择,看 Network 响应 error 定位。
问题 2:PII_PATTERNS 保存被拒
- 现象:点「保存 PII_PATTERNS」提示"不是合法 JSON,请检查格式"。
- 原因:textarea 内容非法 JSON(正则反斜杠在 JSON 里需双写转义)。
- 处理:把正则写成 JSON 字符串,如
{"EMAIL": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"},校验后再粘贴。
问题 3:改了设置但行为没变化
- 现象:保存成功后功能未按新配置生效。
- 原因:系统设置在服务重启后生效。
- 处理:重启 AIP 服务再验证;PII 提示文案亦注明"重启后生效"。
问题 4:无法读取 PII 状态且报错
- 现象:页面顶部提示"读取 PII_PATTERNS 失败"。
- 原因:
GET /settings/PII_PATTERNS返回非 404 错误(403/网络中断)。 - 处理:确认 Token 有效且为管理员;正常 404 即表示未配置,属预期。
8. 已知缺陷与边界
| 项 | 说明 |
|---|---|
| 重启生效 | 设置修改不热加载,须重启 AIP 生效 |
| 明文展示密钥 | SECRET_KEY、各 API_KEY 的 Value 在列表明文展示 |
| Value 单值 | 每 key 单值存储,无版本/历史回滚 |
| PII 不覆盖结构化任务 | text2sql/图表解读等结构化 NLQ 任务始终不脱敏,属设计边界 |
| 无搜索 | 设置项多时无搜索/分页,需滚动查找 |