refactor(role): 优化角色服务中的权限查询和数据操作逻辑

This commit is contained in:
2026-01-15 18:11:07 +08:00
parent ff723a6044
commit a93a44c3d4
12 changed files with 163 additions and 108 deletions
@@ -26,17 +26,13 @@ import cn.odboy.system.service.SystemDictDetailService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@@ -52,7 +52,7 @@ public class SystemRoleController {
@PostMapping(value = "/getRoleById")
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<SystemRoleVo> getRoleById(@RequestBody SystemRoleTb args) {
return ResponseEntity.ok(systemRoleService.getRoleById(args.getId()));
return ResponseEntity.ok(systemRoleService.getRoleVoById(args.getId()));
}
@ApiOperation("导出角色数据")
@@ -17,7 +17,9 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemRoleMenuTb;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 角色菜单关联 Mapper
@@ -27,4 +29,5 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemRoleMenuMapper extends BaseMapper<SystemRoleMenuTb> {
List<String> listMenuPermissionByRoleIds(@Param("roleIds") List<Long> roleIds);
}
@@ -27,5 +27,8 @@ import org.apache.ibatis.annotations.Param;
public interface SystemUserRoleMapper extends BaseMapper<SystemUserRoleTb> {
Set<SystemRoleTb> listUserRoleByUserId(@Param("userId") Long userId);
List<Integer> listUserRoleLevelByUserId(@Param("userId") Long userId);
List<Long> listUserRoleIdByUserId(@Param("userId") Long userId);
}
@@ -129,7 +129,7 @@ public class SystemDeptService {
/**
* 更新父节点中子节点数目 -> TestPassed
*
* @param deptId /
* @param deptId 部门id
*/
@Transactional(rollbackFor = Exception.class)
public void updateDeptSubCnt(Long deptId) {
@@ -179,7 +179,7 @@ public class SystemDeptService {
/**
* 查询所有数据
*
* @param args 条件
* @param args /
* @param isQuery /
* @return /
* @throws Exception /
@@ -16,6 +16,7 @@
package cn.odboy.system.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.odboy.system.dal.dataobject.SystemMenuTb;
import cn.odboy.system.dal.dataobject.SystemRoleMenuTb;
import cn.odboy.system.dal.model.response.SystemMenuVo;
@@ -40,6 +41,11 @@ public class SystemRoleMenuService {
@Autowired
private SystemMenuMapper systemMenuMapper;
/**
* 删除角色菜单关联 -> TestPassed
*
* @param roleId 角色id
*/
@Transactional(rollbackFor = Exception.class)
public void deleteRoleMenuByRoleId(Long roleId) {
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>();
@@ -47,6 +53,12 @@ public class SystemRoleMenuService {
systemRoleMenuMapper.delete(wrapper);
}
/**
* 批量绑定角色菜单关联 -> TestPassed
*
* @param menus 菜单集合
* @param roleId 角色id
*/
@Transactional(rollbackFor = Exception.class)
public void batchInsertRoleMenu(Set<SystemMenuVo> menus, Long roleId) {
if (CollUtil.isNotEmpty(menus)) {
@@ -61,6 +73,11 @@ public class SystemRoleMenuService {
}
}
/**
* 批量删除角色菜单关联 -> TestPassed
*
* @param roleIds 角色id集合
*/
@Transactional(rollbackFor = Exception.class)
public void batchDeleteRoleMenu(Set<Long> roleIds) {
if (CollUtil.isNotEmpty(roleIds)) {
@@ -92,6 +109,11 @@ public class SystemRoleMenuService {
return new LinkedHashSet<>(systemMenuVos);
}
/**
* 批量删除菜单角色关联 -> TestPassed
*
* @param menuIds 菜单id集合
*/
@Transactional(rollbackFor = Exception.class)
public void deleteRoleMenuByMenuIds(List<Long> menuIds) {
if (CollUtil.isEmpty(menuIds)) {
@@ -101,4 +123,9 @@ public class SystemRoleMenuService {
wrapper.in(SystemRoleMenuTb::getMenuId, menuIds);
systemRoleMenuMapper.delete(wrapper);
}
public List<String> listMenuPermissionByRoleIds(List<Long> roleIds) {
List<String> permissions = systemRoleMenuMapper.listMenuPermissionByRoleIds(roleIds);
return permissions.stream().filter(StrUtil::isNotBlank).collect(Collectors.toList());
}
}
@@ -32,9 +32,9 @@ import cn.odboy.system.dal.mysql.SystemRoleMapper;
import cn.odboy.system.framework.permission.core.KitSecurityHelper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.ArrayList;
import java.util.Collections;
@@ -67,7 +67,7 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel());
if (this.countRoleByName(args.getName()) > 0) {
if (this.existRoleWithName(args.getName())) {
throw new BadRequestException("角色名称已存在");
}
SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class);
@@ -78,16 +78,17 @@ public class SystemRoleService {
}
}
private SystemRoleTb getRoleByName(String name) {
private boolean existRoleWithName(String name) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectOne(wrapper);
return systemRoleMapper.exists(wrapper);
}
private long countRoleByName(String name) {
private boolean existRoleWithNameNeSelf(String name, Long roleId) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectCount(wrapper);
wrapper.eq(SystemRoleTb::getId, roleId);
return systemRoleMapper.exists(wrapper);
}
/**
@@ -98,9 +99,8 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class)
public void updateRoleById(SystemRoleVo args) {
checkRoleLevels(args.getLevel());
SystemRoleTb role = this.getRoleTbById(args.getId());
SystemRoleTb role1 = this.getRoleByName(args.getName());
if (role1 != null && !role1.getId().equals(role.getId())) {
SystemRoleTb role = systemRoleMapper.selectById(args.getId());
if (this.existRoleWithNameNeSelf(args.getName(), role.getId())) {
throw new BadRequestException("角色名称已存在");
}
role.setName(args.getName());
@@ -108,7 +108,7 @@ public class SystemRoleService {
role.setDataScope(args.getDataScope());
role.setLevel(args.getLevel());
// 更新
systemRoleMapper.insertOrUpdate(role);
systemRoleMapper.updateById(role);
// 删除关联部门数据
systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId()));
// 判断是否有部门数据, 若有, 则需更新关联
@@ -117,10 +117,6 @@ public class SystemRoleService {
}
}
private SystemRoleTb getRoleTbById(Long id) {
return systemRoleMapper.selectById(id);
}
/**
* 修改绑定的菜单 -> TestPassed
*
@@ -132,7 +128,6 @@ public class SystemRoleService {
checkRoleLevels(role.getLevel());
// 更新菜单
systemRoleMenuService.deleteRoleMenuByRoleId(role.getId());
// 判断是否为空
Set<SystemMenuVo> menus = args.getMenus();
if (CollUtil.isNotEmpty(menus)) {
systemRoleMenuService.batchInsertRoleMenu(menus, role.getId());
@@ -146,8 +141,7 @@ public class SystemRoleService {
*/
@Transactional(rollbackFor = Exception.class)
public void deleteRoleByIds(Set<Long> ids) {
List<Integer> roleLevels = systemRoleMapper.selectByIds(ids).stream().map(SystemRoleTb::getLevel).distinct()
.collect(Collectors.toList());
List<Integer> roleLevels = systemRoleMapper.listRoleLevelByRoleIds(new ArrayList<>(ids));
for (Integer roleLevel : roleLevels) {
checkRoleLevels(roleLevel);
}
@@ -165,7 +159,7 @@ public class SystemRoleService {
*/
public List<SystemRoleTb> listAllRole() {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByAsc(SystemRoleTb::getLevel);
wrapper.orderByDesc(SystemRoleTb::getCreateTime);
return systemRoleMapper.selectList(wrapper);
}
@@ -176,24 +170,21 @@ public class SystemRoleService {
* @param rolePage 分页参数
* @return /
*/
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
KitValidUtil.notNull(args);
// 查询角色基本信息
public List<SystemRoleTb> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemRoleTb::getName, args.getBlurry()).or()
.like(SystemRoleTb::getDescription, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
this.injectQueryParams(args, wrapper);
return systemRoleMapper.selectList(wrapper);
}
private void injectQueryParams(SystemQueryRoleArgs args, LambdaQueryWrapper<SystemRoleTb> wrapper) {
if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemRoleTb::getName, args.getBlurry()).or()
.like(SystemRoleTb::getDescription, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
}
wrapper.orderByAsc(SystemRoleTb::getLevel);
List<SystemRoleTb> roles;
if (rolePage == null) {
roles = systemRoleMapper.selectList(wrapper);
} else {
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
roles = page.getRecords();
}
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
}
/**
@@ -204,13 +195,14 @@ public class SystemRoleService {
* @return /
*/
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> page) {
List<SystemRoleVo> roles = this.queryRoleByArgs(args, page);
Long total = this.countRoleByArgs(args);
return KitPageUtil.toPage(roles, total);
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
this.injectQueryParams(args, wrapper);
IPage<SystemRoleVo> data = systemRoleMapper.selectPage(page, wrapper).convert(systemUserRoleService::convertToRoleVo);
return KitPageUtil.toPage(data);
}
/**
* 查询用户权限信息 -> TestPassed
* 查询用户权限信息 -> TestPassed?
*
* @param user 用户信息
* @return 权限信息
@@ -222,9 +214,17 @@ public class SystemRoleService {
permissions.add("admin");
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
}
List<SystemRoleVo> roles = systemUserRoleService.listRoleVoByUsersId(user.getId());
permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission)
.filter(StrUtil::isNotBlank).collect(Collectors.toSet());
// List<SystemRoleVo> roles = systemUserRoleService.listRoleVoByUsersId(user.getId());
// permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission)
// .filter(StrUtil::isNotBlank).collect(Collectors.toSet());
// return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
List<Long> roleIds = systemUserRoleService.listUserRoleIdByUserId(user.getId());
// 查询角色权限
if (CollUtil.isNotEmpty(roleIds)) {
return systemRoleMenuService.listMenuPermissionByRoleIds(roleIds).stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
}
// 没有包含任何角色,赋予默认权限
permissions.add("IsAJoker");
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
}
@@ -234,23 +234,12 @@ public class SystemRoleService {
* @param ids /
*/
public void verifyBindRelationByIds(Set<Long> ids) {
if (systemUserRoleService.countUserByRoleIds(ids) > 0) {
if (systemUserRoleService.existUserWithRoleIds(ids)) {
throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!");
}
}
public Long countRoleByArgs(SystemQueryRoleArgs args) {
KitValidUtil.notNull(args);
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemRoleTb::getName, args.getBlurry()).or()
.like(SystemRoleTb::getDescription, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
return systemRoleMapper.selectCount(wrapper);
}
public SystemRoleVo getRoleById(Long id) {
public SystemRoleVo getRoleVoById(Long id) {
SystemRoleTb roleTb = systemRoleMapper.selectById(id);
if (roleTb == null) {
return null;
@@ -268,8 +257,7 @@ public class SystemRoleService {
* @return /
*/
private int checkRoleLevels(Integer level) {
List<Integer> levels = systemUserRoleService.listRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
.map(SystemRoleVo::getLevel).collect(Collectors.toList());
List<Integer> levels = systemUserRoleService.listUserRoleLevelByUserId(KitSecurityHelper.getCurrentUserId());
int min = Collections.min(levels);
if (level != null) {
if (level < min) {
@@ -280,9 +268,9 @@ public class SystemRoleService {
}
public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) {
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleTb> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleExportRowVo> rowVos = new ArrayList<>();
for (SystemRoleVo dataObject : systemRoleVos) {
for (SystemRoleTb dataObject : systemRoleVos) {
SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo();
rowVo.setName(dataObject.getName());
rowVo.setLevel(dataObject.getLevel());
@@ -148,15 +148,6 @@ public class SystemUserRoleService {
}
}
public long countUserByRoleIds(Set<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return 0L;
}
LambdaQueryWrapper<SystemUserRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemUserRoleTb::getRoleId, ids);
return systemUserRoleMapper.selectCount(wrapper);
}
/**
* 根据用户id查询角色 -> TestPassed
*
@@ -168,7 +159,7 @@ public class SystemUserRoleService {
}
/**
* 根据用户id查询角色级别 -> TestPassed
* 根据用户id查询角色级别集合 -> TestPassed
*
* @param userId /
* @return /
@@ -176,4 +167,29 @@ public class SystemUserRoleService {
public List<Integer> listUserRoleLevelByUserId(Long userId) {
return systemUserRoleMapper.listUserRoleLevelByUserId(userId);
}
/**
* 根据用户id查询角色id集合 -> TestPassed
*
* @param userId /
* @return /
*/
public List<Long> listUserRoleIdByUserId(Long userId) {
return systemUserRoleMapper.listUserRoleIdByUserId(userId);
}
/**
* 根据角色id集合判断是否存在关联用户 -> TestPassed
*
* @param ids 角色id集合
* @return /
*/
public boolean existUserWithRoleIds(Set<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return false;
}
LambdaQueryWrapper<SystemUserRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemUserRoleTb::getRoleId, ids);
return systemUserRoleMapper.exists(wrapper);
}
}
@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.odboy.system.dal.mysql.SystemDictDetailMapper">
<select id="selectPageByArgs" resultType="cn.odboy.system.dal.model.response.SystemDictDetailVo">
SELECT
t1.*
FROM system_dict_detail t1 LEFT JOIN system_dict t2 ON t1.dict_id = t2.id
<where>
<if test="args.dictName != null and args.dictName != ''">
AND t2.name = #{args.dictName}
</if>
<if test="args.label != null and args.label != ''">
AND t1.label = #{args.label}
</if>
</where>
ORDER BY t1.dict_sort
</select>
<select id="listDictDetailByName" resultType="cn.odboy.system.dal.model.response.SystemDictDetailVo">
SELECT t1.*
FROM system_dict_detail t1
LEFT JOIN system_dict t2 ON t1.dict_id = t2.id
<where>
<if test="name != null and name != ''">
AND t2.name = #{name}
</if>
</where>
ORDER BY t1.dict_sort
</select>
<select id="selectPageByArgs" resultType="cn.odboy.system.dal.model.response.SystemDictDetailVo">
SELECT
t1.*
FROM system_dict_detail t1 LEFT JOIN system_dict t2 ON t1.dict_id = t2.id
<where>
<if test="args.dictName != null and args.dictName != ''">
AND t2.name = #{args.dictName}
</if>
<if test="args.label != null and args.label != ''">
AND t1.label = #{args.label}
</if>
</where>
ORDER BY t1.dict_sort
</select>
<select id="listDictDetailByName" resultType="cn.odboy.system.dal.model.response.SystemDictDetailVo">
SELECT t1.*
FROM system_dict_detail t1
LEFT JOIN system_dict t2 ON t1.dict_id = t2.id
<where>
<if test="name != null and name != ''">
AND t2.name = #{name}
</if>
</where>
ORDER BY t1.dict_sort
</select>
</mapper>
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.odboy.system.dal.mysql.SystemRoleMapper">
<select id="listRoleLevelByRoleIds" resultType="java.lang.Integer">
SELECT DISTINCT t1.`level`
FROM system_role t1
WHERE t1.`level` IS NOT NULL
AND t1.role_id IN
<foreach collection="roleIds" separator="," open="(" close=")" item="roleId">
#{roleId}
</foreach>
</select>
<select id="listRoleLevelByRoleIds" resultType="java.lang.Integer">
SELECT DISTINCT t1.`level`
FROM system_role t1
WHERE t1.`level` IS NOT NULL
AND t1.role_id IN
<foreach collection="roleIds" separator="," open="(" close=")" item="roleId">
#{roleId}
</foreach>
</select>
</mapper>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.odboy.system.dal.mysql.SystemRoleMenuMapper">
<select id="listMenuPermissionByRoleIds" resultType="java.lang.String">
SELECT DISTINCT
t2.permission
FROM
system_roles_menus t1
LEFT JOIN system_menu t2 ON t1.menu_id = t2.menu_id
WHERE
t1.role_id IN
<foreach collection="roleIds" item="roleId" open="(" close=")" separator=",">
#{roleId}
</foreach>
</select>
</mapper>
@@ -13,4 +13,10 @@
LEFT JOIN system_users_roles t2 ON t1.role_id = t2.role_id
WHERE t2.user_id = #{userId}
</select>
<select id="listUserRoleIdByUserId" resultType="java.lang.Long">
SELECT DISTINCT t1.`role_id`
FROM system_role t1
LEFT JOIN system_users_roles t2 ON t1.role_id = t2.role_id
WHERE t2.user_id = #{userId}
</select>
</mapper>