1.引入依赖

之前测试EasyExcel已经引入过了

2.利用代码生成器生成结构

我们做的只需要更改代码生成器的数据库表即可

3.运行代码生成器

4.书写代码

1.controller

@RestController
@CrossOrigin
@RequestMapping("/eduservice/edu-subject")
public class EduSubjectController {
@Autowired
private EduSubjectService eduSubjectService;
//添加课程分类
//获取上传的文件,把文件内容读出来
@PostMapping("addSubject")
public R addSubject(MultipartFile file){
eduSubjectService.save(file);
return R.OK();
} }

2.service

@Data
public class SubjectData {
@ExcelProperty(index=0)
private String oneSubjectName;
@ExcelProperty(index=1)
private String secondSubjectName; }
public interface EduSubjectService extends IService<EduSubject> {
//添加课程分类
void save(MultipartFile file);
}

3.serviceImpl

@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService { @Override
public void save(MultipartFile file) {
try {
InputStream inputStream=file.getInputStream();
EasyExcel.read(inputStream, SubjectData.class,new SubjectExcelsListener()).sheet().doRead();
}catch (Exception e){
e.printStackTrace();
} }
}

4.Excel实体类

@Data
public class SubjectData {
@ExcelProperty(index=0)
private String oneSubjectName;
@ExcelProperty(index=1)
private String secondSubjectName; }

5.

最后关于这个监听器,我们要注意一个问题,因为代码的原因我们没法把监听器交给Spring管理

所以要把eduSujectService传进来

5.书写监听器

public class SubjectExcelsListener extends AnalysisEventListener<SubjectData> {
public EduSubjectService subjectService;
public SubjectExcelsListener(){}
public SubjectExcelsListener(EduSubjectService subjectService){
this.subjectService=subjectService;
}
//一行一行去读取excle内容
@Override
public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
if(subjectData == null) {
throw new onlineEduException(20001,"添加失败");
}
//添加一级分类
EduSubject existOneSubject = this.existOneSubject(subjectService,subjectData.getOneSubjectName());
if(existOneSubject == null) {//没有相同的
existOneSubject = new EduSubject();
existOneSubject.setTitle(subjectData.getOneSubjectName());
existOneSubject.setParentId("0");
subjectService.save(existOneSubject);
} //获取一级分类id值
String pid = existOneSubject.getId(); //添加二级分类
EduSubject existTwoSubject = this.existTwoSubject(subjectService,subjectData.getSecondSubjectName(), pid);
if(existTwoSubject == null) {
existTwoSubject = new EduSubject();
existTwoSubject.setTitle(subjectData.getSecondSubjectName());
existTwoSubject.setParentId(pid);
subjectService.save(existTwoSubject);
}
} @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { }
//判断一级分类是否重复
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;
}
//判断二级分类是否重复
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;
}
}

在线教育项目-day05【课程分类管理-添加课程分类】的更多相关文章

  1. 黑马在线教育项目---34-37、webuploader实现用户头像的异步上传

    黑马在线教育项目---34-37.webuploader实现用户头像的异步上传 一.总结 一句话总结: 启迪:可以多看学习视频,在看电影看电视的时候看的确是不错的选择 1.关于软件的发行版本? 第1阶 ...

  2. 黑马在线教育项目---15-16、datatables插件

    黑马在线教育项目---15-16.datatables插件 一.总结 一句话总结: datatables插件也比较好用,引入好插件的js和css后,核心代码也就是插件的初始化,如果要修改配置可以百度 ...

  3. Django——在线教育项目总结

    项目简介 在线教育平台 软件依赖: WEB框架:Django(1.11.7).Django REST framework 前端框架:Vue(2.5.16) 数据库: MySql.redis 支付平台: ...

  4. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在线教育视频站点介绍

    笔记 第一章项目介绍和前期准备 1.SpringBoot整合微信支付开发在线教育视频站点介绍     简介: 课程介绍,和小D课堂在线教育项目搭建开发 1.课程大纲介绍         2.微信支付项 ...

  5. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  6. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  7. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  8. 【Python】通过python代码实现demo_test环境的登录,通过csv/txt/excel文件批量添加课程并开启课程操作--(刚开始 项目 页面 模块 元素这种鸟 被称作pageobject 等这些搞完 然后把你的定位器、数据 和脚本在分离 就是传说中那个叫数据驱动 的鸟)

    一.1.通过csv文件批量导入数据 1 from selenium import webdriver from time import ctime,sleep import csv #循环读取每一行每 ...

  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计

    笔记 4.在线教育后台数据库设计     简介:讲解后端数据库设计    ,字段冗余的好处,及常见注意事项 1.数据库设计:          er图:          实体对象:矩形        ...

随机推荐

  1. 拿万元月薪必备的书单,学JAVA的程序员必看的5本书!

    点击蓝色"程序员黄小斜"关注我哟 加个"星标",每天带你读好书! 文/黄小斜 转载请注明出处 每一年的年初都是买书学习热情高涨的时候,虽然不知道你们是让这些书吃 ...

  2. JAVABEAN的SCOPE属性(转载)

    对于JSP 程序而言,使用JavaBeans  组件不仅可以封装许多信息,而且还可以将一些 数据处理的逻辑隐藏到JavaBeans  的内部,除此之外,我们还可以设定JavaBeans  的Scope ...

  3. Shell:Day07.笔记

    函数:1.函数介绍function 为了避免代码重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能. 且,这个功能在后面的代码中,会重复调用:  def 2.函数的语法格式 函数的写 ...

  4. php的 '1' == 1, 返回true,到底是谁变成了谁?

    此过程为字符串的 '1' 隐含的编程了数字类型1,所以是true

  5. 微信小程序H5预览页面框架(二维码不隐藏)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. Java第十八天,可变参数

    可变参数 1.使用前提 当一个方法的参数需要多个参数,并且这些参数的类型一致时,可以使用可变参数. 2.使用方法 定义方法时使用 3.定义格式 修饰符 返回值类型 方法名(参数类型...变量名){ } ...

  7. ThinkPHP中的行为扩展和插件详解

    原理分析 将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静 ...

  8. Oracle--pl/sql编程-分支语句(判断、循环)

    if语句 oracle: elsif      java: else if if (条件) then pl/sql或sql语句 [elsif (条件) then ] ...可以有多个elsif [el ...

  9. React Native简史

    诞生 React Native 诞生于 2013 年的 Facebook 内部黑客马拉松(hackathon): In the essence of Facebook’s hacker culture ...

  10. git处理fork的个人库代码与远程项目库待代码同步与合并

    由于每个项目组git代码管理规范都不一致,分支开发和fork开发模式.我就说下fork处理的流程吧. 问题点: 我的代码是从自己的远程个人仓库clone的.我的个人远程仓库代码是从项目的远程仓库弄fo ...