Beego仿小米商城RBAC管理模块

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 models
import (
  _ "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 models
import (
  _ "github.com/jinzhu/gorm"
)

type RoleAccess struct {
  AccessId int
  RoleId   int
}

func (RoleAccess) TableName() string {
  return "role_access"
}

5、models\access.go

package models
import (
  _ "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 admin
import (
  "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 admin
import (
  "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
写下你的留言
 
 
 
 
 
 
posted @   技术颜良  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2023-06-13 Go学设计模式--原型模式的考查点和使用推荐
2023-06-13 工厂模式有三个Level,你能用Go写到第几层?
2023-06-13 最简单的单例模式,Go版本的实现你写对了吗
2023-06-13 用Go语言实现23种设计模式及学习重点
2019-06-13 python 协程
2019-06-13 无监控不运维——使用 Python 写一个小小的项目监控
2019-06-13 python中hasattr()、getattr()、setattr()函数的使用
点击右上角即可分享
微信分享提示