數據格式如下:
"list": [
{
"id": "1278493774292496385",
"title": "前端開發",
"children": [
{
"id": "1278493774460268545",
"title": "vue"
},
{
"id": "1278493774544154625",
"title": "vue-adamin"
},
{
"id": "1278493774611263489",
"title": "elementUi"
}
]
},
{
"id": "1278493774669983746",
"title": "後端開發",
"children": [
{
"id": "1278493774686760961",
"title": "Java"
},
{
"id": "1278493774770647042",
"title": "c++"
}
]
},
{
"id": "1278493774854533122",
"title": "數據庫開發",
"children": [
{
"id": "1278493774867116033",
"title": "mysql"
}
]
}
]
如何才能返回這樣的數據格式呢?
首先我們分析一下這個數據的格式:
外層是一個json數據格式 , 一級分類
內層有一個children裏面是嵌套的封裝了很多對象
首先我們將外層和內層剖析出來建立兩個相對應的實體類
OneSubject
package com.starcpdk.edu.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<>();
}
TwoSubject
package com.starcpdk.edu.eduservice.entity.subject;
import lombok.Data;
//二級分類
@Data
public class TwoSubject {
private String id;
private String title;
}
在OneSubject中包含有twoSubject的list對象集合
EduSubjectController
package com.starcpdk.edu.eduservice.controller;
import com.starcpdk.edu.commonutils.R;
import com.starcpdk.edu.eduservice.entity.subject.OneSubject;
import com.starcpdk.edu.eduservice.service.EduSubjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* <p>
* 課程科目 前端控制器
* </p>
*
* @author 姚雲峯
* @since 2020-07-01
*/
@RestController
@RequestMapping("/eduservice/subject")
@CrossOrigin
public class EduSubjectController {
@Autowired
private EduSubjectService subjectService;
//添加課程分類
//獲取到上傳的文件 , 把文件內容讀取出來
@PostMapping("addSubject")
public R addSubject(MultipartFile file){
//上傳過來的excel文件
subjectService.saveSubject(file , subjectService);
return R.ok();
}
//課程分類的列表功能(樹形結構)
@GetMapping("getAllSubject")
public R getAllSubject(){
//list集合中的泛型是一級分類 , 因爲一級分類中含有多個二級分類
List<OneSubject> list = subjectService.getAllOneTwoSubject();
return R.ok().data("list" , list);
}
}
主要邏輯在service層中
package com.starcpdk.edu.eduservice.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.starcpdk.edu.eduservice.entity.EduSubject;
import com.starcpdk.edu.eduservice.entity.excel.SubjectData;
import com.starcpdk.edu.eduservice.entity.subject.OneSubject;
import com.starcpdk.edu.eduservice.entity.subject.TwoSubject;
import com.starcpdk.edu.eduservice.listener.SubjectExcelListener;
import com.starcpdk.edu.eduservice.mapper.EduSubjectMapper;
import com.starcpdk.edu.eduservice.service.EduSubjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 課程科目 服務實現類
* </p>
*
* @author 姚雲峯
* @since 2020-07-01
*/
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {
//添加課程分類
@Override
public void saveSubject(MultipartFile file , EduSubjectService subjectService) {
try {
//文件輸入流
InputStream in = file.getInputStream();
//調用方法進行讀取
EasyExcel.read(in , SubjectData.class , new SubjectExcelListener(subjectService)).sheet().doRead();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public List<OneSubject> getAllOneTwoSubject() {
//查詢所有一級分類 parent_id=0
QueryWrapper<EduSubject> wrapperOne = new QueryWrapper<>();
wrapperOne.eq("parent_id" , "0");
wrapperOne.orderByAsc("sort", "id");
List<EduSubject> oneSubjectsList = baseMapper.selectList(wrapperOne);
//查詢所有二級分類 parent_id!=0
QueryWrapper<EduSubject> wrapperTwo = new QueryWrapper<>();
wrapperTwo.ne("parent_id" , "0");
wrapperTwo.orderByAsc("sort", "id");
List<EduSubject> twoSubjectsList = baseMapper.selectList(wrapperTwo);
//創建list集合 , 用於存儲最終的分裝數據
List<OneSubject> finalSubjectList = new ArrayList<>();
//封裝一級分類
//查詢出來的所有的一級分類list集合遍歷 , 得到每一個一級分類對象 , 獲取每一個一級分類對象的值,
//封裝到要求的list集合裏面list<OneSubject>finalSubjectList
for (EduSubject eduOneSubject:oneSubjectsList){
//把eduOneSubject中的值獲取到 , 放到oneSubject對象中
//多個OneSubject放到finalSubjectList中
OneSubject oneSubject = new OneSubject();
// oneSubject.setId(eduOneSubject.getId());
// oneSubject.setTitle(eduOneSubject.getTitle());
//與上邊的代碼等價 , 即將eduOneSubject對象中的值get出來然後set到oneSubject中
BeanUtils.copyProperties(eduOneSubject , oneSubject);//springboot封裝的方法 , 將一個對象中的值取出來 , 賦值給領英對象
//分裝二級分類
//在一級分類中遍歷查詢的所有的二級分類
//創建list集合 , 封裝每個一級分類中的二級分類
List<TwoSubject> finalTwoSubjectList = new ArrayList<>();
for (EduSubject eduTwoSubject:twoSubjectsList) {
//判斷當前外循環下的一級分類的id是否與當前內循環中對象的二級分類的parent_id是否相等 , 若相等則從eduTwoSubject中取出值放到twoSubject中 , 然後封裝到finalTwoSubjectList中
if (eduOneSubject.getId().equals(eduTwoSubject.getParentId())){
//把eduTwoSubject對象中的值獲取到 , 放到TwoSubject對象中
//多個twoSubject放到finalTwoSubjectList中
TwoSubject twoSubject = new TwoSubject();
BeanUtils.copyProperties(eduTwoSubject , twoSubject);
finalTwoSubjectList.add(twoSubject);
}
}
oneSubject.setChildren(finalTwoSubjectList);
finalSubjectList.add(oneSubject);
}
return finalSubjectList;
}
}
首先通過查詢數據庫將所有一級分類查詢出來放到oneSubjectsList
集合中 , 然後查詢所有二級分類 , 將查詢到的數據放到twoSubjectsList
集合中。
將查詢到的所有一級分類的數據所放的集合進行遍歷 , 將查詢一級分類的集合中的每一個對象中的title屬性和parent_id屬性賦值給根據返回數據類型構造的實體類的對象中 , 最後將這些對象再封裝到此實體類對應的集合中。
在一級分類的循環中遍歷二級分類 , 同一級分類一樣 , 但是多一步判斷 , 判斷當前外循環即一級循環中的當前對象的id和二級分類中循環的對象的parent_id是否想等 , 想等則說明當前的二級分類對象是此一級分類的對應二級 , 因此將此對象的值賦值給根據數據構造的二級分類的實體類對象中 , 最後將當前一級分類下的二級分類的對象集合通過set方法將集合賦值給一級分類的對象集合中setChildren
。