mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-23 03:36:40 +08:00
Update role.go
更新多角色
This commit is contained in:
parent
86929ce16a
commit
8ba99ffbab
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user