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);
}
}
好了以上就是本次的分享,用上的小伙伴别忘了回头点个赞呦~