优化后的代码如下:

public List<Tree<String>> getUserAssociatedMenuList(String userId) {
    Set<String> userAssociatedRoleIdSet = userRoleRelationService.listRolesByUserId(userId);
    if (userAssociatedRoleIdSet.isEmpty()) {
        userAssociatedRoleIdSet.add("664025b2852045ceadf67cd759ae70ad");
    }
    
    boolean isAdministrator = userAssociatedRoleIdSet.contains("b7cf04c998c44ff1811db2224d898596");
    Set<String> userAssociatedMenuIdSet = getAssociatedMenuIds(userAssociatedRoleIdSet, isAdministrator);
    
    if (userAssociatedMenuIdSet.isEmpty()) {
        return new ArrayList<>();
    }
    
    List<Menu> menuList = getMenuList(isAdministrator, userAssociatedMenuIdSet);
    return buildMenuTree(menuList);
}

private Set<String> getAssociatedMenuIds(Set<String> userAssociatedRoleIdSet, boolean isAdministrator) {
    if (isAdministrator) {
        return new HashSet<>();
    }
    
    return roleMenuRelationService.listMenuIdsByRoleIds(userAssociatedRoleIdSet);
}

private List<Menu> getMenuList(boolean isAdministrator, Set<String> userAssociatedMenuIdSet) {
    LambdaQueryWrapper<Menu> wrapper = Wrappers.<Menu>lambdaQuery();
    if (!isAdministrator) {
        wrapper.in(Menu::getId, userAssociatedMenuIdSet);
    }
    wrapper.orderByAsc(Menu::getSort);
    
    return this.list(wrapper);
}

private List<Tree<String>> buildMenuTree(List<Menu> menuList) {
    return TreeUtil.build(menuList, "0", (menu, treeNode) -> {
        treeNode.setId(menu.getId());
        treeNode.setParentId(menu.getParentId());
        treeNode.setName(menu.getName());
        if (menu.getType().equals("菜单")) {
            treeNode.putExtra("isExternalUrl", menu.getIsExternalUrl());
            treeNode.putExtra("url", menu.getUrl());
            treeNode.putExtra("remark", menu.getRemark());
            treeNode.putExtra("tag", menu.getTag());
        }
    });
}

优化点:

  1. 抽离了获取用户关联角色和获取关联菜单ID的方法,提高了代码的可读性和可维护性;
  2. 将获取菜单列表和构建菜单树的逻辑分开,使代码结构更清晰,易于理解和修改;
  3. 使用Lambda表达式和方法引用简化代码;
  4. 对于管理员角色,直接返回空集合,避免了不必要的查询和处理;
  5. 对于空集合的判断和返回,使用了更简洁的写法,提高了代码的可读性。
springboot项目依赖mapstructmybatis-plushutool数据库为oraclepublic ListTreeString getUserAssociatedMenuListString userId SetString userAssociatedRoleIdSet = userRoleRelationServicelist WrappersU

原文地址: http://www.cveoy.top/t/topic/b0E0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录