增加管理员拥有的菜单列表

This commit is contained in:
YunaiV
2020-07-08 20:21:55 +08:00
parent e4d3254869
commit 6bddebafff
28 changed files with 288 additions and 442 deletions

View File

@@ -0,0 +1,31 @@
package cn.iocoder.mall.managementweb.controller.permission.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel(value = "管理员拥有的菜单树", description = "一般用于首页菜单")
@Data
@Accessors(chain = true)
public class AdminMenuTreeNodeVO {
@ApiModelProperty(value = "菜单编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
private String name;
@ApiModelProperty(value = "前端路由", required = true, example = "/order/list")
private String route;
@ApiModelProperty(value = "菜单图标", required = true, example = "user")
private String icon;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
private Integer pid;
/**
* 子节点数组
*/
private List<AdminMenuTreeNodeVO> children;
}

View File

@@ -1,5 +1,6 @@
package cn.iocoder.mall.managementweb.convert.permission;
import cn.iocoder.mall.managementweb.controller.permission.vo.AdminMenuTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
@@ -21,4 +22,6 @@ public interface ResourceConvert {
List<ResourceVO> convertList(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> list);
AdminMenuTreeNodeVO convertTreeNode(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO bean);
}

View File

@@ -1,24 +1,34 @@
package cn.iocoder.mall.managementweb.manager.permission;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceCreateDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceUpdateDTO;
import cn.iocoder.mall.managementweb.controller.permission.vo.AdminMenuTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
import cn.iocoder.mall.managementweb.convert.permission.ResourceConvert;
import cn.iocoder.mall.systemservice.enums.permission.ResourceIdEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import cn.iocoder.mall.systemservice.rpc.permission.ResourceRpc;
import cn.iocoder.mall.systemservice.rpc.permission.RoleRpc;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* 资源 Manager
*/
@Service
@Slf4j
public class ResourceManager {
@Reference(version = "${dubbo.consumer.ResourceRpc.version}", validation = "false")
private ResourceRpc resourceRpc;
@Reference(version = "${dubbo.consumer.RoleRpc.version}", validation = "false")
private RoleRpc roleRpc;
/**
* 创建资源
@@ -76,4 +86,54 @@ public class ResourceManager {
return ResourceConvert.INSTANCE.convertList(listResourceResult.getData());
}
/**
* 获得管理员的菜单树
*
* @param adminId 管理员编号
* @return 菜单树
*/
public List<AdminMenuTreeNodeVO> treeAdminMenu(Integer adminId) {
// 获得管理员拥有的角色编号列表
CommonResult<Set<Integer>> listAdminRoleIdsResult = roleRpc.listAdminRoleIds(adminId);
listAdminRoleIdsResult.checkError();
if (CollectionUtils.isEmpty(listAdminRoleIdsResult.getData())) {
return null;
}
// 获得角色拥有的资源列表
CommonResult<List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO>> resourceVOResult = resourceRpc.listRoleResource(
listAdminRoleIdsResult.getData(), ResourceTypeEnum.MENU.getType());
resourceVOResult.checkError();
// 构建菜单树
return this.buildAdminMenuTree(resourceVOResult.getData());
}
private List<AdminMenuTreeNodeVO> buildAdminMenuTree(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> resourceVOs) {
// 排序,保证菜单的有序性
resourceVOs.sort(Comparator.comparing(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO::getSort));
// 构建菜单树
// 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
Map<Integer, AdminMenuTreeNodeVO> treeNodeMap = new LinkedHashMap<>();
resourceVOs.forEach(resourceVO -> treeNodeMap.put(resourceVO.getId(), ResourceConvert.INSTANCE.convertTreeNode(resourceVO)));
// 处理父子关系
treeNodeMap.values().stream()
.filter(node -> !node.getPid().equals(ResourceIdEnum.ROOT.getId()))
.forEach((childNode) -> {
// 获得父节点
AdminMenuTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
if (parentNode == null) {
log.error("[getResourceTree][resource({}) 找不到父资源({})]", childNode.getId(), childNode.getPid());
return;
}
if (parentNode.getChildren() == null) { // 初始化 children 数组
parentNode.setChildren(new ArrayList<>());
}
// 将自己添加到父节点中
parentNode.getChildren().add(childNode);
});
// 获得到所有的根节点
return treeNodeMap.values().stream()
.filter(node -> node.getPid().equals(ResourceIdEnum.ROOT.getId()))
.collect(Collectors.toList());
}
}