From 57c7b3aaebe17389b926be2f70175111e996780e Mon Sep 17 00:00:00 2001 From: dataprince Date: Tue, 21 Nov 2023 21:17:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysUserController.java | 2 +- .../ruoyi/system/mapper/SysRoleMapper.java | 40 ++++- .../ruoyi/system/mapper/SysUserMapper.java | 22 --- .../system/service/ISysDataScopeService.java | 17 +++ .../ruoyi/system/service/ISysUserService.java | 9 ++ .../service/impl/SysDataScopeServiceImpl.java | 137 ++++++++++++++++++ .../service/impl/SysUserServiceImpl.java | 43 ++++-- .../resources/mapper/system/SysUserMapper.xml | 66 --------- .../mapper/system/SysUserPostMapper.xml | 5 - .../mapper/system/SysUserRoleMapper.xml | 5 - 10 files changed, 234 insertions(+), 112 deletions(-) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/system/SysUserController.java index 6904e52..647c492 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/system/SysUserController.java @@ -275,7 +275,7 @@ public class SysUserController extends BaseController { List roles = roleService.selectRolesByUserId(userId); SysUserInfoVo userInfoVo = new SysUserInfoVo(); userInfoVo.setUser(user); - userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));//超级管理员角色只能id=1的admin用户才能拥有 return R.ok(userInfoVo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java index e2aed6c..b98578b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -1,16 +1,54 @@ package com.ruoyi.system.mapper; import com.mybatisflex.core.BaseMapper; +import com.mybatisflex.core.query.QueryMethods; +import com.mybatisflex.core.query.QueryWrapper; import com.ruoyi.system.domain.SysRole; +import com.ruoyi.system.domain.vo.SysRoleVo; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + +import static com.ruoyi.system.domain.table.SysDeptTableDef.SYS_DEPT; +import static com.ruoyi.system.domain.table.SysRoleTableDef.SYS_ROLE; +import static com.ruoyi.system.domain.table.SysUserRoleTableDef.SYS_USER_ROLE; +import static com.ruoyi.system.domain.table.SysUserTableDef.SYS_USER; + /** * 角色表 数据层 * - * @author ruoyi + * @author 数据小王子 */ @Mapper public interface SysRoleMapper extends BaseMapper { + /** + * 根据用户ID查询其拥有的角色列表 + * + * 为了避免在数据权限SysDataScopeServiceImpl引用产生循环引用问题,将该方法的实现由service转到mapper中(2023.11.21) + * + * @param userId 用户ID + * @return 拥有的角色列表 + */ + default List selectUserRolesByUserId(Long userId) { + /*select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + where r.del_flag = '0' and ur.user_id = #{userId}*/ + QueryWrapper queryWrapper = QueryWrapper.create() + .select(QueryMethods.distinct(SYS_ROLE.ALL_COLUMNS)) + .from(SYS_ROLE.as("r")) + .leftJoin(SYS_USER_ROLE).as("ur").on(SYS_USER_ROLE.ROLE_ID.eq(SYS_ROLE.ROLE_ID)) + .leftJoin(SYS_USER).as("u").on(SYS_USER.USER_ID.eq(SYS_USER_ROLE.USER_ID)) + .leftJoin(SYS_DEPT).as("d").on(SYS_DEPT.DEPT_ID.eq(SYS_USER.DEPT_ID)); + queryWrapper.where(SYS_ROLE.DEL_FLAG.eq("0")) + .and(SYS_USER_ROLE.USER_ID.eq(userId)); + + List userRoles = selectListByQueryAs(queryWrapper, SysRoleVo.class); + + return userRoles; + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 37a3c0c..04d7bd8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -16,27 +16,5 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface SysUserMapper extends BaseMapper { -// /** -// * 根据条件分页查询用户列表 -// * -// * @param sysUser 用户信息 -// * @return 用户信息集合信息 -// */ -// List selectUserList(SysUser sysUser); -// /** -// * 根据条件分页查询已配用户角色列表 -// * -// * @param user 用户信息 -// * @return 用户信息集合信息 -// */ -// List selectAllocatedList(SysUser user); -// -// /** -// * 根据条件分页查询未分配用户角色列表 -// * -// * @param user 用户信息 -// * @return 用户信息集合信息 -// */ -// List selectUnallocatedList(SysUser user); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java new file mode 100644 index 0000000..70df067 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java @@ -0,0 +1,17 @@ +package com.ruoyi.system.service; + +import com.mybatisflex.core.query.QueryWrapper; + +/** + * 通用"数据权限过滤“服务 + * + * @author dataprince数据小王子 + */ +public interface ISysDataScopeService { + /** + * 添加数据查询过滤条件 + * @param queryWrapper + * @return 添加了过滤条件后的queryWrapper + */ + QueryWrapper addCondition(QueryWrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index d929ca1..145e612 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -73,6 +73,15 @@ public interface ISysUserService extends IBaseService */ SysUserVo selectUserById(Long userId); + /** + * 个人中心模块通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUserVo selectProfileUserById(Long userId); + + /** * 根据用户ID查询用户所属角色组 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 0000000..4b57516 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,137 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.mybatisflex.core.query.QueryCondition; +import com.mybatisflex.core.query.QueryMethods; +import com.mybatisflex.core.query.QueryWrapper; +import com.ruoyi.common.core.core.domain.model.LoginUser; +import com.ruoyi.common.security.utils.LoginHelper; +import com.ruoyi.system.domain.SysUser; +import com.ruoyi.system.domain.vo.SysRoleVo; +import com.ruoyi.system.mapper.SysRoleMapper; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysDataScopeService; +import com.ruoyi.system.service.ISysRoleService; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +import static com.mybatisflex.core.query.QueryMethods.bracket; +import static com.mybatisflex.core.query.QueryMethods.select; +import static com.ruoyi.system.domain.table.SysDeptTableDef.SYS_DEPT; +import static com.ruoyi.system.domain.table.SysRoleDeptTableDef.SYS_ROLE_DEPT; +import static com.ruoyi.system.domain.table.SysUserTableDef.SYS_USER; + +/** + * 通用"数据权限过滤“服务 + * + * @author dataprince数据小王子 + */ +@RequiredArgsConstructor +@Service +public class SysDataScopeServiceImpl implements ISysDataScopeService { + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + @Resource + private SysUserMapper userMapper; + + @Resource + private SysRoleMapper roleMapper; + + /** + * 添加数据查询过滤条件 + * + * @param queryWrapper + * @return 添加了过滤条件后的queryWrapper + */ + @Override + public QueryWrapper addCondition(QueryWrapper queryWrapper) { + QueryCondition queryCondition = QueryCondition.createEmpty(); + // 获取当前的用户 + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + Long userId = loginUser.getUserId(); + if (userId > 0) { + //SysUserVo currentUser = userService.selectUserById(userId); + SysUser currentUser = userMapper.selectOneById(userId); + List roleList = roleMapper.selectUserRolesByUserId(userId); + // 如果是超级管理员,则不过滤数据 + if (ObjectUtil.isNotNull(currentUser) && !LoginHelper.isSuperAdmin(userId)) { + List dataScopeList = new ArrayList<>(); + //除了“2:自定义数据权限”,其它值去重存入dataScopeList列表 + for (SysRoleVo role : roleList) { + String dataScope = role.getDataScope();//数据范围(1:全部数据权限,2:自定义数据权限,3:本部门数据权限,4:本部门及以下数据权限,5:仅本人数据权限) + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && dataScopeList.contains(dataScope)) { + continue; + } + dataScopeList.add(dataScope); + } + + //如果数据范围是“1:全部数据权限”,则不再添加过滤条件,直接返回queryWrapper原值 + if (dataScopeList.contains(DATA_SCOPE_ALL)) { + return queryWrapper; + } + + //单独处理数据范围是“2:自定义数据权限” + for (SysRoleVo role : roleList) { + String dataScope = role.getDataScope();//数据范围 + if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + //OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) + queryCondition.or(SYS_DEPT.DEPT_ID.in(select(SYS_ROLE_DEPT.DEPT_ID).from(SYS_ROLE_DEPT).where(SYS_ROLE_DEPT.ROLE_ID.eq(role.getRoleId())))); + } + } + + //单独处理数据范围是" 3:本部门数据权限" + if (dataScopeList.contains(DATA_SCOPE_DEPT)) { + //OR {}.dept_id = {} + queryCondition.or(SYS_DEPT.DEPT_ID.eq(currentUser.getDeptId())); + } + + //单独处理数据范围是" 4:本部门及以下数据权限" + if (dataScopeList.contains(DATA_SCOPE_DEPT_AND_CHILD)) { + //OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) + queryCondition.or(SYS_DEPT.DEPT_ID.in(select(SYS_DEPT.DEPT_ID).from(SYS_DEPT).where(SYS_DEPT.DEPT_ID.eq(currentUser.getDeptId())).or(QueryMethods.findInSet(QueryMethods.number(currentUser.getDeptId()),SYS_DEPT.ANCESTORS).gt(0)))); + } + + //单独处理数据范围是" 5:仅本人数据权限" + if (dataScopeList.contains(DATA_SCOPE_SELF)) { + //OR {}.user_id = {} + queryCondition.or(SYS_USER.USER_ID.eq(currentUser.getUserId())); + } + } + } + + } + + queryWrapper.and(bracket(queryCondition));//所有新增的插叙条件外边用圆括号包括起来 + //System.out.println("*******************:SysDataScopeServiceImpl.filter:queryWrapper.tosql="+queryWrapper.toSQL()); + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index a05e2da..7a72e3a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -76,6 +76,9 @@ public class SysUserServiceImpl extends BaseServiceImpl @Resource protected Validator validator; + @Resource + private ISysDataScopeService dataScopeService; + @Override public QueryWrapper query() { return super.query().from(SYS_USER); @@ -110,8 +113,6 @@ public class SysUserServiceImpl extends BaseServiceImpl if (ObjectUtil.isNotNull(userBo.getDeptId())) { queryWrapper.and(SYS_USER.DEPT_ID.eq(userBo.getDeptId()).or(SYS_USER.DEPT_ID.in(select(SYS_DEPT.DEPT_ID).from(SYS_DEPT.as("t")).where(findInSet(number(userBo.getDeptId()),SYS_DEPT.ANCESTORS).gt(0))))); } - // addDataScope() - //TODO:数据范围过滤 return queryWrapper; } @@ -137,7 +138,8 @@ public class SysUserServiceImpl extends BaseServiceImpl SYS_DEPT.DEPT_ID,SYS_DEPT.PARENT_ID,SYS_DEPT.ANCESTORS,SYS_DEPT.DEPT_NAME,SYS_DEPT.ORDER_NUM,SYS_DEPT.LEADER,SYS_DEPT.STATUS.as("dept_status") )) .from(SYS_USER.as("u")) - .leftJoin(SYS_DEPT).as("d").on(SYS_DEPT.DEPT_ID.eq(SYS_USER.DEPT_ID)); + .leftJoin(SYS_DEPT).as("d").on(SYS_DEPT.DEPT_ID.eq(SYS_USER.DEPT_ID)) + .where(SYS_USER.DEL_FLAG.eq("0")); //.leftJoin(SYS_USER_ROLE).as("ur").on(SYS_USER_ROLE.USER_ID.eq(SYS_USER.USER_ID)) //.leftJoin(SYS_ROLE).as("r").on(SYS_ROLE.ROLE_ID.eq(SYS_USER_ROLE.ROLE_ID)); } @@ -150,10 +152,8 @@ public class SysUserServiceImpl extends BaseServiceImpl * @return 用户信息集合信息 */ @Override - //@DataScope(deptAlias = "d", userAlias = "u") public List selectUserList(SysUserBo userBo) { - QueryWrapper queryWrapper = buildListQueryWrapper(userBo); - //TODO:数据范围过滤 + QueryWrapper queryWrapper = dataScopeService.addCondition(buildListQueryWrapper(userBo)); return this.listAs(queryWrapper, SysUserVo.class); } @@ -165,8 +165,7 @@ public class SysUserServiceImpl extends BaseServiceImpl */ @Override public TableDataInfo selectPage(SysUserBo userBo) { - QueryWrapper queryWrapper = buildListQueryWrapper(userBo); - //TODO:数据范围过滤 + QueryWrapper queryWrapper = dataScopeService.addCondition(buildListQueryWrapper(userBo)); Page page = this.pageAs(PageQuery.build(), queryWrapper, SysUserVo.class); return TableDataInfo.build(page); } @@ -178,7 +177,6 @@ public class SysUserServiceImpl extends BaseServiceImpl * @return 用户信息集合信息 */ @Override - //@DataScope(deptAlias = "d", userAlias = "u") public TableDataInfo selectAllocatedPage(SysUserBo userBo) { /* select distinct u.user_id, u.tenant_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.phonenumber, u.status, u.create_time from sys_user u @@ -221,7 +219,6 @@ public class SysUserServiceImpl extends BaseServiceImpl * @return 用户信息集合信息 */ @Override - //@DataScope(deptAlias = "d", userAlias = "u") public TableDataInfo selectUnallocatedPage(SysUserBo userBo) { /*select distinct u.user_id, u.tenant_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.phonenumber, u.status, u.create_time from sys_user u @@ -245,6 +242,7 @@ public class SysUserServiceImpl extends BaseServiceImpl .leftJoin(SYS_USER_ROLE).as("ur").on(SYS_USER_ROLE.USER_ID.eq(SYS_USER.USER_ID)) .leftJoin(SYS_ROLE).as("r").on(SYS_ROLE.ROLE_ID.eq(SYS_USER_ROLE.ROLE_ID)) .where(SYS_USER.DEL_FLAG.eq("0")) + .and(SYS_USER.STATUS.eq("0")) .and(SYS_ROLE.ROLE_ID.ne(userBo.getRoleId()).or(SYS_ROLE.ROLE_ID.isNull())) .and(SYS_USER.USER_ID.notIn(select(SYS_USER.USER_ID).from(SYS_USER.as("u")).innerJoin(SYS_USER_ROLE).as("ur").on(SYS_USER_ROLE.USER_ID.eq(SYS_USER.USER_ID).and(SYS_USER_ROLE.ROLE_ID.eq(userBo.getRoleId()))))); if (StringUtils.isNotEmpty(userBo.getUserName())) { @@ -253,9 +251,8 @@ public class SysUserServiceImpl extends BaseServiceImpl if (StringUtils.isNotEmpty(userBo.getPhonenumber())) { queryWrapper.and(SYS_USER.PHONENUMBER.like(userBo.getPhonenumber())); } - //TODO:数据范围过滤 - Page page = this.pageAs(PageQuery.build(), queryWrapper, SysUserVo.class); + Page page = this.pageAs(PageQuery.build(), dataScopeService.addCondition(queryWrapper), SysUserVo.class); return TableDataInfo.build(page); } @@ -307,6 +304,28 @@ public class SysUserServiceImpl extends BaseServiceImpl return this.getOneAs(queryWrapper,SysUserVo.class); } + /** + * 个人中心模块通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUserVo selectProfileUserById(Long userId) { + //使用leftjoin取得部门名称 + QueryWrapper queryWrapper = QueryWrapper.create() + .select(QueryMethods.distinct(SYS_USER.USER_ID,SYS_USER.TENANT_ID,SYS_USER.DEPT_ID,SYS_USER.NICK_NAME,SYS_USER.USER_NAME,SYS_USER.USER_TYPE,SYS_USER.EMAIL,SYS_USER.AVATAR,SYS_USER.PHONENUMBER,SYS_USER.PASSWORD,SYS_USER.GENDER,SYS_USER.STATUS,SYS_USER.DEL_FLAG,SYS_USER.LOGIN_IP,SYS_USER.LOGIN_DATE,SYS_USER.CREATE_BY,SYS_USER.CREATE_TIME,SYS_USER.REMARK, + SYS_DEPT.DEPT_ID,SYS_DEPT.PARENT_ID,SYS_DEPT.ANCESTORS,SYS_DEPT.DEPT_NAME,SYS_DEPT.ORDER_NUM,SYS_DEPT.LEADER,SYS_DEPT.STATUS.as("dept_status") + )) + .from(SYS_USER.as("u")) + .leftJoin(SYS_DEPT).as("d").on(SYS_DEPT.DEPT_ID.eq(SYS_USER.DEPT_ID)) + .where(SYS_USER.DEL_FLAG.eq("0")); + if (ObjectUtil.isNotNull(userId)) { + queryWrapper.and(SYS_USER.USER_ID.eq(userId)); + } + return this.getOneAs(queryWrapper,SysUserVo.class); + } + /** * 查询用户所属角色组 * diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 6e2d3a3..fb8cae2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -58,70 +58,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join sys_role r on r.role_id = ur.role_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml index 3efec54..ed191c1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -4,9 +4,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml index f7664ae..86ee3bb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -4,9 +4,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - -