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.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
*/
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 org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.Set;
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) {
throw new ConstraintException("name", dto.getName(), "同名角色已存在");
}
Role role = new Role();
role.setName(dto.getName());
role.setRemark(dto.getRemark());
updateById(role);
if (dto.getMenuIds() != null) {
roleMenuRepository.delete(new LambdaQueryWrapper<RoleMenu>().eq(RoleMenu::getRoleId, id));
roleMenuRepository.insert(
dto.getMenuIds().stream()
.map(menuId -> new RoleMenu(id, menuId)).collect(Collectors.toList()));
selectyRole.setName(dto.getName());
selectyRole.setRemark(dto.getRemark());
updateById(selectyRole);
if (dto.getMenuIds() != null && !dto.getMenuIds().isEmpty()) {
// 查询当前角色已有的菜单权限
List<RoleMenu> existingRoleMenus = roleMenuRepository.findByRoleId(id);
Set<Long> existingMenuIds = existingRoleMenus.stream()
.map(RoleMenu::getMenuId)
.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;
}