组织树查询-Jvava实现(递归)

yizhihongxing

1.首先查询出组织机构

就是一个简单的查询

List<Dept> deptList = mapper.getDeptList();
        Map<Long, OrgNode> nodeMap = new HashMap<>();
        List<Long> rootIds = new ArrayList<>();
        for (Dept dept : deptList) {
            Long deptId = dept.getDeptId();
            String name = dept.getDeptName();
            Long parentId = dept.getParentId();
            OrgNode node = nodeMap.computeIfAbsent(deptId, OrgNode::new);
            node.setId(deptId);
            node.setLabel(name);
            node.setParentId(parentId);

            if (parentId == 0) {
                rootIds.add(deptId);
            } else {
                OrgNode parent = nodeMap.computeIfAbsent(parentId, OrgNode::new);
                parent.getChildren().add(node);
            }
        }
        // 3. 输出组织机构
        List<OrgNode> orgList = new ArrayList<>();
        for (long rootId : rootIds) {
            orgList.add(nodeMap.get(rootId));
        }
        List<Map<String, Object>> result = dfs2(orgList);

2.def2方法,只查询两级

业务需要

/**
     * 只查询两级
     * @param nodes
     * @return
     */
    private static List<Map<String, Object>> dfs2(List<OrgNode> nodes) {
        List<Map<String, Object>> result = new ArrayList<>();
        for (OrgNode node : nodes) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", node.getId());
            map.put("label", node.getLabel());
            map.put("parentId", node.getParentId());
            List<OrgNode> children = node.getChildren();
            if (children != null && !children.isEmpty()){
                List<OrgNode> collect = children.stream().peek(s -> s.setChildren(null)).collect(Collectors.toList());
                map.put("children", collect);
            }
            result.add(map);
        }
        return result;
    }

效果

组织树查询-Jvava实现(递归)

查询所有级别递归查询


/**
     * 查询所有组织树
     * @param nodes
     * @return
     */
    private static List<Map<String, Object>> dfs(List<OrgNode> nodes) {
        List<Map<String, Object>> result = new ArrayList<>();
        for (OrgNode node : nodes) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", node.getId());
            map.put("label", node.getLabel());
            map.put("parentId", node.getParentId());
            List<OrgNode> children = node.getChildren();
            if (children != null && !children.isEmpty()) {
                map.put("children", dfs(children));
            }
            result.add(map);
        }
        return result;
    }

3.前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>树形控件</title>
    <script src="js/vue.js"></script>
    <script src="element-ui/lib/index.js"></script>
    <script src="js/axios-0.18.0.js"></script>
    <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
</head>
<body>
<div id="app">
    <el-tree
            :data="data"
            show-checkbox
            default-expand-all
            node-key="id"
            ref="tree"
            highlight-current
            :props="defaultProps"
            @check-change="handleCheckChange"
            :indent="20"
    >
    </el-tree>
    <el-button @click="getCheckedNodes">通过 node 获取</el-button>
</div>



<script>
    new Vue({
        el:"#app",
        methods:{
            getCheckedNodes(){
              console.log("打印选中结果:"+this.selectedNodeData)
            },
            handleCheckChange(data, targetNode){
                let checkedNodes = this.$refs.tree.getCheckedNodes() // 获取所有选中的节点数据
                // console.log('当前选中的节点:', checkedNodes)
                // 获取选中节点的 ID 列表
                let checkedNodeIds = checkedNodes.map(node => {
                    return node.id
                })
                this.selectedNodeData=checkedNodeIds;
                console.log('当前选中的节点 ID 列表:', this.selectedNodeData)
            },
            getNodeIds(node, ids) {
                // 处理当前节点的 ID
                ids.push(node.id)

                // 处理所有子节点的 ID
                for (let child of node.children) {
                    this.getNodeIds(child, ids)
                }
            },
            getList(){
                axios.get('http://localhost:8081/brand_case/dao.do?method=list_tree').then( res=>{
                        this.data=res.data.data
                    }
                )
            }
        },
        created(){
            this.getList();
        },
        data(){
            return{
                selectedNodeData: [],
                data: [{
                    id: 1,
                    label: '一级 1',
                    children: [{
                        id: 4,
                        label: '二级 1-1',
                        children: [{
                            id: 9,
                            label: '三级 1-1-1'
                        }, {
                            id: 10,
                            label: '三级 1-1-2'
                        }]
                    }]
                }, {
                    id: 2,
                    label: '一级 2',
                    children: [{
                        id: 5,
                        label: '二级 2-1'
                    }, {
                        id: 6,
                        label: '二级 2-2'
                    }]
                }, {
                    id: 3,
                    label: '一级 3',
                    children: [{
                        id: 7,
                        label: '二级 3-1',
                        children: [{
                            id: 7-1,
                            label: '二级 3-1-1'
                        }]
                    }, {
                        id: 8,
                        label: '二级 3-2'
                    }]
                }],
                defaultProps: {
                    children: 'children',
                    label: 'label'
                }
            }
        }
    })
</script>
</body>
</html>

原文链接:https://www.cnblogs.com/sy2022/p/17333039.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:组织树查询-Jvava实现(递归) - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月19日

相关文章

  • Mybatis如何自动生成数据库表结构总结

    Mybatis是一个优秀的ORM框架,除了提供了常见的ORM操作外,还可以通过它的Generator来实现数据库表结构的自动生成。 步骤一:配置GeneratorConfig.xml文件 在项目的Java包下创建config文件夹,并在其中新建一个GeneratorConfig.xml(文件名不一定要求)文件,用于配置自动生成的相关信息。 <?xml …

    Java 2023年5月19日
    00
  • MyBatis一对一映射初识教程

    MyBatis一对一映射初识教程 什么是一对一映射? 一对一映射是ORM框架MyBatis中非常重要的概念之一。顾名思义,一对一映射就是一张表中的一行数据与另一张表中的一行数据建立一一对应的关系,也就是说我们从这两张表中查到的数据都是一对一的。在MyBatis中,实现一对一映射的方式是通过两个实体类之间的关联关系来完成的。 一对一映射的实现 在MyBatis…

    Java 2023年5月20日
    00
  • 如何使用Java Instrumentation API?

    如何使用Java Instrumentation API Java Instrumentation API是Java平台提供的一个高级工具,用于在运行时修改或监视Java应用程序的字节码。具体来说,Instrumentation API允许我们在JVM启动应用程序之前动态地修改类定义和字节码。这使得我们能够增强应用程序的功能,例如在应用程序执行过程中收集性能…

    Java 2023年5月11日
    00
  • 一篇文章带你了解如何正确使用java线程池

    一篇文章带你了解如何正确使用Java线程池 了解Java线程池的基本概念 什么是线程池? Java线程池是一种用来管理线程的机制,它可以在程序启动时预先创建一定数量的线程,然后缓存起来以供以后使用。当需要执行任务时,从线程池中获取一个线程来执行任务。执行完毕后,线程会自动归还给线程池,线程池可以复用这些线程,这样可以减少因线程创建与销毁所带来的开销。 为什么…

    Java 2023年5月18日
    00
  • Java面向对象编程之类的继承详解

    Java面向对象编程之类的继承详解 什么是继承? 继承是一种面向对象编程的重要特性,它可以让一个类(子类)拥有另一个类(父类)的所有方法和属性。 在Java中,使用关键字extends来实现继承。 继承的语法 public class ChildClass extends ParentClass { // 子类的内容 } 在以上语法中,我们定义了一个名为Ch…

    Java 2023年5月26日
    00
  • SpringBoot+SpringSecurity+jwt实现验证

    下面我会提供一个基于Spring Boot、Spring Security 和 JSON Web Token(JWT)的认证示例。 一、什么是JWT JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种简单的、自包含的方式,用于在通过网络进行传输的两个实体之间安全传递信息。它被称为自包含是因为JWT包含了所有身份验证(Aut…

    Java 2023年5月20日
    00
  • SpringBoot FreeWorker模板技术解析

    SpringBoot FreeMarker模板技术解析 什么是FreeMarker模板引擎 FreeMarker是一款基于模板的Java模板引擎,它可以将模板和数据混合在一起生成输出文本,常用于动态生成HTML,XML,电子邮件等文本。 FreeMarker的特点: 容易创建和维护模板 可以产生非常多的输出格式(HTML,XML,XHTML,PDF等等) 可…

    Java 2023年5月19日
    00
  • 线程间通信的作用是什么?

    以下是关于线程间通信作用的完整使用攻略: 线程间通信的作用 线程间通信是指多个线之间通过共享内存或消息传递等方式来实现数据的交换和调工作的过程。线程间通信的作用主要有以下几个方面: 1. 避免竞争和冲突 在线程编程中,如果多个线程同时访问共享资源,就会出现竞争和冲的情况,导致程序的不稳定不可预测性。通过线程间通,可以实现对共享资源的访问控制,避免线程之间的竞…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部