# 管理后台 — 站点设置

## 概述

站点设置位于管理后台 `/admin/site-settings`，仅 **owner（站长）** 可访问。

设置通过 DB（`site_settings` 表）持久化 + 内存缓存，运行时修改即时生效，无需重启。

## 可配置项

### 基本设置

| Key | 类型 | 默认值 | 说明 |
|-----|------|--------|------|
| `site.framework` | string | `Framework: MetaZone` | 页脚附加标识，留空则隐藏 |
| `site.copyright_start` | string | `2024` | 版权起始年，页脚渲染 `© 起始年-当前年` |

### 注册设置

| Key | 类型 | 默认值 | 说明 |
|-----|------|--------|------|
| `registration.enabled` | bool | `true` | 关闭后新用户无法注册（API 返回 403） |

### 审核设置

| Key | 类型 | 默认值 | 说明 |
|-----|------|--------|------|
| `audit.enabled` | bool | `true` | 审核总开关 |
| `audit.username_audit` | bool | `true` | 用户名修改需审核 |
| `audit.avatar_audit` | bool | `true` | 头像修改需审核 |
| `audit.bio_audit` | bool | `true` | 签名修改需审核 |

## 工作原理

### 存储架构

```
config.yaml (默认值) → DB site_settings 表 → 内存缓存 → 运行时读取
```

1. 启动时从 DB 全量加载到内存（`config.SiteSettings`）
2. 写入先落 DB，再更新内存（`Set()` / `SetBool()`）
3. 读取纯内存，不查 DB（`RLock`）
4. 不存在于 DB 的 key 自动 fallback `config.yaml` 默认值

### 模板注入

全局中间件 `InjectSiteInfo` 读取 `Framework` / `CopyrightStart`，注入 `gin.Context`。

`BuildPageData` 从 context 提取后注入所有 SSR 模板，无需逐个 Controller 修改。

### 页脚管理入口

页脚末尾自动追加“管理面板”链接，**moderator 及以上角色**可见。

## API 路由

| 方法 | 路径 | 权限 | 说明 |
|------|------|------|------|
| GET | `/api/admin/site-settings` | owner | 获取所有设置 + 审核设置 |
| PUT | `/api/admin/site-settings` | owner | 更新单项字符串设置 |
| PUT | `/api/admin/site-settings/bool` | owner | 更新单项布尔设置 |
| GET | `/api/admin/site-settings/bool?key=...` | owner | 获取单个布尔值 |
