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

从 PHP 到 AI + Golang,程序员自救转型手记(五十):增加管理员角色组管理

这是一个系列 Blog,作者将以一个 PHP 全栈工程师的身份,利用 AI 工具(claude code、codex、deepseek、豆包等):从零开始学习 golang 语言,并最终完成 ai-go-admin(github | gitee)开源项目的制作(感谢 star ~),全程记录分享。

在上一期,我们进行了 “多条件组筛选、字段白名单”,本期将完成:增加管理员角色组管理

增加管理员角色组管理

我们之前已经建立好了菜单规则管理管理员账号管理,下一步再制作好管理员角色组管理RBAC权限模型就基本完善了,这个权限模型非常简单,最核心的是:用户角色权限的三层关联,其中用户并不直接跟权限挂钩,而是先建立角色组,将具体的权限节点分配给角色组,然后将角色组分配给用户,它还有以下细节:

  1. 一个角色组可以有多个权限节点
  2. 一个用户可以属于多个角色组
  3. 一个权限也可以被分配给多个角色

受益于之前已经准备好的服务端基类和前端的table组件及表格管家hook,我们这次基本上只需要考虑核心业务,其他的基本功能都是唾手可得的,首先直接让 AI 参考之前已有的 CRUD 实现角色组管理的基本功能,就像建立菜单规则管理实现时一样,然后从基础的 CRUD 开始角色组功能特有的特性开发,为了让读者脑海里有概念,这里提供两张成品图:

重写服务层 Create 方法

在基础的CRUD上,额外对一个角色组设定的权限规则进行处理和检查:

  1. 首先是对分组基础信息中的上级分组不能是自身上级分组不存在的检查。
  2. 如果输入的权限节点包含了系统所有的权限节点,则将权限节点直接折叠为*通配符号,而不再单独的存储所有权限节点的 id 号(即超管,好处是新增的权限节点,不再需要额外向超管级分组追加)。
  3. 这一点是重中之重:对输入权限节点进行检查,首先是非超管不能建立超管级分组,其次是普通管理员能分配给新组的权限,必需是自己拥有的。

重写服务层 Update 方法

和以上 Create 方法类似,额外检查上级分组,不能是自己的子级分组(含直接子级、间接子级)避免形成环。

重写服务层 Delete 方法

主要是防止出现游离分组,能被删除的分组,必需没有子级,或使用批量删除连同所有子级一起删。

重写服务层 List 方法

这下基本上是全部重写了😂。

List 方法这边主要也是权限相关,即:只读取当前管理员拥有全部权限的角色组,但凡某个角色组有一个权限节点不属于他,就不能让他查看。

这里有个小坑,不能是:读取当前管理员拥有的分组(因为管理员可以拥有多个分组,只读取自己拥有的分组看起来是合理的,但是会出现比如:当前管理员有角色组管理的权限,自己操作添加了一个分组,那么这个分组就必须分配给当前管理员,否则他查都查不到 等情况)

重写控制器 List 方法

从图中可以看出来,这次的列表也是支持树状表格的,如果单这一点的话,我们还可以使用List 数据适配函数对输出的数据进行格式化;

不过这次我们还得查出权限规则字段的摘要文本,比如控制台等 29 项这种字样,目前在List 数据适配函数中不能访问到服务层实例,所以选择直接重写控制器 List 方法,核心的代码如下:

// List 覆写通用列表方法: 追加 rules_title 摘要字段,并渲染为树状结构func(h*AuthAdminGroupHandler)List(c*gin.Context){// ......// 批量构建每个分组的 rules 摘要文本(例如: 控制台等 60 项)titles,err:=h.svc.BuildRulesTitles(c,groups)iferr!=nil{httpx.Fail(c,httpx.WithMessage("规则标题查询失败: "+err.Error()))return}// 转 map 以备后续树状数据组装,并注入 rules_titlegroupData:=make([]map[string]any,len(groups))fori:=rangegroups{m:=groups[i].ToMap()m["rules_title"]=titles[groups[i].ID]groupData[i]=m}varlist[]map[string]anyifopts.Selector{list=tree.Render(groupData,"id","pid","name")}else{list=tree.Build(groupData,"id","pid","children")}httpx.Success(c,httpx.WithData(gin.H{"list":list,"total":total,}))// ......}

如上,主要是调用了服务层的BuildRulesTitles方法,以及最后输出时根据opts.Selector(请求是否来自选择器)输出为不同的树状数据,其中BuildRulesTitles方法用于提取权限规则的中文摘要,规则入库的是ids,前台展示1,2,3肯定没有控制器等 20 项好看。

重写控制器 Get 方法

这一点是为了适配前端el-tree组件的数据格式,在编辑一个角色组时,特意将规则中的:所有父级节点去除,这些父级节点的选中状态由子级决定

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

相关文章:

  • 终极免费WeMod增强工具:三步解锁所有高级功能
  • 深入理解零输入响应与零状态响应:LTI系统分析的核心基石
  • 基于SpringBoot的闲置物品交易系统(Java+SpringBoot+MySQL)| 计算机毕业设计 附源码论文PPT
  • 西安除甲醛公司哪个好?五大核心专长分类盘点参考推荐 - 资讯综合
  • 深入解析UEFI固件PEI阶段:PPI与HOB机制详解
  • Java文件读取全攻略:从基础I/O到NIO性能优化实战
  • 游戏后端开发实战:基于Spring Boot构建数据补偿与任务系统
  • Windows上免费安装安卓应用:APK安装器快速入门指南
  • C++ RAII机制深度解析:从资源管理到异常安全编程实践
  • 2026 年苏州市姑苏区住宅防水修缮服务商综合测评报告 - 速达同城防水
  • 70元DIY四自由度机械臂:从零到一实现Arduino舵机控制与运动编程
  • Android构建优化:D8与R8编译混淆原理与实战配置详解
  • 从 PHP 到 AI + Golang,程序员自救转型手记(五十一):管理员和角色组的关联
  • 机器学习项目诊断:偏差、方差与人类水平表现分析
  • Redis密码遗忘应急指南:单机、主从、哨兵架构安全重置全流程
  • 暗黑破坏神2存档编辑器:从入门到精通的全方位指南
  • 高职职教数据全自动上报落地 全链路效能提升高频实操答疑
  • 2026年北京订制旅游机构哪家**?懂行的都看这几点 - 热点品牌推荐
  • 4个入榜项目 大湾区EMBA FT排名对应学费区间一览
  • 北京博亚信诚科技口碑怎么样? - 17728098551
  • Maya法线编辑全攻略:从原理到实战,解决模型渲染问题
  • 利用国外服务器下载国外视频-------有潜力
  • Unity多人游戏开发实战:AI编程助手与跨平台网络优化
  • Nginx 502错误全链路排查与高并发优化实战
  • AssetStudio实战指南:3步提取Unity资源,掌握逆向分析与素材复用
  • 暗黑2存档编辑器终极指南:免费快速修改D2/D2R游戏存档的完整教程
  • 使用EasyExplorer 告别微信QQ 局域网传文件
  • 计算机毕业设计选题推荐:2026年10个全栈综合精选项目(SpringBoot/SSM/Python+论文+源码)
  • 如何快速掌握LeagueAkari:英雄联盟玩家的终极免费工具箱指南
  • 北京博亚信诚科技靠谱吗? - 17728181569