转载地址: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": []
}
]
}
]
什么,你还不行,好吧,我们以事实说话。