多级菜单展示

//方式1:首先按照条件(不同角色展示不同的菜单,权限不同)查询上级菜单id为0的列表(1级菜单),循环得到每个一级菜单id,用一级菜单的id作为parent_id去查询二级菜单,得到每个二级菜单的id,嵌套循环得到每个二级菜单id,查询三级菜单
//不推荐方式1:因为和数据库需要频繁交互,交互次数 = 1 + 一级菜单数量 + 二级菜单数量

//方式2:首先把符合条件的菜单查询出来(列表),通过内存判断筛选出符合条件的记录(每一级的菜单列表)
数据库表结构:
在这里插入图片描述
一级菜单的id为0,以id作为下一级菜单的parent_id

public List findAllMenu(){
List

menuList = findAll(); //调用查询所有菜单的方法
return findMenuListByParentId(menuList,“0”); //调用下面的查询下级菜单的方法
}

//查询下级菜单
private List findMenuListByParentId(List menuList, String parentId){
//最后得到的总的菜单在mapList中
List
mapList = new ArrayList();
for (Menu menu: menuList) { //每个一级菜单都要递归一次来获取对应的下级菜单
if(menu.getParentId().equals(parentId)){ //递归到3级菜单的时候,菜单的id没有对应的菜单的parentId与之对应,即没有下级菜单了,结束
Map map = new HashMap();//不管哪一级菜单,都是一个map
map.put(“path”,menu.getId()); //关于菜单的一些信息
map.put(“title”,menu.getName());
map.put(“icon”,menu.getIcon());
map.put(“linkUrl”,menu.getUrl());
//递归完后会出方法,将子菜单put到map中,再进入下一次循环,下一次循环参数parentId还是0(这个得理解),相当于又遍历一个一级菜单
map.put(“children”,findMenuListByParentId(menuList, menu.getId())); //递归调用
menuList.add(map); //一个一级菜单对应一个map
}
}
return mapList;
}
每一个菜单都会递归一次,找到对应的子菜单,如果遍历到2级或者3级菜单,则满足不了if中的条件,因为参数parentId是0

这里相当于有4个for循环的嵌套,最外层循环找到一级菜单,然后第二层循环找到一个二级菜单,第三层循环找到一个3级菜单,然后用3级菜单的id作为parentId又进入一个for循环,但是满足不了if中的条件,因为没有下级菜单了,所以又回到上一层for循环,继续找3级菜单,这样就能找到2级菜单下所有的3级菜单,对应的3级菜单都找出来之后,则回退到找2级菜单的循环中,继续找出一个2级菜单,等这个1级菜单对应的2级菜单都找出来之后,则回退到最外层的循环,继续找1级菜单,此时,parentId还是初始的0

最后得到的多级菜单的格式如下:
[
{
“path”: “1”,
“children”: [], //首页没有子菜单
“icon”: “iconHome”,
“linkUrl”: null,
“title”: “首页”
},
{
“path”: “2”,
“children”: [ //二级菜单
{
“path”: “2-1”,
“children”: [ //三级菜单
{
“path”: “2-1-1”,
“children”: [],
“icon”: null,
“linkUrl”: “goods/goods.html”,
“title”: “商品列表”
},
{
“path”: “2-1-2”,
“children”: [],
“icon”: null,
“linkUrl”: “goods/goods_edit.html”,
“title”: “添加商品”
},
{

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值