课程分类导入后端实现

一 准备

1 添加依赖

<dependencies>
    <!-- easyexcel -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
    </dependency>
    <!-- xmlbeans -->
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
    </dependency>
</dependencies>

2 创建Excel实体类

@Data
public class ExcelSubjectData {
    @ExcelProperty(value = "一级分类")
    private String levelOneTitle;


    @ExcelProperty(value = "二级分类")
    private String levelTwoTitle;
}

二 实现Excel导入

1 创建监听器

@Slf4j
@NoArgsConstructor // 无参构造函数
@AllArgsConstructor // 全参构造函数
public class ExcelSubjectDataListener extends AnalysisEventListener<ExcelSubjectData> {
    /**
     * Mapper
     */
    private SubjectMapper subjectMapper;

    /**
     * 功能描述:遍历每一行的记录
     *
     * @param data 读取的数据
     * @param context 暂时不用
     */
    @Override
    public void invoke(ExcelSubjectData data, AnalysisContext context) {
        log.info("解析到一条记录: {}", data);
        // 处理读取出来的数据
        String levelOneTitle = data.getLevelOneTitle(); // 一级标题
        String levelTwoTitle = data.getLevelTwoTitle(); // 二级标题
        log.info("levelOneTitle: {}", levelOneTitle);
        log.info("levelTwoTitle: {}", levelTwoTitle);

        // 判断一级分类是否存在
        Subject subjectLevelOne = this.getByTitle(levelOneTitle);
        String parentId;
        if (subjectLevelOne == null) { // 一级分类不存在
            // 组装一级类别
            Subject subject = new Subject();
            subject.setParentId("0");
            subject.setTitle(levelOneTitle);
            // 存入数据库
            subjectMapper.insert(subject);
            parentId = subject.getId();
        } else { // 一级分类存在
            parentId = subjectLevelOne.getId();
        }

        // 判断二级分类是否存在
        Subject subjectLevelTwo = this.getSubByTitle(levelTwoTitle, parentId);
        if (subjectLevelTwo == null) { // 二级分类不存在
            // 组装二级类别
            Subject subject = new Subject();
            subject.setTitle(levelTwoTitle);
            subject.setParentId(parentId);
            // 存入数据库
            subjectMapper.insert(subject);
        }
    }

    /**
     * 功能描述:所有数据读取之后的收尾工作
     *
     * @param context 暂时不用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("全部数据解析完成");
    }

    /**
     * 功能描述:根据一级分类的名称查询一级分类是否存在
     *
     * @param title 一级分类名称
     * @return Subject 一级分类
     */
    private Subject getByTitle(String title) {
        QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", title);
        queryWrapper.eq("parent_id", "0"); //一级分类
        return subjectMapper.selectOne(queryWrapper);
    }

    /**
     * 功能描述:根据二级分类的名称和父id查询二级分类是否存在
     *
     * @param title 二级分类名称
     * @param parentId 二级分类的父类
     * @return Subject 二级分类
     */
    private Subject getSubByTitle(String title, String parentId) {
        QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", title);
        queryWrapper.eq("parent_id", parentId); // 二级分类
        return subjectMapper.selectOne(queryWrapper);
    }
}

2 服务接口

/**
* 功能描述:批量导入
*
* @author cakin
* @date 2020/12/2
* @param inputStream 文件输入流
*/
void batchImport(InputStream inputStream);

3 服务实现

/**
* 功能描述:批量导入
*
* @author cakin
* @date 2020/12/2
* @param inputStream 文件输入流
*/
@Override
public void batchImport(InputStream inputStream) {
    EasyExcel.read(inputStream, ExcelSubjectData.class, new ExcelSubjectDataListener(baseMapper))
            .excelType(ExcelTypeEnum.XLS)
            .sheet().doRead();
}

4 控制器

@CrossOrigin // 允许跨域
@Api(description = "课程分类管理")
@RestController
@RequestMapping("/admin/edu/subject")
@Slf4j
public class SubjectController {

    @Autowired
    private SubjectService subjectService;

    /**
     * 功能描述:Excel批量导入课程分类
     *
     * @param file 文件
     * @return R 返回给前端的数据
     * @author cakin
     * @date 2020/12/2
     */
    @ApiOperation("Excel批量导入课程分类")
    @PostMapping("import")
    public R batchImport(@ApiParam(value = "Excel文件", required = true) @RequestParam("file") MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();
            subjectService.batchImport(inputStream);
            return R.ok().message("批量导入成功");
        } catch (Exception e) {
            log.error(ExceptionUtils.getMessage(e));
            throw new GuliException(ResultCodeEnum.EXCEL_DATA_IMPORT_ERROR);
        }
    }
}

三 测试

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