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.7 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
}