# 5.12 系统配置管理 :::tip 概述 系统配置管理用于动态配置参数,支持分组管理。与参数管理的区别:配置管理支持键值对的分组管理(如网站配置、邮件配置),参数管理是独立的参数实体(如单个开关、阈值)。 ::: ## 模块特点 | 特性 | 说明 | |------|------| | 基类 | BaseLogic(系统共享,不隔离) | | 关联 | 与 ConfigItem 一对多(通过 config_id) | | 用途 | 网站名称、Logo、版权信息等动态配置 | | 缓存 | DictService 两级缓存(请求级 + Redis),减少数据库查询 | ## 数据库表结构 ### 主表 `think_config`(配置组) | 字段 | 类型 | 说明 | |------|------|------| | id | int | 主键,自增 | | name | varchar(150) | 配置组名称(如「网站配置」) | | code | varchar(150) | 配置组编码(如 `website_config`) | | sort | int | 排序(升序) | | note | varchar(255) | 备注说明 | | create_user | varchar(50) | 创建人(BaseModel 自动写入) | | create_time | datetime | 创建时间(BaseModel 自动写入) | | update_user | varchar(50) | 更新人(BaseModel 自动写入) | | update_time | datetime | 更新时间(BaseModel 自动写入) | | is_delete | int | 软删除标记(0=正常,1=已删除) | ### 子表 `think_config_item`(配置项) | 字段 | 类型 | 说明 | |------|------|------| | id | int | 主键,自增 | | config_id | int | 所属配置组 ID(关联 think_config.id) | | name | varchar(150) | 配置项名称(如「网站名称」) | | code | varchar(150) | 配置项编码(如 `site_name`) | | value | varchar(1000) | 配置值 | | options | text | 配置选项(JSON 格式,用于 select/radio 等类型) | | type | varchar(150) | 值类型(text / textarea / number / switch / image / file / select) | | status | int | 状态(1=正常,2=停用) | | sort | int | 排序(升序) | | note | varchar(255) | 配置项备注 | | create_user | varchar(50) | 创建人(BaseModel 自动写入) | | create_time | datetime | 创建时间(BaseModel 自动写入) | | update_user | varchar(50) | 更新人(BaseModel 自动写入) | | update_time | datetime | 更新时间(BaseModel 自动写入) | | is_delete | int | 软删除标记(0=正常,1=已删除) | ## API 接口 ### 配置组 | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/config/page` | sys:config:page | 分页列表 | | GET | `/api/config/list` | sys:config:list | 全量列表 | | GET | `/api/config/detail/:id` | sys:config:detail | 详情 | | POST | `/api/config/add` | sys:config:add | 新增 | | PUT | `/api/config/update` | sys:config:update | 修改 | | DELETE | `/api/config/delete/:id` | sys:config:delete | 删除 | ### 网站配置(快捷接口) | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/config/web/index` | sys:config:web | 获取网站配置(按组返回所有配置项) | | POST | `/api/config/web/save` | sys:config:web | 保存网站配置(批量更新配置项值) | ### 配置项 | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/config/item/page` | sys:config:item:page | 分页列表 | | GET | `/api/config/item/list` | sys:config:item:list | 全量列表 | | GET | `/api/config/item/detail/:id` | sys:config:item:detail | 详情 | | POST | `/api/config/item/add` | sys:config:item:add | 新增 | | PUT | `/api/config/item/update` | sys:config:item:update | 修改 | | DELETE | `/api/config/item/delete/:id` | sys:config:item:delete | 删除 | ## 使用场景 | 场景 | 配置组 | 配置项示例 | |------|--------|----------| | 网站基本信息 | 网站配置 | 网站名称、Logo、版权信息、ICP备案号 | | 邮件配置 | 邮件配置 | SMTP服务器、端口、用户名、密码、发件人 | | 短信配置 | 短信配置 | API Key、模板ID、签名 | | 存储配置 | 存储配置 | 存储类型(本地/OSS)、AccessKey、Bucket | | 支付配置 | 支付配置 | 商户号、密钥、回调地址 | | 其他 | 自定义分组 | 任何需要后台动态配置的参数 | ## 代码示例 ### 后端获取配置值 项目中没有 `ConfigService`,配置值通过 `ConfigItem` 模型直接查询: ```php where('code', 'website_config')->where('is_delete', 0); }) ->where('code', 'site_name') ->where('status', 1) ->where('is_delete', 0) ->value('value'); // 返回:'RXThinkCMF' // 获取整个配置组的所有配置项(关联数组) $config = Config::where('code', 'website_config')->where('is_delete', 0)->find(); if ($config) { $items = ConfigItem::where('config_id', $config->id) ->where('status', 1) ->where('is_delete', 0) ->column('value', 'code'); // 返回:['site_name' => 'RXThinkCMF', 'site_logo' => '...', 'copyright' => '...'] } // 通过 API 获取网站配置(推荐,含类型处理和 URL 拼接) // GET /api/config/web/index → 返回按配置组组织的完整数据 ``` ### 前端获取配置值 ```typescript // 获取网站配置 const { data } = await http.get('/api/config/web/index') // 使用配置值 const siteName = data.site_name const siteLogo = data.site_logo ``` ### 网站配置保存接口 ```bash # ----------------------------------------------------------------------------- # 批量保存网站配置(按配置组 code 批量更新) # ----------------------------------------------------------------------------- curl -X POST http://localhost:8000/api/config/web/save \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "website": { "site_name": "RXThinkCMF", "site_logo": "/uploads/logo.png", "copyright": "© 2026 RXThinkCMF" } }' ``` ## 与参数管理的区别 | 维度 | 配置管理(Config) | 参数管理(Param) | |------|-------------------|-------------------| | 数据结构 | 分组 + 配置项(一对多) | 独立参数实体 | | 适用场景 | 关联性强的配置(如网站配置包含多个字段) | 独立的开关、阈值 | | 管理界面 | 按组展示,表单式编辑 | 列表式管理 | | 获取方式 | `ConfigItem` 模型查询或 `/api/config/web/index` 接口 | `ParamService::getValue(code)` | | 缓存策略 | 两级缓存(请求级 + Redis) | 两级缓存(请求级 + Redis) | ## 数据库操作示例 ```sql -- 查询所有未删除的配置组 SELECT * FROM think_config WHERE is_delete = 0 ORDER BY sort; -- 查询某个配置组下的所有启用配置项 SELECT ci.* FROM think_config_item ci INNER JOIN think_config c ON ci.config_id = c.id WHERE c.code = 'website_config' AND ci.status = 1 AND ci.is_delete = 0 ORDER BY ci.sort; -- 直接更新配置项值 UPDATE think_config_item SET value = '新网站名称' WHERE code = 'site_name' AND config_id = ( SELECT id FROM think_config WHERE code = 'website_config' AND is_delete = 0 ); ``` ## 相关文档 - [5.12 系统参数管理](/zh/core/param.html) — 独立参数实体管理 - [5.10 字典模块](/zh/core/dict.html) — 枚举/字典数据管理 - [5.11 系统配置管理](/zh/core/config.html) — 本文档