后端提供树形结构数据

Posted 最小的帆也能远航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端提供树形结构数据相关的知识,希望对你有一定的参考价值。

一.简介
在项目开发中经常有需要处理树形结构的业务需求。比如具有父子关系的数据信息,而对于这种产品,在设计数据库时使用id<->parentId的结构来做。为方便前端,所以在给前端数据时,最好的做法就是把数据处理成treeJson格式。本文以公司-部门为例
以下测试基于springboot框架
二.关键代码
DepartEntity 公司-部门实体类

@Data
@TableName("sys_depart")
public class DepartEntity {
    private Integer departId;
    private String departName;
    /**
     * 顶层(公司)- company 时值为0或者null
     */
    private Integer parentId;
    /**
     * 顶层(公司)- company 次级(部门) department
     */
    private String type;
    /**
     * 该属性返回数据时使用
     */
    private List<DepartEntity> children;
}

获取树形结构方法(使用jdk8 新方法,简化代码)


private List getDepartmentTree(List list) {

<Map> groupMap = list.stream().collect(Collectors.groupingBy(DepartEntity::getType));

List companyList = groupMap.get("company");

List departmentList = groupMap.get("department");

if (companyList !=null && !companyList.isEmpty()) {

if (departmentList !=null && !departmentList.isEmpty()) {

<Map> departGroupMap = departmentList.stream().collect(Collectors.groupingBy(DepartEntity::getParentId));

for (DepartEntity company : companyList) {

company.setChildren(departGroupMap.get(company.getDepartId()));

}

}

return companyList;

}

return new ArrayList<>();

}

三.测试(数据自己造的,实际需要从数据库表中查询)

 @GetMapping("/tree/list")
    @ResponseBody
    public List<DepartEntity> testTree() {
        DepartEntity depart1 = new DepartEntity();
        depart1.setDepartId(1);
        depart1.setDepartName("公司");
        depart1.setParentId(0);
        depart1.setType("company");
        DepartEntity depart2 = new DepartEntity();
        depart2.setDepartId(2);
        depart2.setDepartName("财务部");
        depart2.setParentId(1);
        depart2.setType("department");
        DepartEntity depart3 = new DepartEntity();
        depart3.setDepartId(2);
        depart3.setDepartName("项目部");
        depart3.setParentId(1);
        depart3.setType("department");
        ArrayList<DepartEntity> list = new ArrayList<>();
        list.add(depart1);
        list.add(depart2);
        list.add(depart3);
        return getDepartmentTree(list);
    }

四.工具测试(使用Apifox测试 使用方式和postman相似)

treeJson格式数据

[
    {
        "departId": 1,
        "departName": "公司",
        "parentId": 0,
        "sort": null,
        "type": "company",
        "status": null,
        "createTime": null,
        "children": [
            {
                "departId": 2,
                "departName": "财务部",
                "parentId": 1,
                "sort": null,
                "type": "department",
                "status": null,
                "createTime": null,
                "children": null
            },
            {
                "departId": 2,
                "departName": "项目部",
                "parentId": 1,
                "sort": null,
                "type": "department",
                "status": null,
                "createTime": null,
                "children": null
            }
        ]
    }
]

 

以上是关于后端提供树形结构数据的主要内容,如果未能解决你的问题,请参考以下文章

后端返回树形结构太多,查找起来麻烦,对树形结构实现搜索显示

(记录贴)java后端---树形结构点击节点出现相关统计信息

element-ui树形控件(利用递归把后端数据转换成树形)

系统管理之组织机构树形化结构优化篇

飘乙己:List转Tree有4种写法!

飘乙己:List转Tree有4种写法!