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

修改/查询单个课程信息

界面原型

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

在这里插入图片描述

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

在这里插入图片描述

查询课程信息

请求/响应数据模型

使用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);    // 校验课程idif (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拷贝到courseMarketBeanUtils.copyProperties(courseMarketNew,courseMarket);courseMarket.setId(courseMarketNew.getId());// 更新int i = courseMarketMapper.updateById(courseMarket);return i;}
}

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

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

相关文章

11月28日作业

提示并输入一个字符串&#xff0c;统计该字符中大写&#xff0c;小写字母个数&#xff0c;数字个数&#xff0c;空格个数以及其他字符个数&#xff0c;要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {string str;int A0,a0,num0,backspac…

基于MBC调制方法的准Z源三相逆变器Simulink建模与仿真

摘 要 与传统&#xff3a;源逆变器相比&#xff0c;准&#xff3a;源逆变器具有电容电压应力低的优点。但是基于简单升压调制策略的准&#xff3a;源逆变器存在开关器件电压应力大和开关频率高的缺陷。将SPWM调制策略应用于准&#xff3a;源逆变器&#xff0c;并在不产生电流纹…

UDS 相关时间参数

文章目录 UDS 全部时间参数UDS 应用层诊断时间参数1、P2 Client P2 Server P2* Client P2* Server 图例2、S3 Client S3 Server 图例 UDS CNA-TP网络层时间参数1、N_As/N_Ar 图例2、N_Bs 图例3、 N_Br 图例4、N_Cs 图例N_Cr 图例 UDS 网络层流控制时间参数 UDS 全部时间参数 UD…

【Qt之QSqlTableModel】介绍及使用

【Qt之QSqlTableModel】介绍及使用 描述常用方法槽函数信号示例 描述 QSqlTableModel类为单个数据库表提供可编辑的数据模型。 QSqlTableModel是一个高级接口&#xff0c;用于从单个表中读写数据库记录。 它建立在较低级别的QSqlQuery之上&#xff0c;可用于向QTableView等视…

智安网络|探索云安全合规要求:等保2.0时代的新趋势解析

随着信息技术的不断发展和应用的广泛普及&#xff0c;信息安全问题日益凸显&#xff0c;特别是在云计算时代&#xff0c;企业对于云平台的安全保障需求更为迫切。等级保护&#xff08;等保&#xff09;作为我国信息安全的基本要求&#xff0c;已经进入了2.0时代&#xff0c;对于…

TS-函数

函数类型的定义 一般函数需要定义它的参数类型和返回值类型作为回调函数(函数类型表达式) function fn(cb: (msg: string) >void) {}可以作为对象调用的函数&#xff08;调用签名&#xff09; type DescribeFunction {msg: string(n: number): void }作为构造函数&#…

1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)

&#xff08;这题基本上把最短路能求的都求了个遍&#xff0c;除了麻烦一点&#xff0c;难度其实还好&#xff09; &#xff08;卡题原因&#xff1a;dijks漏了对路径条数的初始化。&#xff09; #include<bits/stdc.h> using namespace std; #define int long long i…

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

Filament引擎分析--command抽象设备API

1. 前言 Filament中使用了FrameGraph来管理渲染管线&#xff0c;需要准备两点&#xff1a; 设备接口抽象&#xff1a;设备API抽象为Command资源抽象&#xff1a;使用虚拟资源&#xff0c;在实际用到时再创建&#xff0c;方便剔除无用资源 下面就围绕Filament中设备API抽象为…

网络安全小白自学

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

2015年五一杯数学建模C题生态文明建设评价问题解题全过程文档及程序

2015年五一杯数学建模 C题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展&#xff0c;生态文明越来越重要&#xff0c;生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设&#xff0c;报告指出“建设生态文明&#xff0c;是关系…

目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像分割(补充篇)

目录 前言 知识储备 图像分割-行为检测 算法原理 什么是图像分割?

NOI / 1.7编程基础之字符串 30:字符环 c语言 两次遍历解决循环

描述 有两个由字符构成的环。请写一个程序&#xff0c;计算这两个字符环上最长连续公共字符串的长度。例如&#xff0c;字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起&#xff0c;构成一个环&#xff1b;字符串“MADJKLUVKL”的首尾连在一起&#xff0c;构成一个另一个环&…

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

2023网络安全产业图谱

1. 前言 2023年7月10日&#xff0c;嘶吼安全产业研究院联合国家网络安全产业园区&#xff08;通州园&#xff09;正式发布《嘶吼2023网络安全产业图谱》。 嘶吼安全产业研究院根据当前网络安全发展规划与趋势发布《嘶吼2023网络安全产业图谱》调研&#xff0c;旨在进一步了解…

Python与设计模式--命令模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

本文基于NetCore3.1或Net6.0项目升级到Net7.0&#xff0c;参考连接&#xff1a;NetCore3.1或Net6.0项目升级到Net7.0-CSDN博客 所有项目按照此步骤操作一遍&#xff0c;完成后再将所有引用的包&#xff08;即 *.dll&#xff09;更新升级到最新版&#xff08;注意&#xff1a;有…

在 CentOS 7 上安装 MySQL 8

在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先&#xff0c;我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令&#xff1a; sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …

python-爬虫(可直接使用)

爬虫&#xff08;Web Scraping&#xff09;是指通过编程自动化地获取互联网上的信息的过程。爬虫的目的通常是从网页中抓取数据&#xff0c;进行数据分析、处理或展示。以下是爬虫的基本流程和一些重要的概念&#xff1a; 爬虫基本流程&#xff1a; 确定目标&#xff1a; 确定要…

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言 超过一定的年龄之后&#xff0c;所谓人生&#xff0c;无非是一个不断丧失的过程而已。宝贵的东西&#xff0c;会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个&#xff0c;从身旁悄然消逝。——《1Q84》 \;\\\;\\\; 目录 前言自定义类型数字转枚举Cargo.tom…