feat(ruoyi支持用户在多组织中不同角色能力): 增加用户与部门的一对多关系

1、用户与部门及部门对应角色的关联对象移动至公共模块
2、新增Fegin接口:通过用户名查询用户下组织及组织对应角色列表

关联Issue:https://www.gitlink.org.cn/Gitlink/forgeplus/issues/2780
This commit is contained in:
otto 2023-04-20 14:21:33 +08:00
parent d8788e5cae
commit a9158d83c1
12 changed files with 130 additions and 26 deletions

View File

@ -4,11 +4,14 @@ import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.SysUserDeptRole;
import com.ruoyi.system.api.factory.RemoteUserFallbackFactory; import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
/** /**
* 用户服务 * 用户服务
* *
@ -31,6 +34,7 @@ public interface RemoteUserService
* 通过用户名查询用户信息 * 通过用户名查询用户信息
* *
* @param username 用户名 * @param username 用户名
* @param source 请求来源
* @return 结果 * @return 结果
*/ */
@GetMapping("/user/getSysUserByUserName/{username}") @GetMapping("/user/getSysUserByUserName/{username}")
@ -40,6 +44,7 @@ public interface RemoteUserService
* 通过用户Id查询用户信息 * 通过用户Id查询用户信息
* *
* @param userId 用户Id * @param userId 用户Id
* @param source 请求来源
* @return 结果 * @return 结果
*/ */
@GetMapping("/user/getSysUserByUserId/{userId}") @GetMapping("/user/getSysUserByUserId/{userId}")
@ -61,9 +66,19 @@ public interface RemoteUserService
* 通过GitLinkToken获取本系统Token * 通过GitLinkToken获取本系统Token
* *
* @param cookie * @param cookie
* @param source 请求来源
* @return 返回本系统Token * @return 返回本系统Token
*/ */
@PostMapping("/user/getSysUserTokenByGitLinkCookie") @PostMapping("/user/getSysUserTokenByGitLinkCookie")
public R<String> getSysUserTokenByGitLinkCookie(@RequestHeader("cookie") String cookie, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); public R<String> getSysUserTokenByGitLinkCookie(@RequestHeader("cookie") String cookie, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 通过用户名查询用户下组织及组织对应角色列表
*
* @param userName 用户名
* @param source 请求来源
* @return 用户下组织及组织对应角色列表
*/
@GetMapping("/userByUserName/{userName}/list")
public R<List<SysUserDeptRole>> getSysUserDeptRoleListByUserName(@PathVariable("userName") String userName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
} }

View File

@ -1,23 +1,12 @@
package com.ruoyi.system.domain; package com.ruoyi.system.api.domain;
import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Objects; import java.util.Objects;
/** /**
* 用户与部门及部门内角色关联对象 sys_user_dept_role
*
* @author otto * @author otto
* @date 2023-04-11
*/ */
@Data
@NoArgsConstructor
@ApiModel("用户与部门及部门对应角色的关联对象") @ApiModel("用户与部门及部门对应角色的关联对象")
public class SysUserDeptRole { public class SysUserDeptRole {
@ -73,4 +62,64 @@ public class SysUserDeptRole {
public int hashCode() { public int hashCode() {
return Objects.hash(deptId, userId, roleId); return Objects.hash(deptId, userId, roleId);
} }
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public SysDept getSysDept() {
return sysDept;
}
public void setSysDept(SysDept sysDept) {
this.sysDept = sysDept;
}
public SysUser getSysUser() {
return sysUser;
}
public void setSysUser(SysUser sysUser) {
this.sysUser = sysUser;
}
public SysRole getSysRole() {
return sysRole;
}
public void setSysRole(SysRole sysRole) {
this.sysRole = sysRole;
}
@Override
public String toString() {
return "SysUserDeptRole{" +
"deptId=" + deptId +
", userId=" + userId +
", roleId=" + roleId +
", sysDept=" + sysDept +
", sysUser=" + sysUser +
", sysRole=" + sysRole +
'}';
}
} }

View File

@ -3,12 +3,15 @@ package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteUserService; import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.SysUserDeptRole;
import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.LoginUser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
/** /**
* 用户服务降级处理 * 用户服务降级处理
* *
@ -50,6 +53,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
public R<String> getSysUserTokenByGitLinkCookie(String cookie, String source) { public R<String> getSysUserTokenByGitLinkCookie(String cookie, String source) {
return R.fail("获取用户Token失败:" + throwable.getMessage()); return R.fail("获取用户Token失败:" + throwable.getMessage());
} }
@Override
public R<List<SysUserDeptRole>> getSysUserDeptRoleListByUserName(String userName, String source) {
return R.fail("查询用户下组织及组织对应角色列表失败:" + throwable.getMessage());
}
}; };
} }
} }

View File

@ -1,7 +1,5 @@
package com.ruoyi.auth.service; package com.ruoyi.auth.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.SecurityConstants;
@ -17,6 +15,8 @@ import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.RemoteUserService; import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/** /**
* 登录校验方法 * 登录校验方法
@ -97,6 +97,7 @@ public class SysLoginService
throw new ServiceException("对不起,您的账号:" + username + " 已停用"); throw new ServiceException("对不起,您的账号:" + username + " 已停用");
} }
passwordService.validate(user, password); passwordService.validate(user, password);
recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功"); recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
return userInfo; return userInfo;
} }

View File

@ -50,9 +50,9 @@ public class SortUtils {
} }
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
throw new ServiceException(String.format("没用指定字段[%s]", param)); throw new ServiceException(String.format("指定的排序字段不存在[%s]", param));
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
throw new ServiceException(String.format("访问字段非法,请检查字段[%s]权限", param)); throw new ServiceException(String.format("访问排序字段非法,请检查排序字段[%s]权限", param));
} }
return 1; return 1;
}; };

View File

@ -1,11 +1,13 @@
package com.ruoyi.system.controller; package com.ruoyi.system.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.TableDataInfo; import com.ruoyi.common.core.web.page.TableDataInfo;
import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.system.api.domain.SysUserDeptRole;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput;
import com.ruoyi.system.service.ISysUserDeptRoleService; import com.ruoyi.system.service.ISysUserDeptRoleService;
@ -14,6 +16,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List; import java.util.List;
@ -101,6 +104,18 @@ public class SysUserDeptRoleController extends BaseController {
return getDataTable(list); return getDataTable(list);
} }
/**
* 通过用户名查询用户下组织及组织对应角色列表
*/
// @RequiresPermissions("system:SysUserDeptRole:list")
@ApiIgnore
@InnerAuth
@GetMapping("/userByUserName/{userName}/list")
public R<List<SysUserDeptRole>> getSysUserDeptRoleListByUserName(@PathVariable("userName") String userName) {
List<SysUserDeptRole> list = sysUserDeptRoleService.selectSysUserDeptRoleListByUserName(userName);
return R.ok(list);
}
/** /**
* 用户下批量新增组织及在组织中的角色 * 用户下批量新增组织及在组织中的角色
*/ */

View File

@ -1,6 +1,6 @@
package com.ruoyi.system.domain.dto; package com.ruoyi.system.domain.dto;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.system.api.domain.SysUserDeptRole;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.ruoyi.system.domain.dto; package com.ruoyi.system.domain.dto;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.system.api.domain.SysUserDeptRole;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.ruoyi.system.mapper; package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.system.api.domain.SysUserDeptRole;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -83,4 +83,6 @@ public interface SysUserDeptRoleMapper {
List<SysUserDeptRole> selectSysUserDeptRoleListByUserId(@Param("userId") Long userId, @Param("deptName") String deptName, @Param("roleName") String roleName); List<SysUserDeptRole> selectSysUserDeptRoleListByUserId(@Param("userId") Long userId, @Param("deptName") String deptName, @Param("roleName") String roleName);
int deleteSysUserDeptRoleListByUserIdAndDeptIds(@Param("userId") Long userId, @Param("deptIds") Long[] deptIds); int deleteSysUserDeptRoleListByUserIdAndDeptIds(@Param("userId") Long userId, @Param("deptIds") Long[] deptIds);
List<SysUserDeptRole> selectSysUserDeptRoleListByUserName(String userName);
} }

View File

@ -1,6 +1,6 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.system.api.domain.SysUserDeptRole;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -82,4 +82,6 @@ public interface ISysUserDeptRoleService {
int updateSysUserDeptRoleByUser(Long userId, SysUserDeptRoleByUserInput[] sysUserDeptRoleByUserInputs); int updateSysUserDeptRoleByUser(Long userId, SysUserDeptRoleByUserInput[] sysUserDeptRoleByUserInputs);
int deleteSysUserDeptRoleListByUserIdAndDeptIds(Long userId, Long[] deptIds); int deleteSysUserDeptRoleListByUserIdAndDeptIds(Long userId, Long[] deptIds);
List<SysUserDeptRole> selectSysUserDeptRoleListByUserName(String userName);
} }

View File

@ -4,7 +4,7 @@ import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.domain.SysUserDeptRole; import com.ruoyi.system.api.domain.SysUserDeptRole;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByDeptInput;
import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput; import com.ruoyi.system.domain.dto.SysUserDeptRoleByUserInput;
import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysDeptMapper;
@ -214,6 +214,11 @@ public class SysUserDeptRoleServiceImpl implements ISysUserDeptRoleService {
return sysUserDeptRoleMapper.deleteSysUserDeptRoleListByUserIdAndDeptIds(userId, deptIds); return sysUserDeptRoleMapper.deleteSysUserDeptRoleListByUserIdAndDeptIds(userId, deptIds);
} }
@Override
public List<SysUserDeptRole> selectSysUserDeptRoleListByUserName(String userName) {
return sysUserDeptRoleMapper.selectSysUserDeptRoleListByUserName(userName);
}
private SysUser selectSysUserById(Long userId) { private SysUser selectSysUserById(Long userId) {
SysUser sysUser = sysUserMapper.selectUserById(userId); SysUser sysUser = sysUserMapper.selectUserById(userId);
if (sysUser == null) { if (sysUser == null) {

View File

@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserDeptRoleMapper"> <mapper namespace="com.ruoyi.system.mapper.SysUserDeptRoleMapper">
<resultMap type="com.ruoyi.system.domain.SysUserDeptRole" id="SysUserDeptRoleResult"> <resultMap type="com.ruoyi.system.api.domain.SysUserDeptRole" id="SysUserDeptRoleResult">
<result property="deptId" column="dept_id"/> <result property="deptId" column="dept_id"/>
<result property="userId" column="user_id"/> <result property="userId" column="user_id"/>
<result property="roleId" column="role_id"/> <result property="roleId" column="role_id"/>
@ -82,7 +82,7 @@
</sql> </sql>
<select id="selectSysUserDeptRoleList" parameterType="com.ruoyi.system.domain.SysUserDeptRole" <select id="selectSysUserDeptRoleList" parameterType="com.ruoyi.system.api.domain.SysUserDeptRole"
resultMap="SysUserDeptRoleResult"> resultMap="SysUserDeptRoleResult">
<include refid="selectSysUserDeptRoleVo"/> <include refid="selectSysUserDeptRoleVo"/>
<where> <where>
@ -124,8 +124,15 @@
</if> </if>
</where> </where>
</select> </select>
<select id="selectSysUserDeptRoleListByUserName" resultType="com.ruoyi.system.api.domain.SysUserDeptRole">
<include refid="selectSysUserDeptRoleDetailVo"/>
<where>
u.user_name = #{userName}
and u.del_flag = '0'
</where>
</select>
<insert id="insertSysUserDeptRole" parameterType="com.ruoyi.system.domain.SysUserDeptRole"> <insert id="insertSysUserDeptRole" parameterType="com.ruoyi.system.api.domain.SysUserDeptRole">
insert into sys_user_dept_role insert into sys_user_dept_role
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="deptId != null">dept_id,</if> <if test="deptId != null">dept_id,</if>
@ -139,7 +146,7 @@
</trim> </trim>
</insert> </insert>
<update id="updateSysUserDeptRole" parameterType="com.ruoyi.system.domain.SysUserDeptRole"> <update id="updateSysUserDeptRole" parameterType="com.ruoyi.system.api.domain.SysUserDeptRole">
update sys_user_dept_role update sys_user_dept_role
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
<if test="roleId != null">role_id = #{roleId},</if> <if test="roleId != null">role_id = #{roleId},</if>