数据库结构
返回的数据结构
children表示下级的菜单
新建一个返回接口类
package com.atguigu.eduservice.entity.subject;
import com.atguigu.eduservice.entity.EduSubject;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class OtherSubject extends EduSubject {
private List<OtherSubject> children = new ArrayList<>();
}
实体类
package com.atguigu.eduservice.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 课程科目
* </p>
*
* @author testjava
* @since 2022-11-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="EduSubject对象", description="课程科目")
public class EduSubject implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "课程类别ID")
@TableId(value = "id", type = IdType.ID_WORKER_STR)
private String id;
@ApiModelProperty(value = "类别名称")
private String title;
@ApiModelProperty(value = "父ID")
private String parentId;
@ApiModelProperty(value = "排序字段")
private Integer sort;
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间")
private Date gmtCreate;
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间")
private Date gmtModified;
}
控制器新增接口
@GetMapping("getAllSubject")
public R getList() {
List<OtherSubject> list = eduSubjectService.getAllSubject();
return R.ok().data("data", list);
}
新增service实现类方法getAllSubject (service接口也要新增这个方法)
@Override
public List<OtherSubject> getAllSubject() {
List<EduSubject> list = baseMapper.selectList(null);
List<OtherSubject> allList = new ArrayList<>();
allList = list.stream().map(info->{
OtherSubject otherSubject = new OtherSubject();
BeanUtils.copyProperties(info, otherSubject);
return otherSubject;
}).collect(Collectors.toList());
for (OtherSubject subject : allList) {
subject.setChildren(this.handleList(subject.getId(), allList));
}
return allList;
}
分析:
- 获取所有菜单列表
- 将菜单列表转化为需要返回的类型列表(通过stream 方式)
- 通过递归的方法处理下级菜单
private List<OtherSubject> handleList(String id, List<OtherSubject> list) {
List<OtherSubject> childMenus = new ArrayList<>();
for (OtherSubject child : list) {
if(child.getParentId().equals(id)){
childMenus.add(child);
}
}
for (OtherSubject childMenu : childMenus) {
childMenu.setChildren(handleList(childMenu.getId(), list));
}
if(childMenus.size() == 0){
return null;
}else{
return childMenus;
结果: