Преглед изворни кода

feature:
1.添加获取数据权限接口
2.获取用户添加过滤条件

ZZH-wl пре 3 година
родитељ
комит
67fca0a26a

+ 15 - 0
opms_admin/app/handler/role.go

@@ -131,3 +131,18 @@ func (h *RoleHandler) UpdateRoleDataScope(ctx context.Context, req *model.DataSc
 	_, _, rsp.Code, rsp.Msg = myerrors.CheckError(err)
 	return nil
 }
+
+// GetDataScope 获取某用户数据集合权限,返回Ids(用户Id列表),返回-1表示无角色,返回-2表示有全部集合权限
+func (o *RoleHandler) GetDataScope(ctx context.Context, nullParams interface{}, rsp *comm_def.CommonMsg) error {
+	roleService, err := service.NewRoleService(ctx)
+	if err != nil {
+		return gerror.New("系统异常,请重新尝试")
+	}
+	ids, err := roleService.GetDataScope(roleService.GetCxtUserId())
+	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+	rsp.Data = ids
+	return err
+}

+ 8 - 5
opms_admin/app/model/sys_user.go

@@ -36,11 +36,14 @@ type LoginUserRes struct {
 
 // SysUserSearchReq 用户搜索请求参数
 type SysUserSearchReq struct {
-	DeptId   int    `json:"deptId"` //部门id
-	DeptIds  []int  //所属部门id数据
-	Phone    string `json:"phone"`
-	Status   string `json:"status"`
-	KeyWords string `json:"userName"`
+	KeyWords string   `json:"keyWords"`
+	DeptId   int      `json:"deptId"` //部门id
+	DeptIds  []int    //所属部门id数据
+	Phone    string   `json:"phone"`
+	Status   string   `json:"status"`
+	Roles    []string `json:"roles"`
+	Posts    []string `json:"posts"`
+	Groups   []string `json:"groups"`
 	request.PageReq
 }
 

+ 5 - 5
opms_admin/app/service/context.go

@@ -96,17 +96,17 @@ func (c *contextService) GetDataScopeWhere() (where g.Map, err error) {
 	deptIdArr := gset.New()
 	for _, role := range roles {
 		switch role.DataScope {
-		case "1": //全部数据权限
+		case "10": //全部数据权限
 			return nil, nil
-		case "2": //自定数据权限
+		case "20": //自定数据权限
 			deptIds, err := roleSrv.GetRoleDeptTreeselect(gconv.Int64(role.Id))
 			if err != nil {
 				return nil, err
 			}
 			deptIdArr.Add(gconv.Interfaces(deptIds)...)
-		case "3": //本部门数据权限
+		case "30": //本部门数据权限
 			deptIdArr.Add(gconv.Int64(userInfo.DeptId))
-		case "4": //本部门及以下数据权限
+		case "40": //本部门及以下数据权限
 			deptIdArr.Add(gconv.Int64(userInfo.DeptId))
 			//获取正常状态部门数据
 			depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
@@ -117,7 +117,7 @@ func (c *contextService) GetDataScopeWhere() (where g.Map, err error) {
 			for _, children := range childrenList {
 				deptIdArr.Add(gconv.Int64(children.Id))
 			}
-		case "5": //仅本人数据权限
+		case "50": //仅本人数据权限
 			whereJustMe = g.Map{"`user`.id": userInfo.Id}
 		}
 	}

+ 104 - 1
opms_admin/app/service/sys_role.go

@@ -5,6 +5,7 @@ import (
 	"dashoo.cn/micro/app/dao"
 	"dashoo.cn/micro/app/model"
 	"dashoo.cn/opms_libary/utils"
+	"github.com/gogf/gf/container/gset"
 	"github.com/gogf/gf/database/gdb"
 	"github.com/gogf/gf/errors/gerror"
 	"github.com/gogf/gf/frame/g"
@@ -106,7 +107,7 @@ func (s *roleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error)
 }
 
 // GetRolesMenuPermissions 获取角色菜单权限
-func (s roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
+func (s *roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
 	result, err := dao.NewSysMenuDao(s.Tenant).Fields(dao.SysMenu.Columns.Perms).WhereIn(dao.SysMenu.Columns.MenuType, g.Slice{"C", "F"}).
 		WhereIn(dao.SysMenu.Columns.Id, s.roleMenuDao.WhereIn(s.roleMenuDao.Columns.RoleId, ids).Fields(s.roleMenuDao.Columns.MenuId)).
 		WhereNot(dao.SysMenu.Columns.Perms, "").Array()
@@ -220,3 +221,105 @@ func (s *roleService) UpdateRoleDataScope(req *model.DataScopeReq) error {
 	})
 	return err
 }
+
+// GetMaxRoleDataScopeByUser 获取用户所拥有的角色最高数据权限
+func (s *roleService) GetMaxRoleDataScopeByUser(userId int) (string, []int, error) {
+	roleIds, err := dao.NewSysUserRoleDao(s.Tenant).Fields(dao.SysUserRole.Columns.RoleId).Where(dao.SysUserRole.Columns.UserId, userId).Array()
+	if err != nil {
+		return "", nil, err
+	}
+	if roleIds == nil {
+		return "-1", nil, nil
+	}
+
+	scopes, err := s.Dao.Fields(s.Dao.Columns.DataScope).Distinct().Order(s.Dao.Columns.DataScope).WhereIn(s.Dao.Columns.Id, roleIds).Array()
+	if err != nil {
+		return "", nil, err
+	}
+	if scopes == nil || len(scopes) == 0 {
+		return "", nil, gerror.New("用户角色设定有错误。")
+	}
+
+	scope := scopes[0].String()
+	if scope == "30" {
+		for _, v := range scopes {
+			if v.String() == "40" {
+				scope = "40"
+				break
+			}
+		}
+	}
+
+	return scope, gconv.Ints(roleIds), err
+}
+
+// GetDataScope 获取某用户数据集合权限,返回Ids(用户Id列表),返回-1表示无角色,返回-2表示有全部集合权限
+func (s *roleService) GetDataScope(userId int) (ids string, err error) {
+	userDao := dao.NewSysUserDao(s.Tenant)
+	_, err = userDao.WherePri(userId).FindOne()
+	if err != nil {
+		return "", err
+	}
+
+	// 获取角色,获取最高数据权限
+	dataScope, roleIds, err := s.GetMaxRoleDataScopeByUser(userId)
+	if err != nil {
+		return "", err
+	}
+	if dataScope == "-1" { // 无角色
+		return "-1", nil
+	}
+
+	// 数据集合权限 10:全部数据权限 20:自定数据权限 30:本部门数据权限 40:本部门及以下数据权限 50:仅本人数据权限
+	ids = "-1"
+	switch dataScope {
+	case "10": // 所有数据权限
+		return "-2", nil
+	case "20": // 自定数据权限
+		result, err := userDao.Fields(userDao.Columns.Id).WhereIn(
+			userDao.Columns.DeptId, s.roleDeptDao.Fields(s.roleDeptDao.Columns.DeptId).WhereIn(s.roleDeptDao.Columns.RoleId, roleIds),
+		).Array()
+		if err != nil {
+			return "", err
+		}
+		ids = utils.ToIdsString(result)
+	case "30": // 本部门数据权限
+		result, err := userDao.Fields(userDao.Columns.Id).Where(
+			userDao.Columns.DeptId, userDao.Fields(userDao.Columns.DeptId).WherePri(userId),
+		).Array()
+		if err != nil {
+			return "", err
+		}
+		ids = utils.ToIdsString(result)
+	case "40": // 本部门及以下数据权限
+		deptId, err := userDao.Value(userDao.Columns.DeptId, userDao.Columns.Id, userId)
+		if err != nil {
+			return "", err
+		}
+
+		deptSrv := &deptService{
+			contextService: s.contextService,
+			Dao:            dao.NewSysDeptDao(s.Tenant),
+		}
+		//获取正常状态部门数据
+		depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
+		if err != nil {
+			return "", err
+		}
+		deptIdArr := gset.New()
+		childrenList := deptSrv.FindSonByParentId(depts, gconv.Int(deptId))
+		for _, children := range childrenList {
+			deptIdArr.Add(gconv.Int(children.Id))
+		}
+
+		result, err := userDao.Fields(userDao.Columns.Id).WhereIn(userDao.Columns.DeptId, deptIdArr).Array()
+		if err != nil {
+			return "", err
+		}
+		ids = utils.ToIdsString(result)
+	case "50": // 仅本人数据权限
+		ids = gconv.String(userId)
+	}
+
+	return ids, nil
+}

+ 12 - 0
opms_admin/app/service/sys_user.go

@@ -94,6 +94,18 @@ func (s *userService) GetUserList(req *model.SysUserSearchReq) (total int, userL
 	if req.EndTime != "" {
 		userModel = userModel.WhereLTE("sys_user.created_time", req.EndTime)
 	}
+	if len(req.Roles) > 0 {
+		sql := dao.NewSysRoleDao(s.Tenant).Fields(dao.SysRole.Columns.Id).WhereIn(dao.SysRole.Columns.RoleKey, req.Roles)
+		userModel = userModel.LeftJoin(dao.SysUserRole.Table, "ur", "sys_user.id=ur.user_id").WhereIn("ur.role_id", sql)
+	}
+	if len(req.Posts) > 0 {
+		sql := dao.NewSysPostDao(s.Tenant).Fields(dao.SysPost.Columns.Id).WhereIn(dao.SysPost.Columns.PostCode, req.Posts)
+		userModel = userModel.LeftJoin(dao.SysUserPost.Table, "up", "sys_user.id=up.user_id").WhereIn("up.post_id", sql)
+	}
+	if len(req.Groups) > 0 {
+		sql := dao.NewSysGroupDao(s.Tenant).Fields(dao.SysGroup.Columns.Id).WhereIn(dao.SysGroup.Columns.GroupCode, req.Groups)
+		userModel = userModel.LeftJoin(dao.SysUserGroup.Table, "ug", "sys_user.id=ug.user_id").WhereIn("ug.group_id", sql)
+	}
 	if userModel, err = s.SetDataScopeWhere(userModel); err != nil {
 		return 0, nil, err
 	}