Update role.go

更新多角色
This commit is contained in:
HHC26 2024-07-11 13:59:40 +08:00 committed by GitHub
parent 86929ce16a
commit 8ba99ffbab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,16 +1,7 @@
// Package admin
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
package admin package admin
import ( import (
"context" "context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"hotgo/internal/consts" "hotgo/internal/consts"
"hotgo/internal/dao" "hotgo/internal/dao"
"hotgo/internal/library/casbin" "hotgo/internal/library/casbin"
@ -24,6 +15,12 @@ import (
"hotgo/utility/tree" "hotgo/utility/tree"
"hotgo/utility/validate" "hotgo/utility/validate"
"sort" "sort"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
) )
type sAdminRole struct{} type sAdminRole struct{}
@ -36,13 +33,9 @@ func init() {
service.RegisterAdminRole(NewAdminRole()) service.RegisterAdminRole(NewAdminRole())
} }
// Verify 验证权限 // Verify 验证权限 in a more efficient way
func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool { func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool {
var ( user := contexts.Get(ctx).User
user = contexts.Get(ctx).User
err error
)
if user == nil { if user == nil {
g.Log().Info(ctx, "admin Verify user = nil") g.Log().Info(ctx, "admin Verify user = nil")
return false return false
@ -52,26 +45,38 @@ func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool {
return true return true
} }
ok, err := casbin.Enforcer.Enforce(user.RoleKey, path, method) if len(user.RoleKeys) < 1 {
if err != nil {
g.Log().Infof(ctx, "admin Verify Enforce err:%+v", err)
return false return false
} }
return ok
for _, roleKey := range user.RoleKeys {
ok, err := casbin.Enforcer.Enforce(roleKey, path, method)
if err != nil {
g.Log().Infof(ctx, "admin Verify Enforce err:%+v", err)
return false
}
if ok {
return true
}
}
return false
} }
// List 获取列表 // List 获取列表
func (s *sAdminRole) List(ctx context.Context, in *adminin.RoleListInp) (res *adminin.RoleListModel, totalCount int, err error) { func (s *sAdminRole) List(ctx context.Context, in *adminin.RoleListInp) (res *adminin.RoleListModel, totalCount int, err error) {
var ( var (
mod = dao.AdminRole.Ctx(ctx) mod = dao.AdminRole.Ctx(ctx)
pids = []int64{0}
models []*entity.AdminRole models []*entity.AdminRole
pid int64 = 0
) )
// 非超管只获取下级角色 // 非超管只获取下级角色
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) { if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) {
pid = contexts.GetRoleId(ctx) pids = contexts.GetRoleIds(ctx)
mod = mod.WhereLike(dao.AdminRole.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%") for _, pid := range pids {
mod = mod.WhereOrLike(dao.AdminRole.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%")
}
} }
totalCount, err = mod.Count() totalCount, err = mod.Count()
@ -86,21 +91,22 @@ func (s *sAdminRole) List(ctx context.Context, in *adminin.RoleListInp) (res *ad
} }
res = new(adminin.RoleListModel) res = new(adminin.RoleListModel)
res.List = s.treeList(pid, models) res.List = s.treeList(pids, models)
return return
} }
// GetName 获取指定角色的名称 // GetNames 获取指定角色的名称
func (s *sAdminRole) GetName(ctx context.Context, id int64) (name string, err error) { func (s *sAdminRole) GetNames(ctx context.Context, ids []int64) (roleNames []string, err error) {
r, err := dao.AdminRole.Ctx(ctx).Fields("name").WherePri(id).Order("id desc").Value() names, err := dao.AdminRole.Ctx(ctx).Fields(dao.AdminRole.Columns().Name).WherePri(ids).Order("id desc").Array()
if err != nil { if err != nil {
err = gerror.Wrap(err, consts.ErrorORM) err = gerror.Wrap(err, consts.ErrorORM)
return return
} }
return r.String(), nil roleNames = gconv.Strings(names)
return
} }
// GetMemberList 获取指定用户的岗位列表 // GetMemberList 获取指定用户的角色列表
func (s *sAdminRole) GetMemberList(ctx context.Context, id int64) (list []*adminin.RoleListModel, err error) { func (s *sAdminRole) GetMemberList(ctx context.Context, id int64) (list []*adminin.RoleListModel, err error) {
if err = dao.AdminRole.Ctx(ctx).WherePri(id).Order("id desc").Scan(&list); err != nil { if err = dao.AdminRole.Ctx(ctx).WherePri(id).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM) err = gerror.Wrap(err, consts.ErrorORM)
@ -288,7 +294,15 @@ func (s *sAdminRole) DataScopeEdit(ctx context.Context, in *adminin.DataScopeEdi
} }
// treeList 角色树列表 // treeList 角色树列表
func (s *sAdminRole) treeList(pid int64, nodes []*entity.AdminRole) (list []*adminin.RoleTree) { func (s *sAdminRole) treeList(pids []int64, nodes []*entity.AdminRole) (list []*adminin.RoleTree) {
for _, id := range pids {
list = append(list, s.tree(id, nodes)...)
}
return
}
// tree 角色树
func (s *sAdminRole) tree(pid int64, nodes []*entity.AdminRole) (list []*adminin.RoleTree) {
list = make([]*adminin.RoleTree, 0) list = make([]*adminin.RoleTree, 0)
for _, v := range nodes { for _, v := range nodes {
if v.Pid == pid { if v.Pid == pid {
@ -297,7 +311,7 @@ func (s *sAdminRole) treeList(pid int64, nodes []*entity.AdminRole) (list []*adm
item.Label = v.Name item.Label = v.Name
item.Value = v.Id item.Value = v.Id
child := s.treeList(v.Id, nodes) child := s.tree(v.Id, nodes)
if len(child) > 0 { if len(child) > 0 {
item.Children = child item.Children = child
} }
@ -315,7 +329,7 @@ func (s *sAdminRole) VerifyRoleId(ctx context.Context, id int64) (err error) {
return return
} }
ids, err := s.GetSubRoleIds(ctx, mb.RoleId, service.AdminMember().VerifySuperId(ctx, mb.Id)) ids, err := s.GetSubRoleIds(ctx, mb.RoleIds, service.AdminMember().VerifySuperId(ctx, mb.Id))
if err != nil { if err != nil {
err = gerror.New("验证角色信息失败!") err = gerror.New("验证角色信息失败!")
return return
@ -329,10 +343,13 @@ func (s *sAdminRole) VerifyRoleId(ctx context.Context, id int64) (err error) {
} }
// GetSubRoleIds 获取所有下级角色ID // GetSubRoleIds 获取所有下级角色ID
func (s *sAdminRole) GetSubRoleIds(ctx context.Context, roleId int64, isSuper bool) (ids []int64, err error) { func (s *sAdminRole) GetSubRoleIds(ctx context.Context, roleIds []int64, isSuper bool) (ids []int64, err error) {
mod := dao.AdminRole.Ctx(ctx).Fields(dao.AdminRole.Columns().Id) mod := dao.AdminRole.Ctx(ctx).Fields(dao.AdminRole.Columns().Id)
if !isSuper { if !isSuper {
mod = mod.WhereNot(dao.AdminRole.Columns().Id, roleId).WhereLike(dao.AdminRole.Columns().Tree, "%"+tree.GetIdLabel(roleId)+"%") mod = mod.WhereNotIn(dao.AdminRole.Columns().Id, roleIds)
for _, roleId := range roleIds {
mod = mod.WhereOrLike(dao.AdminRole.Columns().Tree, "%"+tree.GetIdLabel(roleId)+"%")
}
} }
columns, err := mod.Array() columns, err := mod.Array()