[golang gin框架] 44.Gin商城项目-微服务实战之后台Rbac微服务之权限的增删改查微服务

news/2023/11/28 17:43:13

上一节讲解了[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联,这里讲解权限管理Rbac微服务权限的增删改查微服务

 一.实现后台权限管理Rbac之权限增删改查微服务服务端功能

1.创建Access模型 

要实现权限的增删改查,就需要创建对应的模型,故在server/rbac/models下创建Access.go模型文件,参考[golang gin框架] 14.Gin 商城项目-RBAC管理代码如下: 

package models//权限模型type Access struct {Id          int64ModuleName  string //模块名称ActionName  string //操作名称Type        int64    //节点类型 :  1、表示模块    2、表示菜单     3、操作Url         string //路由跳转地址ModuleId    int64    //此module_id和当前模型的id关联       module_id= 0 表示模块Sort        int64Description stringStatus      int64AddTime     int64AccessItem  []Access `gorm:"foreignKey:ModuleId;references:Id"`  // 表的自关联,获取该数据的子分类Checked     bool     `gorm:"-"` // 用户是否有该权, 忽略本字段,给struct加一个自定义属性,和数据库没有关系
}func (Access) TableName() string {return "access"
}

2.在proto文件夹下创建rbacAccess.proto

 参考[golang gin框架] 14.Gin 商城项目-RBAC管理,创建rbacAccess.proto.生成权限相关方法,具体代码如下:

syntax = "proto3";package access;option go_package = "./proto/rbacAccess";//权限管理
service RbacAccess {//获取权限rpc方法: 请求参数AccessGetRequest, 响应参数AccessGetResponserpc AccessGet(AccessGetRequest) returns (AccessGetResponse) {}//增加权限rpc方法: 请求参数AccessAddRequest, 响应参数AccessAddResponserpc AccessAdd(AccessAddRequest) returns (AccessAddResponse) {}//编辑权限rpc方法: 请求参数AccessEditRequest, 响应参数AccessEditResponserpc AccessEdit(AccessEditRequest) returns (AccessEditResponse) {}//删除权限rpc方法: 请求参数AccessDeleteRequest, 响应参数AccessDeleteResponserpc AccessDelete(AccessDeleteRequest) returns (AccessDeleteResponse) {}
}//权限相关model: 参考models/access.go
message AccessModel{int64 id=1;string moduleName =2;string actionName=3;int64 type=4;string url=5;int64 moduleId=6;int64 sort =7;string description=8;int64 status=9;int64 addTime=10;repeated AccessModel accessItem=11; //权限的自关联(切片类型)
}//获取权限请求参数
message AccessGetRequest{//权限id, 也可以不传,不传的话就是获取所有权限列表int64 id =1;
}//获取权限响应参数
message AccessGetResponse{//权限model切片repeated AccessModel AccessList=1;
}//增加权限请求参数
message AccessAddRequest{string moduleName =1;string actionName=2;int64 type=3;string url=4;int64 moduleId=5;int64 sort =6;string description=7;int64 status=8;int64 addTime=9;
}//增加权限响应参数
message AccessAddResponse{//是否增加成功bool success=1;//返回状态说明string message=2;
}//编辑权限请求参数
message AccessEditRequest{int64 id=1;string moduleName =2;string actionName=3;int64 type=4;string url=5;int64 moduleId=6;int64 sort =7;string description=8;int64 status=9;int64 addTime=10;
}//编辑权限响应参数
message AccessEditResponse{	//是否编辑成功bool success=1;//返回状态说明string message=2;
}//删除权限请求参数
message AccessDeleteRequest{//权限idint64 id=1;
}//删除权限响应参数
message AccessDeleteResponse{	//是否删除成功bool success=1;//返回状态说明string message=2;
}

3.生成access相关pb.go,pb.micro.go文件

在server/rbac下运行命令protoc --proto_path=. --micro_out=. --go_out=:. proto/rbacAccess.proto即可

 4.在handler文件夹下创建rbacAccess.go文件,实现proto中的service方法

参考[golang gin框架] 14.Gin 商城项目-RBAC管理_权限的增删改查方法代码,把对应的方法实现代码拷贝到rbacAccess.go中,并完善修改一下,变成微服务的代码,具体rbacAccess.go代码如下:

package handlerimport ("context""strconv""rbac/models"pb "rbac/proto/rbacAccess"
)type RbacAccess struct{}//获取权限
func (e *RbacAccess) AccessGet(ctx context.Context, req *pb.AccessGetRequest, res *pb.AccessGetResponse) error {accessList := []models.Access{}where := "1=1"if req.Id > 0 {  // 当传入权限id时,获取对应的权限数据, 当没有传入权限id时,获取权限列表数据where += " AND id=" + strconv.Itoa(int(req.Id))} else {where += " AND module_id = 0"}//获取权限数据以及对应的关联数据models.DB.Where(where).Preload("AccessItem").Find(&accessList)//处理数据var tempList []*pb.AccessModelfor _, v := range accessList {//处理自关联的子数据var tempItemList []*pb.AccessModelfor _, k := range v.AccessItem {tempItemList = append(tempItemList, &pb.AccessModel{Id:          int64(k.Id),ModuleName:  k.ModuleName,ActionName:  k.ActionName,Type:        int64(k.Type),Url:         k.Url,ModuleId:    int64(k.ModuleId),Sort:        int64(k.Sort),Description: k.Description,Status:      int64(k.Status),AddTime:     int64(k.AddTime),})}//处理数据tempList = append(tempList, &pb.AccessModel{Id:          int64(v.Id),ModuleName:  v.ModuleName,ActionName:  v.ActionName,Type:        int64(v.Type),Url:         v.Url,ModuleId:    int64(v.ModuleId),Sort:        int64(v.Sort),Description: v.Description,Status:      int64(v.Status),AddTime:     int64(v.AddTime),AccessItem:  tempItemList,  //关联的子数据})}res.AccessList = tempListreturn nil
}//增加权限
func (e *RbacAccess) AccessAdd(ctx context.Context, req *pb.AccessAddRequest, res *pb.AccessAddResponse) error {access := models.Access{ModuleName:  req.ModuleName,Type:        req.Type,ActionName:  req.ActionName,Url:         req.Url,ModuleId:    req.ModuleId,Sort:        req.Sort,Description: req.Description,Status:      req.Status,}err := models.DB.Create(&access).Errorif err != nil {res.Success = falseres.Message = "增加数据失败"} else {res.Success = trueres.Message = "增加数据成功"}return err
}//修改权限
func (e *RbacAccess) AccessEdit(ctx context.Context, req *pb.AccessEditRequest, res *pb.AccessEditResponse) error {access := models.Access{Id: req.Id}models.DB.Find(&access)access.ModuleName = req.ModuleNameaccess.Type = req.Typeaccess.ActionName = req.ActionNameaccess.Url = req.Urlaccess.ModuleId = req.ModuleIdaccess.Sort = req.Sortaccess.Description = req.Descriptionaccess.Status = req.Statuserr := models.DB.Save(&access).Errorif err != nil {res.Success = falseres.Message = "修改数据失败"} else {res.Success = trueres.Message = "修改数据成功"}return err
}//删除权限
func (e *RbacAccess) AccessDelete(ctx context.Context, req *pb.AccessDeleteRequest, res *pb.AccessDeleteResponse) error {access := models.Access{Id: req.Id}models.DB.Find(&access)if access.ModuleId == 0 { //顶级模块accessList := []models.Access{}models.DB.Where("module_id = ?", access.Id).Find(&accessList)if len(accessList) > 0 {res.Success = falseres.Message = "当前模块下面有菜单或者操作,请删除菜单或者操作以后再来删除这个数据"} else {models.DB.Delete(&access)res.Success = trueres.Message = "删除数据成功"}} else { //操作 或者菜单models.DB.Delete(&access)res.Success = trueres.Message = "删除数据成功"}return nil
}

5.在main.go文件中注册权限微服务

只需在import中引入pbManager "rbac/proto/rbacAccess"以及在main()中加入以下代码即可: 

// Register handler:注册权限微服务if err := pbAccess.RegisterRbacAccessHandler(srv.Server(), new(handler.RbacAccess)); err != nil {logger.Fatal(err)}

 具体代码如下:

package mainimport ("rbac/handler""rbac/models"pb "rbac/proto/rbacLogin"pbRole "rbac/proto/rbacRole"pbManager "rbac/proto/rbacManager"pbAccess "rbac/proto/rbacAccess""go-micro.dev/v4""go-micro.dev/v4/logger""github.com/go-micro/plugins/v4/registry/consul"
)var (service = "rbac"version = "latest"
)func main() {//集成consulconsulReg := consul.NewRegistry()// Create service//读取.ini里面的配置addr := models.Config.Section("consul").Key("addr").String()srv := micro.NewService(micro.Address(addr),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的clientmicro.Name(service),micro.Version(version),//注册consulmicro.Registry(consulReg),)srv.Init(micro.Name(service),micro.Version(version),)// Register handler:注册登录微服务if err := pb.RegisterRbacLoginHandler(srv.Server(), new(handler.RbacLogin)); err != nil {logger.Fatal(err)}// Register handler:注册角色微服务if err := pbRole.RegisterRbacRoleHandler(srv.Server(), new(handler.RbacRole)); err != nil {logger.Fatal(err)}// Register handler:注册管理员微服务if err := pbManager.RegisterRbacManagerHandler(srv.Server(), new(handler.RbacManager)); err != nil {logger.Fatal(err)}// Register handler:注册权限微服务if err := pbAccess.RegisterRbacAccessHandler(srv.Server(), new(handler.RbacAccess)); err != nil {logger.Fatal(err)}// Run serviceif err := srv.Run(); err != nil {logger.Fatal(err)}
}

二.实现后台权限管理Rbac权限客户端微服务功能

参考[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联

1.复制server/rbac/proto文件夹下rbacAccess.go以及rbacAccess文件夹到client项目中的proto文件夹下  

2. 调用Rbac权限增删改查微服务

在controllers/admin/access.go的Index(),Add(),DoAdd(),Edit(),DoEdit(),Delete()方法中调用Rbac权限增删改查微服务功能,这里需要在import中引入rbacAccess微服务相关包,代码如下:

import (pbAccess "goshop/proto/rbacAccess"
)

 原controllers/admin/access.go代码如下:也可参考[golang gin框架] 14.Gin 商城项目-RBAC管理

package adminimport ("github.com/gin-gonic/gin""goshop/models""net/http""strings"
)type AccessController struct {BaseController
}func (con AccessController) Index(c *gin.Context) {//获取权限列表accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Preload("AccessItem").Find(&accessList)c.HTML(http.StatusOK, "admin/access/index.html", gin.H{"accessList": accessList,})
}func (con AccessController) Add(c *gin.Context) {//获取顶级模块accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Find(&accessList)c.HTML(http.StatusOK, "admin/access/add.html", gin.H{"accessList": accessList,})
}func (con AccessController) DoAdd(c *gin.Context) {//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入参数错误", "/admin/access/add")return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/add")return}//实例化accessaccess := models.Access{ModuleName:  moduleName,ActionName:  actionName,Type:        accessType,Url:         url,ModuleId:    moduleId,Sort:        sort,Status:      status,Description: description,}err5 := models.DB.Create(&access).Errorif err5 != nil {con.Error(c, "添加权限失败", "/admin/access/add")return}con.Success(c, "添加权限成功", "/admin/access")
}//编辑
func (con AccessController) Edit(c *gin.Context) {//获取idid, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}access := models.Access{Id: id}models.DB.Find(&access)//获取顶级模块accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Find(&accessList)c.HTML(http.StatusOK, "admin/access/edit.html", gin.H{"access":     access,"accessList": accessList,})
}//编辑:提交
func (con AccessController) DoEdit(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.PostForm("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/edit?id"+models.String(id))return}//获取要修改的数据access := models.Access{Id: id}models.DB.Find(&access)access.ModuleName = moduleNameaccess.ActionName = actionNameaccess.Type = accessTypeaccess.Url = urlaccess.ModuleId = moduleIdaccess.Sort = sortaccess.Status = statusaccess.Description = description//保存err5 := models.DB.Save(&access).Errorif err5 != nil {con.Error(c, "编辑权限失败", "/admin/access/edit?id"+models.String(id))return}con.Success(c, "编辑权限成功", "/admin/access")
}//删除
func (con AccessController) Delete(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取要删除的数据access := models.Access{Id: id}models.DB.Find(&access)if access.ModuleId == 0 { // 顶级模块accessList := []models.Access{}models.DB.Where("module_id = ? ", access.Id).Find(&accessList)if len(accessList) > 0 {con.Error(c, "当前模块下子菜单,请先删除子菜单后再来删除这个数据", "/admin/access")return}}// 操作 或者 菜单, 或者顶级模块下面没有子菜单, 可以直接删除err = models.DB.Delete(&access).Errorif err != nil {con.Error(c, "删除数据失败", "/admin/access")return}con.Success(c, "删除数据成功", "/admin/access")
}

 (1). Index()方法调用微服务代码

原方法:

func (con AccessController) Index(c *gin.Context) {//获取权限列表accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Preload("AccessItem").Find(&accessList)c.HTML(http.StatusOK, "admin/access/index.html", gin.H{"accessList": accessList,})
}

完善后的方法: 

func (con AccessController) Index(c *gin.Context) {//获取权限列表rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/index.html", gin.H{"accessList": res.AccessList,})
}

 (2). Add()方法调用微服务代码

原方法:

func (con AccessController) Add(c *gin.Context) {//获取顶级模块accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Find(&accessList)c.HTML(http.StatusOK, "admin/access/add.html", gin.H{"accessList": accessList,})
}

完善后的方法: 

func (con AccessController) Add(c *gin.Context) {//获取顶级模块rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/add.html", gin.H{"accessList": res.AccessList,})
}

 (3). DoAdd()方法调用微服务代码

原方法:

func (con AccessController) DoAdd(c *gin.Context) {//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入参数错误", "/admin/access/add")return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/add")return}//实例化accessaccess := models.Access{ModuleName:  moduleName,ActionName:  actionName,Type:        accessType,Url:         url,ModuleId:    moduleId,Sort:        sort,Status:      status,Description: description,}err5 := models.DB.Create(&access).Errorif err5 != nil {con.Error(c, "添加权限失败", "/admin/access/add")return}con.Success(c, "添加权限成功", "/admin/access")
}

完善后的方法: 

func (con AccessController) DoAdd(c *gin.Context) {//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入参数错误", "/admin/access/add")return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/add")return}//调用权限微服务功能:实现权限的添加rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessAdd(context.Background(), &pbAccess.AccessAddRequest{ModuleName:  moduleName,Type:        int64(accessType),ActionName:  actionName,Url:         url,ModuleId:    int64(moduleId),Sort:        int64(sort),Description: description,Status:      int64(status),})if !res.Success {con.Error(c, "添加权限失败", "/admin/access/add")return}con.Success(c, "添加权限成功", "/admin/access")
}

 (3). Edit()方法调用微服务代码

原方法:

//编辑
func (con AccessController) Edit(c *gin.Context) {//获取idid, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}access := models.Access{Id: id}models.DB.Find(&access)//获取顶级模块accessList := []models.Access{}models.DB.Where("module_id = ?", 0).Find(&accessList)c.HTML(http.StatusOK, "admin/access/edit.html", gin.H{"access":     access,"accessList": accessList,})
}

完善后的方法: 

//编辑
func (con AccessController) Edit(c *gin.Context) {//获取idid, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取当前id对应的accessrbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)access, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{Id: int64(id),})//获取顶级模块resAccess, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/edit.html", gin.H{"access":     access.AccessList[0],"accessList": resAccess.AccessList,})
}

 (4). DoEdit()方法调用微服务代码

原方法:

//编辑:提交
func (con AccessController) DoEdit(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.PostForm("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/edit?id"+models.String(id))return}//获取要修改的数据access := models.Access{Id: id}models.DB.Find(&access)access.ModuleName = moduleNameaccess.ActionName = actionNameaccess.Type = accessTypeaccess.Url = urlaccess.ModuleId = moduleIdaccess.Sort = sortaccess.Status = statusaccess.Description = description//保存err5 := models.DB.Save(&access).Errorif err5 != nil {con.Error(c, "编辑权限失败", "/admin/access/edit?id"+models.String(id))return}con.Success(c, "编辑权限成功", "/admin/access")
}

完善后的方法: 

//编辑:提交
func (con AccessController) DoEdit(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.PostForm("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/edit?id"+models.String(id))return}rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)accessRes, _ := rbacClient.AccessEdit(context.Background(), &pbAccess.AccessEditRequest{Id:          int64(id),ModuleName:  moduleName,Type:        int64(accessType),ActionName:  actionName,Url:         url,ModuleId:    int64(moduleId),Sort:        int64(sort),Description: description,Status:      int64(status),})if !accessRes.Success {con.Error(c, "编辑权限失败", "/admin/access/edit?id="+models.String(id))return}con.Success(c, "编辑权限成功", "/admin/access/edit?id="+models.String(id))
}

 (5). Delete()方法调用微服务代码

原方法:

//删除
func (con AccessController) Delete(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取要删除的数据access := models.Access{Id: id}models.DB.Find(&access)if access.ModuleId == 0 { // 顶级模块accessList := []models.Access{}models.DB.Where("module_id = ? ", access.Id).Find(&accessList)if len(accessList) > 0 {con.Error(c, "当前模块下子菜单,请先删除子菜单后再来删除这个数据", "/admin/access")return}}// 操作 或者 菜单, 或者顶级模块下面没有子菜单, 可以直接删除err = models.DB.Delete(&access).Errorif err != nil {con.Error(c, "删除数据失败", "/admin/access")return}con.Success(c, "删除数据成功", "/admin/access")
}

完善后的方法: 

//删除
func (con AccessController) Delete(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取我们要删除的数据rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)accessRes, _ := rbacClient.AccessDelete(context.Background(), &pbAccess.AccessDeleteRequest{Id: int64(id),})if !accessRes.Success { //顶级模块con.Error(c, accessRes.Message, "/admin/access")return}//操作 或者菜单con.Success(c, "删除数据成功", "/admin/access")
}

 (6). 完整代码如下

package adminimport ("context""github.com/gin-gonic/gin""goshop/models"pbAccess "goshop/proto/rbacAccess""net/http""strings"
)type AccessController struct {BaseController
}func (con AccessController) Index(c *gin.Context) {//获取权限列表rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/index.html", gin.H{"accessList": res.AccessList,})
}func (con AccessController) Add(c *gin.Context) {//获取顶级模块rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/add.html", gin.H{"accessList": res.AccessList,})
}func (con AccessController) DoAdd(c *gin.Context) {//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入参数错误", "/admin/access/add")return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/add")return}//调用权限微服务功能:实现权限的添加rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)res, _ := rbacClient.AccessAdd(context.Background(), &pbAccess.AccessAddRequest{ModuleName:  moduleName,Type:        int64(accessType),ActionName:  actionName,Url:         url,ModuleId:    int64(moduleId),Sort:        int64(sort),Description: description,Status:      int64(status),})if !res.Success {con.Error(c, "添加权限失败", "/admin/access/add")return}con.Success(c, "添加权限成功", "/admin/access")
}//编辑
func (con AccessController) Edit(c *gin.Context) {//获取idid, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取当前id对应的accessrbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)access, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{Id: int64(id),})//获取顶级模块resAccess, _ := rbacClient.AccessGet(context.Background(), &pbAccess.AccessGetRequest{})c.HTML(http.StatusOK, "admin/access/edit.html", gin.H{"access":     access.AccessList[0],"accessList": resAccess.AccessList,})
}//编辑:提交
func (con AccessController) DoEdit(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.PostForm("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//获取表单数据moduleName := strings.Trim(c.PostForm("module_name"), " ")actionName := strings.Trim(c.PostForm("action_name"), " ")accessType, err1 := models.Int(c.PostForm("type"))url := c.PostForm("url")moduleId, err2 := models.Int(c.PostForm("module_id"))sort, err3 := models.Int(c.PostForm("sort"))status, err4 := models.Int(c.PostForm("status"))description := strings.Trim(c.PostForm("description"), " ")//判断errif err1 != nil || err2 != nil || err3 != nil || err4 != nil {con.Error(c, "传入数据错误", "/admin/access/edit?id"+models.String(id))return}//判断moduleNameif moduleName == "" {con.Error(c, "模块名称不能为空", "/admin/access/edit?id"+models.String(id))return}rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)accessRes, _ := rbacClient.AccessEdit(context.Background(), &pbAccess.AccessEditRequest{Id:          int64(id),ModuleName:  moduleName,Type:        int64(accessType),ActionName:  actionName,Url:         url,ModuleId:    int64(moduleId),Sort:        int64(sort),Description: description,Status:      int64(status),})if !accessRes.Success {con.Error(c, "编辑权限失败", "/admin/access/edit?id="+models.String(id))return}con.Success(c, "编辑权限成功", "/admin/access/edit?id="+models.String(id))
}//删除
func (con AccessController) Delete(c *gin.Context) {//获取提交的表单数据id, err := models.Int(c.Query("id"))if err != nil {con.Error(c, "传入数据错误", "/admin/access")return}//获取我们要删除的数据rbacClient := pbAccess.NewRbacAccessService("rbac", models.RbacClient)accessRes, _ := rbacClient.AccessDelete(context.Background(), &pbAccess.AccessDeleteRequest{Id: int64(id),})if !accessRes.Success { //顶级模块con.Error(c, accessRes.Message, "/admin/access")return}//操作 或者菜单con.Success(c, "删除数据成功", "/admin/access")
}

三.校验权限管理Rbac权限增删改查微服务功能

1.先启动服务端

见[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务代码, 这里还要启动验证码captcha微服务服务端代码以及权限管理Rbac微服务(用户登录微服务服务端,角色管理微服务服务端,管理员管理微服务服务端)服务端才行

2.启动客户端

在项目根目录下运行 :go run main.go,启动项目

3.校验权限管理Rbac权限增删改查微服务操作是否成功 

访问后台登录页面,输入用户名,密码,验证码,登录到后台后,进入权限管理页面,对权限进行增删改查

 

 删除操作后,发现没有该数据了,说明删除操作正确

 好了,权限管理Rbac权限增删改查微服务功能客户端操作完成,这里微服务操作的服务端,客户端功能大致[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联类似,可参考该文章操作,下面一节继续讲解权限管理Rbac微服务之角色权限关联微服务

 [上一节][golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联


http://www.ppmy.cn/news/992370.html

相关文章

LeetCode 2050. 并行课程 III:DFS

【LetMeFly】2050.并行课程 III:DFS 力扣题目链接:https://leetcode.cn/problems/parallel-courses-iii/ 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 relations[…

MVC乱码问题

RequestMapping(value "insert",produces {"text/html;charsetutf-8"}) //前端响应回去加响应头,解决乱码问题,这个还跟JSP响应头还不一样,这是响应的字符串,纯文本,那个前端的是out.Writer()对象&#xff…

第三课:运算符

1.算数运算符 int a 20; int b 10; System.out.println(a b); // 30 System.out.println(a - b); // 10 System.out.println(a * b); // 200 System.out.println(a / b); // 2 System.out.println(a % b); // 0 --->模运算相当于数学中除法的余数 ⚠关于/除法 public s…

在 Windows 上搭建 NTP 服务器

文章目录 一、基础环境二、适用场景三、操作步骤四、常用的NTP服务器五、参考资料 版权声明:本文为博主原创文章,于2023年7月30日首发于CSDN,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u011046671 一、基础…

qt代码练习

计时器练习 namespace Ui { class third; }class third : public QWidget {Q_OBJECTpublic:explicit third(QWidget *parent nullptr);~third();QLabel *labth1 new QLabel(this);QTextEdit *txtth1 new QTextEdit("闹钟",this);QLineEdit *leth1 new QLineEdit(t…

Android 面试题 优化 (一)

🔥 Android性能优化指标 🔥 ​ 🔥 包体积优化 🔥 安装包的大小会影响用户的安装率,如果一个包的太大,用户安装的意愿会大大降低。 经过包分析可以看到,安装包最大的部分是资源和第三方库&#…

VSCode搭建GCC环境

1. 下载 https://www.mingw-w64.org/downloads/ https://github.com/niXman/mingw-builds-binaries/releases 2.安装 x86_64-12.2.0-release-win32-seh-rt_v10-rev1.7z解压到D盘 我的电脑–属性–系统属性–环境变量–系统变量–path D:\MinGW-w64\x86_64-12.2.0-release…

01-导数的定义_左导数和右导数

微积分 导数的定义 左导数与右导数、可导函数 趋近于 0 有两个方向,从左边趋向于 0 是左导数,反之是右导数 下面的绝对值函数的左导数和右导数不相同,一个-1 一个1,0 位置不可导 f(x)|x|, 导数可以理解为某点的斜率…

1 MobileHomeTopicApplication

目录 1 MobileHomeTopicApplication 1.1 /// 获取移动端首页专题设置 2 OperationLogApplication 2.1 /// 根据查询条件分页获取操作日志信息 2.2 /// 增加平台日志信息 2.3 /// 增加平台日志信息 2.4 ///根据ID删除平台日志信息 MobileHomeTopicApplication

【ARM】内核驱动之设备树的学习-长文

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、什么是设备树,为什么叫设备树?二、如何编译设备树?三、…

【图论】三种中心性 —— 特征向量、katz 和 PageRank

维基百科:在图论和网络分析中,中心性指标为图中相应网络位置的节点分配排名或数值。中心性这一概念最初起源于社交网络分析,因此很多衡量中心性的术语也反映了其社会学背景。 不同中心性指标对 “重要” 的衡量方式不同,因此适用于…

SpringBoot配置API跨域

SpringBoot配置API跨域 新建CorsConfig配置类, 在WebMvcConfigurer里配置 addCorsMappings跨域资源映射 package cn.ath.knowwikibackend.cors;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuratio…

RISCV - 4 ISA 扩展名命名约定

RISCV - 4 ISA 扩展名命名约定 1 Case Sensitivity2 Base Integer ISA3 Instruction-Set Extension Names4 Version Numbers5 Underscores6 Additional Standard Extension Names7 Supervisor-level Instruction-Set Extensions8 Hypervisor-level Instruction-Set Extensions9…

P5726 【深基4.习9】打分

【深基4.习9】打分 题目描述 现在有 n ( n ≤ 1000 ) n(n \le 1000) n(n≤1000) 位评委给选手打分,分值从 0 0 0 到 10 10 10。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个)&a…

ARM裸机-8

1、ARM的编程模式和工作模式 1.1、ARM的基本设定 ARM采用的是32位架构 ARM约定: - Byte:8 bits - Halfword :16 bits (2 byte) - Word:32 bits (4 byte) 大部分ARM core 提供: - ARM 指令集 (32-bit) - Thumb 指令集 …

微信小程序 背景图片如何占满整个屏幕

1. 在页面的wxss文件中,设置背景图片的样式: page{background-image: url(图片路径);background-size: 100% 100%;background-repeat: no-repeat; } 2. 在页面的json文件中,设置背景图片的样式: {"backgroundTextStyle&qu…

mysql的json处理

写在前面 需要注意,5.7以上版本才支持,但如果是生产环境需要使用的话,尽量使用8.0版本,因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL的json处理。在正式开始让我们先…

hugging face下载数据集

开始直接执行这个,下载下来的图片打不开 git clone https://huggingface.co/datasets/diffusers/dog-example 解决办法: 安装git lfs 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. sudo apt…

PostGis -基础、Springboot 整合、电子围栏处理

目的: 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据,如:存储一个 多边形 到数据。PostGis中 geometry、geography :基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模…

数学建模学习(7):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…
最新文章