# 运行时配置

支付、邮件、聚合登录和代理转发配置存放在数据库 `runtime_configs` 表中。服务不会自动建表，也不会从 `config.json` 导入；请先手动执行 SQL。运行时读取 Redis 缓存，缓存未命中才查 MySQL；后台保存或切换方案会主动删除缓存，因此修改可即时生效。

```sql
CREATE TABLE runtime_configs (
  config_key VARCHAR(64) NOT NULL,
  config_name VARCHAR(64) NOT NULL,
  config_value JSON NOT NULL,
  enabled TINYINT(1) NOT NULL DEFAULT 1,
  is_default TINYINT(1) NOT NULL DEFAULT 0,
  updated_at BIGINT NOT NULL,
  updated_by VARCHAR(64) NULL,
  PRIMARY KEY (config_key, config_name),
  KEY idx_runtime_configs_active (config_key, enabled, is_default, updated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

管理接口：

- `GET /Admin/System/RuntimeConfig`: 获取全部配置方案。
- `PUT /Admin/System/RuntimeConfig`: 新增或更新一个方案。
- `PUT /Admin/System/RuntimeConfig/Select`: 切换当前方案。

配置类型：

- `pay`: 易支付配置，包含 `url`、`pid`、`key`、`return_url`、`uni_return_url`、`methods`。
- `email`: SMTP 账号数组，按 `priority` 从小到大尝试发送。
- `unilogin`: 聚合登录配置，包含 `url`、`appid`、`appkey` 等。
- `proxyForwardServer`: 代理转发配置，包含 `enabled`、`url`、`timeout`。

示例初始化语句：

```sql
INSERT INTO runtime_configs
(config_key, config_name, config_value, enabled, is_default, updated_at, updated_by)
VALUES
('pay', 'default', JSON_OBJECT(
  'url', 'https://pay.example.com',
  'pid', '1000',
  'key', 'CHANGE_ME',
  'return_url', 'https://your-site.example/#/store/orderDetail/',
  'uni_return_url', 'https://m.your-site.example/#/pages/order/order-detail?id=',
  'methods', JSON_ARRAY(
    JSON_OBJECT('type', 'alipay', 'name', '支付宝'),
    JSON_OBJECT('type', 'wxpay', 'name', '微信支付')
  )
), 1, 1, UNIX_TIMESTAMP(NOW(3)) * 1000, 'init');

INSERT INTO runtime_configs
(config_key, config_name, config_value, enabled, is_default, updated_at, updated_by)
VALUES
('email', 'default', JSON_ARRAY(
  JSON_OBJECT(
    'host', 'smtp.example.com',
    'port', 465,
    'user', 'service@example.com',
    'password', 'CHANGE_ME',
    'from', 'RunForge <service@example.com>',
    'priority', 0
  )
), 1, 1, UNIX_TIMESTAMP(NOW(3)) * 1000, 'init');
```
