課程審核
需求分析
根據模塊需求分析,課程發布前要先審核,審核通過方可發布。下圖是課程審核及發布的流程圖:
為什么課程審核通過才可以發布呢?
這樣做為了防止課程信息有違規情況,課程信息不完善對網站用戶體驗也不好,課程審核不僅起到監督作用,也是幫助教學機構規范使用平臺的手段。
如何控制課程審核通過才可以發布課程呢?
在課程基本表course_base表設置課程審核狀態字段,包括:未提交、已提交(未審核)、審核通過、審核不通過。
下邊是課程狀態的轉化關系:
說明如下:
1、一門課程新增后它的審核狀為”未提交“,發布狀態為”未發布“。
2、課程信息編輯完成,教學機構人員執行”提交審核“操作。此時課程的審核狀態為”已提交“。
3、當課程狀態為已提交時運營平臺人員對課程進行審核。
4、運營平臺人員審核課程,結果有兩個:審核通過、審核不通過。
5、課程審核過后不管狀態是通過還是不通過,教學機構可以再次修改課程并提交審核,此時課程狀態為”已提交“。此時運營平臺人員再次審核課程。
6、課程審核通過,教學機構人員可以發布課程,發布成功后課程的發布狀態為”已發布“。
7、課程發布后通過”下架“操作可以更改課程發布狀態為”下架“
8、課程下架后通過”上架“操作可以再次發布課程,上架后課程發布狀態為“發布”。
通過業務流程的分析,現在我們思考:
1、課程提交審核后還允許修改課程嗎?
如果不允許修改是不合理的,因為提交審核后可以繼續做下一個階段的課程內容,比如添加課程計劃,上傳課程視頻等。
如果允許修改那么課程審核時看到的課程內容從哪里來?如果也從課程基本信息表、課程營銷表、課程計劃表查詢那么存在什么問題呢?如下圖:
運營人員審核課程和教學機構編輯課程操作的數據是同一份,此時會導致沖突。比如:運營人員正在審核時教學機構把數據修改了。
為了解決這個問題,專門設計課程預發布表。
如下圖:
提交課程審核,將課程信息匯總后寫入課程預發布表,課程預發布表記錄了教學機構在某個時間點要發布的課程信息。
課程審核人員從預發布表查詢信息進行審核。
課程審核的同時可以對課程進行修改,修改的內容不會寫入課程預發布表。
課程審核通過執行課程發布,將課程預發布表的信息寫入課程發布表。
2、提交審核課程后,也修改了課程信息,可以再次提交審核嗎?
這個問題在上邊分析課程審核狀態時已經有了答案,如下圖:
提交審核課程后,必須等到課程審核完成才可以再次提交課程。
課程審核功能涉及教學機構提交審核,運營人員進行課程審核。在課堂上我們僅實現教學機構提交審核功能,課程審核的結果通過手動修改數據庫來實現。
雖然課堂上不實現課程審核功能,完整的課程審核數據表設計需要理解。
提交審核將信息寫入課程預發布表,課程預發布表結構如下:
更新課程基本信息表的課程審核狀態為:已經提交
課程審核后更新課程基本信息表的審核狀態、課程預發布表的審核狀態,并將審核結果寫入課程審核記錄。
審核記錄表結構如下:
接口定義
下邊定義提交課程審核的接口,在課程發布Controller中定義接口如下:
package com.xuecheng.content.api;/*** @description 課程預覽,發布* @author Mr.M* @date 2022/9/16 14:48* @version 1.0*/
@Controller()
public class CoursePublishController {@ResponseBody@PostMapping("/courseaudit/commit/{courseId}")public void commitAudit(@PathVariable("courseId") Long courseId){}}
接口開發
Dao開發
1、查詢課程基本信息、課程營銷信息、課程計劃信息等課程相關信息,整合為課程預發布信息。
2、向課程預發布表course_publish_pre插入一條記錄,如果已經存在則更新,審核狀態為:已提交。
3、更新課程基本表course_base課程審核狀態為:已提交。
約束:
1、對已提交審核的課程不允許提交審核。
2、本機構只允許提交本機構的課程。
3、沒有上傳圖片不允許提交審核。
4、沒有添加課程計劃不允許提交審核。
使用代碼生成器生成課程發布表、課程預發布表的PO、Mpper,并拷貝到相應的工程
Service開發
在課程發布Service類中定義接口如下:
package com.xuecheng.content.service;/*** @description 課程預覽、發布接口* @author Mr.M* @date 2022/9/16 14:59* @version 1.0*/
public interface CoursePublishService {/*** @description 提交審核* @param courseId 課程id* @return void* @author Mr.M* @date 2022/9/18 10:31*/public void commitAudit(Long companyId,Long courseId);}
接口實現如下:
package com.xuecheng.content.service.impl;/*** @description TODO* @author Mr.M* @date 2022/9/16 15:37* @version 1.0*/
@Service
public class CoursePublishServiceImpl implements CoursePublishService {@AutowiredCourseBaseInfoService courseBaseInfoService;@AutowiredTeachplanService teachplanService;@AutowiredCourseBaseMapper courseBaseMapper;@AutowiredCourseMarketMapper courseMarketMapper;@AutowiredCoursePublishPreMapper coursePublishPreMapper;@Transactional@Overridepublic void commitAudit(Long companyId, Long courseId) {//約束校驗CourseBase courseBase = courseBaseMapper.selectById(courseId);//課程審核狀態String auditStatus = courseBase.getAuditStatus();//當前審核狀態為已提交不允許再次提交if("202003".equals(auditStatus)){XueChengPlusException.cast("當前為等待審核狀態,審核完成可以再次提交。");}//本機構只允許提交本機構的課程if(!courseBase.getCompanyId().equals(companyId)){XueChengPlusException.cast("不允許提交其它機構的課程。");}//課程圖片是否填寫if(StringUtils.isEmpty(courseBase.getPic())){XueChengPlusException.cast("提交失敗,請上傳課程圖片");}//添加課程預發布記錄CoursePublishPre coursePublishPre = new CoursePublishPre();//課程基本信息加部分營銷信息CourseBaseInfoDto courseBaseInfo = courseBaseInfoService.getCourseBaseInfo(courseId);BeanUtils.copyProperties(courseBaseInfo,coursePublishPre);//課程營銷信息CourseMarket courseMarket = courseMarketMapper.selectById(courseId);//轉為jsonString courseMarketJson = JSON.toJSONString(courseMarket);//將課程營銷信息json數據放入課程預發布表coursePublishPre.setMarket(courseMarketJson);//查詢課程計劃信息List<TeachplanDto> teachplanTree = teachplanService.findTeachplanTree(courseId);if(teachplanTree.size()<=0){XueChengPlusException.cast("提交失敗,還沒有添加課程計劃");}//轉jsonString teachplanTreeString = JSON.toJSONString(teachplanTree);coursePublishPre.setTeachplan(teachplanTreeString);//設置預發布記錄狀態,已提交coursePublishPre.setStatus("202003");//教學機構idcoursePublishPre.setCompanyId(companyId);//提交時間coursePublishPre.setCreateDate(LocalDateTime.now());CoursePublishPre coursePublishPreUpdate = coursePublishPreMapper.selectById(courseId);if(coursePublishPreUpdate == null){//添加課程預發布記錄coursePublishPreMapper.insert(coursePublishPre);}else{coursePublishPreMapper.updateById(coursePublishPre);}//更新課程基本表的審核狀態courseBase.setAuditStatus("202003");courseBaseMapper.updateById(courseBase);}}
接口完善
完善接口層的代碼
@ResponseBody@PostMapping("/courseaudit/commit/{courseId}")public void commitAudit(@PathVariable("courseId") Long courseId){Long companyId = 1232141425L;coursePublishService.commitAudit(companyId,courseId);}
接口測試
使用前端提交課程審核:
1、找一門信息不全的課程,測試各各約束條件。
2、正常提交后,觀察數據庫中課程預發布表記錄的內容是否完整。
3、測試審核過后再次提交,提交后觀察數據庫中課程預發布表記錄的內容是否正確。
審核通過需手動修改數據庫:
1、修改課程預發布表的狀態為審核通過202004。
2、修改課程基本表的審核狀態為審核通過202004。
3、課程發布表中就存在該課程數據了, 達到課程審核通過的效果
4、課程審核通過后, 點擊發布按鈕就能發布課程