使用Java递归实现树形菜单,并且手动分页

1-数据库结构

 2-查询所有菜单数据方法

public List<Permission> selectAll(){
    LambdaQueryWrapper<Permission> wrapper = new LambdaQueryWrapper<>();
    List<Permission> list = permissionMapper.selectList(wrapper);
    return list;
}

3-递归设置子节点方法

public List<Permission> setChild(List<Permission> list){
    if (CollUtil.isEmpty(list)){
        return null;
    }
    for (Permission permission : list) {
        List<Permission> temp = new ArrayList<>();
        for (Permission p : list) {
            if (p.getParentId().equals(permission.getId())){
                temp.add(p);
            }
        }
        setChild(temp);
        permission.setChild(temp);
    }
    return list;
}

4-手动分页

    public Page<Permission> page(Permission permission) {
        //分页工具,获取前端传来的分页参数
        Page page = ParamsUtils.getPage();
        long current = page.getCurrent();
        long size = page.getSize();
        //索引起点
        long start = ((current - 1) * size);
        //索引截至点
        long end = start + size;

        //查询所有
        List<Permission> list = selectAll();

        //设置子节点
        List<Permission> permissions = setChild(list);

        //只要父级点
        List<Permission> collect = permissions.stream().filter(p -> p.getParentId().equals(0l)).collect(Collectors.toList());
        //手动分页
        List<Permission> records = new ArrayList<>();
        if (end >= collect.size()){
            end = collect.size();
        }
        for (long i = start; i < end; i++) {
            records.add(collect.get((int) i));
        }

        page.setRecords(records);
        page.setTotal(collect.size());

        return page;
    }

5-分页工具类

public class ParamsUtils {

    public static Page getPage(){
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes servlet = (ServletRequestAttributes) attributes;
        HttpServletRequest request = servlet.getRequest();
        Long current = Convert.toLong(request.getParameter("current"));
        Long size = Convert.toLong(request.getParameter("size"));
        Page page = Page.of(current, size);
        return page;
    }

}

6-效果

总结一下缺点和优化点:

1-没在数据库层面分页,数据较多时服务器要处理的数据较多

2-没实现模糊查询功能

3-递归方法有待优化,第一轮递归应该只递归根节点,后面就不用过滤了,同时可以减小递归次数,减小服务器压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值