复制项目

This commit is contained in:
kim.dev.6789
2026-01-14 22:35:45 +08:00
parent 305d526110
commit b7f8db7d08
297 changed files with 81784 additions and 0 deletions

739
docs/API_SYSTEM_CONFIG.md Normal file
View File

@@ -0,0 +1,739 @@
# 系统配置管理 API 接口文档
## 基础信息
- **基础路径**: `/system_config`
- **认证方式**: 所有接口都需要在请求头中携带 `token`(通过 `mw.CheckAdmin` 中间件验证,需要管理员权限)
- **请求方法**: 所有接口均为 `POST`
## 响应格式说明
所有接口的响应格式统一为:
```json
{
"errCode": 0, // 错误码0 表示成功
"errMsg": "", // 错误消息
"errDlt": "", // 错误详情
"data": {} // 响应数据
}
```
**注意**: 为了兼容 Ant Design Pro Table前端在 `request` 函数中需要将响应格式转换为 ProTable 期望的格式:
```typescript
const request = async (params) => {
const response = await request('/system_config/list', {
method: 'POST',
data: params,
});
// 将 errCode 格式转换为 ProTable 期望的格式
return {
success: response.errCode === 0,
data: response.data?.list || [],
total: response.data?.total || 0,
};
};
```
## 公共数据结构
### SystemConfigInfo系统配置信息
```json
{
"key": "string", // 配置键(唯一标识)
"title": "string", // 配置标题
"value": "string", // 配置值字符串形式存储根据ValueType解析
"valueType": 1, // 配置值类型1-字符串2-数字3-布尔4-JSON
"description": "string", // 配置描述
"enabled": true, // 是否启用(用于开关类配置)
"showInApp": false, // 是否在APP端展示默认为false
"createTime": 1234567890123, // 创建时间(毫秒时间戳)
"updateTime": 1234567890123 // 更新时间(毫秒时间戳)
}
```
### RequestPagination分页信息
```json
{
"pageNumber": 1, // 页码从1开始
"showNumber": 10 // 每页显示数量
}
```
### StringValue可选字符串值
```json
{
"value": "string" // 字符串值,如果为 null 或未设置则表示不更新该字段
}
```
### Int32Value可选整数值
```json
{
"value": 1 // 整数值,如果为 null 或未设置则表示不更新该字段
}
```
### BoolValue可选布尔值
```json
{
"value": true // 布尔值,如果为 null 或未设置则表示不更新该字段
}
```
## 配置值类型说明
- **1 - 字符串类型 (ConfigValueTypeString)**: 普通文本字符串
- **2 - 数字类型 (ConfigValueTypeNumber)**: 数值字符串,需要转换为数字使用
- **3 - 布尔类型 (ConfigValueTypeBool)**: 布尔值字符串("true"/"false"),需要转换为布尔值使用
- **4 - JSON类型 (ConfigValueTypeJSON)**: JSON 格式字符串,需要解析为 JSON 对象使用
## 常用配置键
- `wallet.enabled`: 是否开启钱包功能(布尔类型)
- `register.phone.verify_code.enabled`: 手机号注册验证码功能是否开启(布尔类型)
---
## 1. 创建系统配置
**接口地址**: `POST /system_config/create`
**请求参数**:
```json
{
"key": "string", // 必填:配置键(唯一标识)
"title": "string", // 可选:配置标题
"value": "string|number|boolean|object", // 可选:配置值(支持多种类型,会根据 valueType 自动转换为字符串存储)
"valueType": 1, // 可选配置值类型1-字符串2-数字3-布尔4-JSON默认为1
"description": "string", // 可选:配置描述
"enabled": true, // 可选是否启用默认为true
"showInApp": false // 可选是否在APP端展示默认为false
}
```
**注意**: `value` 字段支持多种类型传参,系统会根据 `valueType` 自动转换并验证:
- **字符串类型 (valueType=1)**: 可以传字符串,如 `"value": "hello"`
- **数字类型 (valueType=2)**: 可以传数字,如 `"value": 100``"value": 3.14`,会自动转换为字符串存储
- **布尔类型 (valueType=3)**: 可以传布尔值,如 `"value": true``"value": false`,会自动转换为 `"true"``"false"` 字符串存储
- **JSON类型 (valueType=4)**: 可以传 JSON 对象,如 `"value": {"key": "value"}`,会自动序列化为 JSON 字符串存储
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {}
}
```
**请求示例**:
**示例1: 布尔类型配置(推荐直接传布尔值)**
```json
{
"key": "wallet.enabled",
"title": "钱包功能开关",
"value": true, // ✅ 直接传布尔值,不需要传字符串 "true"
"valueType": 3,
"description": "控制是否开启钱包功能",
"enabled": true,
"showInApp": true // 在APP端展示此配置
}
```
**示例2: 数字类型配置(推荐直接传数字)**
```json
{
"key": "wallet.min_withdraw_amount",
"title": "最小提现金额",
"value": 100, // ✅ 直接传数字,会自动转换为字符串 "100" 存储
"valueType": 2,
"description": "用户提现的最小金额(单位:分)",
"enabled": true
}
```
**示例3: JSON类型配置推荐直接传对象**
```json
{
"key": "wallet.withdraw_config",
"title": "提现配置",
"value": { // ✅ 直接传 JSON 对象,会自动序列化为字符串存储
"dailyLimit": 10000,
"monthlyLimit": 100000,
"feeRate": 0.01
},
"valueType": 4,
"description": "提现相关配置JSON格式",
"enabled": true
}
```
**示例4: 字符串类型配置**
```json
{
"key": "wallet.welcome_message",
"title": "欢迎消息",
"value": "欢迎使用钱包功能", // ✅ 字符串类型直接传字符串
"valueType": 1,
"description": "钱包功能欢迎消息",
"enabled": true
}
```
**错误码**:
- `ErrArgs`: 配置键为空
- `ErrDuplicateKey`: 配置键已存在
---
## 2. 获取系统配置详情
**接口地址**: `POST /system_config/get`
**请求参数**:
```json
{
"key": "string" // 必填:配置键
}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {
"config": { // 系统配置信息
"key": "string",
"title": "string",
"value": "string",
"valueType": 1,
"description": "string",
"enabled": true,
"createTime": 1234567890123,
"updateTime": 1234567890123
}
}
}
```
**请求示例**:
```json
{
"key": "wallet.enabled"
}
```
**错误码**:
- `ErrNotFound`: 配置不存在
---
## 3. 获取所有系统配置(分页)
**接口地址**: `POST /system_config/list`
**请求参数**:
```json
{
"pagination": { // 必填:分页信息
"pageNumber": 1, // 页码从1开始
"showNumber": 10 // 每页显示数量
}
}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {
"total": 100, // 总数
"list": [ // 配置列表Ant Design Pro 标准格式)
{
"key": "string",
"title": "string",
"value": "string|number|boolean|object", // 根据 valueType 自动转换为对应类型
"valueType": 1,
"description": "string",
"enabled": true,
"createTime": 1234567890123,
"updateTime": 1234567890123
}
]
}
}
```
**注意**: 返回的 `value` 字段会根据 `valueType` 自动转换为对应类型(详见"2. 获取系统配置详情"的说明)。
**请求示例**:
```json
{
"pagination": {
"pageNumber": 1,
"showNumber": 20
}
}
```
---
## 4. 更新系统配置
**接口地址**: `POST /system_config/update`
**请求参数**:
```json
{
"key": "string", // 必填:配置键
"title": "string", // 可选:配置标题(如果为 null 则不更新)
"value": "string|number|boolean|object", // 可选:配置值(支持多种类型,会根据 valueType 自动转换)
"valueType": 1, // 可选:配置值类型(如果为 null 则不更新)
"description": "string", // 可选:配置描述(如果为 null 则不更新)
"enabled": true, // 可选:是否启用(如果为 null 则不更新)
"showInApp": false // 可选是否在APP端展示如果为 null 则不更新)
}
```
**注意**:
- `value` 字段支持多种类型传参,系统会根据当前的 `valueType`(或新设置的 `valueType`)自动转换并验证
- 如果同时更新 `value``valueType`,系统会验证新值是否符合新的类型要求
- 如果只更新 `valueType`,系统会验证当前值是否符合新的类型要求
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {}
}
```
**请求示例**:
**示例1: 更新布尔类型配置的值**
```json
{
"key": "wallet.enabled",
"value": false, // ✅ 直接传布尔值
"description": "已关闭钱包功能"
}
```
**示例2: 更新数字类型配置的值**
```json
{
"key": "wallet.min_withdraw_amount",
"value": 200 // ✅ 直接传数字
}
```
**示例3: 同时更新值和类型**
```json
{
"key": "wallet.min_amount",
"value": 150, // ✅ 新值
"valueType": 2 // 更新为数字类型
}
```
**注意**: 只有提供的字段才会被更新,未提供的字段保持不变。
**错误码**:
- `ErrNotFound`: 配置不存在
---
## 5. 更新系统配置值
**接口地址**: `POST /system_config/update_value`
**请求参数**:
```json
{
"key": "string", // 必填:配置键
"value": "string" // 必填:新的配置值
}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {}
}
```
**请求示例**:
**示例1: 更新布尔类型配置**
```json
{
"key": "wallet.enabled",
"value": false // ✅ 直接传布尔值,不需要传字符串 "false"
}
```
**示例2: 更新数字类型配置**
```json
{
"key": "wallet.min_withdraw_amount",
"value": 200 // ✅ 直接传数字
}
```
**示例3: 更新 JSON 类型配置**
```json
{
"key": "wallet.withdraw_config",
"value": { // ✅ 直接传 JSON 对象
"dailyLimit": 20000,
"monthlyLimit": 200000
}
}
```
**错误码**:
- `ErrNotFound`: 配置不存在
---
## 6. 更新系统配置启用状态
**接口地址**: `POST /system_config/update_enabled`
**请求参数**:
```json
{
"key": "string", // 必填:配置键
"enabled": true // 必填:是否启用
}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {}
}
```
**请求示例**:
```json
{
"key": "wallet.enabled",
"enabled": false
}
```
**错误码**:
- `ErrNotFound`: 配置不存在
---
## 7. 删除系统配置
**接口地址**: `POST /system_config/delete`
**请求参数**:
```json
{
"keys": ["string"] // 必填:配置键列表(支持批量删除)
}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {}
}
```
**请求示例**:
```json
{
"keys": ["wallet.enabled", "register.phone.verify_code.enabled"]
}
```
---
## 8. 获取所有已启用的配置
**接口地址**: `POST /system_config/get_enabled`
**请求参数**:
```json
{}
```
**响应参数**:
```json
{
"errCode": 0,
"errMsg": "",
"errDlt": "",
"data": {
"list": [ // 已启用的配置列表Ant Design Pro 标准格式)
{
"key": "string",
"title": "string",
"value": "string|number|boolean|object", // 根据 valueType 自动转换为对应类型
"valueType": 1,
"description": "string",
"enabled": true,
"createTime": 1234567890123,
"updateTime": 1234567890123
}
]
}
}
```
**注意**: 返回的 `value` 字段会根据 `valueType` 自动转换为对应类型(详见"2. 获取系统配置详情"的说明)。
**请求示例**:
```json
{}
```
**说明**: 此接口用于获取所有已启用enabled=true的配置通常用于前端展示或业务逻辑判断。
---
## 使用场景示例
### 场景1: 开启/关闭钱包功能
1. **创建钱包功能配置**(推荐直接传布尔值):
```json
POST /system_config/create
{
"key": "wallet.enabled",
"title": "钱包功能开关",
"value": true, // ✅ 直接传布尔值,更直观
"valueType": 3,
"description": "控制是否开启钱包功能",
"enabled": true
}
```
2. **关闭钱包功能**(两种方式):
方式1: 更新 enabled 字段
```json
POST /system_config/update_enabled
{
"key": "wallet.enabled",
"enabled": false
}
```
方式2: 更新 value 字段
```json
POST /system_config/update_value
{
"key": "wallet.enabled",
"value": false // ✅ 直接传布尔值
}
```
3. **业务代码中检查钱包功能是否开启**:
```go
config, err := db.GetSystemConfig(ctx, "wallet.enabled")
if err != nil || !config.Enabled {
return errors.New("钱包功能未开启")
}
```
### 场景2: 配置手机号注册验证码功能
1. **创建验证码功能配置**(推荐直接传布尔值):
```json
POST /system_config/create
{
"key": "register.phone.verify_code.enabled",
"title": "手机号注册验证码功能",
"value": true, // ✅ 直接传布尔值
"valueType": 3,
"description": "控制手机号注册时是否需要验证码",
"enabled": true
}
```
### 场景3: 配置数字类型的参数(推荐直接传数字)
**创建配置**:
```json
POST /system_config/create
{
"key": "wallet.min_withdraw_amount",
"title": "最小提现金额",
"value": 100, // ✅ 直接传数字,会自动转换为字符串存储
"valueType": 2,
"description": "用户提现的最小金额(单位:分)",
"enabled": true
}
```
**获取配置**(返回时会自动转换为数字):
```json
GET /system_config/get
{
"key": "wallet.min_withdraw_amount"
}
// 响应
{
"data": {
"config": {
"key": "wallet.min_withdraw_amount",
"value": 100, // ✅ 返回数字类型,不是字符串 "100"
"valueType": 2
}
}
}
```
**后端使用**(如果直接使用数据库模型,需要手动转换):
```go
config, _ := db.GetSystemConfig(ctx, "wallet.min_withdraw_amount")
minAmount, _ := strconv.ParseInt(config.Value, 10, 64)
```
### 场景4: 配置 JSON 类型的复杂参数(推荐直接传对象)
**创建配置**:
```json
POST /system_config/create
{
"key": "wallet.withdraw_config",
"title": "提现配置",
"value": { // ✅ 直接传 JSON 对象,会自动序列化为字符串存储
"dailyLimit": 10000,
"monthlyLimit": 100000,
"feeRate": 0.01
},
"valueType": 4,
"description": "提现相关配置JSON格式",
"enabled": true
}
```
**获取配置**(返回时会自动解析为对象):
```json
GET /system_config/get
{
"key": "wallet.withdraw_config"
}
// 响应
{
"data": {
"config": {
"key": "wallet.withdraw_config",
"value": { // ✅ 返回 JSON 对象,不是字符串
"dailyLimit": 10000,
"monthlyLimit": 100000,
"feeRate": 0.01
},
"valueType": 4
}
}
}
```
**后端使用**(如果直接使用数据库模型,需要手动解析):
```go
config, _ := db.GetSystemConfig(ctx, "wallet.withdraw_config")
var withdrawConfig map[string]interface{}
json.Unmarshal([]byte(config.Value), &withdrawConfig)
```
---
## 错误码说明
- `ErrArgs`: 参数错误(如必填字段为空)
- `ErrNotFound`: 资源不存在(如配置键不存在)
- `ErrDuplicateKey`: 重复键(如创建配置时键已存在)
- `ErrNoPermission`: 无权限(非管理员用户)
---
## 注意事项
1. **配置键唯一性**: 配置键key在整个系统中必须唯一不能重复。
2. **配置值类型转换**:
- **传参时**: `value` 字段支持多种类型字符串、数字、布尔、JSON对象系统会根据 `valueType` 自动转换为字符串存储
- **返回时**: `value` 字段会根据 `valueType` 自动转换为对应类型返回数字返回数字布尔返回布尔JSON返回对象
- **数据库存储**: 所有值都以字符串形式存储在数据库中
- **后端使用**: 如果直接使用数据库模型,需要根据 `valueType` 手动转换:
- 字符串类型:直接使用
- 数字类型:使用 `strconv.ParseInt``strconv.ParseFloat` 转换
- 布尔类型:使用 `strconv.ParseBool` 转换
- JSON类型使用 `json.Unmarshal` 解析
3. **类型验证**: 系统会在创建和更新时自动验证 `value` 是否符合 `valueType` 的要求:
- 数字类型:必须是有效的数字
- 布尔类型:必须是 `true``false`
- JSON类型必须是有效的 JSON
4. **可选字段更新**: 在 `UpdateSystemConfig` 接口中,如果字段为 `null` 或未设置,则不会更新该字段。
5. **启用状态**: `enabled` 字段用于控制配置是否生效。即使配置存在,如果 `enabled``false`,业务代码也应该认为该功能未开启。
6. **APP端展示**: `showInApp` 字段用于控制配置是否在APP端展示。只有 `showInApp``true` 的配置才会在APP端显示给用户。此字段默认为 `false`
7. **推荐用法**:
- 创建/更新布尔类型配置时,推荐直接传布尔值:`"value": true` 而不是 `"value": "true"`
- 创建/更新数字类型配置时,推荐直接传数字:`"value": 100` 而不是 `"value": "100"`
- 创建/更新 JSON 类型配置时,推荐直接传对象:`"value": {"key": "value"}` 而不是 `"value": "{\"key\":\"value\"}"`
5. **管理员权限**: 所有接口都需要管理员权限,普通用户无法访问。
6. **请求头**: 所有请求都需要在请求头中携带 `token``operationid`