[學成在線]10-課程審核

課程審核

需求分析

根據模塊需求分析,課程發布前要先審核,審核通過方可發布。下圖是課程審核及發布的流程圖:

為什么課程審核通過才可以發布呢?

這樣做為了防止課程信息有違規情況,課程信息不完善對網站用戶體驗也不好,課程審核不僅起到監督作用,也是幫助教學機構規范使用平臺的手段。

如何控制課程審核通過才可以發布課程呢?

在課程基本表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、課程審核通過后, 點擊發布按鈕就能發布課程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75345.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SpringBoot + MyBatis + MySQL + Thymeleaf 的使用】

目錄&#xff1a; 一&#xff1a;創建項目二&#xff1a;修改目錄三&#xff1a;添加配置四&#xff1a;創建數據表五&#xff1a;創建實體類六&#xff1a;創建數據接口七&#xff1a;編寫xml文件八&#xff1a;單元測試九&#xff1a;編寫服務層十&#xff1a;編寫控制層十一…

Elasticsearch索引的字段映射

目錄 type String類型 text和keyword的區別 數值類型 日期類型 index doc_values fields analyzer store index_options ElasticSearch索引映射示例 Elasticsearch中的字段設置直接影響數據的存儲、索引和查詢行為。結合索引查詢場景合理設置mapping信息可以起到提…

【已解決】實際參數列表和形式參數列表長度不同、java: 無法將類xxx中的構造器xxx應用到給定類型| lombok相關

idea運行maven項目時&#xff0c;報錯這個&#xff08;如標題&#xff09; 解決方案記錄&#xff1a; 找到了之前的、能運行成功不報錯的 maven項目。參考其pom.xml文件中lombok相關部分&#xff0c;將<path>標簽下的lombok加個版本號&#xff0c;就運行成功了&#xff1…

4. 學習網站:學習新的技能或培養興趣愛好

文章目錄 前言英文網站&#xff1a;培養興趣愛好的應用總結 前言 學習網站以及具體提供的內容。 英文網站&#xff1a; Coursera&#xff1a;提供來自全球頂尖大學和機構的在線課程&#xff0c;涵蓋廣泛的學科&#xff0c;包括編程、數據科學、商業和藝術等。Udemy&#xff1…

LabVIEW 開發中 TCP 與 UDP 協議的差異

在 LabVIEW 開發的網絡通信場景中&#xff0c;TCP 和 UDP 是常用的兩種傳輸層協議&#xff0c;它們各自具有獨特的特點&#xff0c;適用于不同的應用需求。理解它們之間的差異&#xff0c;有助于開發者根據具體項目需求選擇合適的協議&#xff0c;以實現高效、穩定的網絡通信。…

04-深入解析 Spring 事務管理原理及源碼

深入解析 Spring 事務管理原理及源碼 Spring 事務管理&#xff08;Transaction Management&#xff09;是企業級應用開發中至關重要的功能之一&#xff0c;它確保數據操作的 原子性、一致性、隔離性、持久性&#xff08;ACID&#xff09;。 本篇博客將從 Spring 事務的基本概…

【Linux】用戶向硬件寄存器寫入值過程理解

思考一下&#xff0c;當我們咋用戶態向寄存器寫入一個值&#xff0c;這個過程是怎么樣的呢&#xff1f;以下是應用程序通過標準庫函數&#xff08;如 write()、ioctl() 或 mmap()&#xff09;向硬件寄存器寫入值的詳細過程&#xff0c;從用戶空間到內核再到硬件的完整流程&…

自動駕駛02:點云預處理——02(運動補償篇LIO-SAM)

當激光雷達&#xff08;LiDAR&#xff09;在運動中采集點云時&#xff0c;每個點的時間戳不同&#xff0c;而車輛在移動&#xff0c;導致點云在不同時間點的坐標與實際情況不符&#xff0c;這種現象稱為運動畸變&#xff08;Motion Distortion&#xff09;。為了得到無畸變的點…

基礎算法篇(3)(藍橋杯常考點)—圖論

前言 這期是基礎算法篇的第三節&#xff0c;其中的dijkstra算法更是藍橋杯中的高頻考點 圖的基本相關概念 有向圖和無向圖 自環和重邊 稠密圖和稀疏圖 對于不帶權的圖&#xff0c;一條路徑的路徑長度是指該路徑上各邊權值的總和 對于帶權的圖&#xff0c;一條路徑長度時指該路…

Crawl4AI:專為AI設計的開源網頁爬蟲工具,釋放大語言模型的潛能

在當今數據驅動的AI時代,高效獲取結構化網頁數據是模型訓練和應用落地的關鍵。Crawl4AI作為一款專為大型語言模型(LLMs)設計的開源爬蟲工具,憑借其極速性能、AI友好輸出和模塊化設計,正在成為開發者社區的熱門選擇。本文將深入解析其核心特性與技術優勢。 一、Crawl4AI的核…

前后端數據序列化:從數組到字符串的旅程(附優化指南)

&#x1f310; 前后端數據序列化&#xff1a;從數組到字符串的旅程&#xff08;附優化指南&#xff09; &#x1f4dc; 背景&#xff1a;為何需要序列化&#xff1f; 在前后端分離架構中&#xff0c;復雜數據類型&#xff08;如數組、對象&#xff09;的傳輸常需序列化為字符…

匯編學習之《移位指令》

這章節學習前需要回顧之前的標志寄存器的內容&#xff1a; 匯編學習之《標志寄存器》 算數移位指令 SAL (Shift Arithmetic Left)算數移位指令 : 左移一次&#xff0c;最低位用0補位&#xff0c;最高位放入EFL標志寄存器的CF位&#xff08;進位標志&#xff09; OllyDbg查看…

NLP高頻面試題(二十九)——大模型解碼常見參數解析

在大語言模型的實際應用中&#xff0c;如何更有效地控制文本生成的質量與多樣性&#xff0c;一直是熱門研究話題。其中&#xff0c;模型解碼&#xff08;decode&#xff09;策略至關重要&#xff0c;涉及的主要參數包括 top_k、top_p 和 temperature 等。本文將詳細介紹這些常見…

【C#】Task 線程停止

CancellationTokenSource cts 是用于控制任務&#xff08;線程&#xff09;停止運行的。我們一步步來解釋它的作用。 &#x1f50d; 現在的代碼結構大概是這樣的&#xff1a; Task.Run(() > {while (true){// 不斷循環采集圖像} });這種寫法雖然簡單&#xff0c;但最大的問…

WebRTC的ICE之TURN協議的交互流程中繼轉發Relay媒體數據的turnserver的測試

WebRTC的ICE之TURN協議的交互流程和中繼轉發Relay媒體數據的turnserver的測試 WebRTC的ICE之TURN協議的交互流程中繼轉發Relay媒體數據的turnserver的測試 WebRTC的ICE之TURN協議的交互流程和中繼轉發Relay媒體數據的turnserver的測試前言一、TURN協議1、連接Turn Server 流程①…

Redis + Caffeine多級緩存電商場景深度解析

Redis Caffeine多級緩存 Redis Caffeine多級緩存電商場景深度解析一、實施目的二、具體實施2.1 架構設計2.2 組件配置2.3 核心代碼實現 三、實施效果3.1 性能指標對比3.2 業務指標改善3.3 系統穩定性 四、關鍵策略4.1 緩存預熱4.2 一致性保障4.3 監控配置Prometheus監控指標 …

前端開發3D-基于three.js

基于 three.js 渲染任何畫面&#xff0c;都要基于這 3 個要素來實現 1場景scene&#xff1a;放置物體的容器 2攝像機&#xff1a;類似人眼&#xff0c;可調整位置&#xff0c;角度等信息&#xff0c;展示不同畫面 3渲染器&#xff1a;接收場景和攝像機對象&#xff0c;計算在瀏…

代碼隨想錄算法訓練營--打卡day4

一.移除鏈表元素 1.題目鏈接 203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 2.思路 通過 while 循環來遍歷鏈表&#xff0c;只要 cur 的下一個節點不為空&#xff0c;就繼續循環。在循環中&#xff0c;對 cur 的下一個節點的值進行判斷&#xff1a; 值不等于…

虛擬電廠:多元能源聚合,開啟綠色電力新時代

虛擬電廠&#xff1a;多元能源聚合&#xff0c;開啟綠色電力新時代 在“雙碳”目標驅動下&#xff0c;電力系統正經歷從集中式向分布式、從單一能源向多能互補的深刻變革。 作為能源互聯網的核心載體&#xff0c;虛擬電廠通過數字化技術整合多種能源資源&#xff0c;而是像指…

高通Android10 鈴聲通話音頻80%音量修改

先修改最高的音量step --- a/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.javab/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.java-311,14 311,14 public class AudioService extends IAudio…