黑马天机学堂-2、我的课程表 接口分析与设计

在昨天的学习中,我带领大家解决了天机学堂的简单的BUG。并且演示了整个项目的核心业务流程。现在,你对项目有了基本的了解,是时候动手开发一些业务功能了。

接下来接收到一个正式的开发任务:开发天机学堂项目的学习辅助相关功能

不要小看这部分功能,作为一个在线教育项目,学习是核心。而怎样让学员有一个好的学习体验,持续有动力的学习,就显得非常关键。我们要实现的学习辅助功能,就是要起到激励、促进学员、帮助学员学习的功能,非常重要。

那么从哪里入手呢?

我们来回顾一下,在演示项目业务流程时,我们发现搜索课程、报名课程等流程都已经完成开发了。并且在《个人中心-我的订单》页面可以看到我们下单报名的课程:

通过今天的学习,我们要达成的目标如下:

  • 完成我的课程表相关功能

  • 学会阅读产品原型,分析需求

  • 能根据需求设计接口

  • 能根据需求设计数据库表

  • 学会跨微服务的业务开发

1.接口设计

那么接下来,我们就一起来分析、设计、实现这些接口吧。

科程下栽の,参考资料  https://sourl.cn/sx6zLt

接口分析和设计的方法

企业开发中往往会通过一些工具来设计API接口,比如比较常见的一款API接口工具:YAPI

主要描述查询参数的基本信息,包括:

  • 参数名称

  • 参数是否必须

  • 参数示例

  • 参数描述

由于这里是查询用户集合,请求方式是GET,因此查询参数就是普通的QUERY参数,也就是路径后的?

拼接参数。如果是POST或者PUT请求,这里还可以传递更复杂的参数格式,比如FORM表单、JSON等

知道了这些,前端就知道发送请求时,要携带哪些参数了。

...................

2.数据结构

基于之前的分析,我们已经知道了业务基本流程、用户的交互行为。而用户的这些行为必然产生数据,需要保存到数据库中。这些数据在保存时必须有设定好的结构,这样才能支撑我们完成各种接口功能。

接下来,我们就分析一下课表相关的业务对应的数据结构。

ER图

我们可以结合原型图中包含的信息来画一个ER图,分析我的课表包含的信息:

表结构

基于ER图,课表对应的数据库结构应该是这样的:

CREATE TABLE learning_lesson ( id bigint NOT NULL COMMENT '主键', user_id bigint NOT NULL COMMENT '学员id', course_id bigint NOT NULL COMMENT '课程id', status tinyint DEFAULT '0' COMMENT '课程状态,0-未学习,1-学习中,2-已学完,3-已失效', week_freq tinyint DEFAULT NULL COMMENT '每周学习频率,每周3天,每天2节,则频率为6', plan_status tinyint NOT NULL DEFAULT '0' COMMENT '学习计划状态,0-没有计划,1-计划进行中', learned_sections int NOT NULL DEFAULT '0' COMMENT '已学习小节数量', latest_section_id bigint DEFAULT NULL COMMENT '最近一次学习的小节id', latest_learn_time datetime DEFAULT NULL COMMENT '最近一次学习的时间', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', expire_time datetime NOT NULL COMMENT '过期时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY idx_user_id (user_id,course_id) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生课表';

我们要创建一个名为tj_learning的database,并且执行上面的SQL语句,创建learning_lesson

3 代码生成

在天机学堂项目中,我们使用的是Mybatis作为持久层框架,并且引入了MybatisPlus来简化开发。因此,在创建据库以后,就需要创建对应的实体类、mapper、service等。

这些代码格式固定,编写起来又比较费时。好在IDEA中提供了一个MP插件,可以生成这些重复代码

private final CatalogueClient catalogueClient;

@Override
public LearningLessonVO queryMyCurrentLesson() {
    // 1.获取当前登录的用户
    Long userId = UserContext.getUser();
    // 2.查询正在学习的课程 select * from xx where user_id = #{userId} AND status = 1 order by latest_learn_time limit 1
    LearningLesson lesson = lambdaQuery()
            .eq(LearningLesson::getUserId, userId)
            .eq(LearningLesson::getStatus, LessonStatus.LEARNING.getValue())
            .orderByDesc(LearningLesson::getLatestLearnTime)
            .last("limit 1")
            .one();
    if (lesson == null) {
        return null;
    }
    // 3.拷贝PO基础属性到VO
    LearningLessonVO vo = BeanUtils.copyBean(lesson, LearningLessonVO.class);
    // 4.查询课程信息
    CourseFullInfoDTO cInfo = courseClient.getCourseInfoById(lesson.getCourseId(), false, false);
    if (cInfo == null) {
        throw new BadRequestException("课程不存在");
    }
    vo.setCourseName(cInfo.getName());
    vo.setCourseCoverUrl(cInfo.getCoverUrl());
    vo.setSections(cInfo.getSectionNum());
    // 5.统计课表中的课程数量 select count(1) from xxx where user_id = #{userId}
    Integer courseAmount = lambdaQuery()
            .eq(LearningLesson::getUserId, userId)
            .count();
    vo.setCourseAmount(courseAmount);
    // 6.查询小节信息
    List<CataSimpleInfoDTO> cataInfos =
            catalogueClient.batchQueryCatalogue(CollUtils.singletonList(lesson.getLatestSectionId()));
    if (!CollUtils.isEmpty(cataInfos)) {
        CataSimpleInfoDTO cataInfo = cataInfos.get(0);
        vo.setLatestSectionName(cataInfo.getName());
        vo.setLatestSectionIndex(cataInfo.getCIndex());
    }
    return vo;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/196332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新版微信如何打开青少年模式?

最新版微信如何打开青少年模式&#xff1f; 1、将手机微信升级到最新版&#xff0c;并打开后点击底部我的进入&#xff1b; 2、在我的内&#xff0c;找到并点击设置进入&#xff1b; 3、在设置内找到青少年模式&#xff0c;并点击进入开启微信青少年模式&#xff1b; 原文来源…

解决SLF4J: Class path contains multiple SLF4J bindings.

这个问题在使用Dubbo时产生&#xff0c;推荐一个插件Maven Helper 1.插件安装 安装好后下方会有一个Dependency Analyzer&#xff0c;点击进入 2.删除冲突项 根据报错信息选择一个slf4j删除&#xff0c;不一定是slf4j-log4j12&#xff0c;每个人的报错信息不一样&#xff0c;图…

单图像3D重建AI算法综述【2023】

计算机视觉是人工智能的一个快速发展的领域&#xff0c;特别是在 3D 领域。 本概述将考虑一个应用任务&#xff1a;2D 和 3D 环境之间的转换。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编…

贝锐蒲公英云AP,企业WiFi功能如何使用?

1. 功能介绍 基于WPA2-EAP安全认证技术&#xff0c;为企业提供了一套易用安全的企业无线网络,实现企业员工通过蒲公英客户端一键连接企业无线WiFi。自动分配一人一帐一密&#xff0c;无需配置证书或手动输入密码&#xff0c;减少沟通成本&#xff0c;方便快捷&#xff0c;提高…

Docker中的RabbitMQ已经启动运行,但是管理界面打不开

文章目录 前言一、解决方法方法一方法二 总结 前言 肯定有好多小伙伴在学习RabbitMQ的过程中&#xff0c;发现镜像运行&#xff0c;但是我的管理界面怎么进不去&#xff0c;或者说我第一天可以进去&#xff0c;怎么第二天进不去了&#xff0c;为什么每次重新打开虚拟机都进不去…

C/C++高精度

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 为什么需要高精度算法&#xff1f; 由于c不能进行位数过高的数据运算&#xff0c;所以要通过模拟数组来进行运算&#xff0c;首先是加法。…

.babyk勒索病毒解析:恶意更新如何威胁您的数据安全

导言&#xff1a; 在数字时代&#xff0c;威胁不断进化&#xff0c;其中之一就是.babyk勒索病毒。这种病毒采用高级加密算法&#xff0c;将用户文件锁定&#xff0c;并要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.babyk勒索病毒的特点、如何应对被加密的数据&#…

(1)(1.17) Maxbotix 模拟声纳

文章目录 前言 1 连接到Pixhawk 2 通过Mission Planner进行设置 3 测试传感器 4 参数说明 前言 XL-Maxbotix-EZ 系列模拟声纳&#xff08;XL-MaxSonar-EZ0、EZ4 和 EZL0&#xff09;是相对便宜的短距离&#xff08;7m 至 10m&#xff09;测距仪&#xff0c;主要设计用于室…

实施方法论

软件实施方法论(通用) 软件项目实施交付模型很多领域流传着别人家的传说&#xff1a;别人家的孩子学习成绩好才艺多还长得帅&#xff0c;别人家的客户钱多人傻速来&#xff0c;别人家的公司不加班产品做得好工资还发的倍儿高。这一切事情实际上都有常量和变量&#xff0c;比如…

计算机毕业设计项目选题推荐(免费领源码)java+SSM+mysql澄海区人民新闻中心管理系统67273

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;地方政府当然也不能排除在外。人民新闻中心管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff…

应用程序生成器:App Builder 2023

DecSoft应用程序生成器 专为小屏幕设备设计&#xff0c;但也可以&#xff08;无需更改&#xff09;部署在平板电脑等较大设备中。 如果您想创建现代桌面和移动应用程序&#xff0c;那么您来对地方了&#xff01;DecSoft App Builder 是一个专业的可视化开发环境&#xff0c;用于…

自学人工智能该从哪里开始准备?

随着人工智能技术的飞速发展&#xff0c;越来越多的人对学习人工智能产生了浓厚的兴趣。然而&#xff0c;对于许多初学者来说&#xff0c;不知道如何开始自学人工智能。今天&#xff0c;我将向大家介绍一些自学人工智能的步骤&#xff0c;帮助大家更好地入门这个领域。 第一步&…