Java后台返回实现前端树形结构数据

Java后台如何返回实现前端树形结构数据:

1.步(必须这样写):

package com.zhecre.jx.business.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 该类为树形结构的泛型类,所有使用TreeUtil的List集合中泛型都需要继承该类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseTreeNode<T> {
    /**
     * 子Id
     */
    private String indexid;

    private String indexname;//指标名字
    /**
     * 父ID ,若parentId等于0 或者null,表示为顶级
     */
    private String parentid;
    /**
     * 子节点
     */
    private List<T> children;

}

2步:

package com.zhecre.jx.business.model.cases.response;

import com.zhecre.jx.business.common.BaseTreeNode;
import lombok.Data;

import java.util.List;

/**
 * 描述:补偿方案管理新增指标配置三级下拉
 *
 */
@Data
public class AreaInfo extends BaseTreeNode<AreaInfo> {

    private String indexid;//指标ID

    private String indexname;//指标名字

    private String  unit;

    private Double coef;

    private String parentid;//上一级指标pid


    /** 子节点 */
    private List<AreaInfo> children;



}

3.controller

@GetMapping("/compensationtree")
    public List<AreaInfo> areaInfoList(){
        //首次查所有节点数据
        List<AreaInfo> areaInfu = pasCaseService.selectAll();
        List<AreaInfo> tree = TreeUtil.getTree(areaInfu);

        return tree;

    }

4.Service

 public List<AreaInfo> selectAll();

5.serviceimpl

@Override
    public List<AreaInfo> selectAll() {
        return pasCaseMapper.selectAll();
    }

6.Mapper

 List<AreaInfo> selectAll();

7.MapperXML

<select id="selectAll" resultType="com.zhecre.jx.business.model.cases.response.AreaInfo">
        SELECT INDEXID,INDEXNAME,PARENTID,UNIT,COEF FROM PAS_INDEX  WHERE INDEXID LIKE 'IA%'
    </select>

8.工具类:

package com.zhecre.jx.business.common;

import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;


@Slf4j
public class TreeUtil {



    //java8构建树

    /**
     * 将平铺的List<T>转换成Tree
     * @param listNodes
     * @param <T>
     * @return
     */
    public static <T extends BaseTreeNode> List<T> getTree(List<T> listNodes){
//        判断当前listNodes 是否为空
        if (CollectionUtil.isNotEmpty(listNodes)){
            //根据pid分组 key 都是parentId ,value 所有的permission对象
            Map<String, List<T>> listMap = listNodes.stream().collect(Collectors.groupingBy(t -> Optional.ofNullable(t.getParentid()).orElse(String.valueOf("root"))));
            //得到一级分类,第一级pid==0

            List<T> oneLevelClassify = listMap.get("root");//最底层跟节点id
            //递归
            List<T> list = getChildList(oneLevelClassify, listMap);
            return list;
        }
        return new ArrayList<>();
    }

    /**
     * 获取子节点
     * @param classifies
     * @param groupMap
     * @param <T>
     * @return
     */
    private static <T extends BaseTreeNode> List<T> getChildList(List<T> classifies, Map<String, List<T>> groupMap) {
        //判断一级的数据是否为空
       if (CollectionUtil.isNotEmpty(classifies)){
           //遍历 tree 父级对象
           for (T tree:classifies){
               //所有的二级的list对象
               List<T> classifyList = groupMap.get(tree.getIndexid());
               //判断是否为空
               if (!CollectionUtils.isEmpty(classifyList)) {
                   tree.setChildren((List<BaseTreeNode>)classifyList);
                   getChildList(classifyList, groupMap);
               } else {
                   tree.setChildren(null);
               }
           }
           //循环遍历
//           classifies.forEach(tree -> {
//               List<T> classifyList = groupMap.get(tree.getId());
//               if (!CollectionUtils.isEmpty(classifyList)) {
//                   tree.setChildren((List<BaseTreeNode>)classifyList);
//                   getChildList(classifyList, groupMap);
//               } else {
//                   tree.setChildren(null);
//               }
//           });
           return classifies;
       }
       return new ArrayList<>();
    }
}

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值