Springboot 项目 渲染多级菜单栏

在这里插入图片描述

Springboot 项目 渲染多级菜单栏

说到菜单栏的渲染那就离不开两个字,哪两个字?

递归 !

递归 !

递归不就是自己调用自己吗?

没错 ! 我们的菜单栏就是要通过递归去实现,通常是二级菜单可以通过以下的代码实现:

  @RequestMapping("findMenu")
	@ResponseBody
	public List<Map<String, Object>> findAll2() {
    
    
	  //查出一级菜单的类集
		List<Map<String,Object>> listData = navService.findMaps();
		//定义好存放数据的类集
		List<Map<String,Object>> Data = new ArrayList<Map<String,Object>>();
		
		for (int i = 0; i < listData.size(); i++) {
    
    
		  //定义一级菜单
			Map<String,Object> mpMenu = new HashMap<String, Object>();
			//给一级菜单添加名字
			mpMenu.put("nname", listData.get(i).get("nname"));
			//给一级菜单添加地址
			mpMenu.put("href", listData.get(i).get("href"));
			
			List<Map<String,Object>> twoData = navService.findMapsWhere((Integer) listData.get(i).get("navid"));
			//查出一级菜单地下的二级菜单
			List<Map<String,Object>> two = new ArrayList<Map<String,Object>>();
			//定义二级菜单
			for (int j = 0; j < twoData.size(); j++) {
    
    
			  //定义二级菜单存放
				Map<String,Object> mp = new HashMap<String, Object>();
				//给二级菜单添加名字
				mp.put("nname",twoData.get(j).get("nname"));
				//给二级菜单添加地址
				mp.put("href",twoData.get(j).get("href"));
				//添加到大的二级菜单中
				two.add(mp);
			}
			//给二级菜单起名字添加到类集中
			mpMenu.put("twoData", two);
			
			Data.add(mpMenu);
		}
		return Data;
	}

但是如果是三级菜单,四级菜单呢?for ? for ? for ?

可以,只要你不会for迷糊,那就接着for下去,反正我是for不下去了,那就换一个方法吧。

接下来才是我要向大家介绍的正确的打开方式:

动态渲染多级菜单的工具类

package com.codingfuture.utils;

import com.codingfuture.dto.MenuDTO;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TreeUtil {
    
    
    public static List<MenuDTO> tree(List<MenuDTO> regionTrees) {
    
    
        //返回的节点树
        List<MenuDTO> rootNodes = new ArrayList<>();
        Iterator<MenuDTO> it = regionTrees.iterator();
        while (it.hasNext()) {
    
    
            MenuDTO next = it.next();
            //parent(上级Id)为0的是根节点
            if ("0".equals(next.getPid())) {
    
    
                rootNodes.add(next);
                it.remove();
            }
        }
        //遍历,找到二级节点
        for (MenuDTO menuTree : rootNodes) {
    
    
            List<MenuDTO> child = getChild(regionTrees, menuTree.getMenuId().toString());
            menuTree.setList(child);
        }
        return rootNodes;

    }

    /**
     * 查子节点
     *
     * @param regions
     * @param parentId
     * @return
     */
    public static List<MenuDTO> getChild(List<MenuDTO> regions, String parentId) {
    
    

        //子节点列表
        List<MenuDTO> list = new ArrayList<>();
        Iterator<MenuDTO> it = regions.iterator();
        while (it.hasNext()) {
    
    
            MenuDTO menuTree = it.next();
            if (parentId.equals(menuTree.getPid())) {
    
    
                list.add(menuTree);
                it.remove();
            }
        }

        //遍历 递归获取子节点的子节点
        for (MenuDTO menuTree : list) {
    
    
            List<MenuDTO> child = getChild(regions, menuTree.getMenuId().toString());
            menuTree.setList(child);
        }
        //递归出口  childList长度为0
        if (list.size() == 0) {
    
    
            return new ArrayList<>();
        }
        return list;
    }
}

使用方法极其简单粗暴:

扫描二维码关注公众号,回复: 17253445 查看本文章

直接看一下使用场景,这里我就直接上Service层的代码了

@Service
@Transactional(rollbackFor = Exception.class)
public class  MenuServiceImpl implements MenuService {
    
    

    @Autowired
    private MenuMapper menuMapper;
    @Autowired
    private OrdersMapper ordersMapper;

    @Override
    public List<MenuDTO> findMenu(Object username) {
    
    
      //这里是通过Session拿登录名
        Emp emp = ordersMapper.findName(username);
        String name = emp.getName();
      //下面的这两行才是这个用具类的使用  
        List<MenuDTO> menu = menuMapper.findMenu(name);
        return TreeUtil.tree(menu);

    }
}

好了以上就是本次的分享,用上的小伙伴别忘了回头点个赞呦~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiangyuWA/article/details/126454072