java动态加载菜单树

controller

/**  

@ApiOperation swagger注解,将此方法映射到swagger前端页面
@RequiresPermissions shiro权限注解,无此权限禁止访问此接口
/**
     * 跳转列表页面
     */
    @GetMapping("/treeList")
    @ApiOperation(httpMethod = "GET", value = "菜单列表")
   // @RequiresPermissions("sysResource:list")
    public ApiResponse<List<ResourceVO>> treeList() {
        List<ResourceVO> resources = sysResourceService.treeMainList();
        return ApiResponse.success(resources);
    }

 

service

/**
     * treeList
     *
     * @return
     */
    public List<ResourceVO> treeMainList() {
        //查询主节点
        List<SysResource> rootResources = sysResourceDAO.listRoot();
        //准备一个list
        List<ResourceVO> results = Lists.newArrayListWithExpectedSize(rootResources.size());
        //循环主节点
        rootResources.forEach(rootResource -> {
            //准备一个实体
            ResourceVO resourceVO = new ResourceVO();
            //利用treeList()方法递归查询子节点,返回所有子节点,传入主节点的实体
            List<ResourceVO> resources = treeList(rootResource);
            //如果有子节点,放入准备好的实体
            if (!resources.isEmpty()) {
                resourceVO.setChildren(resources);
            }
            //将查询的主节点的实体的内容映射到准备好的实体
            BeanUtils.copyBeanProp(resourceVO, rootResource);
            //将准备的实体放入准备好的list返回
            results.add(resourceVO);
        });
        //返回给调用者
        return results;
    }

    public List<ResourceVO> treeList(SysResource rootResource) {
        //根据主节点的实体的id当做子节点的父id查询所有子节点
        List<SysResource> childrenResources = sysResourceDAO.listChildren(rootResource.getId());
        //准备一个list
        List<ResourceVO> result = Lists.newArrayListWithExpectedSize(childrenResources.size());
        //如果查无子节点则直接返回准备好的数组,递归结束
        if (childrenResources.isEmpty()) {
            return result;
        } else {
            childrenResources.forEach(childrenResource -> {
                //准备好一个实体
                ResourceVO child = new ResourceVO();
                //将子节点实体里其他内容映射到准备好的实体
                BeanUtils.copyBeanProp(child, childrenResource);
                //子节点的实体再传入本身方法再次调用,再次查询再下一级的子节点,递归调用
                List<ResourceVO> subChildren = treeList(childrenResource);
                //返回值放入准备好的实体
                if (!subChildren.isEmpty()) {
                    child.setChildren(subChildren);
                }
                //将准备好的实体放入准备好的list
                result.add(child);
            });
        }
        //返回给调用者
        return result;
    }

测试有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值