提示:本章内容对于课程模块列表内容的游湖
前言
因为我们的项目中呢,采用的之后两次分类的课程模块,但是呢在现实我们项目中呢,还会有多级分类的情况,所以呢按照我们之前的想法呢,我们需要进行多级循环的嵌套才可以实现,而且还是固定的多级分类,而做不到活动的多级。
一、递归?
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
函数嵌套调用过程示例
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
二、使用步骤
1.创建课程返回封装对象
顶级分类的对象 ----SubjectNestedVo
package com.djr.eduservice.entity.vo;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @Program: science_source_education
* @Description
* @Author: 涛涛 * ^ *
* @Create: 2021-01-29 14:43
**/
@Data
public class SubjectNestedVo {
/**
* 一级课程的ID
*/
private String id;
/**
* 一级分类课程的名称
*/
private String title;
/**
* 二级分类课程的集合
*/
private List<?> children = new ArrayList<>();
}
次级分类对象 ----SubjectVo
package com.djr.eduservice.entity.vo;
import lombok.Data;
/**
* @Program: 二级分类返回
* @Description 课程分类
* @Author: 涛涛 * ^ *
* @Create: 2021-01-29 14:41
**/
@Data
public class SubjectVo {
/**
* 二级分类id
*/
private String id;
/**
* 二级分类课程名称
*/
private String title;
}
2.service
/**
* 递归方式进行查询全部
* @return
*/
List<SubjectNestedVo> getSubjectList();
3.实现类
/**
* 获取顶级分类
*
* @return
*/
@Override
public List<SubjectNestedVo> getSubjectList() {
//获取到顶级分类的集合
List<EduSubject> eduSubjects = getParentId("0");
return getTreeList(eduSubjects);
}
/**
* 获取子分类
*
* @param parentId 其父类的ID
* @return 参数parentId下的所有子类的集合
*/
List<EduSubject> getParentId(String parentId) {
QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", parentId); // 0
List<EduSubject> eduSubjects = baseMapper.selectList(queryWrapper);
return eduSubjects;
}
/**
* 获取数据
*
* @param eduSubjects 子类的集合
* @return
*/
List<SubjectNestedVo> getTreeList(List<EduSubject> eduSubjects) {
List<SubjectNestedVo> subjectNestedVoList = new ArrayList<>();
for (EduSubject eduSubject : eduSubjects) {
SubjectNestedVo subjectNestedVo = new SubjectNestedVo();
//id:449 parentId 0
subjectNestedVo.setId(eduSubject.getId());
subjectNestedVo.setTitle(eduSubject.getTitle());
//449
subjectNestedVo.setChildren(getTreeList(getParentId(eduSubject.getId())));
subjectNestedVoList.add(subjectNestedVo);
}
return subjectNestedVoList;
}
这里呢解释一下:
一共有三个方法
获取顶级分类
根据自己父ID获取次级分类的集合
递归获取数据然后进行数据的赋值
4. controller
/**
* 递归方式查全部
* @return
*/
@ApiOperation(value = "递归方式查询课程")
@PostMapping("/getSubjectList")
public R getSubjectList() {
List<SubjectNestedVo> subjectList = eduSubjectService.getSubjectList();
return R
.ok()
.data("items", subjectList);
}
三、测试
这样呢话呢 ,在执行递归的时候会根据父类的ID进行一级一级的进行获取