Java实现多级菜单(递归)
java实现三级菜单展示(递归)
获取树状的菜单结构
@Override public List<Menu> findTreeMenu(){ List<Menu> menus = findAllMenu(); //先获取你想要在哪些菜单范围内搜索 List<Menu> rootMenus = new ArrayList<>(); for (Menu menu : menus) { //从最上级菜单开始展示 if(menu.getPid().equals(0L)){ rootMenus.add(menu); } } for (Menu rootMenu : rootMenus) { //把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到(目前是三层,由于是递归调用,100 层也没问题) List<Menu> child = getChild(rootMenu.getId(), menus); rootMenu.setSubMenu(child); } return rootMenus; }
获取子菜单方法
/** *通过传入当前菜单id,获取当前id的子菜单 且子菜单里也有子菜单及其信息,直到子菜单没有子菜单了,递归结束 * @param id 当前菜单的id * @param menus 要查询的菜单范围 * @return 该id的子菜单 */ private List<Menu> getChild(Long id,List<Menu> menus){ List<Menu> childList = new ArrayList<>(); for (Menu menu : menus) { if(menu.getPid().equals(id)){ //当菜单范围内的父id等于传入的id,获取该id的所有子列表 childList.add(menu); } } for (Menu menu : childList) { //当上面循环语句查询不到子菜单,长度为0,自然也就不会递归调用了 //将该id的子菜单便利,通过递归调用,给每一个子菜单赋值子菜单 List<Menu> child = getChild(menu.getId(), menus); menu.setSubMenu(child); } if(childList.size()==0){ //子菜单的长度为0,返回null,null不会被jackson解析 return null; } return childList; }
实体类如下
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; @Data @TableName("t_menu") @JsonInclude(JsonInclude.Include.NON_NULL)// 不是null的数据才会被携带到返回数据中 public class Menu { private Long id; private String menuname; private Long pid; private String url; @TableField(exist = false) private List<Menu> subMenu; }
数据库设计如下
返回结果
[ { "id": 1, "menuname": "B2C销售管理", "pid": 0, "url": "/qwe", "subMenu": [ { "id": 1001, "menuname": "订单显示", "pid": 1, "url": "/fsd", "subMenu": [ { "id": 1001001, "menuname": "订单添加", "pid": 1001, "url": "/fg" } ] }, { "id": 1002, "menuname": "销售出库单", "pid": 1, "url": "/gk", "subMenu": [ { "id": 1002001, "menuname": "销售出库单修改", "pid": 1002, "url": "/gh" } ] }, { "id": 1003, "menuname": "销售退货单", "pid": 1, "url": "/jmf", "subMenu": [ { "id": 1003001, "menuname": "销售退货单修改", "pid": 1003, "url": "/il,.j" } ] }, { "id": 1004, "menuname": "网店订单导入", "pid": 1, "url": "/dh", "subMenu": [ { "id": 1004001, "menuname": "网店订单导入修改", "pid": 1004, "url": "/gfjnf" } ] } ] }, { "id": 2, "menuname": "商品与赠品管理", "pid": 0, "url": "/asd", "subMenu": [ { "id": 2001, "menuname": "商品管理", "pid": 2, "url": "/fhj", "subMenu": [ { "id": 2001001, "menuname": "商品管理添加", "pid": 2001, "url": "/ghj" } ] }, { "id": 2002, "menuname": "商品品牌管理", "pid": 2, "url": "/dahj", "subMenu": [ { "id": 2002001, "menuname": " 商品品牌管理添加", "pid": 2002, "url": "/ghkjghkj" } ] }, { "id": 2003, "menuname": "商品类型管理", "pid": 2, "url": "/drhfjn", "subMenu": [ { "id": 2003001, "menuname": "商品类型管理添加", "pid": 2003, "url": "/fghf" } ] }, { "id": 2004, "menuname": "赠品管理", "pid": 2, "url": "/tmkt", "subMenu": [ { "id": 2004001, "menuname": "添加赠品", "pid": 2004, "url": "/iu" }, { "id": 2004002, "menuname": "详情(查询)", "pid": 2004, "url": "/fhg" }, { "id": 2004003, "menuname": "修改数量", "pid": 2004, "url": "/kl" }, { "id": 2004004, "menuname": "商品转赠品", "pid": 2004, "url": "/goodsToPresent" }, { "id": 2004005, "menuname": "赠品转商品", "pid": 2004, "url": "/qwde" }, { "id": 2004006, "menuname": "审核", "pid": 2004, "url": "/qwfqwf" } ] }, { "id": 2005, "menuname": "促销活动申请与审批", "pid": 2, "url": "/gfh", "subMenu": [ { "id": 2005001, "menuname": "促销活动申请与审批添加", "pid": 2005, "url": "/qwdeq" } ] }, { "id": 2006, "menuname": "价格调整申请与审批", "pid": 2, "url": "/dhdtf", "subMenu": [ { "id": 2006001, "menuname": " 价格调整申请与审批添加", "pid": 2006, "url": "/cvbnv" } ] } ] }, { "id": 3, "menuname": "售后管理", "pid": 0, "url": "/zxc", "subMenu": [ { "id": 3001, "menuname": "返厂出入库管理", "pid": 3, "url": "/fgjnf", "subMenu": [ { "id": 3001001, "menuname": " 返厂出入库管理添加", "pid": 3001, "url": "/cbvf" } ] }, { "id": 3002, "menuname": "退换货申请管理", "pid": 3, "url": "/fhtgfh", "subMenu": [ { "id": 3002001, "menuname": " 退换货申请管理添加", "pid": 3002, "url": "/cvbcv" } ] }, { "id": 3003, "menuname": "申诉管理", "pid": 3, "url": "/ghmgh", "subMenu": [ { "id": 3003001, "menuname": "申诉管理添加", "pid": 3003, "url": "/ghk" } ] } ] }, { "id": 4, "menuname": "系统管理", "pid": 0, "url": "/rty", "subMenu": [ { "id": 4001, "menuname": "用户管理(账号管理)", "pid": 4, "url": "/fgjn", "subMenu": [ { "id": 4001001, "menuname": "添加用户", "pid": 4001, "url": "lkjh" }, { "id": 4001002, "menuname": "用户详情", "pid": 4001, "url": "/userManage" }, { "id": 4001003, "menuname": "用户修改", "pid": 4001, "url": "/dfbh" } ] }, { "id": 4002, "menuname": "角色管理(职位管理)", "pid": 4, "url": "/fgjj", "subMenu": [ { "id": 4002001, "menuname": "添加角色", "pid": 4002, "url": "/ijughf" }, { "id": 4002002, "menuname": "角色详情", "pid": 4002, "url": "/ujyhgfb" }, { "id": 4002003, "menuname": "角色修改", "pid": 4002, "url": "/ujyhgf" } ] }, { "id": 4003, "menuname": "权限管理", "pid": 4, "url": "/fhn", "subMenu": [ { "id": 4003001, "menuname": "添加权限", "pid": 4003, "url": "/fthgb" }, { "id": 4003002, "menuname": "权限相亲", "pid": 4003, "url": "/dfg" }, { "id": 4003003, "menuname": "权限修改", "pid": 4003, "url": "/yhkumj" }, { "id": 4003004, "menuname": "权限报表", "pid": 4003, "url": "/wazs" } ] }, { "id": 4004, "menuname": "日志管理", "pid": 4, "url": "/fgngf", "subMenu": [ { "id": 4004001, "menuname": "用户日志", "pid": 4004, "url": "/logManage" }, { "id": 4004002, "menuname": "商品日志", "pid": 4004, "url": "/asf" } ] } ] } ]
更多方法
https://blog.csdn.net/xie1016/article/details/123750710
now ,fight for future
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具