Beego仿小米商城RBAC管理模块
Beego仿小米商城RBAC管理模块
一、RBAC表结构
1、表结构图
2、models\manager.go
package modelsimport (_ "github.com/jinzhu/gorm")type Manager struct {Id intUsername stringPassword stringMobile stringEmail stringStatus intRoleId intAddTime intIsSuper intRole 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 intTitle stringDescription stringStatus intAddTime int}func (Role) TableName() string {return "role"}
4、models\role_access.go
package modelsimport (_ "github.com/jinzhu/gorm")type RoleAccess struct {AccessId intRoleId int}func (RoleAccess) TableName() string {return "role_access"}
5、models\access.go
package modelsimport (_ "github.com/jinzhu/gorm")type Access struct {Id intModuleName string //模块名称ActionName string //操作名称Type int //节点类型 : 1、表示模块 2、表示菜单 3、操作Url string //路由跳转地址ModuleId int //此module_id和当前模型的_id关联 module_id= 0 表示模块Sort intDescription stringStatus intAddTime intAccessItem []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"] = managerfmt.Println(manager)c.TplName = "admin/manager/index.html"}func (c *ManagerController) Add() {//获取所有的角色role := []models.Role{}models.DB.Find(&role)c.Data["roleList"] = rolec.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 = usernamemanager.Password = models.Md5(password)manager.Mobile = mobilemanager.Email = emailmanager.Status = 1manager.AddTime = int(models.GetUnix())manager.RoleId = roleIderr := models.DB.Create(&manager).Errorif 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"] = rolec.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 = roleIdmanager.Mobile = mobilemanager.Email = emailif 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).Errorif 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"] = rolec.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 = titlerole.Description = descriptionrole.Status = 1role.AddTime = int(models.GetUnix())err := models.DB.Create(&role).Errorif 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"] = rolec.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 = titlerole.Description = descriptionerr2 := models.DB.Save(&role).Errorif 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、获取角色idroleId, 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、渲染权限数据以及角色 Idc.Data["accessList"] = accessc.Data["roleId"] = roleIdc.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 = accessIdroleAccess.RoleId = roleIdmodels.DB.Create(&roleAccess)}c.Success("授权成功", "/role/auth?id="+strconv.Itoa(roleId))}
四、权限管理
package adminimport ("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"] = accessc.TplName = "admin/access/index.html"}func (c *AccessController) Add() {//加载顶级模块access := []models.Access{}models.DB.Where("module_id=0").Find(&access)c.Data["accessList"] = accessc.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).Errorif 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"] = accessListc.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 = moduleNameaccess.Type = iTypeaccess.ActionName = actionNameaccess.Url = urlaccess.ModuleId = moduleIdaccess.Sort = sortaccess.Description = descriptionaccess.Status = statuserr := models.DB.Save(&access).Errorif 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")}
谢谢!我很高兴能帮到您!
GoLang系列 · 目录
上一篇Beego仿小米商城RBAC判断权限下一篇Go语言Gin框架路由详解:从入门到精通
Go大神
写下你的留言

浙公网安备 33010602011771号