从 PHP 到 AI + Golang,程序员自救转型手记(五十三):管理员日志管理和日志中间件,日志标题读取的极限优化
这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作全程记录分享。在上一期我们进行了 “管理员权限检查中间件”本期将完成管理员日志管理和日志中间件管理员日志中间件一个全局中间件对所有/admin/开头的请求生效之所以不作为分组中间件注册因为我们路由注册时可能会建立多个类似下方的分组group:r.Group(/admin/auth/admin)group:r.Group(/admin/auth/group)即我们的路由都是子模块自行负责注册的不是统一注册所以使用分组级中间件不方便。后续有改动未来会在制作 “自定义后台入口” 功能时统一注册 admin 路由的 group并将日志中间件直接注册到该 group 上就不再需要全局注册了。日志标题读取从权限规则表读取用户请求/admin/auth/admin/update接口日志中不仅要记录请求用户、请求URL、请求体等更重要的是日志标题数据最好能一眼就看出管理员干了啥。我们刚好有admin_rules表管理员的每个请求都经过了验权能验权自然于该表有权限数据/auth/admin从规则表可查出标题为管理员账号管理的权限规则/auth/admin/update从规则表可查出标题为更新的权限规则最终组装为管理员账号管理 - 更新作为日志标题看起来很完美但是一个后台请求中我们已经读了tokens、验权读了admin_rules现在为了个日志标题又加两个 SQL 查询这非常不合适所有这里让 AI 做了个在单条 SQL 查询中准备好标题的办法核心代码是这样的fmt.Sprintf(SELECT c.title, COALESCE(p.title, ) AS parent_title FROM %s AS c LEFT JOIN %s AS p ON p.id c.pid WHERE c.name ?,tableName,tableName,)控制器层、服务层指定标题这一点非常有必要比如管理员登录接口login这个接口压根不在权限规则表有记录而这个接口的日志又不得不记录那么我们可以在控制器里边c.Set(middleware.CtxAdminLogTitleKey,登录)向请求上下文设定一个自定义的日志标题日志中间件里边只需要先调用c.Next()让控制器的代码先跑即可在写入日志时读取到自定义标题数据// 检查控制器层是否已设置自定义日志标题customTitle,hasCustomTitle:c.Get(CtxAdminLogTitleKey)// 异步写入日志// 先在外面把变量提前捕获好在开 goroutine 慢慢处理和入库避免挂在请求上下文的数据随请求结束丢失等gofunc(){// ......}排除日志也不用每条请求都做记录有以下排除规则请求排除仅记录管理后台请求仅记录POST请求排除chunked请求额外排除list请求因为list请求也可能是POST筛选、排序等数据GET不够且GET直接发送json数据不方便敏感字段过滤或排除我们可以利用 GORM 的模型的创建前钩子在日志写入前对password、salt、token等敏感字段进行过滤。日志是异步写入的在模型钩子中处理可以避免解析请求体等动作拖慢用户侧响应速度。非超管只能看自己的日志在控制器和服务层直接通过拼接Where进行限制避免任何可能的越权。// 非超管则只查询自己的日志if!super{opts.Wheresappend(opts.Wheres,service.WhereGroup{Wheres:[]service.Where{{Field:admin_id,Operator:eq,Value:extension.AdminSession.ID,}},})}管理员日志管理前端请求体展示优化到这里一般的后台就是直接在日志详情直接显示JSON了比如{username: admin, password: ****, ......}不过我还是在这里用了个el-tree并写了工具函数将JSON构建为该组件可以合理使用的结构最终效果如下双击打开详情表格的默认设计是双击打开编辑稍微改一下即可另外直接将双击行的数据作为详情弹窗的数据无需额外加载。自定义一个表格行级操作按钮letoptButtons:OptButton[][{render:tip,name:info,title:详情,text:,type:primary,icon:lucide-info,class:table-row-info,click:(row:TableRow){openInfo(row)},},]利用双击单元格前钩子重写双击操作tableManager.opts.before!.columnDblclick({row}){openInfo(row)returnfalse}接下来在openInfo函数打开详情弹窗主要是tableManager.form.operate info详情弹窗那边再Info v-iftableManager.form.operate info /就行了/** * 点击查看详情按钮响应 */constopenInfo(row:TableRow){if(!row)return// 数据来自表格数据未重新请求 API深克隆不然可能会影响表格letrowClonecloneDeep(row)rowClone.datarowClone.data?[{label:点击展开,children:buildJsonToElTreeData(JSON.parse(rowClone.data))}]:[]tableManager.form.extend![info]rowClone tableManager.form.operateinfo}

相关新闻

想靠黑客技术赚钱,这份零基础入门路线图请收好

想靠黑客技术赚钱,这份零基础入门路线图请收好

从零基础到变现:网安副业的真实路径与学习方案很多人对“黑客”这个词的印象还停留在电影里的炫酷画面,觉得那是高不可攀的技术。但实际上,网络安全已经是一个高度职业化、规范化的领域。对于完全零基础的朋友来说,想靠这项技能开…

2026/9/24 4:26:46 阅读更多 →
GetQzonehistory:5分钟完成QQ空间历史说说永久备份的终极方案

GetQzonehistory:5分钟完成QQ空间历史说说永久备份的终极方案

GetQzonehistory:5分钟完成QQ空间历史说说永久备份的终极方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经翻看QQ空间,发现那些承载着青春记忆的说…

2026/9/24 7:58:58 阅读更多 →
滨州网站建设公司如何打造高转化官网?从需求分析到技术落地的深度避坑指南

滨州网站建设公司如何打造高转化官网?从需求分析到技术落地的深度避坑指南

本文关键词:滨州网站建设公司在这个数字化浪潮席卷全球的今天,任何一个企业,无论你是位于繁华的一线都市,还是扎根在像滨州这样充满活力与潜力的二线城市,都无法再忽视互联网带来的巨大机遇。对于滨州的企业老板和管理者们来说,拥有一份优秀的网站已经不再是“锦上添花”…

2026/9/23 22:05:39 阅读更多 →

最新新闻

从真实安防一线到实验室:入侵检测教学套件的设计逻辑与实操

从真实安防一线到实验室:入侵检测教学套件的设计逻辑与实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:58:20 阅读更多 →
Java Socket字节流传输实战:从逐字节读取到TCP粘包拆包避坑

Java Socket字节流传输实战:从逐字节读取到TCP粘包拆包避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:58:20 阅读更多 →
博科光纤交换机实用指南:常用命令与Zoning配置详解

博科光纤交换机实用指南:常用命令与Zoning配置详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:58:20 阅读更多 →
AIGC检测降AI率:10个实用工具与五轮迭代实操流程

AIGC检测降AI率:10个实用工具与五轮迭代实操流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:58:20 阅读更多 →
智能家居线下选购实战:浦东建材市场走访经验与避坑指南

智能家居线下选购实战:浦东建材市场走访经验与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:58:20 阅读更多 →
怀旧武侠《千年盛世传奇版》正版官方客户端下载指引,忆往游戏正规安全渠道指南

怀旧武侠《千年盛世传奇版》正版官方客户端下载指引,忆往游戏正规安全渠道指南

《千年盛世传奇版》又名千年盛世原始千年,由安徽游昕网络科技有限公司联合忆往游戏平台负责运营,是经过正版授权打造的经典怀旧武侠手游。现阶段游戏依托专属官方主站面向全网正式开放,高度复刻千年端游原版武侠设定,融合传奇打宝…

2026/9/24 7:57:19 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →