获取组织机构树

转载地址:https://blog.csdn.net/weixin_38492276/article/details/100066926
一、数据表设计

在这里我需要说明一下,在看一些开源项目的时候,先不要直接去一头栽到代码里去,那样通常会是雾里探花,研究一番,就把自己搞成了丈二和尚了,所以我一般是会先去看数据表,从业务入手,下一步就去看POM文件 。

我在数据库里面建立了dept(部门表),为了测试方便,我在这里只建了五个字段 。
在这里插入图片描述

org_id (部门id) org_name (部门名称) parent_id (父id)sort(排序) create_date(创建时间)

二、由于此业务简单,所以我们就不看pom文件了,也无非就是spring-boot核心包,mysql、mybatis核心包。我们之间看业务。

建立和数据表对应的实体 。

package com.zed.zd.pojo.dept;
 
import java.util.List;
 
/**
 *  @author: shenaiguo
 *  @Date:    
 *  @Description:
 */ 
public class Dept {
    private int orgId;
    private String orgName;
    private int parentId;
    private int sort;
    private List<Dept> children;
 
    public List<Dept> getChildren() {
        return children;
    }
 
    public void setChildren(List<Dept> children) {
        this.children = children;
    }
 
    public int getOrgId() {
        return orgId;
    }
 
    public void setOrgId(int orgId) {
        this.orgId = orgId;
    }
 
    public String getOrgName() {
        return orgName;
    }
 
    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }
 
    public int getParentId() {
        return parentId;
    }
 
    public void setParentId(int parentId) {
        this.parentId = parentId;
    }
 
    public int getSort() {
        return sort;
    }
 
    public void setSort(int sort) {
        this.sort = sort;
    }
}

三、控制层

package com.zed.zd.controller.dept;
 
import com.zed.zd.pojo.dept.Dept;
import com.zed.zd.service.dept.IdeptService;
import com.zed.zd.service.exam.IExamInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
 
import java.util.List;
import java.util.Map;
 
@RestController
@RequestMapping("/dept")
public class DeptController {
 
    @Autowired
    private IdeptService deptService;
 
 
    @GetMapping("/getTreeDept")
    public List<Dept> getTreeDept(){
        List<Dept> depts=deptService.getRootDept(0);
        return deptService.getTreeDept(depts);
    }
}

在这里需要说明一下,

1、由于直接获取那棵树,所以什么都不需要传。

2、这里需要指定一下根节点的 parent_id ,这里就指定为0。

四、服务层。

一、接口

package com.zed.zd.service.dept;
 
 
import com.zed.zd.pojo.dept.Dept;
 
import java.util.List;
 
public interface IdeptService {
 
 
    List<Dept> getTreeDept(List<Dept> depts);//获取树状结构的部门
    List<Dept> getRootDept(int parentId );//利用父id进行查询部门
}

二、实现类

package com.zed.zd.service.dept.impl;
 
import com.zed.zd.mapper.dept.DeptMapper;
import com.zed.zd.pojo.dept.Dept;
 
 
import com.zed.zd.service.dept.IdeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
 
import java.util.List;
 
 
@Service
public class DeptServiceImpl   implements IdeptService {
 
    @Autowired
    private DeptMapper deptMapper;
    @Override
    public List<Dept> getTreeDept(List<Dept> depts) {
 
        for (Dept d:depts){
            List<Dept> depts1 =deptMapper.getchildrenDept(d.getOrgId());
            d.setChildren(depts1);
            getTreeDept(depts1);
        }
        return depts;
    }
 
    @Override
    public List<Dept> getRootDept(int id) {
        return deptMapper.getRootDept(id);
    }
}

其实这里的核心代码getTreeDept就是这块,通过递归实现。

1、遍历父节点为0的部门,也就是根节点。

2、通过部门id,获取所有在父节点为0的部门,也就是所有根节点的一级子节点(孩子节点)。

3、把孩子节点放到该部门的孩子节点属性上。

4、通过递归调用以此类推实现整个树的遍历。

五、mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zed.zd.mapper.dept.DeptMapper">
    <select id="getRootDept" resultType="com.zed.zd.pojo.dept.Dept">
        select * from dept where parent_id= #{id}
    </select>
    <select id="getchildrenDept" resultType="com.zed.zd.pojo.dept.Dept">
        select * from dept where parent_id= #{orgId}
    </select>
</mapper>

相信聪明的你,一定会看懂,在这里就不在赘述了。

六、好了,万事俱备只欠东风, 下面我们有请我们今天最后一个主角闪亮登场。postman,没错,他此时一定会想,别看你之前说的多玄乎。哼,不过我这关,你一起都是海市蜃楼,呵呵,还拽上成语了。

[
    {
        "orgId": 3,
        "orgName": "董事长",
        "parentId": 0,
        "sort": 1,
        "children": [
            {
                "orgId": 4,
                "orgName": "经理1",
                "parentId": 3,
                "sort": 1,
                "children": [
                    {
                        "orgId": 7,
                        "orgName": "部门1",
                        "parentId": 4,
                        "sort": 1,
                        "children": []
                    },
                    {
                        "orgId": 8,
                        "orgName": "部门2",
                        "parentId": 4,
                        "sort": 2,
                        "children": []
                    }
                ]
            },
            {
                "orgId": 5,
                "orgName": "经理2",
                "parentId": 3,
                "sort": 2,
                "children": []
            },
            {
                "orgId": 6,
                "orgName": "经理3",
                "parentId": 3,
                "sort": 3,
                "children": [
                    {
                        "orgId": 9,
                        "orgName": "技术部",
                        "parentId": 6,
                        "sort": 12,
                        "children": []
                    }
                ]
            },
            {
                "orgId": 10,
                "orgName": "技术部A经理",
                "parentId": 3,
                "sort": 33,
                "children": []
            }
        ]
    }
]

什么,你还不行,好吧,我们以事实说话。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值