开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程管理-修改课程信息(后端)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11379
课程管理-修改课程信息(后端)
内容介绍
一、修改课程基本信息
二、开发后端接口
三、总结
四、图例
一、修改课程基本信息
1.分析
(1)第一步:点击上一步时候,能够回到第一步。回到第一步之后是为了返回之前对数据做修改,需要把课程基本信息数据回显。
意为当点击页面中的上一步时,回到上一个添加课程基本信息页面。
在此页面,可以将之前的内容重新显示出来,做一个数据回显。
与讲师列表中的效果一样,点击讲师列表其中的修改后。
能够回到之前的讲师表单页面,做一个表单数据回显。在此添加课程中的上一步按键,和此处的修改按键效果是一样的。
(2)第二步:在数据回显页面,修改内容,保存,修改数据库内容。
即第一步操作完成数据回显后,将数据进行修改完成后,点击保存并下一步,让其真正修改数据库的内容。
以上就是两步主要的操作,首先第一步数据回显,最后第二步最终修改。
二、开发后端接口
1.思路
之后我们对功能实现,首先编写后端的接口,再完成前端。此时我们要完成两个接口,第一部分是使得点击上一步的按钮后可以做一个数据回显,需要根据id将数据查出来。第二部分,在查完之后,做真正修改,提交数据表单,在接口中做数据库内容的修改。
(1)根据课程 id 查询课程基本信息接口
(2)修改课程信息接口
2.根据课程 id 查询课程基本信息接口
(1)Controller 部分
① 代码讲解
在与课程相关的 EduCourseController 接口中添加代码。
先编写第一个接口根据课程id查询课程的基本信息。首先添加 get 提交方法,命名为 getCourseInfo。同时传入参数 courseId 课程 id。
l 代码如下:
@GetMapping("getCourseInfo/ {courseId}")
创建方法,同时在方法传入参数 couseId 值,添加@PathVariable 注解,表示通过路径得到 String 类型的 courseId 值。
l 代码如下:
public R getCourseInfo(@PathVariable String courseld){
}
调用 service 中 getCourseInfo 的方法,将参数传入查询课程基本信息。将基本信息返回给类型为 CourseInfoVo 的对象,因为在课程基本信息中有许多数据包括课程标题,课程分类等等,此外还有简介。
所以写返回的对象类型为 EduCourse 并不合适,所以应该写 CourseInfoVo,其中包含了 id、名称和描述等等课程所有的基本信息内容。
l 代码如下:
CourseInfoVo courseInfoVo = courseService. getCourseInfo(courseId)
最后加上一个 return R.ok()将最后查询到的课程基本信息返回给名为 courseInfoVo的值。
l 代码如下:
return R.ok() .data("courseInfoVo" , courseInfoVo);
Controller 到此就全部完成。
② 完整代码
l EduCourseController 代码如下:
public class EduCourseController {
@Autowired
private EduCourseService courseService;
//添加课程基本信息的方法
@PostMapping("addCourseInfo")
public R addCourseInfo(@RequestBody CourseInfoVo courseInfoVo){
//返回添加之后课程id,为了后面添加大纲使用
String id = courseService. saveCourseInfo(courseInfoVo) ;
return R.ok().data("courseId",id) ;
}
//根据课程id查询课程基本信息
//get提交方式,命名为getCourseInfo。同时传入参数courseId课程id
@GetMapping("getCourseInfo/ {courseId}")
//创建方法,同时在方法中得到id值,添加@PathVariable注解,表示通过路径得到courseId值。
public R getCourseInfo(@PathVariable String courseld){
//调service中getCourseInfo的方法,将参数传入查询课程基本信息。
将返回的信息返回给类型为CourseInfoVo的对象,因为此类型中其中包含了id、名称等等课程所有的基本信息内容。
CourseInfoVo courseInfoVo = courseService. getCourseInfo(courseId) ;
//将最后查询到的课程基本信息返回给名为courseInfoVo的值。
return R.ok() .data("courseInfoVo" , courseInfoVo);
}
}
(3)Service 部分
① interface 接口-EduCourseService.java
接下来编写 Service 部分,在 Service 中实现真正的查询。先点击 Controller 中getCourseInfo 选中第一行,创建 Service 的 interface 接口EduCourseService.java,添加注释(红色部分)。
l EduCourseService.java 代码如下:
╱
*
*
*<p>
*
课程服务类
*<
p>
*
*
@author testjava
*@
since 2020-03-02
*/
public interface EduCourseService extends IService<EduCourse>{
//添加课程基本信息的方法
String saveCourseInfo(CourseInfoVo courseInfoVo) ;
//根据课程id查询课程基本信息
CourseInfoVo getCourseInfo(String courseId) ;
}
② 实现类-EduCourseServiceImpl.java
添加注释后来到实现类 EduCourseServiceImpl 中,在实现类中将方法最终创建然后实现。
编写实现类代码:
因为现在要查课程基本信息,而课程基本信息的包含主要是两张表数据,一个是课程表 edu_course,一个是描述表 edu_course_description,两张表中都含有相关数据,所以先查询两张表。
先查询课程表,再查描述表又称简介表。
因为在 service 中,首先使用 baseMapper 中的 selectById 方法,根据课程id做查询。同时将查询的结果返回 EduCourse 类型的课程对象 eduCourse。
l 代码如下:
//1查询课程表
EduCourse eduCourse = baseMapper. selectById(courseId);
然后查询描述表,使用注入的 courseDescriptionService 来查询,同样使用selectById 方法,因为课程表和描述表使用的是同一个 id,所以传入课程 id 值,返回描述对象 courseDescription。
l 代码如下:
//2查询描述表
EduCourseDescription courseDescription = courseDescriptionService.getById(courseId);
到此两张表的数据都得到,得到之后要将两表的数据都封装到 courseInfoVo 中去。
首先创建一个 CourseInfoVo 类型的对象,然后将 eduCourse 中的对象放入,在将courseDescription 放入。第一种方法:将 eduCourse 其中的值 get 出来后 set 放入 courseInfoVo 中去。在此使用 BeanUtils 中的 copyProperties 方法将 eduCourse 其中的值直接复制到 courseInfoVo 中即可。
l 代码如下:
CourseInfoVo courseInfoVo = new CourseInfoVo() ;
BeanUtils.copyProperties(eduCourse, courseInfoVo) ;
这么做后就会存在课程表数据,之后再完成描述表的数据。将描述表的数据也放进去,描述表的数据使用get,set方法,先取出再放进去。
l 代码如下:courseInfoVo.setDescription(courseDsescription.getDescription());
最后将 courseInfoVo 数据 return 返回即可,到此就全部结束。
l EduCourseServiceImpl.java 中添加代码如下:
@Override
public CoursenfoVo getCourseInfo(String courseId){
//1查询课程表
EduCourse eduCourse = baseMapper. selectById(courseId);
//封装课程表的数据到courseInfoVo中
CourseInfoVo courseInfoVo = new CourseInfoVo() ;
BeanUtils.copyProperties(eduCourse, courseInfoVo) ;
//2查询描述表
EduCourseDescription courseDescription = courseDescriptionService.getById(courseId);
//封装描述表的数据到courseInfoVo
courseInfoVo.setDescription(courseDsescription.getDescription());
//将含有两个表的数据的值courseInfoVo给返回,得到最终数据。
return null;
}
}
整体的做法思路就是,先根据课程 id,把课程信息给查出来,在封装到courseInfoVo 中去,使用到 BeanUtils。查出来描述信息再将描述信息也放到courseInfoVo 中去,到此就完成了基本代码。到此第一个接口根据课程 id 查课程的基本信息到此完成。
3. 修改课程信息接口
(1)Controller 部分
最后再修修改课程信息的接口,使用 Post 提交,取名为 updateCourseInfo,再命名修改方法名为 updateCourseInfo。
l 代码如下:
@PostMapping("updateCourseInfo")
将方法名命名为 updateCourseInfo。在修改时仍然为提交一个表单,所以采用@RequestBody,通过路径得到 CourseInfoVo 的对象。
l 代码如下:
public R updateCourseInfo(@RequestBody CourseInfoVo courseInfovo){
}
调用一个 courseService 中的 updateCourseInfo()方法做最后的修改操作,同时将参数 courseInfoVo 对象传过去,最后 return 一个值。
l 代码如下:
courseService.updateCourleInfo(courseInfoVo) ;
return R.ok(
):
l EduCourseController 中添加代码如下:
//修改课程信息
@PostMapping("updateCourseInfo")
public R updateCourseInfo(@RequestBody CourseInfoVo courseInfovo){
courseService.updateCourleInfo(courseInfoVo) ;
return R.ok(
):
}
(2)service 部分
① 创建 upteCourseInfo 方法
写 service 的修改方法,首先点击 updateCourleInfo 创建方法。跳转到EduCourseService.java 中后,添加方法注解。
l EduCourseService.java 代码如下:
╱
*
*
*<p>
*
课程服务类
*<
p>
*
*
@author testjava
*@
since 2020-03-02
*/
public interface EduCourseService extends IService<EduCourse>{
//添加课程基本信息的方法
String saveCourseInfo(CourseInfoVo courseInfoVo) ;
//根据课程id查询课程基本信息
CourseInfoVo getCourseInfo(String courseId) ;
//修改课程信息
void updateCourseInfo(CourseInfoVo courseInfoVo);
}
② 实现类
创建方法后来到它的实现类 EduCourseService.java 中,编写方法。
Ø 修改课程表
根据之前做过的添加,查询都是对两张表操作,所以修改应该也是对两张表:课程表和描述表进行操作,修改课程应分为修改课程表和修改描述表。
首先调用 baseMapper 中的 updateById 方法,将 EduCourse 类型对象eduCourse 传入。但此时方法传入的是 CourseInVo 类型的对象 courseInVo,所以先将 courseInVo 变为 EduCourse 类型。
l 代码如下:
baseMapper.updateById(eduCourse) ;
先创建一个新的EduCourse类型的对象eduCourse,再使用BeanUtils中的copyProperties 方法,实现对象值的复制,将 courseInVo 的值传到 eduCourse 中,最后完成修改。
l 代码如下:
//1修改课程表
EduCourse eduCourse = new EduCourse() ;
BeanUtils.copyProperties(courseInfoVo, eduCourse) ;
修改后有个返回值 int 表示影响的行数,如果现在这个值为1表示成功,0表示失败。
l 代码如下:
int update = baseMapper.updateById(eduCourse) ;
所以之后对其进行判断,如果 update为0,表示添加失败,直接 throw 一个GuliException 异常,显示修改课程信息失败。
l 代码如下:
if(update == o){
throw new GuliException(20001,"修改课程信息失败");
}
Ø 修改描述表
之后再修改描述表,调用之前注入的courseDescriptionService中的updateById(EduCourseDescription t)方法。
l 代码如下:
courseDescriptionService.updateById(description)
因为其中也需要传入EduCourseDescription类型的对象,所以创建一个EduCourseDescription 类型的对象
l 代码如下:
//2修改描述表
EduCourseDescription description = new EduCourseDescription();
使用 get,set 方法得到新建对象的id和描述信息。最后将对象传入方法中。
l 代码如下:
description.setId(courseInfoVo.getId());
description.setDescription(courseInfoVo.getDescription());
③ 完整代码
l EduCourseController 添加代码如下:
@
Override
//实现
updateCourseInfo
方法
public void updateCourseInfo(CourseInfoVo courseInfovo){
//1修改课程表
//新建一个
EduCourse
类型对象,叫
eduCourse
EduCourse eduCourse = new EduCourse() ;
//使用
BeanUtils
中的
copyProperties
方法,实现对象值的复制,将courseInVo的值传到eduCourse中,最后完成修改。
BeanUtils.copyProperties(courseInfoVo, eduCourse) ;
//修改后有个返回值int表示影响的行数,如果现在这个值为表示成功,0表示失败。
int update = baseMapper.updateById(eduCourse) ;
//进行判断,如果update为0,表示添加失败,直接throw一个GuliException异常,显示修改课程信息失败。
if(update == o){
throw new GuliException(20001,"修改课程信息失败");
}
//2修改描述表
//创建一个EduCourseDescription类型的对象,叫
description
EduCourseDescription description = new EduCourseDescription();
//使用set,get方法,从
courseInfoVo
中得到
description
的id值
description.setId(courseInfoVo.getId());
//得到
description
的描述内容
description.setDescription(courseInfoVo.getDescription());
//调用之前注入的courseDescriptionService中的updateById(EduCourseDescription t)方法,传入参数
description
。
courseDescriptionService.updateById(description)
}
三、总结
到此就完成了修改课程信息的所有操作,两个接口。第一个接口是根据课程id查询课程基本信息。
返回的是CourseInfoVo,先查课程表将eduCourse做了一个封装放入CourseInfoVo,再查描述表将查询结果放入CourseInfoVo中去,最终返回CourseInfoVo。第二个接口时修改课程信息,也是两张表。先改课程表将eduCourse 传过来,再改修改表将数据最后做修改。以上就是两个基本接口,一个根据 id 查询,一个修改。接口完成后,最终就是前端部分将数据回显,再做修改。
四、图例
1.修改课程基本信息
第一步:点击上—步时候,回到第一步,把课程基本信息数据回显。
第二步在数据回显页面,修改内容,保存,修改数据库内容。
2.开发后端接口
(1)根据课程 id 查询课程基本信息接口
(2)修改课程信息接口
3.主要部分代码:
//根据课程id查询课程基本信息
GetMapping(" getCourseInfo/ {courseld}")
public R getCourseInfo(@PathVariable String courseId){
CourseInfoVo courseInfoVo = coursiBervice.getCourseInfo(courseId) ;
return R.ok() .data(" courseInfoVo" , courseInfoVo) ;
}
//修改课程信息
@PostMapping ("updateCourseInfo")
public R updateCourseInfo(@RequestBody CourseInfoVo courseInfoVo){
courseService.updateCourseInfo(courseInfoVo);
return R.ok() ;