使用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-递归方法有待优化,第一轮递归应该只递归根节点,后面就不用过滤了,同时可以减小递归次数,减小服务器压力。
下一篇:
十转二进制的转换及其简便方法