課程分類導入後端實現

一 準備

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);
        }
    }
}

三 測試

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