[开发]FlintHub 1.0 — SplitDB 控制台拆分与操作日志查看改造计划

👑Lv.11 元老 🌞 骨干会员
2026-10-24 00:16:21

本文由 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.phpP29 已含 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/overviewGETDatabaseController::overview()引擎概览(只读监控)
/admin/database/settingsGET/POSTDatabaseController::settings()引擎设置(操作型)
/admin/database/engineGET/POSTDatabaseController::engine()重定向到 /admin/database/overview(保旧链接)
/admin/logs/auditGETLogController::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 无用户)。

五、改动文件清单

#文件操作说明
1index.php✏️ 改新增 /database/overview(GET) + /database/settings(GET/POST) 路由;/database/engine 保留指向 engine();新增 /logs/audit(GET) → LogController
2app/Controllers/Admin/DatabaseController.php✏️ 改新增 overview()(只读渲染,复用 P29 助手);新增 settings()(迁移 save_buckets/save_auto_expand/consistency POST 处理 + maybeAutoExpand 触发 + 扩容记录查询);engine() 改为 redirect('/admin/database/overview')
3app/Views/admin/database/overview.php🆕 新建只读概览视图(从 engine.php 提取)
4app/Views/admin/database/settings.php🆕 新建操作型视图(从 engine.php 提取 + 新增扩容记录区块)
5app/Views/admin/database/engine.php🗑️ 删除旧单页视图(不再引用)
6app/Controllers/Admin/LogController.php🆕 新建操作日志控制器(audit())
7app/Views/admin/logs/audit.php🆕 新建操作日志视图
8app/Helpers/AuditLog.php✏️ 改query() 追加可选 $date 参数(向后兼容)
9app/Views/admin/_sidebar.php✏️ 改菜单重组:数据管理(概览/设置/备份优化)+ 站长工具(操作日志/维护工具)
10update/ 镜像同步(上述全部 PHP/app 文件)📦 同步fc /b 逐字节一致;engine.php 从镜像删除
11update/CHANGELOG.md✏️ 改记录 P30
12update/SplitDB引擎控制台使用说明.md✏️ 改同步:概览/设置拆页 + 操作日志说明


六、安全与健壮性

  1. 全部 POST(settings 页 save_buckets/save_auto_expand)走 Csrf::verifyOrDie;overview 纯 GET 只读;
  2. 筛选参数白名单:action /^[a-z_]{1,32}$/、date /^\d{4}-\d{2}-\d{2}$/、page intval 钳制;SQL 全参数绑定;
  3. AuditLog::query() 扩展向后兼容,原调用方零影响;
  4. 扩容记录查询仅读 audit_logs(LIMIT 10),无写操作;
  5. 菜单 __nav_active 各值唯一,无高亮串扰;
  6. engine 重定向走 Controller::redirect()(防开放重定向,仅相对路径)。

七、验证与交付

  1. php -l 全过(改动的全部 PHP 文件);
  2. 功能自测(临时脚本用后即删):
  • 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 映射逐一核对;
  1. update/ 镜像 fc /b 逐字节一致(engine.php 删除同步);CHANGELOG 记 P30;使用说明修订;
  2. 浏览器复核建议:菜单分组展开/高亮、日志筛选交互(依赖 JS,CLI 无法全覆盖)。

八、待确认点

  1. 扩容记录展示:最近 10 条(本次设计)还是提供分页/筛选?默认按本次设计(LIMIT 10 最近记录)。
  2. 一致性检查归属:随「引擎设置」页(本次设计,操作型诊断)还是移回「引擎概览」?默认 settings 页。
  3. 操作日志类型下拉:从 DB DISTINCT action 动态读取 + 60s 缓存(2026-08-16 用户反馈采纳——性能实测覆盖索引亚毫秒级,免维护,新类型自动出现;替换原静态白名单设计);
  4. engine 重定向:302 临时重定向(本次设计)即可,无需 301。

计划完。待用户确认后按第五节清单串行实施。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 3 次 | 回复 0 次

全部回复 (0)

暂无回复

请 登录