獲取組織機構樹

指尖改變生活發表於2020-10-13

轉載地址: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": []
            }
        ]
    }
]

什麼,你還不行,好吧,我們以事實說話。
在這裡插入圖片描述

相關文章