refactor(system): 优化角色权限更新逻辑

- 在 RoleMenuRepository 中添加 findByRoleId 方法,用于查询指定角色的菜单权限
-优化 RoleServiceImpl 中的 updateRole 方法:
  - 使用 selectyRole替代新建 Role 实例 - 增加对空菜单 ID 的检查
  - 通过对比现有权限,仅插入不存在的菜单权限
- 这些修改减少了不必要的数据库操作,提高了系统性能
This commit is contained in:
zhuangtianxiang 2025-05-09 22:04:49 +08:00
parent eddc46e40d
commit 36e21c6cfe
2 changed files with 29 additions and 10 deletions

View File

@ -2,9 +2,16 @@ package com.zsc.edu.dify.modules.system.repo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsc.edu.dify.modules.system.entity.RoleMenu; import com.zsc.edu.dify.modules.system.entity.RoleMenu;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/** /**
* @author Yao * @author Yao
*/ */
public interface RoleMenuRepository extends BaseMapper<RoleMenu> { public interface RoleMenuRepository extends BaseMapper<RoleMenu> {
@Select("select * from sys_role_menu where role_id = #{id}")
List<RoleMenu> findByRoleId(@Param("id") Long id);
} }

View File

@ -14,7 +14,9 @@ import com.zsc.edu.dify.modules.system.vo.RoleVo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -80,17 +82,27 @@ public class RoleServiceImpl extends ServiceImpl<RoleRepository, Role> implement
count(new LambdaQueryWrapper<Role>().eq(Role::getName, dto.getName())) > 0) { count(new LambdaQueryWrapper<Role>().eq(Role::getName, dto.getName())) > 0) {
throw new ConstraintException("name", dto.getName(), "同名角色已存在"); throw new ConstraintException("name", dto.getName(), "同名角色已存在");
} }
Role role = new Role(); selectyRole.setName(dto.getName());
role.setName(dto.getName()); selectyRole.setRemark(dto.getRemark());
role.setRemark(dto.getRemark()); updateById(selectyRole);
updateById(role); if (dto.getMenuIds() != null && !dto.getMenuIds().isEmpty()) {
if (dto.getMenuIds() != null) { // 查询当前角色已有的菜单权限
roleMenuRepository.delete(new LambdaQueryWrapper<RoleMenu>().eq(RoleMenu::getRoleId, id)); List<RoleMenu> existingRoleMenus = roleMenuRepository.findByRoleId(id);
roleMenuRepository.insert( Set<Long> existingMenuIds = existingRoleMenus.stream()
dto.getMenuIds().stream() .map(RoleMenu::getMenuId)
.map(menuId -> new RoleMenu(id, menuId)).collect(Collectors.toList())); .collect(Collectors.toSet());
// 筛选出不存在的菜单ID组合进行插入
List<RoleMenu> roleMenusToInsert = dto.getMenuIds().stream()
.filter(menuId -> !existingMenuIds.contains(menuId))
.map(menuId -> new RoleMenu(id, menuId))
.collect(Collectors.toList());
if (!roleMenusToInsert.isEmpty()) {
roleMenuRepository.insert(roleMenusToInsert);
} }
return role; }
return selectyRole;
} }