广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springboot构造树形结构数据并查询的方法
  • 579
分享到

springboot构造树形结构数据并查询的方法

2024-04-02 19:04:59 579人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl

因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。

在这里插入图片描述

不说废话,直接开干!!!

我这里用的是springboot+mybatis-plus+mysql,示例的接口是查询一级权限以及二级权限、三级权限整个权限树…

下面是导入的Maven依赖


 		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-WEB</artifactId>
        </dependency>
<!--数据库连接-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>
 
        <dependency>
            <groupId>Mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis增强工具-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
  		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.6</version>
        </dependency>

下面是实体类Permission


@Data
public class Permission implements Serializable {
    @TableId
    private String permissionId;
    @NotNull(message = "权限名称不能为空")
    private String permissionName;
    
    @NotNull(message = "权限标识不能为空")
    private String permissionCode;
    
    @NotBlank(message = "父菜单ID不能为空")
    private String parentId;

    
    private String path;

    
    private Integer sort;
    

    private LocalDateTime createTime;

    

    private LocalDateTime updateTime;

    
    private String delFlag;

    public Permission() {
        this.permissionId = IdUtil.simpleUUID();
    }

树形结点类


@Data
public class Treenode {
    protected String id;
    protected String parentId;
    protected List<TreeNode> children = new ArrayList<TreeNode>();
    protected boolean hasChildren;

   public void addTreeNode(TreeNode node){
       children.add(node);
   }
}

树形结点详细信息类


@Data
@EqualsAndHashCode(callSuper = true)
public class PermissionTree extends TreeNode implements Serializable {
    private String permissionName;
    private String permissionCode;
    private String path;
    private Integer sort;
    private String label;
    private boolean hasChildren;
    public PermissionTree() {
    }
}

构建树形结点工具类(关键),在这里我用@UtilityClass注解就表示这个类中的方法都是静态方法:


@UtilityClass
public class TreeUtil {


    public <T extends TreeNode> List<T> build(List<T> treeNodes, String root) {
        List<T> trees = new ArrayList<>();
        for (T treeNode : treeNodes) {

            if (root.equals(treeNode.getParentId())) {
                trees.add(treeNode);
            }

            for (T node : treeNodes) {
                if (node.getParentId().equals(treeNode.getId())) {
                    treeNode.addTreeNode(node);
                    treeNode.setHasChildren(true);

                }
            }
        }
        return trees;
    }


    
    public List<PermissionTree> buildTree(List<Permission> permissionList, String root) {
        System.out.println(Arrays.toString(permissionList.toArray()));
        List<PermissionTree> treeNodeList = new ArrayList<>();
        PermissionTree treeNode = null;
        for (Permission permission : permissionList) {
            treeNode = new PermissionTree();
            treeNode.setId(permission.getPermissionId());
            treeNode.setPermissionName(permission.getPermissionName());
            treeNode.setPath(permission.getPath());
            treeNode.setSort(permission.getSort());
            treeNode.setParentId(permission.getParentId());
            treeNode.setLabel(permission.getPermissionName());
            treeNode.setHasChildren(false);
            treeNodeList.add(treeNode);
        }
        return TreeUtil.build(treeNodeList, root);
    }
  }

响应消息主体类



@ToString
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class R<T> implements Serializable {

	private static final long serialVersionUID = 1L;

	private int code;

	private String msg;

	private T data;

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	public static <T> R<T> ok() {
		return restResult(null, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS);
	}

	public static <T> R<T> ok(T data) {
		return restResult(data, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS);
	}

	public static <T> R<T> ok(T data, String msg) {
		return restResult(data, CommonConstants.SUCCESS, msg);
	}

	public static <T> R<T> failed() {
		return restResult(null, CommonConstants.FAIL, null);
	}

	public static <T> R<T> failed(String msg) {
		return restResult(null, CommonConstants.FAIL, msg);
	}

	public static <T> R<T> failed(T data) {
		return restResult(data, CommonConstants.FAIL, null);
	}

	public static <T> R<T> failed(T data, String msg) {
		return restResult(data, CommonConstants.FAIL, msg);
	}

	private static <T> R<T> restResult(T data, int code, String msg) {
		R<T> apiResult = new R<>();
		apiResult.setCode(code);
		apiResult.setData(data);
		apiResult.setMsg(msg);
		return apiResult;
	}
}

数据查询接口mapper类


@Mapper
public interface PermissionMapper extends BaseMapper<Permission>{
    
}

数据逻辑处理业务接口


public interface PermissionService extends IService<Permission> {
  

    
    List<PermissionTree> treePermission(boolean lazy, String parentId);
}

数据逻辑处理业务接口实现类


@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {


    @Override
    public List<PermissionTree> treePermission(boolean lazy, String parentId) {

        if (!lazy) {
            return TreeUtil.buildTree(
                    baseMapper.selectList(Wrappers.<Permission>lambdaQuery().orderByAsc(Permission::getSort)),
                    CommonConstants.PERMISSION_ROOT_ID);
        }
        String parent = parentId == null ? CommonConstants.PERMISSION_ROOT_ID : parentId;
        return TreeUtil.buildTree(
                baseMapper.selectList(Wrappers.<Permission>lambdaQuery().eq(Permission::getParentId, parent).orderByAsc(Permission::getSort)), parent
        );
    }
}

查询权限树请求接口类


@RestController
@RequestMapping("/permission")
public class PermissionController {
    @Autowire
    private PermissionService permissionService;

    
    @RequestMapping(value = "/getTree", method = RequestMethod.GET)
    public R getTree(boolean lazy, String parentId) {
        return R.ok(permissionService.treePermission(lazy, parentId));
    }
 }

表中测试数据如下(注意它的parent_id

在这里插入图片描述

测试一:不是懒加载,查询整个权限树。 结果如下。

在这里插入图片描述


{
    "code": 0,
    "msg": "SUCCESS",
    "data": [
        {
            "id": "1",
            "parentId": "-1",
            "children": [
                {
                    "id": "2",
                    "parentId": "1",
                    "children": [
                        {
                            "id": "3",
                            "parentId": "2",
                            "children": [],
                            "hasChildren": false,
                            "permissionName": "update",
                            "permissionCode": null,
                            "path": null,
                            "sort": 3,
                            "label": "update",
                            "owned": false
                        },
                        {
                            "id": "4",
                            "parentId": "2",
                            "children": [],
                            "hasChildren": false,
                            "permissionName": "insert_role",
                            "permissionCode": null,
                            "path": null,
                            "sort": 4,
                            "label": "insert_role",
                            "owned": false
                        }
                    ],
                    "hasChildren": true,
                    "permissionName": "delete",
                    "permissionCode": null,
                    "path": null,
                    "sort": 2,
                    "label": "delete",
                    "owned": false
                }
            ],
            "hasChildren": true,
            "permissionName": "add",
            "permissionCode": null,
            "path": null,
            "sort": 1,
            "label": "add",
            "owned": false
        },
        {
            "id": "5",
            "parentId": "-1",
            "children": [],
            "hasChildren": false,
            "permissionName": "role:saveRole",
            "permissionCode": null,
            "path": "/role/saveRole",
            "sort": 5,
            "label": "role:saveRole",
            "owned": false
        }
    ]
}

测试二:是懒加载,根据parent_id查询当前分支。 结果如下。

在这里插入图片描述


{
    "code": 0,
    "msg": "SUCCESS",
    "data": [
        {
            "id": "3",
            "parentId": "2",
            "children": [],
            "hasChildren": false,
            "permissionName": "update",
            "permissionCode": null,
            "path": null,
            "sort": 3,
            "label": "update",
            "owned": false
        },
        {
            "id": "4",
            "parentId": "2",
            "children": [],
            "hasChildren": false,
            "permissionName": "insert_role",
            "permissionCode": null,
            "path": null,
            "sort": 4,
            "label": "insert_role",
            "owned": false
        }
    ]
}

到此这篇关于SpringBoot构造树形结构数据并查询的方法的文章就介绍到这了,更多相关springboot 树形结构并查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springboot构造树形结构数据并查询的方法

本文链接: https://www.lsjlt.com/news/156062.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot构造树形结构数据并查询的方法
    因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl...
    99+
    2022-11-12
  • springboot构造树形结构数据并查询的方法是什么
    本篇内容主要讲解“springboot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot构造树形结构数据并查询的方法是什么”吧!因为项目需要,页...
    99+
    2023-06-25
  • MySQL查询树形结构数据的两种方法
    目录1. 递归查询2. 闭包表对于mysql查询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法: 1. 递归查询 使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_tab...
    99+
    2023-11-11
    MySQL查询树形数据 MySQL查询树形结构 MySQL树形结构查询
  • Java 递归查询部门树形结构数据的实践
    说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1、数据库表:department 2、编写sql映射语句 &...
    99+
    2022-11-12
  • 数据库树形结构怎么查 四种方法解决
    使SQL实现树形查询 1 树形结构固定,即固定几层结构,可以采用数据库连接查询,这里以两张表为例: select one.id, one.label, two.id, two.labelfrom...
    99+
    2023-09-13
    数据库 sql java
  • JS使用reduce()方法处理树形结构数据
    目录定义语法实例1. 没有传递初始值init2. 传递初始值的情况下3. 数组去重4. 利用 reduce 对数组中的 Object 对象进行分组及合并5. 利用 reduce 处理...
    99+
    2022-11-12
  • mysql查询数据库下表结构的方法
    mysql查询数据库下表结构的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!方法:1、使用DESCRIBE命令以表格的...
    99+
    2022-10-18
  • Mysql树形结构的数据库表设计方案
    目录前言一、基本数据 二、继承关系驱动的设计 三、基于左右值编码的设计四、树形结构CRUD算法(1)获取某节点的子孙节点 (2)获取某节点的族谱路径(3)为某节点添加子孙节点 (4)...
    99+
    2022-11-12
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除
    前言   本篇章主要介绍二叉树的应用之一------二叉排序树,包括二叉排序树的定义、查找、插入、构造、删除及查找效率分析。 1. 二叉排序树的定义 Q...
    99+
    2022-11-12
  • 树形结构数据库表Schema设计的两种方案
    目录前言一、基本数据二、继承关系驱动的Schema设计三、基于左右值编码的Schema设计四、树形结构CRUD算法(1)获取某节点的子孙节点 (2)获取某节点的族谱路径(3...
    99+
    2022-11-12
  • Java树形结构数据生成导出excel文件方法记录
    目录什么是树形结构数据 效果用法源码总结什么是树形结构数据 效果 用法 String jsonStr = "{\"name\":\"aaa\",\"children\":[...
    99+
    2022-11-12
  • 查询json数据结构的方式有哪些
    这篇文章主要介绍“查询json数据结构的方式有哪些”,在日常操作中,相信很多人在查询json数据结构的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”查询json数据...
    99+
    2022-10-19
  • MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)
    目录方法一:使用嵌套结果集实现1,准备工作2,实现代码方法二:使用递归查询实现    树形结构数据在开发中十分常见,比如:菜单数、组织树, 利用&nbs...
    99+
    2022-11-12
  • C语言数据结构二叉树递归的方法
    本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌...
    99+
    2023-06-30
  • C语言数据结构系列之树的概念结构和常见表示方法
    0x00 树的概念 树是一种非线性的数据结构,它是由 n(n >= 0)个有限节点组成的一个具有层次关系的集合。 ❓ 那么为什么叫 "树" 呢...
    99+
    2022-11-13
  • 查看mysql数据库表结构图的方法
    这篇文章主要介绍了查看mysql数据库表结构图的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。查看mysql数据库表结构图的方法:首先打开m...
    99+
    2022-10-18
  • oracle查询锁表及解锁,修改表字段名与复制表结构和数据的方法
    在Oracle中查询锁表及解锁: 锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locke...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作