07-学成在线修改/查询课程的基本信息和营销信息

news2024/11/24 7:52:41

修改/查询单个课程信息

界面原型

第一步: 用户进入课程列表查询页面,点击编辑按钮编辑课程的相关信息

在这里插入图片描述

第二步: 进入编辑界面显示出当前编辑课程的信息,其中课程营销信息不是必填项,修改成功后会自动进入课程计划编辑页面

在这里插入图片描述

查询课程信息

请求/响应数据模型

使用Http Client测试,根据课程Id查询课程信息,查询结果为单条课程信息对象CourseBaseInfoDto

// 根据课程Id查询课程信息
GET {{content_host}}/content/course/22
Content-Type: application/json

根据查询的响应结果定义对应的响应模型类CourseBaseInfoDto,由于其大部分信息来自课程基本信息表,所以我们可以将定义的响应结果模型类继承CourseBase

  • 大分类名称和小分类名称来自于课程分类表,需要根据请求参数中携带的大分类Id和小分类Id从数据库中获取
// 响应结果
HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 04 Feb 2023 07:06:22 GMT
Keep-Alive: timeout=60
Connection: keep-alive
    
{
  "id": 22,
  "companyId": 1232141425,
  "companyName": null,
  "name": "大数据2",
  "users": "具有一定的java基础",
  "tags": null,
  "mt": "1-6",
  "st": "1-6-1",
  "grade": "200001",
  "teachmode": "200002",
  "description": "111111大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据",
  "pic": "https://cdn.educba.com/academy/wp-content/uploads/2018/08/Spring-BOOT-Interview-questions.jpg",
  "createDate": "2019-09-04 09:56:19",
  "changeDate": "2022-09-16 07:59:57",
  "createPeople": null,
  "changePeople": null,
  "auditStatus": "202001",
  "status": "203001",
  "charge": "201001",
  "price": 11.0,
  "originalPrice": 1111.0,
  "qq": "334455",
  "wechat": "223321",
  "phone": "1333333",
  "validDays": 33,
  "mtName": "云计算/大数据",
  "stName": "Spark"
}

查询课程基本/营销信息

第一步: 在api工程中定义接口,根据课程Id查询课程信息

@ApiOperation("根据课程id查询课程基础信息")
@GetMapping("/course/{courseId}")
public CourseBaseInfoDto getCourseBaseById(@PathVariable Long courseId) {
    return courseBaseInfoService.getCourseBaseInfo(courseId);
}

第二步: 在service工程中编写service接口及其实现类,将新增课程时实现的方法getCourseBaseInfo声明为Service接口的方法

/**
 * 根据课程id查询课程基本信息
 * @param courseId  课程id
 * @return
 */
CourseBaseInfoDto getCourseBaseInfo(Long courseId);
public interface CourseBaseInfoService {
    CourseBaseInfoDto getCourseBaseInfo(Long courseId);
}

private CourseBaseInfoDto getCourseBaseInfo(Long courseId) {
    // 创建CourseBaseInfoDto对象
    CourseBaseInfoDto courseBaseInfoDto = new CourseBaseInfoDto();
    // 1. 根据课程id查询课程基本信息
    CourseBase courseBase = courseBaseMapper.selectById(courseId);
    if (courseBase == null)
        return null;
    // 1.1 拷贝属性
    BeanUtils.copyProperties(courseBase, courseBaseInfoDto);
    // 2. 根据课程id查询课程营销信息
    CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
    // 2.1 拷贝属性
    if (courseMarket != null)
        BeanUtils.copyProperties(courseMarket, courseBaseInfoDto);
    // 3. 查询课程分类名称并封装到到CourseBaseInfoDto对象中
    // 3.1 根据小分类id(1-1-1)查询对应的课程分类对象
    CourseCategory courseCategoryBySt = courseCategoryMapper.selectById(courseBase.getSt());
    // 3.2 设置课程的小分类名称
    courseBaseInfoDto.setStName(courseCategoryBySt.getName());
    // 3.3 根据大分类id(1-1)查询对应的课程分类对象
    CourseCategory courseCategoryByMt = courseCategoryMapper.selectById(courseBase.getMt());
    // 3.4 设置课程大分类名称
    courseBaseInfoDto.setMtName(courseCategoryByMt.getName());
    // 返回CourseBaseInfoDto对象
    return courseBaseInfoDto;
}

修改课程信息

请求/响应数据模型

根据课程Id修改课程信息,根据请求参数定义对应的请求模型类EditCourseDto中

PUT /content/course
Content-Type: application/json
// 将请求参数封装到EditCourseDto对象中
{
    "id": 40,
    "companyName": null,
    "name": "SpringBoot核心",
    "users": "Spring Boot初学者",
    "tags": "Spring项目的快速构建",
    "mt": "1-3",
    "st": "1-3-2",
    "grade": "200003",
    "teachmode": "201001",
    "description": "课程系统性地深度探讨 Spring Boot 核心特性,引导小伙伴对 Java 规范的重视,启发对技术原理性的思考,掌握排查问题的技能,以及学习阅读源码的方法和技巧,全面提升研发能力,进军架构师队伍。",
    "pic": "https://cdn.educba.com/academy/wp-content/uploads/2018/08/Spring-BOOT-Interview-questions.jpg",
    "charge": "201001",
    "price": 0.01
}

修改课程信息时比新增课程多了课程Id,因为需要根据课程id去数据库中更新课程基本信息表和课程营销表中对应的信息并保存数据

@Data
@ApiModel(value = "EditCourseDto", description = "修改课程基本信息")
public class EditCourseDto extends AddCourseDto{
    @ApiModelProperty(value = "课程id", required = true)
    private Long id;
}

根据响应结果定义对应的响应模型类CourseBaseInfoDto

// 修改成功的响应结果是一个CourseBaseInfoDto对象
{
    "id": 40,
    "companyId": 1232141425,
    "companyName": null,
    "name": "SpringBoot核心",
    "users": "Spring Boot初学者",
    "tags": "Spring项目的快速构建",
    "mt": "1-3",
    "mtName": null,
    "st": "1-3-2",
    "stName": null,
    "grade": "200003",
    "teachmode": "201001",
    "description": "课程系统性地深度探讨 Spring Boot 核心特性,引导小伙伴对 Java 规范的重视,启发对技术原理性的思考,掌握排查问题的技能,以及学习阅读源码的方法和技巧,全面提升研发能力,进军架构师队伍。",
    "pic": "https://cdn.educba.com/academy/wp-content/uploads/2018/08/Spring-BOOT-Interview-questions.jpg",
    "createDate": "2019-09-10 16:05:39",
    "changeDate": "2022-09-09 07:27:48",
    "createPeople": null,
    "changePeople": null,
    "auditStatus": "202004",
    "status": "203001",
    "coursePubId": 21,
    "coursePubDate": null,
    "charge": "201001",
    "price": 0.01
}

修改课程基本/营销信息

第一步: 在api工程中定义接口,将修改后的json格式的课程基本/营销信息保存到对应的课程信息表和课程营销表

@ApiOperation("修改课程基础信息接口")
@PutMapping("/course")
public CourseBaseInfoDto modifyCourseBase(@RequestBody EditCourseDto editCourseDto) {
    Long companyId = 22L;
    return courseBaseInfoService.updateCourseBase(companyId, editCourseDto);
}

第二步: 编写Service接口CourseBaseInfoService及其实现类CourseBaseInfoServiceImpl

/**
     * 修改课程信息
     * @param companyId 机构id,本机构只能修改本机构课程
     * @return
     */
CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto editCourseDto);

第三步: 这里需要使用MP中IService提供的saveOrUpdate方法,然后注入到CourseBaseInfoServiceImpl

public interface CourseMarketService extends IService<CourseMarket> {   
}

@Service
public class CourseMarketServiceImpl extends ServiceImpl<CourseMarketMapper, CourseMarket> implements CourseMarketService {
}
// 操作course_market
@Autowired
CourseMarketService courseMarketService;

/**
* 修改课程信息
* @param companyId 机构id,本机构只能修改本机构课程
* @return
*/
@Override
@Transactional
public CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto editCourseDto) {
    // 1.判断当前要修改课程的是否属于当前机构
    Long courseId = editCourseDto.getId();
    // 根据课程Id获取修改课程在数据库中对应的课程基本信息对象
    CourseBase courseBase = courseBaseMapper.selectById(courseId);    
    // 校验课程id
    if (courseBase == null){
        XueChengException.cast("课程不存在");
    }
    // 校验机构与课程是否对应
    if (!companyId.equals(courseBase.getCompanyId())) {
        XueChengPlusException.cast("只允许修改本机构的课程");
    }
    // 2.将请求参数中封装的课程基本信息拷贝到courseBase对象中
    BeanUtils.copyProperties(editCourseDto, courseBase);
    // 设置课程基本信息的更新时间
    courseBase.setChangeDate(LocalDateTime.now());
    // 将修改后的课程基本信息对象保存到数据库
    courseBaseMapper.updateById(courseBase);
    // 3.根据课程Id获取修改课程在数据库中对应的课程营销信息对象
    CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
    // 由于课程营销信息不是必填项,故这里先判断一下
    if (courseMarket == null) {
        // 如果没有课程营销信息创建并设置为当前课程的Id,如果有课程营销信息那么它的Id一定是课程Id(我们就是根据课程Id查的)
        courseMarket = new CourseMarket();
        courseMarket.setId(courseId);
    }
    // 4.将请求参数中封装的课程营销信息拷贝到courseMarket对象中
    BeanUtils.copyProperties(editCourseDto, courseMarket);
    // 将修改后的课程营销信息对象保存到数据库并对价格进行校验
    int insert = saveCourseMarket(courseMarket);   
    // 5.查询更新后的课程基本信息和营销信息并封装到CourseBaseInfoDto对象中,然后返回给前端
    return getCourseBaseInfo(courseId);
}

第四步: 在新增课程和修改课程中都对课程营销信息进行了保存,并且都校验了课程营销信息的价格字段,所以可以将这部分代码进行抽取

/**
     * @description 保存营销信息的校验
     * @param courseMarket 营销信息
     * @return
     * @author xiaoming
     * @date 2023/1/21 21:46
    */
private int saveCourseMarket(CourseMarket courseMarket) {
    // 获取课程收费状态并设置
    String charge = courseMarket.getCharge();
    if(StringUtils.isBlank(charge)){
        XueChengException.cast("请设置收费规则");
    }
    // 如果课程收费,则判断价格是否正常
    if(charge.equals("201001")){
        Float price = courseMarket.getPrice();
        Float originalPrice = courseMarket.getOriginalPrice();
        if(originalPrice == null || originalPrice <= 0 || price == null || price.floatValue() <= 0){
            XueChengException.cast("课程设置了收费价格不能为空且必须大于0");
        }
    }
    // 如果课程免费,则判断价格是否正常
    if (charge.equals("201000")){
        Float price = courseMarket.getPrice();
        Float originalPrice = courseMarket.getOriginalPrice();
        if((originalPrice != null && originalPrice != 0) || (price != null && price.floatValue() != 0)){
            XueChengException.cast("课程设置了免费,请勿添加金额");
        }
        courseMarket.setPrice(0f);
        courseMarket.setOriginalPrice(0f);
    }
    // 由于添加课程时课程营销信息不是必填项,所以应该是课程营销信息表中有则更新无则插入
    boolean flag = courseMarketService.saveOrUpdate(courseMarket);
    return flag ? 1 : -1;
}

使用BaseMapper提供的方法实现有则更新无则插入

// 操作course_market
@Autowired
CourseMarketService courseMarketService;

/**
* 修改课程信息
* @param companyId 机构id,本机构只能修改本机构课程
* @return
*/
@Override
@Transactional
public CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto editCourseDto) {
    // 1.判断当前要修改课程的是否属于当前机构
    Long courseId = editCourseDto.getId();
    // 根据课程Id获取修改课程在数据库中对应的课程基本信息对象
    CourseBase courseBase = courseBaseMapper.selectById(courseId);
    if (!companyId.equals(courseBase.getCompanyId())) {
        XueChengPlusException.cast("只允许修改本机构的课程");
    }
    // 2.将请求参数中封装的课程基本信息拷贝到courseBase对象中
    BeanUtils.copyProperties(editCourseDto, courseBase);
    // 设置课程基本信息的更新时间
    courseBase.setChangeDate(LocalDateTime.now());
    // 将修改后的课程基本信息对象保存到数据库
    courseBaseMapper.updateById(courseBase);
    // 3.根据课程Id获取修改课程在数据库中对应的课程营销信息对象
    CourseMarket courseMarketNew = new CourseMarket();
    BeanUtils.copyProperties(editCourseDto, courseMarketNew);
    CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
    // 从数据库查询营销信息,存在则更新不存在则添加
    if(courseMarket == null){
        // 插入数据库
        int insert = courseMarketMapper.insert(courseMarketNew);
        return insert;
    }else{
        // 将courseMarketNew拷贝到courseMarket
        BeanUtils.copyProperties(courseMarketNew,courseMarket);
        courseMarket.setId(courseMarketNew.getId());
        // 更新
        int i = courseMarketMapper.updateById(courseMarket);
        return i;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes入门篇

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容Kubernetes是什么&#xff1f;为什么需要 Kubernetes&#xff0c;它能做什么&#xff1f;Kubernetes 版本进化Kubernetes 概念Kubernetes 中 3 个重要概念 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介…

如何优化索引?

前缀索引 这个操作是为了减少索引长度&#xff0c;即占用空间的。这样一个页可以多存一些索引&#xff0c;查找时候就会更快了。但是前缀索引有俩缺点&#xff0c;一个是ORDER BY或GROUP BY时候没法用&#xff0c;另一个是没法用做覆盖索引&#xff08;因为索引本来自己都不全…

SAP_ABAP_编程基础_二进制文件_SMW0中上传与下载

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读448次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

【Vue】【uni-app】实现发起工单页面

修改了上次的导航栏为二级导航 <template><view class"leftNav"><div class"logo">显鹅易见</div><uni-collapse class"item" accordion"true"><uni-collapse-item title"养殖场总部">…

记一次域控迁移并升级

域环境&#xff1a; 域控级别&#xff1a;windows server2008R2 主域控&#xff1a;win server 2008R2 辅域控&#xff1a;win server 2016 需求&#xff1a;新购一台win server 2022&#xff0c;需要将主域控迁移到新服务器中&#xff0c;并升级域控级别为最新 检查域控 …

如何应对雨天飞行的挑战?无人机机库防护能力解析

一、 背景介绍 无人机机库是无人机停放和起降场所&#xff0c;类似传统飞机的 hangar&#xff08;飞机库&#xff09;。它是一个专门用于存储、维护和保护无人机的设施。无人机机库的存在有助于提高无人机的安全性&#xff0c;同时也为无人机提供了一个有序的管理场所。 雨天…

Django RestFramework

安装restframework pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support安装其他模块 pip install pillowpip install django-cors-headers建模和迁移数据 drf包含四个…

局域网协议:ICMP (Internet Control Message Protocol,互联网控制消息协议)

ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;是用于在IP网络中传递控制消息的协议。它通常被用于网络设备之间交换状态信息和错误报告&#xff0c;以及执行网络诊断和故障排除。 文章目录 ICMP主要功能ICMP的工作原理ICMP消…

Spring Boot 3 + Spring Security 6 最新版本修改 Json 登录后 RememberMe 功能问题失效的解决方案

当 Spring Boot 版本更新到 3 之后&#xff0c;最低要求的 JDK 版本变为 17&#xff0c;相应的 最新版本的 Spring Security 的配置也发生了变化&#xff0c;一下主要讲解一些新的 Spring Security 的配置方法 1. 配置由继承WebSeucrityConfigurerAdapter变成只需添加一个Secur…

查看当前目录下文件数量

查看当前目录下文件数量 查看文件夹数量查看文件数查看所有文件&#xff08;包括子文件&#xff09;数量查看所有目录&#xff08;包括子目录&#xff09;数量查看图片数量 查看文件夹数量 ls -l | grep ^d | wc -l查看文件数 不包含文件夹 ls -l | grep ^- | wc -l查看所有…

Vue 定义只读数据 readonly 与 shallowReadonly

readonly 让一个响应式数据变为 **深层次的只读数据**。 shallowReadonly 让一个响应式数据变为 **浅层次的只读数据**&#xff0c;只读第一层。 isReadonly 判断一个数据是不是只读数据。 应用场景&#xff1a;不希望数据被修改时使用。 readonly深层次只读&#xff1a; …

Matplotlib直方图的创建_Python数据分析与可视化

Matplotlib直方图的创建 概念区分绘制直方图 概念区分 什么是直方图&#xff1f; 直方图&#xff08;Histogram&#xff09;又称质量分布图&#xff0c;是统计报告图的一种&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的情况&#xff0c;一般用横轴表示数据所属…

16.spirng源码解析-registerBeanPostProcessors

注册拦截bean创建的bean处理器 此部分实质上是在BeanDefinitions中寻找BeanPostProcessor&#xff0c;之后调用BeanFactory.addBeanPostProcessor方法保存在一个List中&#xff0c;注意添加时仍然有优先级的概念&#xff0c;优先级高的在前面。

ESP-Mesh-Lite 用户指南

ESP-MESH-LITE 本指南提供有关 Mesh-Lite 协议的介绍。 概述 ESP-MESH-LITE 是一套建立在 Wi-Fi 协议之上的网络协议。ESP-MESH-LITE 允许分布在大范围区域内&#xff08;室内和室外&#xff09;的大量设备&#xff08;下文称节点&#xff09;在同一个 WLAN&#xff08;无线…

聚观早报 |红魔9 Pro开卖;真我GT5 Pro定档

【聚观365】11月29日消息 红魔9 Pro开卖 真我GT5 Pro定档 一加12镜头细节公布 Redmi K70 Pro将搭载夜枭算法 苹果Vision Pro头显下月量产 红魔9 Pro开卖 红魔电竞旗舰最新力作——红魔9 Pro系列正式发布。作为一款全能电竞旗舰&#xff0c;该机搭载了第三代骁龙8移动平台…

如何恢复已删除的照片 ?适用于 Windows 的Android 数据恢复软件值得尝试

“我丢失了 Android 手机上的照片&#xff0c;有人告诉我使用恢复程序来找回所有手机数据。我使用的是 Windows 10 和华为 手机&#xff0c;对于 Windows最有效的 Android 数据恢复是什么&#xff1f;” Android 恢复程序用于检索丢失或删除的文件&#xff0c;如照片、联系人、…

pytorch读取tiny-imagenet-200的验证集(val)

ori_train torchvision.datasets.ImageFolder(root args.datadir /tiny-imagenet-200/train/, transformtransform)#可以获取class_idx的映射class_idx ori_train.class_to_idx val_annotations.txt中存储着每个图片对应的类别 获取验证集的标签 test_target []#读取val_…

uniapp微信小程序中阻止事件冒泡

开发场景&#xff1a;列表中展示地块的数据信息&#xff0c;用户可以点击列表进入地块的详情界面&#xff0c;也可以点击列表中的星星按钮进行收藏 遇到的问题&#xff1a;每次点击星星的时候&#xff0c;都会触发父级的点击事件&#xff0c;从而进入到详情界面 原本的代码&am…

红队攻防之hash登录RDP

没什么好害怕&#xff0c;孩子放心去飞吧&#xff0c;在你的身后有个等你的家 Restricted Admin Mode 受限管理模式是一项 Windows 功能&#xff0c;可防止将 RDP 用户的凭据存储在建立 RDP 连接的计算机的内存中。 这是用来防止用户&#xff08;管理员&#xff09;在 RDP 进…

VT-VSPA1-1X比例压力阀控制板

替代力士乐同型号,可以完全互换使用&#xff1b;适用于力士乐系列所有无电位置反馈的直动式和先导式比例压力阀的控制&#xff1b;外置欧板式连接&#xff0c;VT-VSPA1-1X型放大器配套支架型号&#xff1a;VT-3002-1X/32D或VT-3002-2X/32D&#xff1b; VT-VSPA2-1-1X/T1、VT-V…