Skip to content

参数配置 ​

概述 ​

参数配置(infra_config)是系统级的「键值型」配置中心,用于把分散在代码里的开关与阈值收敛到数据库,便于运维人员在不发版的情况下动态调整。

它同时服务于两类场景:

  • 业务配置:前端页面展示、业务模块读取的普通参数(如初始密码、监控地址)。
  • 运行时配置:被后端中间件、调度器高频读取的开关(如演示模式、IP 黑白名单),这类参数修改后需要尽快生效。

image-20260930143322466

核心概念 ​

参数由以下关键属性构成:

  • 参数分组(category):对参数做逻辑归类,例如 用户管理,仅用于展示与检索。
  • 参数键名(config_key):全局唯一、用于程序读取的键,命名约束为「小写字母开头,仅含小写字母、数字、_ . -」。键名一旦创建不可修改。
  • 参数名称(name):面向用户的中文名称。
  • 参数键值(value):实际配置内容,字符串类型,最长 500 字符,前后空格会自动去除。
  • 参数类型(type):1 系统内置、2 自定义。系统内置参数通常由初始化脚本写入,不允许删除。
  • 是否可见(visible):不可见参数在前端列表隐藏,且不会被中间件当作「已启用」(见下文缓存机制)。

缓存与生效机制 ​

参数配置采用「数据库 + Redis + 内存」三级缓存,以兼顾一致性与性能。

要点:

  • 启动时由 ParamsService.init_cache 把全量参数同步进 Redis(infra:config:{tenant_id}:{config_key}),中间件无数据时使用默认值。
  • 创建、修改、删除参数都会同步维护 Redis 缓存;修改与删除还会主动失效对应租户的中间件内存缓存(_invalidate_mid_config_cache),避免最长 60 秒的脏读。
  • 中间件侧通过 get_system_config_for_middleware 读取,带有 60 秒内存缓存并按租户隔离,因此对高频请求几乎零开销。
  • 不可见(visible != 1)的参数在中间件读取时视为「未启用」,自动回退默认值。

内置系统参数 ​

以下键名被后端中间件 / 调度器直接消费(见 MIDDLEWARE_CONFIG_KEYS),配置它们即可改变系统运行时行为:

配置键语义默认值说明
demo_enable演示模式开关false开启后非 GET 请求(且不在白名单内)会被拦截
ip_white_listIP 白名单[]演示模式下放行这些 IP 的写操作
ip_black_listIP 黑名单[]命中的客户端直接被拒绝访问
white_api_list_pathAPI 白名单路径[]演示模式下放行的接口路径前缀
operation_log_retention_days操作日志保留天数90日志清理任务的保留窗口

此外,初始化 SQL 还会写入一些业务参数,例如 system.user.init-password(账号初始密码)、system.user.register-enabled(注册开关),这些都可在页面上直接查看与调整。

提示:修改上述内置键的键名是无效的——键名创建后不可变更,更新接口会校验 config_key 保持一致。

后端接口 ​

所有接口位于 /infra/config,统一响应包裹于 ResponseSchema,需要对应权限码:

接口说明权限
GET /page分页查询参数列表infra:config:query
GET /get参数详情infra:config:query
GET /get-value-by-key按键名取参数值infra:config:query
GET /key/{config_key}按键名取参数详情infra:config:query
POST /create新建参数infra:config:create
PUT /update修改参数infra:config:update
DELETE /delete删除参数infra:config:delete
DELETE /delete-list批量删除infra:config:delete
GET /export-excel导出 Excelinfra:config:export
GET /info获取初始化缓存参数无

约束逻辑(集中在 ParamsService):

  • 创建时校验 config_key 唯一,重复则报错。
  • 更新时不允许修改键名;成功后同步 Redis 并失效中间件缓存。
  • 删除时拒绝删除系统内置(type=1)或不可见(visible=false)的参数,避免破坏运行时依赖。

前端使用 ​

参数配置页面位于 apps/web-ele/src/views/infra/config,采用 Vben 的 useVbenVxeGrid + 弹窗表单模式。

  • 列表字段由 data.ts 的 useGridColumns 定义,搜索表单由 useGridFormSchema 定义,类型与可见性通过字典 INFRA_CONFIG_TYPE、INFRA_BOOLEAN_STRING 渲染。
  • 表单 form.vue 通过 getConfig 回显数据,提交时按是否有 id 自动选择新建或更新。
  • 所有写操作按钮受权限码(如 infra:config:create)控制,无权限时不展示。

典型调用示例:

ts
import { getConfigKey } from '#/api/infra/config';

// 在业务代码中按需读取某个参数值
const value = await getConfigKey('system.user.register-enabled');

使用建议与注意事项 ​

  • 给程序读取的参数务必使用稳定、语义清晰的 config_key,创建后切勿尝试改名。
  • 仅把真正需要动态调节的项做成参数配置,避免把高频变化的业务数据误用此表。
  • 修改「内置系统参数」后,最迟约 60 秒(或下次请求)内即对中间件生效;由于会主动失效缓存,多数情况下是即时生效。
  • 系统内置参数不要删除;若只是希望临时停用,可将「是否可见」置为否,中间件会按默认值处理。
  • 参数键值统一为字符串,消费方(如中间件)会按语义解析:布尔类兼容 true/1/yes/on,数组类兼容 JSON 字符串。