在线教育平台 课程相关的接口实现

一、分页查询我的课表

按照Restful风格,查询请求应该使用GET方式。

请求路径一般是资源名称,比如这里资源是课表,所以资源名可以使用lessons,同时这里是分页查询,可以在路径后跟一个/page,代表分页查询

请求参数,因为是分页查询,首先肯定要包含分页参数,一般有两个:

  • pageNo:页码

  • pageSize:每页大小

这里只有两个排序条件,没有过滤条件,因此加上两个排序字段即可:

  • sortBy:排序方式

  • isAsc:是否升序

定义好

  • 统一的分页请求Query实体

  • 统一的分页结果DTO实体

  • 课表分页VO实体

 @Override
    public PageDTO<LearningLessonVO> queryMyLessons(PageQuery query) {
        // 1.获取当前登录用户
        Long userId = UserContext.getUser();
        // 2.分页查询
        // select * from learning_lesson where user_id = #{userId} order by latest_learn_time limit 0, 5
        Page<LearningLesson> page = lambdaQuery()
                .eq(LearningLesson::getUserId, userId) // where user_id = #{userId}
                .page(query.toMpPage("latest_learn_time", false));
        List<LearningLesson> records = page.getRecords();
        if (CollUtils.isEmpty(records)) {
            return PageDTO.empty(page);
        }
        // 3.查询课程信息
        Map<Long, CourseSimpleInfoDTO> cMap = queryCourseSimpleInfoList(records);

        // 4.封装VO返回
        List<LearningLessonVO> list = new ArrayList<>(records.size());
        // 4.1.循环遍历,把LearningLesson转为VO
        for (LearningLesson r : records) {
            // 4.2.拷贝基础属性到vo
            LearningLessonVO vo = BeanUtils.copyBean(r, LearningLessonVO.class);
            // 4.3.获取课程信息,填充到vo
            CourseSimpleInfoDTO cInfo = cMap.get(r.getCourseId());
            vo.setCourseName(cInfo.getName());
            vo.setCourseCoverUrl(cInfo.getCoverUrl());
            vo.setSections(cInfo.getSectionNum());
            list.add(vo);
        }
        return PageDTO.of(page, list);
    }

    private Map<Long, CourseSimpleInfoDTO> queryCourseSimpleInfoList(List<LearningLesson> records) {
        // 3.1.获取课程id
        Set<Long> cIds = records.stream().map(LearningLesson::getCourseId).collect(Collectors.toSet());
        // 3.2.查询课程信息
        List<CourseSimpleInfoDTO> cInfoList = courseClient.getSimpleInfoList(cIds);
        if (CollUtils.isEmpty(cInfoList)) {
            // 课程不存在,无法添加
            throw new BadRequestException("课程信息不存在!");
        }
        // 3.3.把课程集合处理成Map,key是courseId,值是course本身
        Map<Long, CourseSimpleInfoDTO> cMap = cInfoList.stream()
                .collect(Collectors.toMap(CourseSimpleInfoDTO::getId, c -> c));
        return cMap;
    }

第一段代码是一个方法queryMyLessons,用于查询当前登录用户的学习课程信息,并返回封装好的LearningLessonVO对象列表。方法逻辑包括: 1. 获取当前登录用户的ID。 2. 进行分页查询学习课程记录。 3. 调用queryCourseSimpleInfoList方法查询学习课程对应的课程简要信息。 4. 封装学习课程记录和课程简要信息到LearningLessonVO对象列表中。

第二段代码实现了将学习课程记录和对应课程简要信息关联起来,并返回一个包含完整信息的LearningLessonVO对象列表的功能。

二、添加课程到课表

当用户支付完成或者报名免费课程后,应该立刻将课程加入到课表中。交易服务会通过MQ通知学习服务,我们需要查看交易服务的源码,查看MQ通知的消息格式,来确定监听消息的格式。

 private List<CourseSimpleInfoDTO> getOnShelfCourse(List<Long> courseIds) {
        // 1.查询课程
        List<CourseSimpleInfoDTO> courseInfos = courseClient.getSimpleInfoList(courseIds);
        LocalDateTime now = LocalDateTime.now();
        // 2.判断状态
        for (CourseSimpleInfoDTO courseInfo : courseInfos) {
            // 2.1.检查课程是否上架
            if(!CourseStatus.SHELF.equalsValue(courseInfo.getStatus())){
                throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_FOR_SALE);
            }
            // 2.2.检查课程是否过期
            if(courseInfo.getPurchaseEndTime().isBefore(now)){
                throw new BizIllegalException(TradeErrorInfo.COURSE_EXPIRED);
            }
        }
        return courseInfos;
    }


    @Override
    @Transactional
    public PlaceOrderResultVO enrolledFreeCourse(Long courseId) {
        Long userId = UserContext.getUser();
        // 1.查询课程信息
        List<Long> cIds = CollUtils.singletonList(courseId);
        List<CourseSimpleInfoDTO> courseInfos = getOnShelfCourse(cIds);
        if (CollUtils.isEmpty(courseInfos)) {
            // 课程不存在
            throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_EXISTS);
        }
        CourseSimpleInfoDTO courseInfo = courseInfos.get(0);
        if(!courseInfo.getFree()){
            // 非免费课程,直接报错
            throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_FREE);
        }
        // 2.创建订单
        Order order = new Order();
        // 2.1.基本信息
        order.setUserId(userId);
        order.setTotalAmount(0);
        order.setDiscountAmount(0);
        order.setRealAmount(0);
        order.setStatus(OrderStatus.ENROLLED.getValue());
        order.setFinishTime(LocalDateTime.now());
        order.setMessage(OrderStatus.ENROLLED.getProgressName());
        // 2.2.订单id
        Long orderId = IdWorker.getId(order);
        order.setId(orderId);

        // 3.订单详情
        OrderDetail detail = packageOrderDetail(courseInfo, order, 0);

        // 4.写入数据库
        saveOrderAndDetails(order, CollUtils.singletonList(detail));

        // 5.发送MQ消息,通知报名成功
        rabbitMqHelper.send(
                MqConstants.Exchange.ORDER_EXCHANGE,
                MqConstants.Key.ORDER_PAY_KEY,
                OrderBasicDTO.builder()
                        .orderId(orderId)
                        .userId(userId)
                        .courseIds(cIds)
                        .finishTime(order.getFinishTime())
                        .build()
        );
        // 6.返回vo
        return PlaceOrderResultVO.builder()
                .orderId(orderId)
                .payAmount(0)
                .status(order.getStatus())
                .build();
    }

由此,我们可以得知发送消息的Exchange、RoutingKey,以及消息体。消息体的格式是OrderBasicDTO,包含四个字段:

  • orderId:订单id

  • userId:下单的用户id

  • courseIds:购买的课程id集合

  • finishTime:支付完成时间

实体类

@Data
@Builder
public class OrderBasicDTO {
    /**
     * 订单id
     */
    private Long orderId;
    /**
     * 下单用户id
     */
    private Long userId;
    /**
     * 下单的课程id集合
     */
    private List<Long> courseIds;
    /**
     * 订单完成时间
     */
    private LocalDateTime finishTime;
}
 @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "learning.lesson.pay.queue", durable = "true"),
            exchange = @Exchange(name = MqConstants.Exchange.ORDER_EXCHANGE, type = ExchangeTypes.TOPIC),
            key = MqConstants.Key.ORDER_PAY_KEY
    ))
    public void listenLessonPay(OrderBasicDTO order){
        // 1.健壮性处理
        if(order == null || order.getUserId() == null || CollUtils.isEmpty(order.getCourseIds())){
            // 数据有误,无需处理
            log.error("接收到MQ消息有误,订单数据为空");
            return;
        }
        // 2.添加课程
        log.debug("监听到用户{}的订单{},需要添加课程{}到课表中", order.getUserId(), order.getOrderId(), order.getCourseIds());
        lessonService.addUserLessons(order.getUserId(), order.getCourseIds());
    }
 @Override
    @Transactional
    public void addUserLessons(Long userId, List<Long> courseIds) {
        // 1.查询课程有效期
        List<CourseSimpleInfoDTO> cInfoList = courseClient.getSimpleInfoList(courseIds);
        if (CollUtils.isEmpty(cInfoList)) {
            // 课程不存在,无法添加
            log.error("课程信息不存在,无法添加到课表");
            return;
        }
        // 2.循环遍历,处理LearningLesson数据
        List<LearningLesson> list = new ArrayList<>(cInfoList.size());
        for (CourseSimpleInfoDTO cInfo : cInfoList) {
            LearningLesson lesson = new LearningLesson();
            // 2.1.获取过期时间
            Integer validDuration = cInfo.getValidDuration();
            if (validDuration != null && validDuration > 0) {
                LocalDateTime now = LocalDateTime.now();
                lesson.setCreateTime(now);
                lesson.setExpireTime(now.plusMonths(validDuration));
            }
            // 2.2.填充userId和courseId
            lesson.setUserId(userId);
            lesson.setCourseId(cInfo.getId());
            list.add(lesson);
        }
        // 3.批量新增
        saveBatch(list);
    }

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
万岳在线教育系统源码v1.1.4 源码描述: 一、万岳在线教育系统源码 搭建迅速,为您提供完善的线上教育解决方案 源码开源,可定制开发,多终端,多版本,多选择 二、产品介绍 万岳在线教育系统,是一款集直播授课、在线答疑、作业批改、互动白板等教学功能为一身的网络教学平台。源码开源,支持定制或二次开发,可全球搭建部署。 万岳网校系统源码,轻松实现小班课、大班课、双师教学、内容付费等众多教学场景,是学校和教培机构的不二选择。 三、应用场景 互动大班课 包含语音大班课和视频大班课两种模式,可容纳万人同时在线;语音大班课支持视频、音频、PPT,视频大班课以实时视频讲座的形式展现。 功能模块:直播授课、文字互动、课件展示、语音互动、教学白板、屏幕共享 精品小班课 支持老师和学员视频连麦,实现师生之间一对一、一对多视频互动教学。内置教学白板、随堂测验、抢答、举手上台等多种实用教学功能。 功能模块:直播授课、教学白板、屏幕共享、连麦互动、随堂测验、在线抢答 双师教学 主讲老师线上授课,辅导老师协助主讲老师答疑督学、维持课堂纪律、总结知识要点、发布重要提醒,构建高效有序的授课直播环境。 功能模块:直播授课、课件共享、连麦互动、教学白板、课堂练习、屏幕共享 内容付费 包含知识付费和课程付费两种模式,内容分为视频、图文和语音三种展现形式,学员通过免费、密码、付费三种方式获取相关课程。 功能模块:视频课程、图文课程、直播课程、语音课程、组合销售 四、功能展示 1、教学白板 含画笔、文本框、橡皮擦等工具,支持书写标记、PPT上传等操作。 2、互动连麦 小班课中,学员申请视频连麦,1名讲师最多能与16位学员同时连麦。 3、随堂测验 测验含三种题型,分为选择、判断和应用题,讲师能在开课前预设测验。 4、课堂练习 讲师发布课堂练习后,学员需在一定时间内完成答题,结束后练习自动提交。 5、举手上台 直播授课中,学员举手申请上台与讲师连麦,讲师同意后便能上台。 6、在线抢答 讲师随机发布题目,学员参与抢答,讲师选中的学员即可上麦沟通。 7、屏幕共享 精品小班课中,讲师可在直播间内共享自己的电脑桌面给学员。 8、课件下载 学员在上课时下载的课件,可到个人中心“我的课件”中进行查看。 9、懂没懂 讲师授课时可利用“懂没懂”功能来大体判断学员对知识的掌握。 10、录播回放 平台可将小班课直播实况全程录下,学员能凭此功能及时参与补课。 11、作业本 讲师能在上课端发布课堂作业,内容来源:上传试卷照片,或在题库中选择添加。 12、错题本 学员能将作业或课堂测试中的错题添加至个人中心错题本,支持题目拍照上传。 13、网课购买 根据需求,学员能将付费课程添加到购物车,若课程配有教材,需填写收货地址。 五、系统优势 1、高并发优化 提供高并发、大数据解决方案,支持数据库读写分离和集群化部署。 2、安全可靠 数据加密,内容云端存储,防盗防录屏,IP访问监控,全方位保护课程版权。 3、多终端支持 支持Web、Android、iOS、ipad等多个终端切换。 4、注重体验 高清视频直播授课,码率自适应,播放超低延迟,互动连麦流畅不失真。 六、产品参数 开发语言 Android端APP:Java ios端APP:Object-c 管理后台服务端:php 采用框架:ThinkPHP 服务器参数 数据库:Mysql 缓存服务器:Redis 聊天服务器:Socket 传输协议和媒体格式 推流 :RTMP 拉流 RTMP和HTTP 音频格式:ACC 视频格式:H.264 服务器配置 操作系统:linux CentOS 服务器,建议购买境内的服务器 三方服务 编解码:腾讯云直播SDK 存储:七牛云提供,每月免费10G的流量和10G的存储服务 服务器:推荐使用阿里云、腾讯云 分发:腾讯云CDN, 使用腾讯云的编解码SDK,绑定使用腾讯云的CDN分发业务 域名:阿里云、腾讯云(使用阿里云的服务器要再阿里云备案,腾讯云同理) 租赁中国境内范围内的服务器需要域名做备案,使用非境内的服务器-无需备案 物流:阿里云市场:快递查询接口 登录:QQ,微信,短信。QQ,微信去腾讯开放平台申请,短信去对应的短信接口平台申请接入 支付:Android 微信支付,支付宝支付,iOS applepay
这是一个基于SpringBoot和Vue的在线视频教育平台的源码资源包。该平台旨在为用户提供一个便捷的在线教育学习环境,涵盖了课程浏览、视频播放、用户管理、课程管理等功能。通过这个平台,用户可以随时随地学习自己感兴趣的课程,同时老师也可以方便地发布和管理课程内容。 该源码资源包包含了完整的前端和后端代码,以及部署说明和演示视频。前端使用Vue框架进行开发,实现了响应式布局和交互设计,为用户提供了良好的用户体验。后端则采用SpringBoot框架,实现了RESTful API接口,方便与前端进行数据交互。 在课程浏览方面,用户可以按照分类、热度等条件筛选课程,查看课程详情和评分,从而选择合适的课程进行学习。视频播放功能支持多种分辨率选择,以及弹幕、评论等互动功能,让用户在学习过程中能够更好地参与和交流。 此外,平台还提供了用户管理和课程管理功能。用户可以注册、登录、修改个人信息,以及收藏、购买课程等。老师则可以发布新的课程、更新课程内容、管理学生信息等。这些功能都通过后端的API接口实现,保证了数据的安全性和一致性。 总之,这个基于SpringBoot和Vue的在线视频教育平台源码资源包为用户提供了一个功能完善、易于使用的在线教育学习环境。通过这个平台,用户可以方便地找到自己感兴趣的课程,进行高效的在线学习。
在线教育平台是基于云技术一站式全面服务,打造出一种新型的在线教育平台系统,此平台包括校园模式、企业模式,以及云视频教育模式等。 在线教育平台是基于SpringCloud微服务开发,单个微服务启动较快,局部修改容易部署。 此平台包含PC端、微信小程序、H5端、App、后台管理。仿照小鹅通、魔学院做的全系列产品。 文档包含:《服务器端安装部署手册》、《开发环境搭建手册》、《产品手册》、《用户操作手册》、《数据库结构说明文档》、《应用层API接口说明文档》、《系统架构文档》。 功能点包含: 学习平台:真实还原线下课堂; 在线直播:教学直播延时不卡顿; 在线打卡:轻量级的督学学习产品; 题库系统:实现教考分离、智能考试; 移动学习:随时随地、碎片化移动学习; 在线班级:引入分班制、高效督导服务; 教学应用:关联网校、督学助学应用工具; 数据平台:运营流量建设和用户维系; 网校系统:直播课堂、视频课程、付费问答、互动班级; 考试测评:课后作业、模拟考试、智能组卷、自动阅卷、考试统计、万人考试、智能评估; 视频云服务:大班直播、小班课、1V1私教、录播课。 营销点包含: 涨粉神器:粉丝裂变式邀请,拉新引流; 售课工貝:限时折扣、划价、优惠券、兑换码; 裂变海报:热门裂变传播玩法,吸粉引流; 裂变红包:挖掘微信精准流量,全民营销; 请好友看:快速提高课程访问量,提升品牌曝光; 积分体系:增强平台黏性、学员忠诚度; 分销体系:多渠道微信生态分销; 拼团秒杀:打造爆款,刺激课程销量。 建议以下配置:CentOS 7.6、MySQL 5.6、JDK 8.0、Tomcat 8.0、Tengine2.3、Redis3.2、Docker。 在线教育平台&在线培训平台 更新日志: v4.6 1、题库系统:多选问题的解决;实现教考分离、智能考试; 2、在线班级:增加班主任的功能; 3、网校系统:直播课堂中bug的修复; 4、考试测评:小班课中1V1私教的bug修复; 5、分校体系:微信转发的bug修复; 6、限时折扣:时间区间的bug修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值