课程发布与学习流程全解析

流程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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; …