前端页面展示数据树形数据时,需要我们返回一定的数据格式,这样的情况有两种解决办法,一种是进行字符串拼接,另一种是编写对应的实体类。下面是以实体类的方式进行解决。
课程分类列表树形显示.png
第一种实现方式
一、编写实体类
一级分类
package com.caiweiwei.eduservice.entity.subject; import lombok.Data; import java.util.ArrayList; import java.util.List; @Data public class OneSubject { private String id; private String title; private List<TwoSubject> children=new ArrayList<>(); }
二级分类
package com.caiweiwei.eduservice.entity.subject; import lombok.Data; @Data public class TwoSubject { private String id; private String title; }
二、controller层
/** * 功能描述:课程分类列表(树形) * @Author: caiweiwei * @Date: 2020/9/16 9:47 */ @GetMapping("/sublectList") public R getAllSubject(){ //list的泛型是一级分类 List<OneSubject>list= eduSubjectService.getAllOneTwoSubject(); return R.ok().data("list",list); }
三、service层
/** * 功能描述:查询一级分类和二级分类并进行封装 * * @Author: caiweiwei * @Date: 2020/9/16 10:12 */ @Override public List<OneSubject> getAllOneTwoSubject() { //查询一级分类 QueryWrapper<EduSubject> oneSubjectQueryWrapper = new QueryWrapper<>(); oneSubjectQueryWrapper.eq("parent_id", "0"); List<EduSubject> oneSubjects = baseMapper.selectList(oneSubjectQueryWrapper); //查询二级分类 QueryWrapper<EduSubject> twoSubjectQueryWrapper = new QueryWrapper<>(); oneSubjectQueryWrapper.ne("parent_id", "0"); List<EduSubject> twoSubjects = baseMapper.selectList(twoSubjectQueryWrapper); List<OneSubject> oneSubjectList = new ArrayList<>(); //封装一级分类 for (int i = 0; i < oneSubjects.size(); i++) { EduSubject eduSubject = oneSubjects.get(i); OneSubject oneSubject = new OneSubject(); //将属性进行复制 BeanUtils.copyProperties(eduSubject, oneSubject); //封装二级分类 List<TwoSubject> twoSubjectList = new ArrayList<>(); for (int j = 0; j < twoSubjects.size(); j++) { if(twoSubjects.get(j).getParentId().equals(eduSubject.getId())){ TwoSubject twoSubject = new TwoSubject(); //将属性进行赋值 BeanUtils.copyProperties(twoSubjects.get(j), twoSubject); twoSubjectList.add(twoSubject); } } //将封装好的二级分类封装到一级分类的实体类中 oneSubject.setChildren(twoSubjectList); oneSubjectList.add(oneSubject); } return oneSubjectList; }
第二种实现方式
一、创建树形结构实体类
@Data public class TreeDto { private String id; private String name; private String pid; private String isParent; private List<TreeDto> childTreeDto; }
二、创建树形工具类
public class TreeToolUtils { private List<TreeDto> rootList; //根节点对象存放到这里 private List<TreeDto> bodyList; //其他节点存放到这里,可以包含根节点 public TreeToolUtils(List<TreeDto> rootList, List<TreeDto> bodyList) { this.rootList = rootList; this.bodyList = bodyList; } public List<TreeDto> getTree(){ //调用的方法入口 if(bodyList != null && !bodyList.isEmpty()){ //声明一个map,用来过滤已操作过的数据 Map<String,String> map = Maps.newHashMapWithExpectedSize(bodyList.size()); rootList.forEach(beanTree -> getChild(beanTree,map)); return rootList; } return null; } public void getChild(TreeDto treeDto,Map<String,String> map){ List<TreeDto> childList = Lists.newArrayList(); bodyList.stream() .filter(c -> !map.containsKey(c.getId())) .filter(c ->c.getPid().equals(treeDto.getId())) .forEach(c ->{ map.put(c.getId(),c.getPid()); getChild(c,map); childList.add(c); }); treeDto.setChildTreeDto(childList); } }
三、使用main方法进行测试
TreeDto treeDto = new TreeDto("1", "总店", "null", "true",null); TreeDto treeDto1 = new TreeDto("2", "市分店", "1", "true",null); TreeDto treeDto2 = new TreeDto("3", "县分店", "2", "true",null); TreeDto treeDto3 = new TreeDto("710", "店长", "3", "true",null); TreeDto treeDto4= new TreeDto("713", "财务部", "3", "true",null); TreeDto treeDto5 = new TreeDto("20032", "后勤部", "3", "true",null); TreeDto treeDto6 = new TreeDto("1909", "小王", "710", "false",null); TreeDto treeDto7= new TreeDto("1974", "小张", "713", "false",null); TreeDto treeDto8 = new TreeDto("388187", "佳佳", "20032", "false",null); TreeDto treeDto9 = new TreeDto("1949", "阿达", "20032", "false",null); ArrayList<TreeDto> rootList = new ArrayList<>();//根节点 ArrayList<TreeDto> bodyList = new ArrayList<>();//子节点 rootList.add(treeDto); bodyList.add(treeDto1); bodyList.add(treeDto2); bodyList.add(treeDto3); bodyList.add(treeDto4); bodyList.add(treeDto5); bodyList.add(treeDto6); bodyList.add(treeDto7); bodyList.add(treeDto8); bodyList.add(treeDto9); TreeToolUtils utils = new TreeToolUtils(rootList,bodyList); List<TreeDto> result = utils.getTree(); String jsonString = JSONObject.toJSONString(result.get(0)); System.out.println(jsonString); }
四、控制台输出样式
{ "childTreeDto": [{ "childTreeDto": [{ "childTreeDto": [{ "childTreeDto": [{ "childTreeDto": [], "id": "1909", "isParent": "false", "name": "小王", "pid": "710" }], "id": "710", "isParent": "true", "name": "店长", "pid": "3" }, { "childTreeDto": [{ "childTreeDto": [], "id": "1974", "isParent": "false", "name": "小张", "pid": "713" }], "id": "713", "isParent": "true", "name": "财务部", "pid": "3" }, { "childTreeDto": [{ "childTreeDto": [], "id": "388187", "isParent": "false", "name": "佳佳", "pid": "20032" }, { "childTreeDto": [], "id": "1949", "isParent": "false", "name": "阿达", "pid": "20032" }], "id": "20032", "isParent": "true", "name": "后勤部", "pid": "3" }], "id": "3", "isParent": "true", "name": "县分店", "pid": "2" }], "id": "2", "isParent": "true", "name": "市分店", "pid": "1" }], "id": "1", "isParent": "true", "name": "总店", "pid": "null" }