界面原型
第一步: 用户进入课程列表查询页面,点击编辑
按钮编辑课程的相关信息
第二步: 进入编辑界面显示出当前编辑课程
的信息,其中课程营销信息不是必填项
,修改成功后会自动进入课程计划编辑页面
请求/响应数据模型
使用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;
}
}