Java实现查询菜单返回树结构

1.在DAO中的实现代码:

public List<TreeResult> parseMenuTree(List<TreeResult> list){
    List<TreeResult> result = new ArrayList<>();

    //1.获取第一个节点
    for (TreeResult menu:list) {
        if(null == menu.getParentId()){
            result.add(menu);
        }
    }

    //2.获取递归子节点
    for (TreeResult parent:result) {
        parent = menuChild(parent,list);
    }
    return result;
}

public TreeResult menuChild(TreeResult parent,List<TreeResult> list){
    for (TreeResult menu:list) {
        if(Objects.equals(parent.getId(),menu.getParentId())){
            parent.getChildren().add(menu);
            menu = menuChild(menu,list);
        }
    }
    return parent;
}

2.在Controller中的实现代码:

@ApiOperation(value = "动态菜单", httpMethod = "POST", produces = "application/json;charset=UTF-8")
@ApiImplicitParam(value = "token", name = "token", dataType = "String", paramType = "header")
@PostMapping("/api/menu/tree")
public Result menuTree(HttpServletRequest request) {
    Map<String, Object> map = new HashMap<>();
    try {
        User user = userService.getDao().findById(Integer.valueOf(tokenService.valid(request.getHeader("token"))));
        if (user == null) {
            return Result.fail(902, "用户登录失效,请重新登录");
        }
        if (Enums.UserType.Driver == user.getType()) {
            return Result.fail(903, "该用户没有权限");
        }
        if (Enums.UserType.Passenger == user.getType()) {
            return Result.fail(903, "该用户没有权限");
        }
        //根据用户对应的角色获取角色对应的菜单id
        List<Integer> integers = roleAndMenuService.getDao().findByRoleId(user.getRoles());
        List<String> list = integers.stream().map(x -> x + "").collect(Collectors.toList());
        String menus = String.join(",", list);
        //根据菜单id获取对应的菜单
        List<TreeResult> tree = menuService.getDao().findTree(menus);
        //将菜单列表转成树结构
        List<TreeResult> treeResults = menuService.getDao().parseMenuTree(tree);
        map.put("list", treeResults);
        return Result.ok(map);
    } catch (Exception e) {
        e.printStackTrace();
        return Result.fail(901, e.getMessage());
    }
}

3.TreeResult实体类:

@Getter
@Setter
public class TreeResult {
   private Integer id;
   private String icon;
   private String menuName;
   private String menuType;
   private String menuUrl;
   private Integer parentId;

   private List<TreeResult> children = new ArrayList<TreeResult>();

}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamlzjoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值