返回特定的數據格式

數據格式如下:

"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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章