当前位置: 首页 > news >正文

EasyAdmin 操作日志系统解析:按月分表记录用户操作的设计思路

EasyAdmin 操作日志系统解析:按月分表记录用户操作的设计思路

【免费下载链接】easyadmin框架主要使用ThinkPHP6.0 + layui,拥有完善的权限的管理模块以及敏捷的开发方式,让你开发起来更加的舒服。项目地址: https://gitcode.com/gh_mirrors/easy/easyadmin

EasyAdmin 是一个基于 ThinkPHP6.0 + layui 构建的开源后台管理框架,内置了完善的权限管理模块。其中它的操作日志模块设计得非常巧妙——采用按月分表的方式记录后台用户的操作行为,既保证了写入性能,又让日志查询、清理变得异常轻松。这篇文章就来拆解 EasyAdmin 操作日志按月分表的设计思路,帮助新手理解这套优雅的日志方案。

为什么操作日志要按月分表?

后台管理系统的操作日志有一个典型特点:数据量增长极快,但价值具有时效性。管理员每一次登录、增删改查都会被记录下来,一个月轻松积累几十万甚至上百万条数据。

如果所有日志都堆在一张表里,会带来两个痛点:

  • 😣 单表数据量过大,insert写入变慢,页面查询也卡顿
  • 😣 想清理过期日志时,delete大表数据性能极差,还容易锁表

按月分表则完美解决了这两个问题:写入分散到不同月份的表,查询按需定位,清理直接删表即可。这就是 EasyAdmin 选择按月分表的核心动机。

EasyAdmin 按月分表的核心实现:模型动态表名

EasyAdmin 操作日志分表的关键代码,藏在模型SystemLog的构造函数里。我们来看 app/admin/model/SystemLog.php 的核心逻辑:

public function __construct(array $data = []) { parent::__construct($data); $this->name = 'system_log_' . date('Ym'); }

模型实例化时,自动把表名设置为system_log_当前年月,例如 2026 年 8 月就是system_log_202608。同时模型还提供了setMonth()方法,支持按指定月份切换表名,为后续的按月查询打下基础。

动态建表:日志表自动创建

光有分表思路还不够,月份更替后新表从哪来?EasyAdmin 的解决方案是写入时自动检测、自动建表,整个过程完全不需要人工干预。

核心实现在 app/admin/service/SystemLogService.php:

  • 服务采用单例模式,实例化时从配置读取表前缀,拼出完整的按月表名
  • save()方法写入前先调用detectTable()检测表是否存在
  • 若表不存在,则通过getCreateSql()动态生成建表语句并立即执行

整个流程可以用一句话概括:首次写入某月日志时,自动建好该月的表。这意味着系统跑多久都不需要人工建表,运维成本几乎为零。

操作日志是怎么被记录下来的?

EasyAdmin 通过全局中间件无侵入地记录日志,开发者完全不用在业务代码里写任何日志逻辑。中间件定义在 app/admin/middleware/SystemLog.php,主要做了三件事:

  1. 📝 只记录POSTPUTDELETE这类写操作的Ajax 请求,避免无意义的查询请求刷屏
  2. 🔒 对敏感字段自动脱敏,如passwordphonemobile统一替换为******,防止密码等隐私信息落库
  3. 💾 收集管理员 ID、请求地址、请求方法、真实 IP、User-Agent、操作内容等字段,调用日志服务写入对应月份的表

这个设计非常贴心:自动脱敏从源头杜绝了敏感信息泄露,也让日志数据可以放心长期保存。

按月查询:前端筛选 + 后端定位

分表之后,查询也得跟着月份走。EasyAdmin 的日志列表页 app/admin/controller/system/Log.php 实现了按月切换查询

  • 前端 log.js 默认展示当月日志,并提供一个月份选择器
  • 用户选择月份后,后端通过setMonth($month)动态切换到对应月份的日志表
  • 列表支持按操作人、请求方法、路由地址、IP、创建时间范围等条件筛选,并关联查询操作人信息

前端页面上,日志字段一目了然:后台用户、请求方法、路由地址、日志标题、操作内容、IP 地址、创建时间等,配合 layui 表格的搜索功能,排查问题非常顺手。

按月分表方案的优缺点总结

维度表现
写入性能✅ 单表数据量可控,写入稳定
查询效率✅ 按月份定位表,查询速度快
数据清理✅ 直接 DROP 旧月份表,秒级完成
代码复杂度⚠️ 需要动态表名 + 自动建表逻辑
跨月统计⚠️ 需要遍历多张表,稍显繁琐

总体来看,按月分表是日志类数据最经典的实践方案,尤其适合中小型后台管理系统。EasyAdmin 通过模型动态表名 + 服务层自动建表 + 中间件自动记录,把整套方案封装得开箱即用。

总结

EasyAdmin 的操作日志系统,用很轻量的代码实现了三个关键能力:按月自动分表、写入时自动建表、按月份灵活查询。它没有引入复杂的中间件或定时任务,纯粹依靠 PHP 层面对表名的动态控制,就把日志模块打理得井井有条。

对新手来说,这套设计是一份很好的学习样板——理解了 SystemLog 模型 与 SystemLogService 的配合方式,你就掌握了动态表名的常见套路,未来遇到类似的数据分片需求时,也能举一反三。

【免费下载链接】easyadmin框架主要使用ThinkPHP6.0 + layui,拥有完善的权限的管理模块以及敏捷的开发方式,让你开发起来更加的舒服。项目地址: https://gitcode.com/gh_mirrors/easy/easyadmin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1405524/

相关文章:

  • 2026 莱山区防水补漏本地实体房屋渗漏检测维修服务商 核心要点 - 超人防水
  • 2026杭州上城区名包回收实测:一只香奈儿CF,跑完这几家店才敢说真话 - 帅气的人
  • 3步解开NCM加密:ncmdump把网易云音乐一键转成MP3
  • 基于SpringBoot的社区养老食堂系统设计与实现源码+文档
  • 网盘下载助手上手攻略:3 个实战场景实现极速下载
  • 原神帧率解锁5分钟上手:突破60帧上限,高帧率畅玩其实很简单
  • 2026最新:无刑事犯罪记录公证认证办理流程是什么?异地可以办吗?
  • 免费实时字幕翻译怎么实现?PotPlayer百度翻译插件3步配置指南
  • AI前沿技术日报|2026-08-15|GLM-5.3、Qwen3.8开源、英伟达CPO交换机量产、SpaceX完成Cursor收购
  • 青岛黄岛区 2026 宅仕达防水补漏本地实体房屋渗漏检测维修服务商 - 超人防水
  • 从零搭建自动驾驶训练数据:跟着 LMDrive 走通 7 个环节
  • 诚信的 日照海边民宿 日照海边民宿
  • Unity 6光线追踪实战:DanbaidongRP光追阴影与高质量SSR从入门到精通
  • 杭州西湖区防水补漏本地实体房屋渗漏检测维修服务商 - 超人防水
  • 黄山徽州区 2026 靠谱防水补漏本地实体房屋渗漏检测维修服务商 #黄山 - 超人防水
  • RustDesk 远程桌面一键部署与使用全指南:新手到进阶的完整教程
  • 无锡滨湖漏水检测维修全城上门2026全网口碑优选:防水补漏公司#无锡 - 超人防水
  • 一篇讲透 NS-USBloader:Switch 游戏安装从文件传输到 payload 注入的完整路径
  • 阴阳师自动化脚本实战:10分钟装好,把日常肝度全交给 OnmyojiAutoScript
  • 大麦自动抢票保姆级指南:开售倒计时全流程实战
  • 5 分钟上手 terraform-aws-ecs:从零部署你的第一个 Fargate ECS 集群
  • 嵌入式项目构建实战:embedded-resources的Meson配置、交叉编译与LTO详解
  • 突破 60 帧天花板:原神帧率解锁工具 genshin-fps-unlock 从入门到调优全指南
  • 应急广播远程取号技术研究取得新突破
  • 并行编程实战—CUDA Tile编程入门之二创建和应用
  • ZenTimings完整指南:AMD Ryzen内存时序监控、电压与频率实时查看的全流程教程
  • 5分钟免费搞定PotPlayer实时字幕翻译:百度API配置从零到流畅
  • 深耕四川单招十余年!成都竞元精品小班定向培养,助你上岸公办院校 - 成都竞元单招
  • 苹果用户实测:2026年抖音去水印最稳方法分享 - 工具软件使用方法推荐
  • 成考本科怎么拿学位证?英语差也能顺利申请吗?三湘学历教育详解 - 米諾