本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:暂存20260913/docs/SplitDB控制台拆分与操作日志改造计划 (2).md。
FlintHub 1.0 — SplitDB 控制台拆分与操作日志查看改造计划
文档状态:待确认(2026-08-16)
目标:① 将原
/admin/database/engine(P29 引擎控制台)拆分为「引擎概览(只读)」与「引擎设置(操作)」两个独立页面;② 后台菜单重组为「数据管理 / 站长工具」两组;③ 新增「操作日志」查看页/admin/logs/audit;④ 保留旧路径重定向基线:FlintHub 1.0(SplitDB 纯 SQLite 分片引擎);PHP 8.0.2(SQLite 3.33.0);P29 引擎控制台已上线
关联文档:
update/SplitDB引擎控制台改造计划.md(P29 设计与决策)、update/SplitDB引擎控制台使用说明.md(P29 使用说明,本次需同步修订)
一、现状勘察结论(已读代码确认)
| 勘察项 | 现状 | 对本计划的影响 |
|---|---|---|
app/Controllers/Admin/DatabaseController.php | P29 已含 engine() + 11 个助手(currentBucketSize / updateBucketSize / maybeAutoExpand / bucketStatsCached / bucketStatsLive / totalThreads / suggestBuckets / consistencyCheck / backupList / handleSaveBuckets / handleSaveAutoExpand) | 拆分时助手方法全部复用,仅新增 overview()/settings() 两个入口方法 |
app/Views/admin/database/engine.php | 单页五大模块(275 行) | 拆分为 overview.php + settings.php 两个视图 |
app/Views/admin/_sidebar.php | 「数据管理」组含 备份优化 / 引擎控制台 / 维护工具 | 重组为两组(见第三节) |
index.php 路由 | GET/POST /admin/database/engine → engine() | 新增 overview/settings 路由;engine 改为重定向 |
audit_logs 表(Schema.php L536-551) | 字段:id/user_id/username/action/target_type/target_id/detail/ip/user_agent/created_at;索引:idx_audit_logs_action / idx_audit_logs_created / idx_audit_logs_target | 日志页分页/筛选直接可用;created_at 有索引 → 日期筛选走 LIKE 'YYYY-MM-DD%' 前缀可命中索引 |
app/Helpers/AuditLog.php::query() | query($action='', $userId=0, $page=1, $perPage=50) —— 仅支持 action/userId 筛选,无日期参数 | 需小幅扩展:追加可选 $date=''(YYYY-MM-DD)与 $targetType='' 参数,向后兼容 |
| 图标映射(TemplateCompiler::icon) | 已有 list/clock/history/eye/wrench/shield/database/settings/save/maintenance | 菜单图标直接用现有映射,无新增图标需求 |
| 自动扩容触发点 1 | 原「引擎页加载时」(engine() GET) | 改为 settings 页加载时触发(settings 是操作页,符合语义) |
二、页面拆分设计
2.1 路由总览
| 路径 | 方法 | 控制器动作 | 说明 |
|---|---|---|---|
/admin/database/overview | GET | DatabaseController::overview() | 引擎概览(只读监控) |
/admin/database/settings | GET/POST | DatabaseController::settings() | 引擎设置(操作型) |
/admin/database/engine | GET/POST | DatabaseController::engine() | 重定向到 /admin/database/overview(保旧链接) |
/admin/logs/audit | GET | LogController::audit()(🆕 新控制器) | 操作日志查看页 |
2.2 引擎概览 /admin/database/overview(只读)
保留原 engine 页的只读监控数据:
| 模块 | 内容 | 数据来源(复用 P29 助手) |
|---|---|---|
| 引擎概览表 | 当前配置桶数 / 当前季度 / 当前总帖子数 / 建议桶数 | currentBucketSize() / ShardRouter::quarter() / totalThreads() / suggestBuckets() |
| 分片分布统计 | 当前季度各桶 topic/reply 行数 + 文件大小(表格) | bucketStatsCached()(60s 缓存)+「🔄 刷新统计」按钮(?refresh_stats=1) |
| 说明横幅 | 提示操作型功能已移至「SplitDB 设置」页 | 静态文案 + 跳转链接 |
- 无任何 POST 表单;自动扩容检查(maybeAutoExpand)不在本页触发。
2.3 引擎设置 /admin/database/settings(操作型)
| 模块 | 内容 | 实现 |
|---|---|---|
| 桶数动态调整 | 下拉 32/64/128/256 → save_buckets(白名单 + 只增不减 + 写 config 四步 + config 不可写置灰) | 复用 handleSaveBuckets() / updateBucketSize() |
| 自动扩容设置 | 开关 + 阈值 + 只读当前总帖数参考 + 上次扩容时间 | 复用 handleSaveAutoExpand();阈值旁只读显示 totalThreads() |
| 扩容记录(本次新增) | 展示 audit_logs 中最近扩容/调整记录(action ∈ {auto_expand, admin_action} 且 target_type='database'),显示时间/操作人/详情(桶数变化),最近 10 条 | 直接查 audit_logs(参数绑定 + LIMIT 10),或扩展 AuditLog::query() 复用 |
| 一致性检查(诊断) | 范围下拉(当前季度/全部历史)+ 开始检查 → 对拍结果表(不一致红色高亮) | 复用 consistencyCheck(),随 settings 页渲染结果 |
| 自动扩容触发点 1 | 本页 GET 加载时调用 maybeAutoExpand() | 迁移自原 engine 页 |
2.4 旧路径兼容
engine()保留为临时重定向:GET/POST /admin/database/engine→redirect('/admin/database/overview')(302,redirect() 已防开放重定向);- 旧
engine.php视图文件:删除(不再被引用),同步删除 update/ 镜像对应文件。
三、后台菜单重组(app/Views/admin/_sidebar.php)
3.1 新结构
┌─ 数据管理 ──────────────────────────────┐
│ SplitDB 概览 → /admin/database/overview (icon: database) nav_active=database_overview
│ SplitDB 设置 → /admin/database/settings (icon: settings) nav_active=database_settings
│ 备份优化 → /admin/database (icon: save) nav_active=database
├─ 站长工具 ──────────────────────────────┤
│ 操作日志 → /admin/logs/audit (icon: list) nav_active=logs_audit
│ 维护工具 → /admin/maintenance (icon: wrench) nav_active=maintenance
└──────────────────────────────────────────┘- 「数据管理」组 header:icon
database(沿用); - 「站长工具」组 header:icon
wrench(新增 header,与既有「外观管理」「扩展」header 平级); - 菜单项顺序按上表;
__nav_active值分别绑定各子链接 active 态; - 折叠/展开逻辑(_sidebar.php 底部 JS)按 header 分组自动生效,无需改动 JS。
四、操作日志查看页(/admin/logs/audit)
4.1 控制器
新建 app/Controllers/Admin/LogController.php(extends BaseController,构造器即管理员 + 30 分钟二次验证,等价 need_admin())。
★ 权限等级考量(2026-08-16 用户反馈):审计日志含 IP/UA/管理操作详情,属敏感数据。经勘察,本系统无 moderator/版主角色体系——后台权限仅
Auth::isAdmin()(role='admin' && group_id=4),Permission 助手是版块级矩阵而非用户角色级。因此本期保持 need_admin()(BaseController 构造器),不做 need_manage()(该概念在代码库中无既有实现,引入需新增角色字段与权限矩阵,超出本期范围)。扩展点:若后续需让版主可查,在audit()入口追加角色判断(如Auth::isAdmin() || 版主组判定)即可,不影响本期实现。
public function audit()
{
// GET 参数:page / action / date(YYYY-MM-DD)
$page = max(1, (int)($_GET['page'] ?? 1));
$action = (string)($_GET['action'] ?? ''); // 白名单:允许 [a-z_],非法置空
$date = (string)($_GET['date'] ?? ''); // 白名单:\d{4}-\d{2}-\d{2}
$perPage = 50;
$audit = \app\Helpers\AuditLog::query($action, 0, $page, $perPage, $date); // 扩展后签名
// 计算 totalPages 并钳制 $page(越界回落最后一页,同 P26 规范)
$this->view('admin/logs/audit', [
'items' => $audit['items'], 'total' => $audit['total'],
'page' => $page, 'totalPages' => $totalPages,
'action' => $action, 'date' => $date,
'__nav_active' => 'logs_audit',
]);
}- 筛选表单为 GET(无需 CSRF,与后台用户搜索一致);
- action 白名单正则
/^[a-z_]{1,32}$/;date 白名单/^\d{4}-\d{2}-\d{2}$/(不合法置空)。
4.2 AuditLog::query() 扩展(向后兼容)
public static function query(string $action = '', int $userId = 0, int $page = 1,
int $perPage = 50, string $date = ''): array
{
// 追加:if ($date !== '') { $where .= ' AND created_at LIKE :date_prefix'; $params[':date_prefix'] = $date . '%'; }
// (created_at 存 'Y-m-d H:i:s',LIKE 'YYYY-MM-DD%' 前缀可命中 idx_audit_logs_created)
}- 原调用方(若有)零改动:新参数
$date默认''不改变既有行为; - 目标类型筛选暂不做(本次需求仅「日期 + 操作类型」,避免过度设计)。
4.3 视图 app/Views/admin/logs/audit.php
- 标题 + 筛选表单:操作类型下拉(可选全部,及从
action参数回显)+ 日期输入(type=date)+ 查询按钮; - 操作类型下拉值:从 audit_logs 表
SELECT DISTINCT action动态读取(2026-08-16 用户反馈,采纳)+「全部」选项——新操作类型自动出现,免维护; - ★ 性能实测:
EXPLAIN QUERY PLAN SELECT DISTINCT action FROM audit_logs=SCAN TABLE audit_logs USING COVERING INDEX idx_audit_logs_action(覆盖索引扫描,不落表);当前 170 行稳态 0.030~0.047ms,即便万级行仍为亚毫秒级; - ★ 优化(防大表退化):DISTINCT 结果落
data/runtime/cache_audit_actions.json(60s TTL,JSON 带 ts),复用引擎统计缓存同款模式;页面加载命中缓存即免查库;刷新缓存由"新增日志写入"自然驱动(60s 后过期重查); - 表格列:时间 / 管理员(username) / 操作类型(action) / 目标(target_type + target_id) / IP / 详情(detail,超长截断 title 悬浮);
- 分页:
$this->pagination()统一样式,URL 带action/date参数不丢筛选; - 空态:「暂无操作日志」;
- 管理员列为空时显示
-(系统任务如 auto_expand 无用户)。
五、改动文件清单
| # | 文件 | 操作 | 说明 |
|---|---|---|---|
| 1 | index.php | ✏️ 改 | 新增 /database/overview(GET) + /database/settings(GET/POST) 路由;/database/engine 保留指向 engine();新增 /logs/audit(GET) → LogController |
| 2 | app/Controllers/Admin/DatabaseController.php | ✏️ 改 | 新增 overview()(只读渲染,复用 P29 助手);新增 settings()(迁移 save_buckets/save_auto_expand/consistency POST 处理 + maybeAutoExpand 触发 + 扩容记录查询);engine() 改为 redirect('/admin/database/overview') |
| 3 | app/Views/admin/database/overview.php | 🆕 新建 | 只读概览视图(从 engine.php 提取) |
| 4 | app/Views/admin/database/settings.php | 🆕 新建 | 操作型视图(从 engine.php 提取 + 新增扩容记录区块) |
| 5 | app/Views/admin/database/engine.php | 🗑️ 删除 | 旧单页视图(不再引用) |
| 6 | app/Controllers/Admin/LogController.php | 🆕 新建 | 操作日志控制器(audit()) |
| 7 | app/Views/admin/logs/audit.php | 🆕 新建 | 操作日志视图 |
| 8 | app/Helpers/AuditLog.php | ✏️ 改 | query() 追加可选 $date 参数(向后兼容) |
| 9 | app/Views/admin/_sidebar.php | ✏️ 改 | 菜单重组:数据管理(概览/设置/备份优化)+ 站长工具(操作日志/维护工具) |
| 10 | update/ 镜像同步(上述全部 PHP/app 文件) | 📦 同步 | fc /b 逐字节一致;engine.php 从镜像删除 |
| 11 | update/CHANGELOG.md | ✏️ 改 | 记录 P30 |
| 12 | update/SplitDB引擎控制台使用说明.md | ✏️ 改 | 同步:概览/设置拆页 + 操作日志说明 |
六、安全与健壮性
- 全部 POST(settings 页 save_buckets/save_auto_expand)走
Csrf::verifyOrDie;overview 纯 GET 只读; - 筛选参数白名单:action
/^[a-z_]{1,32}$/、date/^\d{4}-\d{2}-\d{2}$/、page intval 钳制;SQL 全参数绑定; AuditLog::query()扩展向后兼容,原调用方零影响;- 扩容记录查询仅读 audit_logs(LIMIT 10),无写操作;
- 菜单
__nav_active各值唯一,无高亮串扰; - engine 重定向走
Controller::redirect()(防开放重定向,仅相对路径)。
七、验证与交付
php -l全过(改动的全部 PHP 文件);- 功能自测(临时脚本用后即删):
- overview 页数据:currentBucketSize/quarter/totalThreads/suggestBuckets/bucketStats 正常返回;
- settings 页:save_buckets 白名单+只增不减+写 config 往返还原;save_auto_expand 保存;maybeAutoExpand 守卫(未启用/阈值/24h/flock);consistencyCheck 两范围;
- 扩容记录:audit_logs 中 auto_expand/admin_action 记录查询正确(含空态);
- AuditLog::query 日期筛选:
LIKE 'YYYY-MM-DD%'命中与空结果; - engine 重定向:302 Location 指向 /admin/database/overview;
- 侧边栏:5 个链接 href 与 __nav_active 映射逐一核对;
update/镜像fc /b逐字节一致(engine.php 删除同步);CHANGELOG 记 P30;使用说明修订;- 浏览器复核建议:菜单分组展开/高亮、日志筛选交互(依赖 JS,CLI 无法全覆盖)。
八、待确认点
- 扩容记录展示:最近 10 条(本次设计)还是提供分页/筛选?默认按本次设计(LIMIT 10 最近记录)。
- 一致性检查归属:随「引擎设置」页(本次设计,操作型诊断)还是移回「引擎概览」?默认 settings 页。
- 操作日志类型下拉:从 DB DISTINCT action 动态读取 + 60s 缓存(2026-08-16 用户反馈采纳——性能实测覆盖索引亚毫秒级,免维护,新类型自动出现;替换原静态白名单设计);
- engine 重定向:302 临时重定向(本次设计)即可,无需 301。
计划完。待用户确认后按第五节清单串行实施。