RBAC 是基于角色的权限访问控制(Role-Based Access Control)。在 RBAC 中,权限与角色相
关联,用户通过成为适当角色的成员而得到这些角色的权限
1、实现角色的增加修改删除
2、实现用户的增加修改删除,增加修改用户的时候需要选择角色
3、实现权限的增加修改删除 (页面菜单)
4、实现角色授权功能
5、判断当前登录的用户是否有访问菜单的权限
6、根据当前登录账户的角色信息动态显示左侧菜单
在models目录下创建role.go角色模型
package models
//角色模型
type Role struct { // 结构体首字母大写, 和数据库表名对应, 默认访问数据表users, 可以设置访问数据表的方法
Id int
Title string
Description string
Status int
AddTime int
}
//配置数据库操作的表名称
func (Role) TableName() string {
return "role"
}
在controllers/admin下创建RoleController.go角色控制器
package admin
import (
"github.com/gin-gonic/gin"
"goshop/models"
"net/http"
"strings"
)
type RoleController struct {
BaseController
}
//角色列表
func (con RoleController) Index(c *gin.Context) {
//定义一个角色切片
roleList := []models.Role{}
//获取角色
models.DB.Find(&roleList)
c.HTML(http.StatusOK, "admin/role/index.html", gin.H{
"roleList": roleList,
})
}
//新增角色
func (con RoleController) Add(c *gin.Context) {
c.HTML(http.StatusOK, "admin/role/add.html", gin.H{})
}
//新增角色:提交
func (con RoleController) DoAdd(c *gin.Context) {
//获取表单的提交数据
//strings.Trim(str, cutset), 去除字符串两边的cutset字符
title := strings.Trim(c.PostForm("title"), " ") // 去除字符串两边的空格
description := strings.Trim(c.PostForm("description"), " ")
//判断角色名称是否为空
if title == "" {
con.Error(c, "角色名称不能为空", "/admin/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 {
con.Error(c, "增加角色失败,请重试", "/admin/role/add")
return
}
con.Success(c, "增加角色成功", "/admin/role")
}
//编辑角色
func (con RoleController) Edit(c *gin.Context) {
//获取角色id
id, err := models.Int(c.Query("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/role")
} else {
role := models.Role{Id: id}
models.DB.Find(&role)
c.HTML(http.StatusOK, "admin/role/edit.html", gin.H{
"role": role,
})
}
}
//编辑角色:提交
func (con RoleController) DoEdit(c *gin.Context) {
//获取提交的表单数据
id, err := models.Int(c.PostForm("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/role")
return
}
//获取表单的提交数据
//strings.Trim(str, cutset), 去除字符串两边的cutset字符
title := strings.Trim(c.PostForm("title"), " ") // 去除字符串两边的空格
description := strings.Trim(c.PostForm("description"), " ")
//判断角色名称是否为空
if title == "" {
con.Error(c, "角色名称不能为空", "/admin/role/add")
return
}
//查询角色是否存在
role := models.Role{Id: id}
models.DB.Find(&role)
//修改角色属性
role.Title = title
role.Description = description
err = models.DB.Save(&role).Error
if err != nil {
con.Error(c, "修改数据失败", "/admin/role/edit?id="+models.String(id))
return
}
con.Success(c, "修改数据成功", "/admin/role")
}
//删除角色
func (con RoleController) Delete(c *gin.Context) {
//获取提交的表单数据
id, err := models.Int(c.Query("id"))
if err != nil {
con.Error(c, "传入数据错误", "/admin/role")
return
}
//查询角色是否存在
role := models.Role{Id: id}
err = models.DB.Delete(&role).Error
if err != nil {
con.Error(c, "删除数据失败", "/admin/role")
return
}
con.Success(c, "删除数据成功", "/admin/role")
}
在templates/admin/role下创建角色相关html
{{ define "admin/role/index.html" }}
{{ template "admin/public/page_header.html" .}}