需求:文章类型添加和修改的时候要选择上级类型,实际项目中前端会使用框架的级联框实现,后端采用无限极树实现
1.实体domain添加属性
//添加一个集合,用于装当前类型的所有子类型;children名称不能乱写要与前端一致【elementUI的级联框组件】 /** * 自定义: 保存自己的所有子类型 * 注意: 前端我们使用的是ElementUI的级联框, 默认子类型集合属性名就是children */ @JsonInclude(JsonInclude.Include.NON_EMPTY) //类型树最后一级没有数据就不显示 private List<ArticleType> children = new ArrayList<>();
.2.无限极树业务
private List<ArticleType> typeTree(){ List<ArticleType> articleTypes = articleTypeMapper.findAll(); //使用Map充当缓解,<Long,ArticleType>设置是为了方便通过key[id]获取value[类型对象] Map<Long,ArticleType> map = new HashMap<>(); for (ArticleType articleType : articleTypes) { map.put(articleType.getId(),articleType); } //遍历所有找自己的父类型:没有就直接加到类型树,有就找到自己的父类型,将自己加到父类型的集合中 List<ArticleType> typeTree = new ArrayList<>(); for (ArticleType articleType : articleTypes) { //1.获取父类型的id Long parentId = articleType.getParentId(); if(parentId==null){ typeTree.add(articleType); }else{ //2.获取父类型对象 ArticleType parentArticleType = map.get(parentId); if(parentArticleType != null){ //3.获取父类型装子类型的集合children List<ArticleType> children = parentArticleType.getChildren(); //4.将自己装到集合中 children.add(articleType); } } } return typeTree; }