好久没有更新博客了,前段时间也是一直忙的房子的事情和换工作的事情,也是忙的不亦乐乎。好在现在一切都理顺了,好了,回归到正题,回归到今天的主题。利用递归实现组织机构显示。因为此业务场景非常普遍,如组织机构,多级菜单,反正是涉及到树形结构的业务场景不胜枚举。所以,自己把这核心的代码和思路共享出来,供其他小伙伴和自己共同去学习。
基础环境 :springboot+mybatis、mysql
测试环境: Navicat、postman。
关于如何构建springboot+mybatis网上的资料很多,我在之前的博客也写过,在这里不在赘述。我们直奔主题。
一、数据表设计
在这里我需要说明一下,在看一些开源项目的时候,先不要直接去一头栽到代码里去,那样通常会是雾里探花,研究一番,就把自己搞成了丈二和尚了,所以我一般是会先去看数据表,从业务入手,下一步就去看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
children; public List getChildren() { return children; } public void setChildren(List 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
getTreeDept(){ List 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
getTreeDept(List depts);//获取树状结构的部门 List 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
getTreeDept(List depts) { for (Dept d:depts){ List depts1 =deptMapper.getchildrenDept(d.getOrgId()); d.setChildren(depts1); getTreeDept(depts1); } return depts; } @Override public List getRootDept(int id) { return deptMapper.getRootDept(id); } }
其实这里的核心代码getTreeDept就是这块,通过递归实现。
1、遍历父节点为0的部门,也就是根节点。
2、通过部门id,获取所有在父节点为0的部门,也就是所有根节点的一级子节点(孩子节点)。
3、把孩子节点放到该部门的孩子节点属性上。
4、通过递归调用以此类推实现整个树的遍历。
五、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": []
}
]
}
]
什么,你还不行,好吧,我们以事实说话。
注意核对清楚啊,哇。。。。。。此时有响起来,那热烈的掌声,久久不能平静。。。。。。