課程發布與學習流程全解析

流程

image-20250519162453195

課程發布Controller

獲取課程發布信息

@ApiOperation("獲取課程發布信息")
@ResponseBody
@GetMapping("/course/whole/{courseId}")
public CoursePreviewDto getPreviewInfo(@PathVariable("courseId") Long courseId) {CoursePreviewDto coursePreviewDto = new CoursePreviewDto();//獲取課程預覽信息CoursePublish coursePublish = coursePublishService.getCoursePublish(courseId);if (coursePublish == null) {return coursePreviewDto;}// 開始向coursePreviewDto填充數據CourseBaseInfoDto courseBaseInfoDto = new CourseBaseInfoDto();BeanUtils.copyProperties(coursePublish, courseBaseInfoDto);// 課程計劃信息String teachplan = coursePublish.getTeachplan();// 轉成List<TeachplanDto>List<TeachplanDto> teachplanDtos = JSON.parseArray(teachplan,TeachplanDto.class);coursePreviewDto.setCourseBase(courseBaseInfoDto);coursePreviewDto.setTeachplans(teachplanDtos);return coursePreviewDto;}

學習服務

獲取課程學習視頻地址

/*** 獲取課程學習視頻地址* @param userId 用戶id* @param courseId 課程id* @param teachplanId 課程計劃id* @param mediaId 媒資id* @return*/@Overridepublic RestResponse<String> getVideo(String userId, Long courseId, Long teachplanId, String mediaId) {// 查詢課程信息CoursePublish coursepublish = contentServiceClient.getCoursepublish(courseId);if (coursepublish == null) {RestResponse.validfail("課程不存在");}// 遠程調用內容管理服務,根據課程計劃id(teachplanId)去查詢課程計劃信息,如果is_preview為1表示支持試學// 也可以從coursepublish對象中解析出課程計劃信息去判斷是否支持試學List<TeachplanDto> teachplanDtos = contentServiceClient.queryTreeNodes(courseId);TeachplanDto teachplanDto = findTeachplanDtoById(teachplanDtos, teachplanId);String isPreview = teachplanDto.getIsPreview();if (isPreview == null || "0".equals(isPreview)) {RestResponse.validfail("該課程計劃不支持試看");} else if ("1".equals(isPreview)) {// 如果視頻支持試學調用媒資服務查詢視頻的播放地址,返回return mediaServiceClient.getPlayUrlByMediaId(mediaId);}// 用戶已登錄if (StringUtil.isNotEmpty(userId)) {// 獲取學習資格XcCourseTablesDto xcCourseTablesDto = myCourseTablesService.getLearningStatus(userId, courseId);String learnStatus = xcCourseTablesDto.getLearnStatus();if ("702002".equals(learnStatus)) {// 獲取視頻播放地址return RestResponse.validfail("無法學習,因為沒有選課或選課后沒有支付");} else if ("702003".equals(learnStatus)) {return RestResponse.validfail("已過期需要申請續費或重新支付");} else {// 有資格學習,要返回視頻的播放地址// 遠程調用媒資獲取視頻播放地址return mediaServiceClient.getPlayUrlByMediaId(mediaId);}}// 如果用戶沒有登錄// 取出課程收費規則String charge = Objects.requireNonNull(coursepublish).getCharge();if ("201000".equals(charge)) {// 有資格學習,要返回視頻的播放地址//  遠程調用媒資獲取視頻播放地址return mediaServiceClient.getPlayUrlByMediaId(mediaId);}return RestResponse.validfail("課程需要購買");}

根據teachplanId從課程計劃列表中查找對應的TeachplanDto

/*** 根據teachplanId從課程計劃列表中查找對應的TeachplanDto* @param teachplanDtos 課程計劃列表* @param teachplanId 要查找的課程計劃ID* @return 找到的TeachplanDto對象,未找到返回null*/
private TeachplanDto findTeachplanDtoById(List<TeachplanDto> teachplanDtos, Long teachplanId) {return teachplanDtos.stream().flatMap(dto -> {// 將當前節點及其子節點合并到一個流中Stream<TeachplanDto> stream = Stream.of(dto);if (dto.getTeachPlanTreeNodes() != null) {Stream<TeachplanDto> childrenStream = dto.getTeachPlanTreeNodes().stream();stream = Stream.concat(stream, childrenStream);}return stream;}).filter(dto -> dto.getId().equals(teachplanId)).findFirst().orElse(null);
}

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

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

相關文章

Linux的讀寫屏障

在 Linux 中&#xff0c;讀寫屏障&#xff08;Read-Write Barriers&#xff0c;簡稱 RWB&#xff09;是對內存訪問順序的一種控制機制&#xff0c;用來保證在多核處理器環境下&#xff0c;內存訪問的正確順序&#xff0c;避免因亂序執行導致的數據一致性問題。它是操作系統內核…

Spring AI 和 Elasticsearch 作為你的向量數據庫

作者&#xff1a;來自 Elastic Josh Long, Philipp Krenn 及 Laura Trotta 使用 Spring AI 和 Elasticsearch 構建一個完整的 AI 應用程序。 Elasticsearch 原生集成了業界領先的生成式 AI 工具和服務提供商。查看我們關于超越 RAG 基礎或使用 Elastic 向量數據庫構建生產級應用…

TDengine 高可用——雙活方案

概述 部分用戶因為部署環境的特殊性只能部署兩臺服務器&#xff0c;同時希望實現一定的服務高可用和數據高可靠。本文主要描述基于數據復制和客戶端 Failover 兩項關鍵技術的 TDengine 雙活系統的產品行為&#xff0c;包括雙活系統的架構、配置、運維等。TDengine 雙活既可以用…

與 JetBrains 官方溝通記錄(PyCharm 相關問題反饋)

#工作記錄 溝通記錄&#xff1a; Subject: Feedback on Terminal and Environment Activation Issues in PyCharm : PY-81233 溝通進度&#xff1a; 【筆記】記一次PyCharm的問題反饋_the polyglot context is using an implementation th-CSDN博客 【筆記】與PyCharm官方溝通…

前端實戰:用 JavaScript 模擬文件選擇器,同步實現圖片預覽與 Base64 轉換

代碼 function 仙盟插件_通用_圖片_上傳(人間通道id,檢驗關卡img,仙界指引id){const 人間通道 document.getElementById(人間通道id);const 檢驗關卡 document.getElementById(檢驗關卡img);const 仙界指引 document.getElementById(仙界指引id);人間通道.addEventListener(…

數據庫設計文檔撰寫攻略

數據庫設計文檔撰寫攻略 一、數據庫設計文檔的核心價值二、數據庫設計文檔的核心框架與內容詳解2.1 文檔基礎信息2.2 需求分析與設計原則2.2.1 業務需求概述2.2.2 設計原則 2.3 數據模型設計2.3.1 概念模型&#xff08;ER 圖&#xff09;2.3.2 邏輯模型&#xff08;表結構設計&…

3D個人簡歷網站 7.聯系我

3D個人簡歷網站 7.聯系我 修改Contact.jsx // 從 react 庫導入 useRef 和 useState hooks import { useRef, useState } from "react";/*** Contact 組件&#xff0c;用于展示聯系表單&#xff0c;處理用戶表單輸入和提交。* returns {JSX.Element} 包含聯系表單的 …

AI大模型從0到1記錄學習numpy pandas day25

第 3 章 Pandas 3.1 什么是Pandas Pandas 是一個開源的數據分析和數據處理庫&#xff0c;它是基于 Python 編程語言的。 Pandas 提供了易于使用的數據結構和數據分析工具&#xff0c;特別適用于處理結構化數據&#xff0c;如表格型數據&#xff08;類似于Excel表格&#xff09;…

一些可以優化JavaScript性能的工具或庫匯總

在 JavaScript 性能優化方面,有許多實用的工具和庫可以幫助你分析、監控和提升代碼性能。以下是一些常用的工具和庫分類整理: 一、性能分析工具 這些工具用于診斷性能瓶頸,定位問題代碼。 Chrome DevTools Performance 面板:分析運行時性能,記錄函數執行時間、內存使用、…

Linux | tmux | 無法復制粘貼

問題&#xff1a;在Linux中使用tmux時&#xff0c;總是沒法使用復制粘貼功能&#xff1b; 解決: 如果希望直接用鼠標選擇并復制&#xff08;類似普通終端&#xff09;&#xff0c;可以&#xff1a; 在 ~/.tmux.conf 中添加&#xff1a;sh set -g mouse on;重新加載 tmux 配置…

行賄罪案件(公安偵查階段)詢問筆錄發問提綱

一、基本情況核實 與行賄對象&#xff08;受賄人&#xff09;的關系&#xff1f;何時通過何種方式認識&#xff1f;日常交往頻率及主要內容&#xff1f; 是否具備國家工作人員身份或其他特定主體資格&#xff1f;是否屬于被追訴單位的直接責任人員&#xff1f; 二、行賄動機與…

活到老學到老-Spring參數校驗注解Validated /Valid

通過 Validated 和 Valid可以對請求的進行參數校驗。 1.核心對比&#xff1a; 特性Valid (JSR-303)Validated (Spring)來源Java標準規范Spring框架擴展分組校驗不支持支持&#xff08;通過groups屬性&#xff09;嵌套路徑自動處理級聯校驗需配合Valid生效應用范圍方法參數、屬…

【筆記】JetBrains 數據遷移與符號鏈接操作

數據遷移與符號鏈接操作 一、備份原始數據 使用 robocopy 命令備份 C 盤中的源文件夾&#xff0c;確保原始數據完整備份。 robocopy "C:\Users\love\AppData\Local\JetBrains" "E:\Downloads\Other\JetBrains" /E確保備份路徑足夠存儲空間。 二、復制文…

使用 Terraform 創建 Azure Databricks 工作區

使用 Terraform 創建 Azure Databricks Terraform 是一種基礎設施即代碼(IaC)工具,允許用戶通過聲明式配置文件來管理和部署云資源。Azure Databricks 是一個基于 Apache Spark 的分析平臺,專為數據工程和數據科學設計。通過 Terraform,可以自動化 Azure Databricks 的創…

【zookeeper】--部署3.6.3

文章目錄 下載解壓創建data和logs配置文件1)創建目錄并且編輯 zoo.cfg2)接下來將 node01 的 ZooKeeper 所有文件拷貝至 node02 和 node03。推薦從 node02 和 node03 拷貝4&#xff09;最后 vim /etc/profile 配置環境變量&#xff0c;環境搭建結束。配完環境變量后 source /etc…

RxJS 核心操作符詳細用法示例

1. Observable 詳細用法 Observable 是 RxJS 的核心概念&#xff0c;代表一個可觀察的數據流。 創建和訂閱 Observable import { Observable } from "rxjs";// 1. 創建Observable const myObservable new Observable(subscriber > {// 發出三個值subscriber.n…

QGrphicsScen畫布網格和QGrphicsItem對齊到網格

#include <QGraphicsScene> #include <QPainter> #include <QWheelEvent> #include <QGraphicsView> class MyGraphicsView : public QGraphicsView { public:MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene){}protected:// 重寫滾輪事…

深入解析自然語言處理中的語言轉換方法

在數字化浪潮席卷全球的今天&#xff0c;自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;作為人工智能領域的核心技術之一&#xff0c;正深刻地改變著我們與機器交互的方式。其中&#xff0c;語言轉換方法更是 NLP 的關鍵組成部分&#xff0c…

VRRP虛擬路由器協議的基本概述

目錄 vrrp是什么&#xff1f; VRRP的一些概念與專有名詞 VRRP的Master選舉規則&#xff1a; 尾聲 vrrp是什么&#xff1f; vrrp全名virtual router redundance protocol&#xff0c;虛擬路由器冗余協議 VRRP的一些概念與專有名詞 1&#xff09;VRRP設備&#xff1a;運行VRRP…

數據結構 -- 交換排序(冒泡排序和快速排序)

冒泡排序 基于“交換”的排序&#xff1a;根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置 //交換 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …