从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作全程记录分享。在上一期我们进行了 “列表通用排序接口实现增量重排法”本期将完成菜单规则管理实现菜单规则管理实现我们之前已经写好了AdminRule模型这里提供向 AI 详细的提供模型位置和新文件位置并提供参考代码基于internal/model/admin.go的AdminRule模型在internal/handler/admin/auth/建立AuthAdminRuleHandler控制器并建立对应的仓储、服务等可参考已有的AuthAdminHandler及其仓储、服务。已完成 AdminRule 的 CRUD 骨架搭建新增4个文件并通过 go build、go vet、gotest校验。 新增文件 internal/repository/admin/rule.go — AdminRuleRepository internal/service/admin/auth/rule.go — AuthAdminRuleService internal/handler/admin/auth/rule.go — AuthAdminRuleHandler internal/router/admin/auth/rule.go — 路由注册# ......先简单检查了一下还行好家伙考虑未来不做可视化CRUD了。数据效验目前 AI 写的效验全部是在服务层新增了一个validateRule函数里边写了大量if用来检查name不能为空、pid不能为自身等这当然不太合理gin的ShouldBindJSON方法本身就支持数据绑定同时完成效验而且我们在基控制器已经调用过该方法了所以必填、格式正确性等验证直接在模型上加bindingtag 即可。也可以写validatetag它是专门做验证的包https://github.com/go-playground/validator的语法该依赖已随gin框架内置可直接使用。还有一些涉及数据库、父子关系、唯一性、业务联动的效验必须抽到服务层这里有两个选择使用validatetag然后在服务层完成效验或直接代码里边if这里选择后者因为这次验证不算多且对验证消息的要求比较高如下// 主要就是因为这个验证选择统一使用 if这里的验证消息定制化较高ifentity.Typemenu(entity.Path||entity.Component){returnerrors.New(规则类型为菜单时菜单路由路径和菜单组件路径不能为空)}// 名称唯一校验排除自身existing,err:s.repo.FindByName(c,entity.Name)iferr!nil!errors.Is(err,gorm.ErrRecordNotFound){returnerr}ifexisting!nilstrconv.FormatUint(uint64(existing.ID),10)!pk{returnerrors.New(规则名称已存在)}// 路由路径的唯一性验证// ......// 不能将自身设为自己的上级 上级存在性检查// ......方法位置错误findByName根据规则名称查询和findByPath根据菜单路由路径查询方法AI 给放在了服务层可能是因为目前这两个方法仅用于 数据效验 时查数据。这里让它移动至仓储层一是因为职能规划二是这两个方法未来其他地方需要使用的可能性很大仓储里边有它们非常合理。完成移动只需要一句话然后已移至 internal/repository/admin/rule.go FindByName 和 FindByPath 已移至 internal/repository/admin/rule.go。 两个仓储方法均使用 GORM Generics API。 服务层改为调用 s.repo.FindByName(c, entity.Name)s.repo.FindByPath(c, entity.Path)删除服务层原有的 findByName、findByPath 私有方法。 服务层仍负责唯一性判断和业务错误消息。 已格式化并通过仓储层、服务层相关包测试。菜单规则管理定制功能菜单规则作为权限系统的基础此功能当然不是一个CRUD就能搞定的接下来基于已有CRUD进行一系列定制控制器层自定义扩展数据和列表数据适配器菜单规则管理的菜单列表需要组装为可以展开折叠的树状表格数据使用tree.Build即可选择器如远程下拉读取菜单列表时需要组装为另外一种树状列表在title字段上渲染树状分支符号使用tree.Render即可只读取当前登录管理员拥有权限的菜单规则使用handler.WithExtension自定义扩展数据传递当前登录管理员的数据到服务层供后续使用// NewAuthAdminRuleHandler 创建菜单和权限规则管理控制器实例funcNewAuthAdminRuleHandler(svc*svcAuth.AuthAdminRuleService)*AuthAdminRuleHandler{returnAuthAdminRuleHandler{Handler:handler.NewHandler(svc,handler.WithAdapter(handler.Adapter{// 定义控制器层的数据适配器就不需要重写控制器层的 List 方法了List:func(data any,opts service.Options)(any,error){rules,ok:data.([]model.AdminRule)if!ok{returndata,nil}ruleData:make([]map[string]any,len(rules))fori:rangerules{ruleData[i]rules[i].ToMap()}ifopts.Selector{returntree.Render(ruleData,id,pid,title),nil}else{returntree.Build(ruleData,id,pid,children),nil}},}),handler.WithExtension(func(c*gin.Context)any{returnsvcAuth.AuthAdminRuleExtension{AdminSession:middleware.GetAdmin(c),}}),),svc:svc,}}服务层List 方法读取自定义扩展中的管理员数据并使用Permission包读取当前登录管理员拥有权限的菜单规则。// List 覆写通用查询全部记录方法: 根据管理员权限过滤func(s*AuthAdminRuleService)List(c*gin.Context,opts service.Options)([]model.AdminRule,error){// 从控制器传来的 管理员信息 扩展数据extension,ok:opts.Extension.(*AuthAdminRuleExtension)if!ok||extension.AdminSessionnil{returnnil,errors.New(参数错误缺少 AdminSession 扩展数据)}perm:permission.New()// 是否超级管理员super,err:perm.IsSuperAdmin(c.Request.Context(),extension.AdminSession.ID)iferr!nil{returnnil,err}// 树状表格无翻页设定无限 limitopts.Limit999999// 来自选择器则只查 dir、menu不查 nodeifopts.Selector{opts.Wheresappend(opts.Wheres,service.WhereGroup{Wheres:[]service.Where{{Field:type,Operator:IN,Value:[]string{dir,menu},}},})}// 非超管读取当前管理员拥有的权限规则 IDsif!super{ruleIDs,err:perm.GetRuleIds(c.Request.Context(),extension.AdminSession.ID,nil)iferr!nil{returnnil,err}iflen(ruleIDs)0{returnnil,nil}// 添加 IN IDs 的 where 以确保只读取到当前管理员拥有的权限规则opts.Wheresappend(opts.Wheres,service.WhereGroup{Wheres:[]service.Where{{Field:id,Operator:IN,Value:ruleIDs,}},})}rules,err:s.repo.List(c,s.BuildRepoOpts(opts))returnrules,err}Count 方法做类似以上的改造只读取拥有权限的菜单规则的数量前端受益于我们的table组件和useTableManager.ts表格管家按部就班的写好列定义及表单即可自动完成对服务端数状表格的兼容没啥特殊的不再赘述。

相关新闻

SQL Server日期时间函数全解析:从基础概念到高阶应用与性能优化

SQL Server日期时间函数全解析:从基础概念到高阶应用与性能优化

1. 项目概述:为什么你需要一份“最全”的日期时间函数指南干了这么多年数据库开发,我发现一个挺有意思的现象:无论是新手还是老手,但凡涉及到SQL Server里的日期时间处理,总免不了要去翻文档或者搜一下某个函数的具体用…

2026/8/4 7:30:02 阅读更多 →
B站视频下载终极指南:三步解锁大会员4K高清视频

B站视频下载终极指南:三步解锁大会员4K高清视频

B站视频下载终极指南:三步解锁大会员4K高清视频 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站上的精彩视频无法…

2026/8/4 7:29:02 阅读更多 →
软件设计的一些感想

软件设计的一些感想

软件设计的一些感想 做了十几年软件,写过无数行代码,也重构过无数个深夜。回头看,软件设计这件事,最难的从来不是技术选型或者算法优化,而是如何在复杂中保持简单,在变化中守住稳定。今天不聊高深的理论&am…

2026/8/4 7:29:02 阅读更多 →

最新新闻

构网型VSG-PMSM永磁直驱风力发电系统解析

构网型VSG-PMSM永磁直驱风力发电系统解析

1. 构网型VSG-PMSM永磁直驱风力发电系统概述 永磁直驱风力发电系统作为当前风电领域的主流技术路线之一,其核心优势在于省去了传统双馈机组中的齿轮箱结构,通过PMSM(永磁同步电机)直接与风机叶轮连接。这种结构大幅减少了机械传动…

2026/8/4 8:18:25 阅读更多 →
Python基础语法全解析:从入门到精通

Python基础语法全解析:从入门到精通

1. Python语言基础语法元素解析 作为一名使用Python十余年的开发者,我经常被问到同一个问题:"怎样才能真正掌握Python的基础语法?"今天我们就来彻底拆解Python最核心的语法元素,这些是每个Python程序员必须内化的基本功…

2026/8/4 8:18:25 阅读更多 →
AI如何重构软件开发全流程:从需求到运维的智能化实践

AI如何重构软件开发全流程:从需求到运维的智能化实践

1. 项目概述:AI如何重构开发全流程2026年的软件开发领域,AI技术已经从辅助工具演变为核心生产力。我最近完成的一个企业级SaaS项目,全程采用AI重构开发流程,从需求分析到上线运维仅用传统工时1/3的时间。这种全流程AI赋能不是简单…

2026/8/4 8:18:25 阅读更多 →
大模型跨语言处理机制与中英文差异技术解析

大模型跨语言处理机制与中英文差异技术解析

大模型跨语言处理机制与中英文差异技术解析 文档摘要:本文系统梳理了 Transformer 大语言模型(LLM)在处理多语言输入时的内部表征机制,解答了“模型内部是否先翻译成英文”的疑惑,并对比了中英文在 Tokenizer 编码效率…

2026/8/4 8:18:25 阅读更多 →
基于 YOLOv8 的人脸表情识别系统(全套源码+数据集)

基于 YOLOv8 的人脸表情识别系统(全套源码+数据集)

项目简介 本项目以 YOLOv8 目标检测框架为核心,构建了一套完整的人脸表情识别系统,涵盖数据集处理、模型训练与调优、可视化分析以及交互式推理系统的全流程开发。系统能够在图片、视频及摄像头实时画面中同步完成人脸定位与表情分类,支持 7…

2026/8/4 8:18:25 阅读更多 →
游戏逆向工程实战:从寻路CALL到内存基址的完整分析流程

游戏逆向工程实战:从寻路CALL到内存基址的完整分析流程

1. 项目概述:从“找路”到“找基址”的逆向思维在游戏安全、外挂分析、内存修改器开发乃至一些自动化脚本的底层交互中,我们常常会听到“找CALL”、“找基址”这些术语。乍一听,这像是某种神秘的“黑话”,但实际上,它们…

2026/8/4 8:17:25 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →