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…

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…

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

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

深入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、…

网络安全小白自学

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

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

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

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…

CorelDRAW Graphics Suite2023破解版含2024最新注册机下载

CorelDRAW Graphics Suite2023是Corel公司的平面设计软件&#xff1b;该软件是Corel出品的矢量图形制作工具软件&#xff0c;这个图形工具给设计师提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能。在日常科研绘图中&#xff0c;若较为轻量&#xff0c;通常…

处理器及微控制器:XCZU15EG-2FFVC900I 可编程单元

XCZU15EG-2FFVC900I参数&#xff1a; Zynq UltraScale™ MPSoC 系列基于 Xilinx UltraScale™ MPSoC 架构。该 Zynq UltraScale™ MPSoC 器件集成了功能丰富的 64 位四核或双核 Arm Cortex-A53 和双核 Arm Cortex-R5F 处理系统&#xff08;基于 Xilinx UltraScale™ MPSoC 架…

六、Lua运算符

文章目录 一、Lua 运算符&#xff08;一&#xff09;算术运算符&#xff08;二&#xff09;关系运算符&#xff08;三&#xff09;逻辑运算符&#xff08;四&#xff09;其他运算符 二、运算符优先级 一、Lua 运算符 运算符是一个特殊的符号&#xff0c;用于告诉解释器执行特定…

443. 压缩字符串

这篇文章会收录到 : 算法通关村第十二关-黄金挑战字符串冲刺题-CSDN博客 压缩字符串 描述 : 给你一个字符数组 chars &#xff0c;请使用下述算法压缩&#xff1a; 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 &#xff1a; 如果这一组长度为 1 &#xff0c;…

MySQL- CRUD

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

万界星空科技生产管理mes系统种的工艺确认流程

MES工艺流程是制造执行系统的核心部分&#xff0c;它涵盖了整个生产过程&#xff0c;包括物料管理、生产计划、生产执行、质量管理、维修保养等方面&#xff0c;可以有效地提高生产效率和产品质量。 一、确认追溯模型&#xff1a; 以工艺文件为确认对象&#xff0c;以产品生产…

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A&#xff0c;然后输入 M 行操作指令。 第一类指令形如 C l r d&#xff0c;表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x&#xff0c;表示询问数列中第 x 个数的值。 对于每个询问&#xff0c;输出一个整数表示答案。 输入格式 第一行…

sqli-labs靶场详解(less29-less31)

less-29 提示有最好的防火墙 小白原因 这种题型没见过 先自己测试一下 ?id1 to use near 1 预计可以使用报错注入 和单引号有关的注入点 ?id1 and 11 成功 ?id1 and 12 失败 确实是单引号字符型注入点 ?id1;%00 id1%27;%00 获取到了%00空字符&#xff08;原因就是服务器获取…