Java 树形结构数据如何高效返回给前端进行展示?

news2024/11/23 21:19:25

在开发过程中我们总是遇到一些具有层次结构的数据,这些数据在前端也总是需要以树形结构进行显示,那么后端接口如何高效的去将这些数据封装成树形结构呢?下面来进行解析讲解。 

  • 最终实现的一个结果图

 

  • 设计返回的实体VO

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;

@Schema(description = "知识库管理- 知识字典 - Response VO")
@Data
@EqualsAndHashCode(callSuper = false)
public class KnowledgeBaseDictTreeResVO implements Serializable {
    @Schema(description = "主键id")
    private Long id;

    @Schema(description = "父级菜单id")
    private Long parentId;

    @Schema(description = "父级菜单名称")
    private String parentMenuName;

    @Schema(description = "菜单名称")
    private String menuName;

    @Schema(description = "菜单层级:1:一级菜单;2:二级菜单;3:三级菜单;4:四级菜单;")
    private Integer menuLevel;

    @Schema(description = "归属系统")
    private String belongingSystem;

    @Schema(description = "排序序号")
    private Integer sort;

    @Schema(description = "创建时间")
    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) //jsonstring
    @DateTimeFormat(pattern =FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND ) //querystri
    private LocalDateTime createTime;

    @Schema(description = "子集")
    List<KnowledgeBaseDictTreeResVO> children;

}
  • Controller层代码

@PostMapping("/getKnowledgeBaseDictTreeList")
    @Operation(summary = "获取知识字典树形列表")
    @PreAuthorize("@ss.hasPermission('knowledgebase:problem:knowledgeBaseDict:list')")
    public CommonResult<List<KnowledgeBaseDictTreeResVO>> getKnowledgeBaseDictTreeList(@Valid @RequestBody KnowledgeBaseDictQueryReqVO reqVO) {
        return CommonResult.success(knowledgeBaseDictService.getKnowledgeBaseDictTreeList(reqVO));
    }
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Schema(description = "知识字典树形列表查询参数 - Request Search VO")
@Data
public class KnowledgeBaseDictQueryReqVO {

    @Schema(description = "菜单名称")
    private String menuName;

    @Schema(description = "归属系统名称")
    private String belongingSystemName;

    @Schema(description = "归属系统id")
    private Long belongingSystemId;


}
  • Service层代码

@Override
    public List<KnowledgeBaseDictTreeResVO> getKnowledgeBaseDictTreeList(KnowledgeBaseDictQueryReqVO reqVO) {
        // 先查询所有顶层级结构
        List<KnowledgeBaseDictDO> kbddoTopList = knowledgeBaseDictMapper.getKnowledgeBaseDictTopLevel(reqVO);
        List<KnowledgeBaseDictTreeResVO> kbdtrvList = KnowledgeBaseDictConvert.INSTANCE.convert(kbddoTopList);
        // 查询所有知识字典数据
        List<KnowledgeBaseDictDO> allList = knowledgeBaseDictMapper.getKnowledgeBaseDictAllList(reqVO);
        List<KnowledgeBaseDictTreeResVO> allkbdtrvList = KnowledgeBaseDictConvert.INSTANCE.convert(allList);
        List<KnowledgeBaseDictTreeResVO> result = new ArrayList<>();
        for (KnowledgeBaseDictTreeResVO kbddoTop : kbdtrvList) {
            result.add(getTreeChildren(kbddoTop,allkbdtrvList));
        }
        return result;
    }

核心实现如下: 

/**
     * 递归获取子级菜单
     * @param vo 父级菜单
     * @param list 所有菜单
     * @return
     */
    private KnowledgeBaseDictTreeResVO getTreeChildren(KnowledgeBaseDictTreeResVO vo,List<KnowledgeBaseDictTreeResVO> list){
        List<KnowledgeBaseDictTreeResVO> childrenList = new ArrayList<>();
        for(KnowledgeBaseDictTreeResVO otv : list){
            if (vo.getId().equals(otv.getParentId())) {
                childrenList.add(getTreeChildren(otv,list));
            }
        }
        vo.setChildren(childrenList);
        return vo;
    }

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

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

相关文章

PTA—C语言期末复习(选择题)

1. 按照标识符的要求&#xff0c;&#xff08;A&#xff09;不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中&#xff0c;标识符通常由字母&#xff08;包括大写和小写&#xff09;、数字和下划线组成&#xff0c;但不能以数字开头&#xff0c…

聚类算法(3)---K-means 算法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…

firewalld(1)基本原理

简介 Firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,数据包过滤机制(Netfilter)有两个软件:firewalld与iptables。也就是说firewalld…

高德地图获取key值步骤

1、创建新应用 进入控制台&#xff08;https://lbs.amap.com/dev/&#xff09;&#xff0c;创建一个新应用。 如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上分别填写key名称、选择服务平台、SHA1、以及PackageName SHA1:是在安卓…

java实现双线性映射

1.目录结构 2.导包 将jpbc-api-2.0.0.jar和jpbc-plaf-2.0.0.jar导入到java项目中 网盘链接&#xff1a;链接: https://pan.baidu.com/s/1lFLXQj8v_EhL9KZYaaRv1w?pwde8db 提取码: e8db 3.编写代码 a.properties type a q 878071079966331252243778198475404981580688319941…

MSA 助力实验室测量更稳定、更准确

在汽车制造、石油化工、电子制造等行业,产品的质量和性能需要通过准确的测量来保证。但是由于测量设备的误差、操作人员的主观影响以及环境条件的干扰等因素会导致测量系统出现各种问题,且这些问题会导致测量结果不准确,从而影响产品质量。 随着工业信息化的迅速发展, 各行业对…

串口通信中字符和16进制显示的区别分析,串口发送数据

分析的原因 在对串口传送数值时&#xff0c;不想再进行一步字符转化&#xff0c;想要直接传送数值。但查看时就需要以16进制的数值形式查看数据&#xff0c;否则将不能看到正确的数据显示 下图是对串口寄存器发送一个16bit位的数据 void uart0Senduint16(UINT16 dat){SBUFdat…

使用Python Selenium,动态网页不再是难题!

目录 1、直接执行JS代码 🌐 1.1 execute_script基础用法 1.2 带参数执行JS函数 1.3 获取执行结果 2、使用execute_async_script异步执行 🔄 2.1 适用场景分析 2.2 实现异步操作示例 2.3 错误处理与调试技巧 3、JS与页面元素交互 👤 3.1 修改DOM属性 3.2 触发事…

KVM性能优化之磁盘IO优化

方法一&#xff1a;通过直接在XML里定义&#xff1a; 1.磁盘类型选择 <target devsda busscsi/> PS:virti0模式读写低于sata和SCSI模式&#xff0c;SCSI模式最高&#xff0c;大数据集建议使用SCSI 2.缓存模式选择 <driver nameqemu typeqcow2 cachenone/> 加上…

webpack+webpack server入门

​ 1.webpack介绍 webpack是一个模块加载器兼打包工具。它是以 commonJS 的形式来书写脚本的&#xff0c;但对 AMD/CMD 的支持也很全面&#xff0c;方便旧项目进行代码迁移。支持对react热插拔。 2.安装&#xff08;使用淘宝镜像&#xff09; 全局安装 cnpm install webpa…

同三维T700转换器 USB转HDMI转换器

让USB摄像头变成HDMI输出&#xff0c;支持4K60输出 一、产品简介&#xff1a; 此转换器可以把USB信号转成HDMI信号&#xff0c;支持4K60 HDMI输出&#xff0c;有效解决了USB摄像头连接电视、显示器、导播台的问题&#xff0c;带USB控制口&#xff0c;可升级/接蓝牙接收器&#…

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

停更公告

由于csdn越来越流氓了&#xff0c;我永久停更&#xff0c;专注于网站建设&#xff08;亚运奥运素材网&#xff09;qdhca.asiahttp://qdhca.asia/

一招教你搞定Windows系统指定IP不变[固定IP地址方法]

1.打开控制面板&#xff0c;找到“网络和Internet” 点击进入&#xff1a; 2.点击打开“网络和共享中心”后&#xff0c;选择“更改适配器选项”。 3.点击 “查看此连接的状态”&#xff0c; 接着点击“详细信息” 查看信息。记录当前的IP地址是 10.88.x.xx&#xff0c;后面我们…

第一视角:获取VC账号,是成为亚马逊供应商的全面准备与必要条件

在当今全球化、数字化的商业环境中&#xff0c;亚马逊作为全球最大的电子商务平台&#xff0c;为众多企业提供了无限的商业机会。然而&#xff0c;想要成功在亚马逊上立足&#xff0c;成为其优质供应商&#xff0c;并非易事。其中&#xff0c;VC(Vendor Central)账号&#xff0…

提高接口响应

1. 简介 接口响应慢会直接影响用户体验和降低业务效率。为了有效应对这一问题&#xff0c;合理使用多线程技术成为了一种高效的解决方案。通过将独立的任务分配给不同的线程进行并行处理&#xff0c;我们可以充分利用系统资源&#xff0c;避免单一任务阻塞整个系统&#xff0c…

【十】【QT开发应用】QT中文乱码解决方案

QT中文乱码解决方案 粘贴代码导致的乱码 粘贴别人的代码时,在记事本里面"过一遍",然后再粘贴到QTCreator 使用u8 配置QT 不使用QT使用VS QT自选编码格式 结尾 最后&#xff0c;感谢您阅读我的文章&#xff0c;希望这些内容能够对您有所启发和帮助。如果您有任何问…

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会

6月22日&#xff0c;2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕&#xff0c;泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司&#xff08;NASDAQ:LIDR&#xff09;及光电器件规模化量产巨头Accelight Technologies&#xff…

ASM插桩——动态添加字段并生成get set 方法

1 首先创建一个实体类Student. 代码如下 package com.org.xcyz.asm;public class Student {private int id;private String name;private boolean sex;public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public…