You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
5.9 KiB
197 lines
5.9 KiB
/* |
|
* @desc:角色处理 |
|
* |
|
* |
|
* @Date: 2022/3/9 10:31 |
|
*/ |
|
|
|
package service |
|
|
|
import ( |
|
"context" |
|
"github.com/gogf/gf/v2/database/gdb" |
|
"github.com/gogf/gf/v2/frame/g" |
|
"github.com/gogf/gf/v2/util/gconv" |
|
"tyj_admin/api/v1/system" |
|
"tyj_admin/internal/consts" |
|
"tyj_admin/internal/dao" |
|
"tyj_admin/internal/model/do" |
|
"tyj_admin/internal/model/entity" |
|
"tyj_admin/library/liberr" |
|
) |
|
|
|
type IRole interface { |
|
GetRoleList(ctx context.Context) (list []*entity.SysRole, err error) |
|
GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) |
|
AddRole(ctx context.Context, req *system.RoleAddReq) (err error) |
|
Get(ctx context.Context, id uint) (res *entity.SysRole, err error) |
|
GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error) |
|
EditRole(ctx context.Context, req *system.RoleEditReq) error |
|
DeleteByIds(ctx context.Context, ids []int64) (err error) |
|
} |
|
|
|
type roleImpl struct { |
|
} |
|
|
|
var roleService = roleImpl{} |
|
|
|
func Role() IRole { |
|
return &roleService |
|
} |
|
|
|
func (s *roleImpl) GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) { |
|
res = new(system.RoleListRes) |
|
g.Try(ctx, func(ctx context.Context) { |
|
model := dao.SysRole.Ctx(ctx) |
|
if req.RoleName != "" { |
|
model = model.Where("name like ?", "%"+req.RoleName+"%") |
|
} |
|
if req.Status != "" { |
|
model = model.Where("status", gconv.Int(req.Status)) |
|
} |
|
res.Total, err = model.Count() |
|
liberr.ErrIsNil(ctx, err, "获取角色数据失败") |
|
if req.PageNum == 0 { |
|
req.PageNum = 1 |
|
} |
|
res.CurrentPage = req.PageNum |
|
if req.PageSize == 0 { |
|
req.PageSize = consts.PageSize |
|
} |
|
err = model.Page(res.CurrentPage, req.PageSize).Order("id asc").Scan(&res.List) |
|
liberr.ErrIsNil(ctx, err, "获取数据失败") |
|
}) |
|
return |
|
} |
|
|
|
// GetRoleList 获取角色列表 |
|
func (s *roleImpl) GetRoleList(ctx context.Context) (list []*entity.SysRole, err error) { |
|
cache := Cache() |
|
//从缓存获取 |
|
iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysRole, s.getRoleListFromDb, 0, consts.CacheSysAuthTag) |
|
if iList != nil { |
|
err = gconv.Struct(iList, &list) |
|
} |
|
return |
|
} |
|
|
|
// 从数据库获取所有角色 |
|
func (s *roleImpl) getRoleListFromDb(ctx context.Context) (value interface{}, err error) { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
var v []*entity.SysRole |
|
//从数据库获取 |
|
err = dao.SysRole.Ctx(ctx). |
|
Order(dao.SysRole.Columns().ListOrder + " asc," + dao.SysRole.Columns().Id + " asc"). |
|
Scan(&v) |
|
liberr.ErrIsNil(ctx, err, "获取角色数据失败") |
|
value = v |
|
}) |
|
return |
|
} |
|
|
|
// AddRoleRule 添加角色权限 |
|
func (s *roleImpl) AddRoleRule(ctx context.Context, ruleIds []uint, roleId int64) (err error) { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
enforcer, e := CasbinEnforcer(ctx) |
|
liberr.ErrIsNil(ctx, e, "添加权限失败") |
|
ruleIdsStr := gconv.Strings(ruleIds) |
|
for _, v := range ruleIdsStr { |
|
_, err = enforcer.AddPolicy(gconv.String(roleId), v, "All") |
|
liberr.ErrIsNil(ctx, err, "添加权限失败") |
|
} |
|
}) |
|
return |
|
} |
|
|
|
// DelRoleRule 删除角色权限 |
|
func (s *roleImpl) DelRoleRule(ctx context.Context, roleId int64) (err error) { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
enforcer, e := CasbinEnforcer(ctx) |
|
liberr.ErrIsNil(ctx, e, "删除角色权限失败") |
|
_, err = enforcer.RemoveFilteredPolicy(0, gconv.String(roleId)) |
|
liberr.ErrIsNil(ctx, e, "删除角色权限失败") |
|
}) |
|
return |
|
} |
|
|
|
func (s *roleImpl) AddRole(ctx context.Context, req *system.RoleAddReq) (err error) { |
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
roleId, e := dao.SysRole.Ctx(ctx).TX(tx).InsertAndGetId(req) |
|
liberr.ErrIsNil(ctx, e, "添加角色失败") |
|
//添加角色权限 |
|
e = s.AddRoleRule(ctx, req.MenuIds, roleId) |
|
liberr.ErrIsNil(ctx, e, "添加角色失败") |
|
//清除缓存 |
|
Cache().Remove(ctx, consts.CacheSysRole) |
|
}) |
|
return err |
|
}) |
|
return |
|
} |
|
|
|
func (s *roleImpl) Get(ctx context.Context, id uint) (res *entity.SysRole, err error) { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
err = dao.SysRole.Ctx(ctx).WherePri(id).Scan(&res) |
|
liberr.ErrIsNil(ctx, err, "获取角色信息失败") |
|
}) |
|
return |
|
} |
|
|
|
// GetFilteredNamedPolicy 获取角色关联的菜单规则 |
|
func (s *roleImpl) GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error) { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
enforcer, e := CasbinEnforcer(ctx) |
|
liberr.ErrIsNil(ctx, e) |
|
gp := enforcer.GetFilteredNamedPolicy("p", 0, gconv.String(id)) |
|
gpSlice = make([]int, len(gp)) |
|
for k, v := range gp { |
|
gpSlice[k] = gconv.Int(v[1]) |
|
} |
|
}) |
|
return |
|
} |
|
|
|
// EditRole 修改角色 |
|
func (s *roleImpl) EditRole(ctx context.Context, req *system.RoleEditReq) (err error) { |
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
_, e := dao.SysRole.Ctx(ctx).TX(tx).WherePri(req.Id).Data(&do.SysRole{ |
|
Status: req.Status, |
|
ListOrder: req.ListOrder, |
|
Name: req.Name, |
|
Remark: req.Remark, |
|
}).Update() |
|
liberr.ErrIsNil(ctx, e, "修改角色失败") |
|
//删除角色权限 |
|
e = s.DelRoleRule(ctx, req.Id) |
|
liberr.ErrIsNil(ctx, e) |
|
//添加角色权限 |
|
e = s.AddRoleRule(ctx, req.MenuIds, req.Id) |
|
liberr.ErrIsNil(ctx, e) |
|
//清除缓存 |
|
Cache().Remove(ctx, consts.CacheSysRole) |
|
}) |
|
return err |
|
}) |
|
return |
|
} |
|
|
|
// DeleteByIds 删除角色 |
|
func (s *roleImpl) DeleteByIds(ctx context.Context, ids []int64) (err error) { |
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { |
|
err = g.Try(ctx, func(ctx context.Context) { |
|
_, err = dao.SysRole.Ctx(ctx).TX(tx).Where(dao.SysRole.Columns().Id+" in(?)", ids).Delete() |
|
liberr.ErrIsNil(ctx, err, "删除角色失败") |
|
//删除角色权限 |
|
for _, v := range ids { |
|
err = s.DelRoleRule(ctx, v) |
|
liberr.ErrIsNil(ctx, err) |
|
} |
|
//清除缓存 |
|
Cache().Remove(ctx, consts.CacheSysRole) |
|
}) |
|
return err |
|
}) |
|
return |
|
}
|
|
|