二级分类菜单及三级分类菜单的层级结构返回

前言

在开发投诉分类功能模块时,遇到过这样一个业务场景:后端需要按层级结构返回二级分类菜单所需数据,换言之,将具有父子关系的List结果集数据转为树状结构数据来返回

二级分类菜单

前期准备

这里简单复刻下真实场景中 出现的二级分类菜单层级结构返回

数据库设计

建表语句如下

DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu`  (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '名称',`parent_id` bigint NULL DEFAULT NULL COMMENT '父级id',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES (1, '质量问题', 0);
INSERT INTO `menu` VALUES (2, '变质', 1);
INSERT INTO `menu` VALUES (3, '过期', 1);
INSERT INTO `menu` VALUES (4, '包装破损', 1);
INSERT INTO `menu` VALUES (5, '服务问题', 0);
INSERT INTO `menu` VALUES (6, '态度恶劣', 5);
INSERT INTO `menu` VALUES (7, '东拉西扯', 5);

在这里插入图片描述

效果图预览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里是在SpringBoot项目中演示实现的,持久层框架选用MyBatis-Plus,版本号:3.5.3.1

🌟之所以强调MP版本号,是因为之前在实现分页时遇过挫,真实项目选用的版本是3.3.2,而自己在学习MP时,选择版本是3.5.3.1。MP官方文档在不同版本中,有关分页插件的使用介绍可能存在不同,实际开发中对引入MP依赖的版本号还是要有所关注

在这里插入图片描述

开发测试

创建实体类

package com.atguigu.mybatisplus.pojo;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;/*** @author Songguo* @date 2023/11/15 9:56*/
@Data
@TableName("menu")
public class Menu {private Long id;private String name;private Long parentId;
}

创建mapper层

package com.atguigu.mybatisplus.mapper;import com.atguigu.mybatisplus.pojo.Menu;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface MenuMapper extends BaseMapper<Menu> {
}

创建service层接口及实现类

package com.atguigu.mybatisplus.service;import com.atguigu.mybatisplus.pojo.Menu;
import com.baomidou.mybatisplus.extension.service.IService;public interface MenuService extends IService<Menu> {
}
package com.atguigu.mybatisplus.service.impl;import com.atguigu.mybatisplus.mapper.MenuMapper;
import com.atguigu.mybatisplus.pojo.Menu;
import com.atguigu.mybatisplus.service.MenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;/*** @author Songguo* @date 2023/11/15 10:00*/
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
}

创建测试类

package com.atguigu.mybatisplus;import com.atguigu.mybatisplus.pojo.Menu;
import com.atguigu.mybatisplus.service.MenuService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Songguo* @date 2023/11/15 10:02*/
@SpringBootTest
public class MenuServiceImplTest {@Autowiredprivate MenuService menuService;@Testpublic void ListToTreeTest() {List<Menu> list = menuService.list();// 存放要返回的树状结构数据List<Map<String, Object>> MenuList = new ArrayList<>();for (Menu menu : list) {if (Long.valueOf(0) == menu.getParentId()) {Map<String, Object> map = new HashMap<>();map.put("id", menu.getId());map.put("name", menu.getName());// map.put("parentId", menu.getParentId());map.put("children", getChildren(list, menu.getId()));MenuList.add(map);}}MenuList.forEach(System.out::println);}public List<Map<String, Object>> getChildren(List<Menu> list, Long topId) {List<Map<String, Object>> data = new ArrayList<>();for (Menu menu : list) {if (topId == menu.getParentId()) {Map<String, Object> map = new HashMap<>();map.put("id", menu.getId());map.put("name", menu.getName());// map.put("parentId", menu.getParentId());data.add(map);}}return data;}}

注意: 在真实场景中,并不需要返回每条记录的所有字段值,主要看前端需要接收那些数据

实现思路很简单:

1️⃣获取分类菜单所有记录

2️⃣遍历找出一级节点(父节点),然后在调用getChildren()(重金寻子方法)获取二级节点(子节点)

3️⃣通过List<Map<String,Object>>来存放结果集

三级分类菜单

前期准备

这里简单复刻下真实场景中 出现的三级分类菜单层级结构返回

数据库设计

建表语句如下

CREATE TABLE address (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,parent_id INT NOT NULL,level INT NOT NULL
);INSERT INTO address (name, parent_id, level) VALUES ('湖北', 0, 1);
INSERT INTO address (name, parent_id, level) VALUES ('辽宁', 0, 1);
INSERT INTO address (name, parent_id, level) VALUES ('武汉', 1, 2);
INSERT INTO address (name, parent_id, level) VALUES ('荆州', 1, 2);
INSERT INTO address (name, parent_id, level) VALUES ('沈阳', 2, 2);
INSERT INTO address (name, parent_id, level) VALUES ('蔡甸区', 3, 3);
INSERT INTO address (name, parent_id, level) VALUES ('江夏区', 3, 3);
INSERT INTO address (name, parent_id, level) VALUES ('沙市区', 4, 3);
INSERT INTO address (name, parent_id, level) VALUES ('大东区', 5, 3);
INSERT INTO address (name, parent_id, level) VALUES ('浑南区', 5, 3);

在这里插入图片描述

效果图预览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

开发测试

创建实体类

package com.atguigu.mybatisplus.pojo;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;/*** @author Songguo* @date 2023/11/26 17:04*/
@Data
@TableName("address")
public class Address {private int id;private String name;private int parentId;private int level;
}

创建mapper层

package com.atguigu.mybatisplus.mapper;import com.atguigu.mybatisplus.pojo.Address;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface AddressMapper extends BaseMapper<Address> {
}

创建service层接口及实现类

package com.atguigu.mybatisplus.service;import com.atguigu.mybatisplus.pojo.Address;
import com.baomidou.mybatisplus.extension.service.IService;public interface AddressService extends IService<Address> {
}
package com.atguigu.mybatisplus.service.impl;import com.atguigu.mybatisplus.mapper.AddressMapper;
import com.atguigu.mybatisplus.pojo.Address;
import com.atguigu.mybatisplus.service.AddressService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;/*** @author Songguo* @date 2023/11/26 17:08*/
@Service
public class AddressServiceImpl extends ServiceImpl<AddressMapper, Address> implements AddressService {
}

创建测试类

package com.atguigu.mybatisplus;import com.atguigu.mybatisplus.pojo.Address;
import com.atguigu.mybatisplus.service.AddressService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Songguo* @date 2023/11/26 17:10*/
@SpringBootTest
public class AddressServiceImplTest {@Autowiredprivate AddressService addressService;@Testpublic void getAddress() {List<Address> list = addressService.list();// list.forEach(System.out::println);// 存放结果集List<Map<String, Object>> addressList = new ArrayList<>();for (Address address : list) {if (address.getLevel() == 1) {Map<String, Object> map = new HashMap<>();map.put("id", address.getId());map.put("name", address.getName());// map.put("parentId", address.getParentId());map.put("children", getChildren(list, address.getId()));addressList.add(map);}}addressList.forEach(System.out::println);}public List<Map<String, Object>> getChildren(List<Address> list, int parentId) {List<Map<String, Object>> data = new ArrayList<>();for (Address address : list) {HashMap<String, Object> map = new HashMap<>();if (parentId == address.getParentId()) {map.put("id", address.getId());map.put("name", address.getName());// map.put("parentId", address.getParentId());if (address.getLevel() < 3) {map.put("children", getChildren(list, address.getId()));}data.add(map);}}return data;}}

小结

二级分类菜单的层级结构返回是在真实项目中遇到的,而三级分类菜单的层级结构返回是模拟真实场景下的需求进行扩展实现的

弄懂了二级分类和三级分类,多级分类还会远嘛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236357.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)

项目场景&#xff1a; 最近需要使用Neo4j图数据库&#xff0c;因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像&#xff0c;执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…

Python语言学习笔记之七(JOSN应用)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Json JSON (JavaScript Obiect Notation)是一种轻量级的数据交换格式&#xff0c;它是ECMAScript的一…

英国人工智能初创公司Stability AI面临卖身压力;深度学习中的检索增强生成简介

&#x1f989; AI新闻 &#x1f680; 英国人工智能初创公司Stability AI面临卖身压力 摘要&#xff1a;多位知情人士透露&#xff0c;英国人工智能初创公司Stability AI正寻求出售公司&#xff0c;因为投资者对其财务状况的压力越来越大。管理层最近几周一直将自己标榜为收购…

Day46力扣打卡

最近一直在做以前的题&#xff0c;刷题量都没有怎么增长&#xff0c;感觉自己算法一直不太行&#xff0c;但也只能菜就多练了。 打卡记录 由子序列构造的最长回文串的长度&#xff08;区间DP&#xff09; 链接 第二次刷这道题&#xff0c;相比上回思路来的很快&#xff0c;但…

码云配置遇到秘钥不正确

你这个就是秘钥没有和git绑定&#xff0c; 需要 git config --global user.name "你的用户名随便写" git config --global user.email "你的邮箱"

SpringBoot+Redis获取电脑信息

获取电脑信息 测试 System.getProperties(); System: 是Java中的一个内置类&#xff0c;用于提供与系统相关的功能和信息。这个类中包含了一些静态方法和常量&#xff0c;可以让您方便地访问和操作系统级别的资源。 getProperties(): 是一个静态方法&#xff0c;它返回一个表示…

Windows11如何让桌面图标的箭头消失(去掉快捷键箭头)

在Windows 11中&#xff0c;桌面图标的箭头是快捷方式图标的一个标志&#xff0c;用来表示该图标是一个指向文件、文件夹或程序的快捷方式。如果要隐藏这些箭头&#xff0c;你需要修改Windows注册表或使用第三方软件。 在此之前&#xff0c;我需要提醒你&#xff0c;修改注册表…

俄罗斯方块小游戏开发

代码图&#xff1a; import pygame, randompygame.init()# 游戏界面参数 width 300 height 600 surface pygame.display.set_mode((width, height))# 颜色定义 black (0, 0, 0) white (255, 255, 255) red (200, 0, 0) green (0, 200, 0) blue (0, 0, 200)# 俄罗斯方块…

我与开源的历程

我在2000年开始接触开源&#xff0c;当时在松下航空电子美国总部工作。我负责将 IFE 系统从 Win31 迁移到 Linux。作为一个完全不懂 Linux 的小白&#xff0c;我不得不找到一台笔记本电脑安装并自学 Redhat Linux 6.1。2003年回到新加坡后&#xff0c;我发现没有一个凝聚 Linux…

Echarts 柱状图添加标记 最大值 最小值 平均值

标记 最大值 最小值 series: [//图表配置项 如大小&#xff0c;图表类型{name: 图例,type: bar,//图表类型data: [{value: 500,time: 2012-11-12},{value: 454,time: 2020-5-17},{value: 544,time: 2022-1-22},{value: 877,time: 2013-1-30}, {value: 877,time: 2012-11-12}] …

云轴科技ZStack信创云平台助力国泰君安期货实现信创改造

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack 产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

Element UI 实战:跨页保存表格选中状态与判断状态可选性的高效方案

引言 在前文中&#xff0c;我们曾深入探讨了在修改数据后跨页时提醒用户可能丢失数据的问题。虽然这种方式对于一些场景是足够的&#xff0c;但当涉及选择框时&#xff0c;我们需要更为智能和高效的解决方案。在本文中&#xff0c;我们将分享一种基于 Element UI 的实际案例&am…