签入版本

This commit is contained in:
小蚂蚁云
2026-10-25 17:24:27 +08:00
parent 48911cc08f
commit fdbeae092a
1010 changed files with 30682 additions and 95274 deletions
+30 -171
View File
@@ -1,192 +1,51 @@
# 5.12 系统配置管理
:::tip 概述
系统配置管理用于动态配置参数,支持分组管理。与参数管理的区别:配置管理支持键值对的分组管理(如网站配置、邮件配置),参数管理是独立的参数实体(如单个开关、阈值)。
系统配置是**运行在数据库里**的键值对(gin_config + gin_config_item),供业务页面级别的开关与文案使用。注意与 `config/config.yaml`(进程配置)区分:一个面向运营、一个面向运维。
:::
## 模块特点
## 两层配置的分工
| 特性 | 说明 |
|------|------|
| 基类 | BaseLogic(系统共享,不隔离) |
| 关联 | 与 ConfigItem 一对多(通过 config_id) |
| 用途 | 网站名称、Logo、版权信息等动态配置 |
| 缓存 | DictService 两级缓存(请求级 + Redis),减少数据库查询 |
| | config.yaml | 系统配置(本页) |
|---|---|---|
| 载体 | 文件 + APP_* 环境变量 | gin_config / gin_config_item 表 |
| 变更方式 | 改文件/环境后重启 | 管理界面即时保存 |
| 面向 | 运维(端口/密钥/连接) | 运营(站点名/开关/文案) |
| 消费方 | 启动序列与基础设施 | 业务模块经接口读取 |
## 数据库表结构
## 表结构
### 主表 `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
<?php
use app\model\ConfigItem;
use app\model\Config;
// 获取单个配置项的值(按配置组 code + 配置项 code 查询)
$value = ConfigItem::whereHas('config', function ($query) {
$query->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 → 返回按配置组组织的完整数据
```text
gin_config 配置分组(如站点配置、业务开关组)
gin_config_item 配置项(config 分组下 key + value + 描述)
```
### 前端获取配置值
## 典型用途
```typescript
// 获取网站配置
const { data } = await http.get('/api/config/web/index')
- 站点名称、logo、备案号等展示信息
- 功能开关(注册开放、评论审核……)
- 业务参数文案(客服电话、协议链接)
// 使用配置值
const siteName = data.site_name
const siteLogo = data.site_logo
```
涉及连接、密钥、端口的**绝不要**放系统配置——那些必须走 config.yaml(受启动校验与环境变量管控)。
### 网站配置保存接口
## 业务侧读取
```bash
# -----------------------------------------------------------------------------
# 批量保存网站配置(按配置组 code 批量更新)
# -----------------------------------------------------------------------------
curl -X POST http://localhost:8000/api/config/web/save \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"website": {
"site_name": "RXThinkCMF",
"site_logo": "/uploads/logo.png",
"copyright": "© 2026 RXThinkCMF"
}
}'
```
标准五方法(Page/List/Detail/Add/Update/Delete)经 ModuleSpec 声明,读取走详情/列表接口;变更走管理界面并受权限码保护,操作留痕(操作日志)。
## 与参数管理的区别
## 管理界面
| 维度 | 配置管理(Config) | 参数管理(Param) |
|------|-------------------|-------------------|
| 数据结构 | 分组 + 配置项(一对多) | 独立参数实体 |
| 适用场景 | 关联性强的配置(如网站配置包含多个字段) | 独立的开关、阈值 |
| 管理界面 | 按组展示,表单式编辑 | 列表式管理 |
| 获取方式 | `ConfigItem` 模型查询或 `/api/config/web/index` 接口 | `ParamService::getValue(code)` |
| 缓存策略 | 两级缓存(请求级 + Redis) | 两级缓存(请求级 + Redis) |
配置管理页(分组 + 配置项维护)见 [6.14 配置管理](/zh/modules/config.html)。
## 数据库操作示例
## 与参数管理(param)的区别
```sql
-- 查询所有未删除的配置组
SELECT * FROM think_config WHERE is_delete = 0 ORDER BY sort;
| | 配置(config) | 参数(param) |
|---|---|---|
| 组织方式 | 分组树 + 项 | 扁平单表 |
| 典型内容 | 成组的站点/业务配置 | 散落的独立参数(如协议版本号) |
| 读取方式 | 按分组/键读取 | 按 code 读取 |
-- 查询某个配置组下的所有启用配置项
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) — 本文档
→ [5.13 系统参数管理](/zh/core/param.html)