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.hqwc.cn/news/228043.html

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

相关文章

蓝桥杯day02——第三大的数

题目 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, 2] 输出&…

osgFX扩展库-异性光照、贴图、卡通特效(1)

本章将简单介绍 osgFX扩展库及osgSim 扩展库。osgFX库用得比较多,osgSim库不常用&#xff0c;因此&#xff0c;这里只对这个库作简单的说明。 osgFX扩展库 osgFX是一个OpenSceneGraph 的附加库&#xff0c;是一个用于实现一致、完备、可重用的特殊效果的构架工具&#xff0c;其…

雷达公式实现(matlab)

雷达公式实现 代码来源&#xff1a;《雷达系统分析与设计(MATLAB版)(第三版)》 function [snr] radar_eq(pt,freq,g,sigma,b,nf,loss,range) % This program implements Eq.(1.63) %% Inputs:% pt——峰值功率&#xff0c;W% freq——雷达中心频率&#xff0c;Hz% g——天线…

ZKP15.2 Formal Methods in ZK (Part I)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 15: Secure ZK Circuits via Formal Methods (Guest Lecturer: Yu Feng (UCSB & Veridise)) 15.2 Formal Methods in ZK (Part I) Circuits Workflow Source Code: Witness Generation and ConstraintsWitness Generatio…

SpringCloudAlibaba之Nacos的持久化和高可用——详细讲解

目录 一、Nacos持久化 1.持久化说明 2.安装mysql数据库5.6.5以上版本(略) 3.修改配置文件 二、nacos高可用 1.集群说明 2.nacos集群架构图 2.集群搭建注意事项 3.集群规划 4.搭建nacos集群 5.安装Nginx 6.配置nginx conf配置文件 7.启动nginx进行测试即可 一、Nacos持久…

C语言——数组转换

将的两行三列数组转换为三行两列的数组 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int a[2][3]{{1,2,3},{4,5,6}};int b[3][2],i,j;for ( i 0; i <1; i){for ( j 0; j <2; j){printf("%5d",a[i][j]);b[j][i]a[i][j];}printf(&…

国标GB28181安防监控平台EasyCVR周界入侵AI算法检测方案

在城市管理和公共安全领域&#xff0c;安全视频监控的重要性日益凸显。AI视频智能分析平台基于深度学习和计算机视觉技术&#xff0c;利用AI入侵算法&#xff0c;能够实时、精准地监测周界入侵行为。 TSINGSEE青犀在视频监控及AI视频智能分析领域拥有深厚的技术积累和丰富的实…

idea创建spring boot项目,java版本只能选择17和21

1.问题描述 java版本为"11.0.20"&#xff0c;idea2023创建spring boot项目时&#xff08;File->Project->Spring Initializr&#xff09;&#xff0c;java版本无法选择11&#xff0c;导致报错&#xff0c;如下图所示&#xff1a; 2.原因 spring2.X版本在2023…

Blender动画导入Three.js

你是否在把 Blender 动画导入你的 ThreeJS 游戏(或项目)中工作时遇到问题? 您的 .glb (glTF) 文件是否正在加载,但没有显示任何内容? 你的骨骼没有正确克隆吗? 如果是这样,请阅读我如何使用 SkeletonUtils.js 解决此问题 1、前提条件 你正在使用 Blender 3.1+(此版本…

前端---CSS篇(详解CSS)

1.CSS简介 CSS(Cascading Style Sheets)层叠样式表&#xff0c;是用来为结构化文档&#xff08;HTML、XML等应用&#xff09;添加样式,比如字体、颜色、大小、间距的计算机语言。CSS目前已经发展到了CSS3.0了。 2.CSS导入方式 CSS有三种导入方式&#xff1a; 1.行内样式&am…

ElementPlusError: [ElPagination] 你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档

使用element table出现这个错误好几回了&#xff0c;今天把它记录一下&#xff0c;并把错误原因复盘一遍。具体如下&#xff1a; 错误截图 原因 其实这个错误挺迷的&#xff0c;我把各种情况都测试了一遍&#xff0c;最后发现是因为给 翻页参数 total 传值错误导致的。 总结…