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;
    }
}

使用方法极其简单粗暴:

直接看一下使用场景,这里我就直接上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);

    }
}

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

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
@ResponseBody是一个注解,通常用于Spring MVC的控制器方法上,用于指示该方法的返回值直接作为响应体返回给客户端,而不是通过视图解析器进行页面渲染。 使用@ResponseBody注解可以将控制器方法的返回值序化为JSON、XML或其他格式的数据,然后将其作为HTTP响应的内容返回给客户端。这在构建RESTful API或返回纯数据的接口时非常有用。 示例代码如下: ```java @Controller @RequestMapping("/api") public class ApiController { @GetMapping("/user/{id}") @ResponseBody public User getUserById(@PathVariable Long id) { // 从数据库或其他数据源获取用户信息 User user = userService.getUserById(id); return user; } @PostMapping("/user") @ResponseBody public ResponseEntity<User> createUser(@RequestBody User newUser) { // 创建新用户,并返回创建成功的用户信息 User createdUser = userService.createUser(newUser); return ResponseEntity.status(HttpStatus.CREATED).body(createdUser); } } ``` 在上述示例中,`@ResponseBody`注解被应用在控制器方法上,表示该方法的返回值将直接作为响应体返回给客户端。无需通过视图解析器进行页面渲染。 需要注意的是,如果使用@RestController注解来标记整个控制器类,那么所有控制器方法的返回值都会被默认加上@ResponseBody注解,无需显式添加。 使用@ResponseBody注解可以很方便地返回纯数据或自定义格式的数据给客户端,而不需要构建视图模板。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王要努力ぴ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值