Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >目录树结构

目录树结构

作者头像
在水一方
发布于 2022-06-14 07:23:58
发布于 2022-06-14 07:23:58
93500
代码可运行
举报
文章被收录于专栏:在水一方在水一方
运行总次数:0
代码可运行

实际项目中后端生成目录树的json是比较常见的,hutool中提供了treeUtil使用起来比较方便。先做个记录

通过hutool

引入hutool的jar

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.16</version>
        </dependency>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public List<Tree<String>> findOrgTreeInfoByUserCode() {
       
//获取数据  设定根节点的parentId为:0
List<OrgTreeNode> orgTreeNodes = customerBoardMapper.findOrgTrees();
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        treeNodeConfig.setChildrenKey("children");

        //可配置树深度
//        treeNodeConfig.setDeep(2);
        treeNodeConfig.setIdKey("id");
        //转换器
        List<Tree<String>> build = TreeUtil.build(treeNodesList, "0", treeNodeConfig,
                (treeNode, tree) -> {
                    tree.setId(treeNode.getId().toString());
                    tree.setParentId(treeNode.getParentId().toString());
                    tree.setName(treeNode.getName());

                });

        return build;


    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class OrgTreeNode {

    private String id;

    private String parentId;

    private String name;

    private String belongRegionId;
    private String belongRegionName;
    private List<OrgTreeNode> children = new ArrayList<>();

   
}

小测试demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @GetMapping("menu")
   public String getTreeMenu(){
       List<Menu> list = helloService.findMenu();
       List<Menu> result =new ArrayList<>();
        Map<Integer, Menu> menuMap = new HashMap<>();

       for(Menu menu:list){

           if(menu.getParentId()==0){
               Menu menu1 =new Menu();
                menu1.setId(menu.getId());
                menu1.setName(menu.getName());
               result.add(menu1);
               menuMap.put(menu.getId(), menu1);

           }else{
               if(menuMap.containsKey(menu.getParentId())){
                   Menu menu2 = new Menu();
                   menu2.setId(menu.getId());
                   menu2.setParentId(menu.getParentId());
                   menu2.setName(menu.getName());
                   menuMap.get(menu.getParentId()).getChildren().add(menu2);
                   menuMap.put(menu.getId(), menu2);

               }

           }
       }
       return JSON.toJSONString(result);
   }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class Menu {

    private Integer id;
    private Integer parentId;
    private String name;
    private List<Menu> children = new ArrayList<>();


}

效果展示(这里的排序还需要处理)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{
	"children": [{
		"children": [{
			"children": [],
			"id": 133,
			"name": "添加配置",
			"parentId": 24
		}, {
			"children": [],
			"id": 134,
			"name": "添加配置",
			"parentId": 24
		}],
		"id": 24,
		"name": "配置管理",
		"parentId": 8
	}, {
		"children": [{
			"children": [],
			"id": 132,
			"name": "日志删除",
			"parentId": 25
		}],
		"id": 25,
		"name": "日志管理",
		"parentId": 8
	}, {
		"children": [{
			"children": [],
			"id": 119,
			"name": "查看",
			"parentId": 45
		}, {
			"children": [],
			"id": 126,
			"name": "新增",
			"parentId": 45
		}, {
			"children": [],
			"id": 127,
			"name": "修改",
			"parentId": 45
		}, {
			"children": [],
			"id": 131,
			"name": "禁用启用",
			"parentId": 45
		}],
		"id": 45,
		"name": "用户管理",
		"parentId": 8
	}, {
		"children": [{
			"children": [],
			"id": 115,
			"name": "查看",
			"parentId": 46
		}, {
			"children": [],
			"id": 116,
			"name": "新增",
			"parentId": 46
		}, {
			"children": [],
			"id": 117,
			"name": "修改",
			"parentId": 46
		}, {
			"children": [],
			"id": 118,
			"name": "删除",
			"parentId": 46
		}],
		"id": 46,
		"name": "菜单管理",
		"parentId": 8
	}, {
		"children": [{
			"children": [],
			"id": 120,
			"name": "查看",
			"parentId": 47
		}, {
			"children": [],
			"id": 128,
			"name": "新增",
			"parentId": 47
		}, {
			"children": [],
			"id": 129,
			"name": "修改",
			"parentId": 47
		}, {
			"children": [],
			"id": 130,
			"name": "删除",
			"parentId": 47
		}],
		"id": 47,
		"name": "角色管理",
		"parentId": 8
	}, {
		"children": [],
		"id": 48,
		"name": "组织管理",
		"parentId": 8
	}],
	"id": 8,
	"name": "系统管理"
}]

说明

JSON.toJSONString(result);需要引入fastjson的jar

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hutool-树结构使用笔记
腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云GTS官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧 。
无敌小菜鸟
2022/01/26
2.4K0
hutool-树结构使用笔记
业务实战中用到树结构
Dlimeng
2023/06/30
1310
目录树设计与实现(树状Json数据)
目录树主要采用parentId的方式来标识父节点,根据网上关于树结构的分析,几种方式各有优劣,无外乎都是根据不同的场景。如果对于查询比较多的业务场景则采用这种方式的效率更高一点,频繁的CURD 可以采用左右孩子节点的方式,省去了递归,下面是关于目录树的完整实现过程,如果有问题,欢迎小伙伴评论区留言!
CodeWwang
2022/08/24
1.1K0
Daily-Blog项目后台日志
使用@ApiOperation(value = "友链评论列表",notes = "获取一页友链评论")来进行标注
用户11097514
2024/05/30
3220
Daily-Blog项目后台日志
Java实现递归查询树结构
        我们在实际开发中,肯定会用到树结构,如部门树、菜单树等等。Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。今天,咱们就来说说怎么样将List集合转换成TreeList。
军军不吃鸡
2022/12/02
2.7K0
Java 遍历之树形菜单
思路:首先找根节点(一般都是判断parentId 为null 或者 isEmpty()或者equals("xx")),找到根节点后循环根节点,遍历找出根节点对应的子节点一直找到最后一个节点。没有则遍历下一个根节点。
赵哥窟
2021/05/17
4K0
Java 遍历之树形菜单
使用Java实现树形下拉菜单:从零开始到完全掌握
大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。
默 语
2024/11/25
1180
使用Java实现树形下拉菜单:从零开始到完全掌握
Hutool工具包-常用开发工具类(让代码更简洁)
冬天vs不冷
2025/01/20
2780
Hutool工具包-常用开发工具类(让代码更简洁)
LayUI树形表格treetable使用详解
LayUI是现在比较流行的一款前端框架,也有很多人基于LayUI开发了很多不错的组件,比如treetable树形表格。因为treetable是第三方基于LayUI开发的,所以需要先用Layui引入一下文件。
全栈程序员站长
2022/07/01
8.9K1
LayUI树形表格treetable使用详解
Spring boot整合shiro权限管理
apache shiro: https://shiro.apache.org/ Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 shiro的三个核心组件: Subject, SecurityManager 和 Realms。   Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三
二十三年蝉
2018/05/30
4.7K0
Java8编程小技巧,提高代码效率100%!超级实用!
大家好,我是小义,今天分享几个Java8编程小技巧,提高代码逼格,写出优雅代码,让同事看了也直呼内行。
程序员小义
2024/05/20
1780
Java8编程小技巧,提高代码效率100%!超级实用!
【编程】给定一个部门,变量出当前部门的所有父部门包含当前部门
给定一个部门,输出当前部门的所有父部门及其自己。如下图: 分析: 1:如果直接就是一级部门,直接返回; 2:如果不是一级部门,就递归查询。同样需要注意去重 代码: public class AllParentDepartment {     public static void main(String[] args) {         AllParentDepartment allDepartment = new AllParentDepartment();         List<Depart
凯哥Java
2022/12/16
4010
【编程】给定一个部门,变量出当前部门的所有父部门包含当前部门
java解析任意层的json数据(递归解析) 原
/** * JSONObject解析方法(可以解析任意层json,采用递归解析的方法) * @param objJson * @param menu 父菜单实体类 * @param list List<Menu>集合 * @return */ @SuppressWarnings("rawtypes") public static List<Menu> analysisJson(Object objJson,Menu menu,List<Menu> list) { // 如果ob
wuweixiang
2018/08/14
3.2K0
BeanTree
https://gitee.com/dromara/hutool/pulls/884
阿超
2022/12/05
1780
SpringBoot + Mybatis-Plus构建树形结构的几种方式
在实际开发中,很多数据都是树形结构,例如:地区、页面上的菜单、上下级关系的组织等等,这时就需要我们从数据源中读取到数据,通过某些方式拼成树形结构 然后再给前端展示。对于一些不经常变化且使用频繁的数据,可以考虑将拼好的树形结构数据放入缓存,每次用的时候直接读取出来就可以使用。
鱼找水需要时间
2023/08/20
2K0
SpringBoot + Mybatis-Plus构建树形结构的几种方式
树状结构数据
注意,这里的方法都是基于TreeNode类的简单实现,实际使用时可能需要根据你的具体业务逻辑进行调整。例如,节点的唯一标识可以是其他类型而非int,树的遍历可以使用递归或非递归方式等。
收心
2023/12/19
2180
三种构建树形结构!!Stream牛逼
PS:个人还是比较倾向用Stream流构建树形结构,节省代码量还通俗易懂!!!Stream在实际开发过程中,运用得体的话,既能节省代码量,还能提高效率,但是复杂的流式处理数据也会让代码看起来不易理解!
小熊学Java
2023/07/16
6920
三种构建树形结构!!Stream牛逼
10.10.10.1可以设置为网关吗_个人如何做跨境电商
注:product/category路径的/会被替换为product-category 3.在src/views/modules下新建product商品文件夹,然后创建category.vue文件
全栈程序员站长
2022/09/19
9250
10.10.10.1可以设置为网关吗_个人如何做跨境电商
Lombok快速入门
为什么说Lombok可以使代码更简洁、可以消除冗长代码呢?我们来拿lombok官网的一个例子来说:
端碗吹水
2020/09/23
1.1K0
Lombok快速入门
Spring Boot+Vue3 动态菜单实现思路梳理
「松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。」 ---- 关于 Spring Boot + Vue3 的动态菜单,松哥之前已经写了两篇文章了,这两篇文章主要是从代码上和大家分析动态菜单最终的实现方式,但是还是有小伙伴觉得没太看明白,感觉缺乏一个提纲挈领的思路,所以,今天松哥再整一篇文章和大家再来捋一捋这个问题,希望这篇文章能让
江南一点雨
2022/07/18
1.2K0
Spring Boot+Vue3 动态菜单实现思路梳理
相关推荐
hutool-树结构使用笔记
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文