| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- package role
- import (
- "database/sql"
- "errors"
- "fmt"
- "gfast/app/model/admin/role_dept"
- "gfast/app/service/cache_service"
- "gfast/app/service/casbin_adapter_service"
- "gfast/library/service"
- "gfast/library/utils"
- "github.com/gogf/gf/database/gdb"
- "github.com/gogf/gf/errors/gerror"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/os/gtime"
- "github.com/gogf/gf/util/gconv"
- "github.com/gogf/gf/util/gvalid"
- )
- //分页请求参数
- type SelectPageReq struct {
- RoleName string `p:"roleName"` //参数名称
- BeginTime string `p:"beginTime"` //开始时间
- EndTime string `p:"endTime"` //结束时间
- Status string `p:"status"` //状态
- PageNum int `p:"pageNum"` //当前页码
- PageSize int `p:"pageSize"` //每页数
- }
- //修改状态参数
- type StatusSetReq struct {
- RoleId uint `p:"roleId" v:"required#角色ID不能为空"`
- Status uint `p:"status" v:"required#状态不能为空"`
- }
- //角色数据授权参数
- type DataScopeReq struct {
- RoleId uint `p:"roleId" v:"required#角色ID不能为空"`
- DataScope uint `p:"dataScope" v:"required#权限范围不能为空"`
- DeptIds []uint `p:"deptIds"`
- }
- func GetRoleListSearch(req *SelectPageReq) (total, page int, list []*Entity, err error) {
- model := Model
- if req != nil {
- if req.RoleName != "" {
- model = model.Where("name like ?", "%"+req.RoleName+"%")
- }
- if req.Status != "" {
- model = model.Where("status", gconv.Int(req.Status))
- }
- if req.BeginTime != "" {
- model = model.Where("create_time >= ? ", utils.StrToTimestamp(req.BeginTime))
- }
- if req.EndTime != "" {
- model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime))
- }
- }
- total, err = model.Count()
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("获取总行数失败")
- return
- }
- if req.PageNum == 0 {
- req.PageNum = 1
- }
- page = req.PageNum
- if req.PageSize == 0 {
- req.PageSize = service.AdminPageNum
- }
- list, err = model.Page(page, req.PageSize).Order("id asc").All()
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("获取数据失败")
- return
- }
- return
- }
- //获取用户组(角色)列表
- func GetList() (list []*Entity, err error) {
- cache := cache_service.New()
- //从缓存获取
- iList := cache.Get(cache_service.AdminAuthRole)
- if iList != nil {
- list = iList.([]*Entity)
- return
- }
- //从数据库获取
- list, err = Model.Order("list_order asc,id asc").All()
- //缓存数据
- cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag)
- return
- }
- func checkRoleData(params map[string]interface{}) error {
- rules := []string{
- "roleName@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
- }
- e := gvalid.CheckMap(params, rules)
- if e != nil {
- return e
- }
- return nil
- }
- //保存角色信息并返回插入的id
- func Add(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
- if e := checkRoleData(data); e != nil {
- err = gerror.New(e.(*gvalid.Error).FirstString())
- return
- }
- //保存角色信息
- now := gtime.Timestamp()
- roleMap := gdb.Map{
- "status": data["status"],
- "name": data["roleName"],
- "create_time": now,
- "update_time": now,
- "list_order": data["roleSort"],
- "remark": data["remark"],
- }
- var res sql.Result
- res, err = tx.Table(Table).Data(roleMap).Save()
- if err != nil {
- return
- }
- InsId, _ = res.LastInsertId()
- return
- }
- //修改角色信息操作
- func Edit(tx *gdb.TX, data map[string]interface{}) (err error) {
- if _, k := data["roleId"]; !k {
- err = errors.New("缺少更新条件Id")
- return
- }
- if e := checkRoleData(data); e != nil {
- err = gerror.New(e.(*gvalid.Error).FirstString())
- return
- }
- //保存角色信息
- now := gtime.Timestamp()
- roleMap := gdb.Map{
- "id": data["roleId"],
- "status": data["status"],
- "name": data["roleName"],
- "update_time": now,
- "list_order": data["roleSort"],
- "remark": data["remark"],
- }
- _, err = tx.Table(Table).Data(roleMap).Save()
- if err != nil {
- return
- }
- return
- }
- //设置角色状态
- func StatusSetRole(req *StatusSetReq) error {
- if req != nil {
- entity, err := Model.Where("id", req.RoleId).One()
- if err != nil {
- g.Log().Error(err)
- return gerror.New("获取角色信息失败")
- }
- entity.Status = req.Status
- _, err = entity.Update()
- if err != nil {
- g.Log().Error(err)
- return gerror.New("设置状态失败")
- }
- }
- return nil
- }
- //设置角色数据权限
- func DataScope(req *DataScopeReq) error {
- tx, err := g.DB().Begin()
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("设置失败")
- return err
- }
- _, err = tx.Table(Table).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update()
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- return gerror.New("设置失败")
- }
- if req.DataScope == 2 {
- _, err := tx.Table(role_dept.Table).Delete(role_dept.Columns.RoleId, req.RoleId)
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- return gerror.New("设置失败")
- }
- //自定义数据权限
- data := g.List{}
- for _, deptId := range req.DeptIds {
- data = append(data, g.Map{role_dept.Columns.RoleId: req.RoleId, role_dept.Columns.DeptId: deptId})
- }
- _, err = tx.Table(role_dept.Table).Data(data).Insert()
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- return gerror.New("设置失败")
- }
- }
- tx.Commit()
- return nil
- }
- //删除角色权限操作
- func DeleteRoleRule(roleId int) (err error) {
- enforcer, e := casbin_adapter_service.GetEnforcer()
- if e != nil {
- err = e
- return
- }
- //查询当前权限
- gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId))
- //删除旧权限
- for _, v := range gp {
- _, e = enforcer.RemovePolicy(v)
- if e != nil {
- err = e
- return
- }
- }
- return
- }
- func DeleteByIds(ids []int) (err error) {
- //查询所有子级id
- roleAllEntity, err := GetList()
- if err != nil {
- g.Log().Debug(err)
- err = gerror.New("删除失败,不存在角色信息")
- return
- }
- roleAll := gconv.SliceMap(roleAllEntity)
- sonList := make(g.List, 0, len(roleAll))
- for _, id := range ids {
- sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...)
- }
- for _, role := range sonList {
- ids = append(ids, gconv.Int(role["id"]))
- }
- tx, err := g.DB("default").Begin() //开启事务
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("事务处理失败")
- return
- }
- _, err = tx.Table(Table).Where("id in(?)", ids).Delete()
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- err = gerror.New("删除失败")
- return
- }
- //删除角色的权限和管理的部门数据权限
- for _, v := range ids {
- err = DeleteRoleRule(v)
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- err = gerror.New("删除失败")
- return
- }
- _, err = tx.Table(role_dept.Table).Delete(role_dept.Columns.RoleId, v)
- if err != nil {
- g.Log().Error(err)
- tx.Rollback()
- err = gerror.New("删除失败")
- return
- }
- }
- tx.Commit()
- return
- }
|