Beego仿小米商城RBAC管理模块

news/2024/10/8 0:28:38

Beego仿小米商城RBAC管理模块

一、RBAC表结构

1、表结构图

图片

2、models\manager.go

package models
import ( _ "github.com/jinzhu/gorm")
type Manager struct { Id int Username string Password string Mobile string Email string Status int RoleId int AddTime int IsSuper int Role Role `gorm:"foreignkey:Id;association_foreignkey:RoleId"`}
func (Manager) TableName() string { return "manager"}

3、models\role.go

package modelsimport (  _ "github.com/jinzhu/gorm")
type Role struct { Id int Title string Description string Status int AddTime int}
func (Role) TableName() string { return "role"}

4、models\role_access.go

package modelsimport (  _ "github.com/jinzhu/gorm")
type RoleAccess struct { AccessId int RoleId int}
func (RoleAccess) TableName() string { return "role_access"}

5、models\access.go

package modelsimport (  _ "github.com/jinzhu/gorm")
type Access struct { Id int ModuleName string //模块名称 ActionName string //操作名称 Type int //节点类型 : 1、表示模块 2、表示菜单 3、操作 Url string //路由跳转地址 ModuleId int //此module_id和当前模型的_id关联 module_id= 0 表示模块 Sort int Description string Status int AddTime int AccessItem []Access `gorm:"foreignkey:ModuleId;association_foreignkey:Id"` Checked bool `gorm:"-"` // 忽略本字段}
func (Access) TableName() string { return "access"}

二、用户管理

package adminimport (  "beegoxiaomi/models"  "fmt"  "github.com/astaxie/beego"  "strconv"  "strings")
type ManagerController struct { BaseController}
func (c *ManagerController) Get() { manager := []models.Manager{} models.DB.Preload("Role").Find(&manager) c.Data["managerList"] = manager fmt.Println(manager) c.TplName = "admin/manager/index.html"}
func (c *ManagerController) Add() { //获取所有的角色 role := []models.Role{} models.DB.Find(&role) c.Data["roleList"] = role c.TplName = "admin/manager/add.html"}
func (c *ManagerController) DoAdd() { //获取数据 roleId, err1 := c.GetInt("role_id") if err1 != nil { c.Error("非法请求", "/manager/add") return } username := strings.Trim(c.GetString("username"), " ") password := strings.Trim(c.GetString("password"), " ") mobile := strings.Trim(c.GetString("mobile"), " ") email := strings.Trim(c.GetString("email"), " ")
if len(username) < 2 || len(password) < 6 { c.Error("用户名或者密码长度不合法", "/manager/add") return } //判断数据库里面有没有当前用户 managerList := []models.Manager{} models.DB.Where("username=?", username).Find(&managerList) if len(managerList) > 0 { c.Error("用户名已经存在", "/manager/add") return } //增加管理员 manager := models.Manager{} manager.Username = username manager.Password = models.Md5(password) manager.Mobile = mobile manager.Email = email manager.Status = 1 manager.AddTime = int(models.GetUnix()) manager.RoleId = roleId err := models.DB.Create(&manager).Error if err != nil { c.Error("增加管理员失败", "/manager/add") return } c.Success("增加管理员成功", "/manager")}
func (c *ManagerController) Edit() {
//获取管理员信息 id, err := c.GetInt("id") if err != nil { c.Error("非法请求", "/manager") return } manager := models.Manager{Id: id} models.DB.Find(&manager) c.Data["manager"] = manager
//获取所有的角色 role := []models.Role{} models.DB.Find(&role) c.Data["roleList"] = role c.TplName = "admin/manager/edit.html"}
func (c *ManagerController) DoEdit() {
id, err1 := c.GetInt("id") if err1 != nil { c.Error("非法请求", "/manager") return } roleId, err2 := c.GetInt("role_id") if err2 != nil { c.Error("非法请求", "/manager") return } mobile := strings.Trim(c.GetString("mobile"), " ") email := strings.Trim(c.GetString("email"), " ") password := strings.Trim(c.GetString("password"), " ")
//获取数据 manager := models.Manager{Id: id} models.DB.Find(&manager) manager.RoleId = roleId manager.Mobile = mobile manager.Email = email if password != "" { if len(password) < 6 { c.Error("密码长度不合法,密码长度不能小于6位", "/manager/edit?id="+strconv.Itoa(id)) return } manager.Password = models.Md5(password) } //执行修改 err := models.DB.Save(&manager).Error if err != nil { beego.Info(err) c.Error("修改数据失败-检查一下数据是否合法", "/manager/edit?id="+strconv.Itoa(id)) } else { c.Success("修改数据成功", "/manager") }}func (c *ManagerController) Delete() { id, err1 := c.GetInt("id") if err1 != nil { c.Error("传入参数错误", "/manager") return } manager := models.Manager{Id: id} models.DB.Delete(&manager) c.Success("删除轮播图成功", "/manager")}

三、角色管理

package adminimport (  "beegoxiaomi/models"  "strconv"  "strings")
type RoleController struct { BaseController}
func (c *RoleController) Get() {
role := []models.Role{} models.DB.Find(&role) c.Data["roleList"] = role c.TplName = "admin/role/index.html"}
func (c *RoleController) Add() { c.TplName = "admin/role/add.html"}
func (c *RoleController) DoAdd() { title := strings.Trim(c.GetString("title"), " ") description := strings.Trim(c.GetString("description"), " ")
if title == "" { c.Error("标题不能为空", "/role/add") return } role := models.Role{} role.Title = title role.Description = description role.Status = 1 role.AddTime = int(models.GetUnix()) err := models.DB.Create(&role).Error if err != nil { c.Error("增加角色", "/role/add") } else { c.Success("增加角色成功", "/role") }}
func (c *RoleController) Edit() { id, err := c.GetInt("id") if err != nil { c.Error("传入参数错误", "/role") return }
role := models.Role{Id: id} models.DB.Find(&role) c.Data["role"] = role c.TplName = "admin/role/edit.html"}
func (c *RoleController) DoEdit() {
id, err1 := c.GetInt("id") if err1 != nil { c.Error("传入参数错误", "/role") return } title := strings.Trim(c.GetString("title"), " ") description := strings.Trim(c.GetString("description"), " ") if title == "" { c.Error("标题不能为空", "/role/add") return } //修改 role := models.Role{Id: id} models.DB.Find(&role) role.Title = title role.Description = description err2 := models.DB.Save(&role).Error if err2 != nil { c.Error("修改数据失败", "/role/edit?id="+strconv.Itoa(id)) } else { c.Success("修改角色成功", "/role") }
}
func (c *RoleController) Delete() { id, err1 := c.GetInt("id") if err1 != nil { c.Error("传入参数错误", "/role") return } role := models.Role{Id: id} models.DB.Delete(&role) c.Success("删除角色成功", "/role")
}
func (c *RoleController) Auth() {
//1、获取角色id
roleId, err := c.GetInt("id") if err != nil { c.Error("传入参数错误", "/role") return }
//2、获取全部的权限
access := []models.Access{} models.DB.Preload("AccessItem").Where("module_id=0").Find(&access)
//3、获取当前角色拥有的权限 ,并把权限id放在一个map对象里面 roleAccess := []models.RoleAccess{} models.DB.Where("role_id=?", roleId).Find(&roleAccess) roleAccessMap := make(map[int]int) for _, v := range roleAccess { roleAccessMap[v.AccessId] = v.AccessId }
//4、循环遍历所有的权限数据,判断当前权限的id是否在角色权限的Map对象中,如果是的话给当前数据加入checked属性 for i := 0; i < len(access); i++ { if _, ok := roleAccessMap[access[i].Id]; ok { access[i].Checked = true } for j := 0; j < len(access[i].AccessItem); j++ { if _, ok := roleAccessMap[access[i].AccessItem[j].Id]; ok { access[i].AccessItem[j].Checked = true } } } //5、渲染权限数据以及角色 Id c.Data["accessList"] = access c.Data["roleId"] = roleId c.TplName = "admin/role/auth.html"
}
func (c *RoleController) DoAuth() { //1、获取参数post传过来的角色id 和 权限切片 roleId, err := c.GetInt("role_id") if err != nil { c.Error("传入参数错误", "/role") return } accessNode := c.GetStrings("access_node")
//2、修改角色权限---删除当前角色下面的所有权限
roleAccess := models.RoleAccess{} models.DB.Where("role_id=?", roleId).Delete(&roleAccess)
//3、执行增加数据
for _, v := range accessNode { accessId, _ := strconv.Atoi(v) roleAccess.AccessId = accessId roleAccess.RoleId = roleId models.DB.Create(&roleAccess) } c.Success("授权成功", "/role/auth?id="+strconv.Itoa(roleId))}

四、权限管理

package admin
import ( "beegoxiaomi/models" "strconv")
type AccessController struct { BaseController}
func (c *AccessController) Get() { access := []models.Access{} models.DB.Preload("AccessItem").Where("module_id=0").Find(&access) c.Data["accessList"] = access c.TplName = "admin/access/index.html"}
func (c *AccessController) Add() { //加载顶级模块 access := []models.Access{} models.DB.Where("module_id=0").Find(&access) c.Data["accessList"] = access c.TplName = "admin/access/add.html"}
func (c *AccessController) DoAdd() {
moduleName := c.GetString("module_name") iType, err1 := c.GetInt("type") actionName := c.GetString("action_name") url := c.GetString("url") moduleId, err2 := c.GetInt("module_id") sort, err3 := c.GetInt("sort") description := c.GetString("description") status, err4 := c.GetInt("status") if err1 != nil || err2 != nil || err3 != nil || err4 != nil { c.Error("传入参数错误", "/access/add") return } access := models.Access{ ModuleName: moduleName, Type: iType, ActionName: actionName, Url: url, ModuleId: moduleId, Sort: sort, Description: description, Status: status, } err := models.DB.Create(&access).Error if err != nil { c.Error("增加数据失败", "/access/add") } else { c.Success("增加数据成功", "/access") }
}
func (c *AccessController) Edit() { //获取要修改的数据 id, err1 := c.GetInt("id") if err1 != nil { c.Error("传入参数错误", "/access") return } access := models.Access{Id: id} models.DB.Find(&access) c.Data["access"] = access
//获取顶级模块 accessList := []models.Access{} models.DB.Where("module_id=0").Find(&accessList) c.Data["accessList"] = accessList
c.TplName = "admin/access/edit.html"}
func (c *AccessController) DoEdit() { id, err1 := c.GetInt("id") moduleName := c.GetString("module_name") iType, err2 := c.GetInt("type") actionName := c.GetString("action_name") url := c.GetString("url") moduleId, err3 := c.GetInt("module_id") sort, err4 := c.GetInt("sort") description := c.GetString("description") status, err5 := c.GetInt("status") if err1 != nil || err2 != nil || err3 != nil || err4 != nil || err5 != nil { c.Error("传入参数错误", "/access") return } access := models.Access{Id: id} models.DB.Find(&access) access.ModuleName = moduleName access.Type = iType access.ActionName = actionName access.Url = url access.ModuleId = moduleId access.Sort = sort access.Description = description access.Status = status err := models.DB.Save(&access).Error if err != nil { c.Error("修改失败", "/access/edit?id="+strconv.Itoa(id)) return } c.Success("修改成功", "/access/")
}
func (c *AccessController) Delete() {
id, err1 := c.GetInt("id") if err1 != nil { c.Error("传入参数错误", "/access") return } //获取当前数据 access1 := models.Access{Id: id} models.DB.Find(&access1) if access1.ModuleId == 0 { //顶级模块 access3 := []models.Access{} models.DB.Where("module_id=?", access1.Id).Find(&access3) if len(access3) > 0 { c.Error("当前模块下面还有菜单或者操作,无法删除", "/access") return } } access2 := models.Access{Id: id} models.DB.Delete(&access2) c.Success("删除成功", "/access")
}
Go大神

 谢谢!我很高兴能帮到您! 

赞赏二维码喜欢作者

GoLang系列 · 目录
上一篇Beego仿小米商城RBAC判断权限下一篇Go语言Gin框架路由详解:从入门到精通
阅读 133
写下你的留言
 
 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/43345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第1章 计算机网络和因特网

本章流程图1.1 什么是因特网 回答这个问题:我们更够描述因特网的具体构成(nuts and bolts),即构成因特网的基本硬件和软件组件。 我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。1.1.1 具体构成描述 端系统通过通信链路(communication link)和分组交换机(…

TCP协议的客户端和服务端的多路复用

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <sys/time.h> #include <sys/select.h> int main(void) {//1.创建套接字in…

Web应用课 第四讲 内外边距、盒子模型、位置、浮动、名片实战

内外边距 margin 内边距 margin属性为给定元素设置所有四个(上下左右)方向的外边距属性。 可以接受1~4个值(上、右、下、左的顺序) 可以分别指明四个方向:margin-top、margin-right、margin-bottom、margin-left 取值 length:固定值 percentage:相对于包含块的宽度,以百…

红日复现为什么失败之struct漏洞复现

struts2漏洞 一、指纹识别 s2的url路径组成(详见struts.xml配置文件):name工程名+namespace命名空间+atcion名称+extends拓展名部署在根目录下,工程名可为空;当然namespace名称也可设置为空;拓展名也可设置为空。 方法一 (1)url会有.action或.do后缀文件名(eg:http://…

使用getaddrinfo函数来获取并打印出www.baidu.com的所有IP地址(IPv4和IPv6)

#include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h>int main() {struct addrinfo hints, *res, *p;int status;char ipstr[INET6_ADDRSTRLEN];// 设置h…

C138 线段树分治 P2056 [ZJOI2007] 捉迷藏

视频链接:C138 线段树分治 P2056 [ZJOI2007] 捉迷藏_哔哩哔哩_bilibili P2056 [ZJOI2007] 捉迷藏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线段树分治 O(nlognlogn) #include <iostream> #include <cstring> #include <algorithm> #include <…

[lnsyoj118/luoguP3369]普通平衡树

平衡树 Treap题意 维护一个数据结构,要求支持插入,删除,根据排名查数,根据数查排名,查询前驱,查询后继\(6\)个操作 sol 考虑到后四个查询的操作,会发现使用二叉搜索树(BST)完全可以实现 为了完成这四个操作,需要在每个节点记录\(3\)个值:\(key\) 表示当前节点的数 \(c…

牛客周赛46(思路待补)

比赛链接:牛客周赛46赛时感受 本场参加的是内测,多亏了内测群的佬提供的思路,得以AK。 ABC都是简单的签到题,D稍微需要分类一下,EF有点算法知识,E可以使用前缀和+二分搜索过掉,但是听说好像还能使用离散化树状数组等等,F是数学知识,隔板法和求质数、求组合…