使用hutool工具生成树形结构

news2024/10/7 2:27:33

假设要构建一个菜单,可以实现智慧库房,菜单的样子如下:

智慧库房
    |- RFID
    |- 智慧大屏
    |- 智能密集架
    |- 环境管控

那这种结构如何保存在数据库中呢?一般是这样的:

​ 每条数据根据parentId相互关联并表示层级关系,parentId在这里也叫外键

idparentIdname
10智慧库房
21RFID
31智慧大屏
41智能密集架
51环境管控

使用步骤:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

我这里使用的是枚举:(大家可以使用数据将需要封装成树形结构的数据,查询封装成一个List)

package com.hy.archive.supervision.enums;

/**
 * @description: 智慧库房功能
 */

public enum SmartWarehouseFunctionEnum {

    SMART_WAREHOUSE("1", "智慧库房", "0"),
    RFID("2", "RFID", "1"),
    SMART_LARGE_SCREEN("3", "智慧大屏", "1"),
    INTELLIGENT_DENSE_RACK("4", "智能密集架", "1"),
    ENVIRONMENTAL_CONTROL("5", "环境管控", "1");


    private String id;
    private String name;
    private String pid;


    SmartWarehouseFunctionEnum(String id, String name, String pid) {
        this.id = id;
        this.name = name;
        this.pid = pid;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPid() {
        return pid;
    }


    public static SmartWarehouseFunctionEnum fromCode(String id) {
        for (SmartWarehouseFunctionEnum DispatchTypeEnum : SmartWarehouseFunctionEnum.values()) {
            if (DispatchTypeEnum.getId().equals(id)) {
                return DispatchTypeEnum;
            }
        }
        return null;
    }
}

package com.js.hutool.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.js.hutool.enums.SmartWarehouseFunctionEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;

@RestController
@RequestMapping("/frid")
public class FridFunctionController {

    /**
     * @description: 使用htool工具生成树形递归结构
     * @author: js
     * @date: 2023/8/4 15:36
     * @param:
     * @return:
     **/
    @GetMapping("/function")
    public List<Tree<String>> obtainAllFunctionsOfTheSmartWarehouse() {
        List<TreeNode> nodeList = CollUtil.newArrayList();
        int i=0;
        for (SmartWarehouseFunctionEnum value : SmartWarehouseFunctionEnum.values()) {
            
            
            //1.将数据库中的数据一次性查询出来封装到List中
            //2.在这里将从数据库查询的所有数据List中id,pid(父级id),name 依次次封装到longTreeNode中
           
            
            TreeNode<String> longTreeNode = new TreeNode<>(value.getId(), value.getPid(), value.getName(), 0);
            // 如果还需要给树形添加其他字段,返回给前端,需使用map进行封装
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("返回给前端的字段1", i++);// 返回给前端的字段:open_function
            hashMap.put("返回给前端的字段2",i+1);
            longTreeNode.setExtra(hashMap);
            nodeList.add(longTreeNode);
        }


        //配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
        //设置权重对应的名称
        treeNodeConfig.setWeightKey("order");
        //设置ID对应的名称
        treeNodeConfig.setIdKey("id");//如果返回给前端的id不叫id,可以修改这里的值
// 最大递归深度
        treeNodeConfig.setDeep(3);//这个是设置树形结构的层级

//转换器 (含义:找出父节点为字符串零的所有子节点, 并递归查找对应的子节点, 深度最多为 3)
        											     // 0表示最顶层的id是0,即最高的父级id为多少
        List<Tree<String>> build = TreeUtil.<TreeNode, String>build(nodeList, "0", treeNodeConfig,
                (treeNode, tree) -> {
                    tree.setId((String) treeNode.getId());
                    tree.setParentId((String) treeNode.getParentId());
                    tree.setName(treeNode.getName());

                    //这里的putAll与put的区别:put将之前需要给前端的其他字段封装成Map,进行多嵌套了一成
                    tree.putAll(treeNode.getExtra());
                    //tree.put("open_function",treeNode.getExtra());
                });

        return build;


    }


}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【应用层】- HTTP协议

目录 HTTP简介 认识URL 协议方案名 登录信息&#xff08;认证&#xff09; 服务器地址 服务器端口号 带层次的文件路径 查询字符串 片段标识符 urlencode和urldecode urlencode编码工具 HTTP协议格式 HTTP请求协议格式 如何将有效载荷跟HTTP报头进行分离&#xff…

应急响应-linux挖矿病毒的实战处置

0x01 服务器现状分析 客户描述服务器卡顿&#xff0c;切通过搜索引擎进去该官网跳转非法页面&#xff0c;但本地访问无异常 0x02 信息收集 通过进程占用情况cpu功率拉满&#xff0c;确定被植入挖矿病毒文件 qq 且存在计划任务update.sh&#xff1a;crontab -l 将该文件上传沙…

RabbitMQ消息队列

目录 网址&#xff1a; 一、项目准备 1.导入依赖 2.抽取工具类 配置的属性在哪里呢 二、代码编写 1.简单模式 生产者 消费者 2.Work queues工作队列模式 生产者 消费者1 消费者2 3.Publish/Subscribe发布与订阅模式 生产者 消费者1 消费者2 4.Routing路由模式…

伦敦金费用有哪几方面?

通常在网上开设伦敦金投资账户是没有成本的&#xff0c;而它交易的费用&#xff0c;主要是由点差和过夜利息&#xff08;仓息&#xff09;构成。如果伦敦金投资者只是做短线的日内交易&#xff0c;做一手完整的100盎司的标准合约&#xff0c;需要支付大约50美元点差费用&#x…

备忘录模式(C++)

定义 在不破坏封装性的前提下&#xff0c;捕获一-个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 应用场景 ➢在软件构建过程中&#xff0c;某些对象的状态在转换过程中&#xff0c;可能由于某种需要&#xff0c;要…

【vim 学习系列文章 4 - vim与系统剪切板之间的交互】

文章目录 背景1.1.1 vim支持clipboard 检查1.1.2 vim的寄存器 上篇文章&#xff1a;【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】 背景 从vim中拷贝些文字去其它地方粘贴&#xff0c;都需要用鼠标选中vim的文字后&#xff0c;Ctrlc、Ctrlv&#x…

回归决策树模拟sin函数

# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…

以公益之行,筑责任之心——2023年中创算力爱心公益助学活动

捐资助学是一项功在当代、利在千秋的义举。 高考录取工作已经开始&#xff0c;一张张高校录取通知书也陆续送达各位准大学生手中。当他们怀揣着对大学的好奇与憧憬&#xff0c;准备迈进理想的大学时&#xff0c;还有一群人&#xff0c;他们渴望知识&#xff0c;却因经济困难而…

直播招聘小程序解决方案

项目开发愿景 介绍工作拿佣金&#xff0c;Boss直播现真身。做为直播招聘的新平台&#xff0c;让求职和招聘变得更简单&#xff01;企业发布招聘视频&#xff0c;展现公司环境与实力&#xff0c;开通会员可以直播招聘、在线面试功能&#xff1b;求职者刷视频可以刷到工作…

Docker与DevOps的无敌组合,引爆你的创新潜能

&#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;iOS开发上架 &#x1f4cc;本文由iOS开发上架原创&#xff01; &#x1f389;欢迎关注&#x1f50e;…

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术&#xff0c;共分七层&#xff0c; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…

Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网

解决方案&#xff1a; 以管理员模式打开命令行&#xff0c;输入&#xff1a;netsh winsock reset &#xff0c;然后重启电脑 如果还不行的话&#xff0c; 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可

docker solr-8.11.2安装部署

历史背景 现在solr官网仅能够下载到最新版本的安装包。并且支持docker。现在就用docker来部署一下 1、准备工作 docker环境部署&#xff08;这个自己百度一下哈&#xff0c;很简单两个命令就能解决&#xff09; yum -y install yum-utils yum -y install docker-ce 安装命令…

【Spring Boot】(二)Spring Boot 配置文件的探索之旅

文章目录 前言一、配置文件的作用二、配置文件的格式2.1 Spring Boot 配置文件格式2.2 properties 和 yml 的区别 三、properties 配置文件3.1 properties 基本语法3.2 配置文件的读取3.3 properties 优缺点分析 四、yml 配置文件说明4.1 yml 基本语法4.2 yml 使用案例4.3 yml …

《硅基物语.我是灵魂画手》一本书讲透AI绘画,AIC松鼠活动第六期

《硅基物语我是灵魂画手》 当AI遇上绘画&#xff0c;会打开怎样的奇妙世界? 用ChatGPTMidjourney西出人类的灵魂与梦想 用StableDiffusionD-ID画出青春绚丽的渴望 激活每个人隐藏的绘画天赋 人人都能成为顶尖绘画大师 如果你问我对于 AI绘画的态度&#xff0c;我会告诉你…

中信银行与华为联合编制:《2023金融数据可信流通技术白皮书》

导读 中信银行与华为技术有限公司联合编制的《金融数据可信流通技术白皮书》&#xff0c;从技术、业务、管理、法律等维度探讨了金融业数据流通的现状、问题、机遇和挑战&#xff0c;并提出了一套金融业数据流通的技术解决方案。该方案基于华为OceanStor存储&#xff0c;结合…

枫叶时代:打造中国特色的传统文化IP

近年来&#xff0c;取材于传统文化的影视作品在文化产业市场受到前所未有的关注。作为一种兼具辨识度、影响力和流量变现能力的文化符号&#xff0c;影视IP既是文化产业的一个重要环节&#xff0c;也是国家文化软实力的直接体现。优秀的影视IP可以超越文字、语言、民族的障碍&a…

-bash: ./startup.sh: Permission denied解决

今天在Linux上启动Tomcat&#xff0c;结果弹出&#xff1a;-bash: ./startup.sh: Permission denied 的提示。 这是因为用户没有权限&#xff0c;而导致无法执行。用命令chmod 修改一下bin目录下的.sh权限就可以了。 在Tomcat的bin目录下 &#xff0c;输入命令行 &#xff1a;c…

使用Python + Flask搭建web服务

示例脚本 from flask import Flask# 获取一个实例对象 app Flask(__name__)# 1、注册 app.route(/reg, methods[get]) def reg():return {code: 200,msg: reg ok!}# 2、登录 app.route(/login, methods[get]) def login():return login ok&#xff01;if __name__ __main__:…

Springboot+Easyexcel将数据写入模板文件并导出Excel

SpringbootEasyexcel将数据写入模板文件并导出Excel 一、导入依赖二、根据excel表头创建对应的实体类Pojo三、Controller类接收请求四、Service层获取待写入数据五、效果展示六、总结 一、导入依赖 <!--操作excel工具包--> <dependency><groupId>com.alibab…