一、添加依赖
1、service-edu模块配置依赖
<dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency></dependencies>
二、业务处理
1、SubjectAdminController
package com.guli.edu.controller.admin;@Api(description="课程分类管理")@CrossOrigin //跨域@RestController@RequestMapping("/eduservice/subject")public class SubjectAdminController {@Autowiredprivate SubjectService subjectService;//添加课程分类@ApiOperation(value = "Excel批量导入")@PostMapping("addSubject")public R addSubject(MultipartFile file) {//1 获取上传的excel文件 MultipartFile//返回错误提示信息subjectService.importSubjectData(file,subjectService);//判断返回集合是否为空return R.ok();}}
2、创建和Excel对应的实体类
import com.alibaba.excel.annotation.ExcelProperty;import lombok.Data;@Datapublic class ExcelSubjectData {@ExcelProperty(index = 0)private int oneSubjectName;@ExcelProperty(index = 1)private String twoSubjectName;}
3、SubjectService
(1)接口
void batchImport(MultipartFile file);
(2)实现类
//添加课程分类//poi读取excel内容@Overridepublic void importSubjectData(MultipartFile file,EduSubjectService subjectService) {try {//1 获取文件输入流InputStream inputStream = file.getInputStream();// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(inputStream, ExcelSubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();}catch(Exception e) {e.printStackTrace();throw new GuliException(20002,"添加课程分类失败");}}
4、创建读取Excel监听器
import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import com.atguigu.eduservice.entity.EduSubject;import com.atguigu.eduservice.entity.vo.ExcelSubjectData;import com.atguigu.eduservice.service.EduSubjectService;import com.atguigu.servicebase.handler.GuliException;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import java.util.ArrayList;import java.util.List;import java.util.Map;public class SubjectExcelListener extends AnalysisEventListener<ExcelSubjectData> {public EduSubjectService subjectService;public SubjectExcelListener() {}//创建有参数构造,传递subjectService用于操作数据库public SubjectExcelListener(EduSubjectService subjectService) {this.subjectService = subjectService;}//一行一行去读取excle内容@Overridepublic void invoke(ExcelSubjectData user, AnalysisContext analysisContext) {if(user == null) {throw new GuliException(20001,"添加失败");}//添加一级分类EduSubject existOneSubject = this.existOneSubject(subjectService,user.getOneSubjectName());if(existOneSubject == null) {//没有相同的existOneSubject = new EduSubject();existOneSubject.setTitle(user.getOneSubjectName());existOneSubject.setParentId("0");subjectService.save(existOneSubject);}//获取一级分类id值String pid = existOneSubject.getId();//添加二级分类EduSubject existTwoSubject = this.existTwoSubject(subjectService,user.getTwoSubjectName(), pid);if(existTwoSubject == null) {existTwoSubject = new EduSubject();existTwoSubject.setTitle(user.getTwoSubjectName());existTwoSubject.setParentId(pid);subjectService.save(existTwoSubject);}}//读取excel表头信息@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}//读取完成后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}//判断一级分类是否重复private EduSubject existTwoSubject(EduSubjectService subjectService,String name,String pid) {QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();wrapper.eq("title",name);wrapper.eq("parent_id",pid);EduSubject eduSubject = subjectService.getOne(wrapper);return eduSubject;}//判断一级分类是否重复private EduSubject existOneSubject(EduSubjectService subjectService,String name) {QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();wrapper.eq("title",name);wrapper.eq("parent_id","0");EduSubject eduSubject = subjectService.getOne(wrapper);return eduSubject;}}
三、分类列表前端实现
1、参考 views/tree/index.vue
2、创建api
api/edu/subject.js
import request from '@/utils/request'const api_name = '/admin/edu/subject'export default {getNestedTreeList() {return request({url: `${api_name}`,method: 'get'})}}
3、list.vue
<template><div class="app-container"><el-input v-model="filterText" placeholder="Filter keyword" style="margin-bottom:30px;" /><el-treeref="subjectTree":data="subjectList":props="defaultProps":filter-node-method="filterNode"class="filter-tree"default-expand-all/></div></template><script>import subject from '@/api/edu/subject'export default {data() {return {filterText: '',subjectList: [],defaultProps: {children: 'children',label: 'title'}}},watch: {filterText(val) {this.$refs.subjectTree.filter(val)}},created() {this.fetchNodeList()},methods: {fetchNodeList() {subject.getNestedTreeList().then(response => {if (response.success === true) {this.subjectList = response.data.items}})},filterNode(value, data) {if (!value) return truereturn data.title.indexOf(value) !== -1}}}</script>
四、分类列表后端实现
1、创建vo
package com.guli.edu.vo;@Datapublic class SubjectVo {private String id;private String title;}
package com.guli.edu.vo;@Datapublic class SubjectNestedVo {private String id;private String title;private List<SubjectVo> children = new ArrayList<>();}
2、创建controller
@ApiOperation(value = "嵌套数据列表")@GetMapping("")public R nestedList(){List<SubjectNestedVo> subjectNestedVoList = subjectService.nestedList();return R.ok().data("items", subjectNestedVoList);}
3、创建service
接口
List<SubjectNestedVo> nestedList();
实现Final
@Overridepublic List<SubjectNestedVo> nestedList() {//最终要的到的数据列表ArrayList<SubjectNestedVo> subjectNestedVoArrayList = new ArrayList<>();//获取一级分类数据记录QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();queryWrapper.eq("parent_id", 0);queryWrapper.orderByAsc("sort", "id");List<Subject> subjects = baseMapper.selectList(queryWrapper);//获取二级分类数据记录QueryWrapper<Subject> queryWrapper2 = new QueryWrapper<>();queryWrapper2.ne("parent_id", 0);queryWrapper2.orderByAsc("sort", "id");List<Subject> subSubjects = baseMapper.selectList(queryWrapper2);//填充一级分类vo数据int count = subjects.size();for (int i = 0; i < count; i++) {Subject subject = subjects.get(i);//创建一级类别vo对象SubjectNestedVo subjectNestedVo = new SubjectNestedVo();BeanUtils.copyProperties(subject, subjectNestedVo);subjectNestedVoArrayList.add(subjectNestedVo);//填充二级分类vo数据ArrayList<SubjectVo> subjectVoArrayList = new ArrayList<>();int count2 = subSubjects.size();for (int j = 0; j < count2; j++) {Subject subSubject = subSubjects.get(j);if(subject.getId().equals(subSubject.getParentId())){//创建二级类别vo对象SubjectVo subjectVo = new SubjectVo();BeanUtils.copyProperties(subSubject, subjectVo);subjectVoArrayList.add(subjectVo);}}subjectNestedVo.setChildren(subjectVoArrayList);}return subjectNestedVoArrayList;}
五、优化前端过滤功能
filterNode(value, data) {if (!value) return truereturn data.title.toLowerCase().indexOf(value.toLowerCase()) !== -1}


">
