跳转到内容

系统参数

系统参数(sys_config)提供可在线管理的运行时配置能力。与框架层的 app.yaml 静态配置不同,系统参数存储在数据库中,支持热更新,无需重启服务。

特性框架层配置 (app.yaml)系统参数 (sys_config)
存储位置文件系统数据库
修改方式编辑文件 + 重启API 在线修改
生效时机应用启动时实时生效(带缓存)
适用场景数据库连接、端口、密钥业务开关、功能配置
类型安全编译期校验运行时 Schema 校验
多租户不区分租户按 tenant_id 隔离
POST /api/system/config
{
"name": "sys.account.register",
"label": "账号注册开关",
"value": "true",
"type": "boolean", // string | number | boolean | json
"remark": "控制是否开放用户自主注册功能"
}
GET /api/system/config?page=1&pageSize=10&name=sys.account
// 响应
{
"total": 20,
"rows": [
{
"id": "cfg-001",
"name": "sys.account.register",
"label": "账号注册开关",
"value": "true",
"type": "boolean",
"remark": "控制是否开放用户自主注册功能",
"updatedAt": "2024-06-01T12:00:00Z"
}
]
}
PUT /api/system/config/{id}
{
"value": "false" // 关闭注册
}
// 更新后自动清除缓存,下次读取时从数据库刷新
DELETE /api/system/config/{id}
// 内置参数(name 以 sys. 开头)不可删除

系统参数通过带缓存的 Service 方法获取,避免频繁查询数据库。

const configService = createConfigService({ db, cache });
// 获取参数值(自动类型转换)
const registerEnabled = await configService.getBoolean('sys.account.register');
// → true
const maxUploadSize = await configService.getNumber('sys.upload.maxSize');
// → 5242880
const smtpConfig = await configService.getJson('sys.mail.smtp');
// → { host: 'smtp.example.com', port: 465, ssl: true }
const appName = await configService.getString('sys.app.name');
// → 'VentoStack'
// 缓存 Key: config:{tenantId}:{name}
// TTL: 无过期时间,变更时主动失效
async function getConfigValue(name: string, tenantId: string): Promise<string | null> {
const cacheKey = `config:${tenantId}:${name}`;
// 1. 查询缓存
const cached = await cache.get(cacheKey);
if (cached !== null) return cached;
// 2. 查询数据库
const row = await db.query`
SELECT value FROM sys_config
WHERE name = ${name} AND tenant_id = ${tenantId}
`;
if (row.length === 0) return null;
// 3. 写入缓存
await cache.set(cacheKey, row[0].value);
return row[0].value;
}
// 缓存失效
async function invalidateConfigCache(name: string, tenantId: string) {
await cache.del(`config:${tenantId}:${name}`);
}

以下是系统预置的标准参数(sys. 前缀的参数为系统内置,不可删除):

参数名默认值说明
sys.account.registertrue是否开放用户注册
sys.account.captchatrue登录是否需要验证码
sys.account.resetPasswordtrue是否开放密码自助重置
sys.user.initPassword123456用户初始密码
sys.upload.maxSize5242880上传文件最大字节数(5MB)
sys.upload.allowedTypesjpg,jpeg,png,gif,pdf,doc,docx允许的文件类型
sys.mail.smtp{}SMTP 配置(JSON)
sys.app.nameVentoStack应用名称
sys.app.logo应用 Logo URL
import { createConfigService } from '@ventostack/system';
// 在路由处理器中读取配置
app.post('/api/register', async (ctx) => {
const registerEnabled = await configService.getBoolean('sys.account.register');
if (!registerEnabled) {
return ctx.json({ error: 'registration_disabled' }, 403);
}
const captchaEnabled = await configService.getBoolean('sys.account.captcha');
if (captchaEnabled) {
await verifyCaptcha(ctx.body.captchaId, ctx.body.captchaCode);
}
// ... 注册逻辑
});