课程管理-修改课程信息(后端) | 学习笔记

简介: 简介:快速学习课程管理-修改课程信息(后端)

开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程管理-修改课程信息(后端)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/667/detail/11379


课程管理-修改课程信息(后端)

 

内容介绍

一、修改课程基本信息

二、开发后端接口

三、总结

四、图例

 

一、修改课程基本信息

1.分析

(1)第一步:点击上一步时候,能够回到第一步。回到第一步之后是为了返回之前对数据做修改,需要把课程基本信息数据回显。

意为当点击页面中的上一步时,回到上一个添加课程基本信息页面。

image.png

在此页面,可以将之前的内容重新显示出来,做一个数据回显。

与讲师列表中的效果一样,点击讲师列表其中的修改后。

能够回到之前的讲师表单页面,做一个表单数据回显。在此添加课程中的上一步按键,和此处的修改按键效果是一样的。

(2)第二步:在数据回显页面,修改内容,保存,修改数据库内容。

即第一步操作完成数据回显后,将数据进行修改完成后,点击保存并下一步,让其真正修改数据库的内容。

以上就是两步主要的操作,首先第一步数据回显,最后第二步最终修改。


二、开发后端接口

1.思路

之后我们对功能实现,首先编写后端的接口,再完成前端。此时我们要完成两个接口,第一部分是使得点击上一步的按钮后可以做一个数据回显,需要根据id将数据查出来。第二部分,在查完之后,做真正修改,提交数据表单,在接口中做数据库内容的修改。

(1)根据课程 id 查询课程基本信息接口

(2)修改课程信息接口

2.根据课程 id 查询课程基本信息接口

(1)Controller 部分

① 代码讲解

在与课程相关的 EduCourseController 接口中添加代码。

image.png

先编写第一个接口根据课程id查询课程的基本信息。首先添加 get 提交方法,命名为 getCourseInfo。同时传入参数 courseId 课程 id。

l 代码如下:

@GetMapping("getCourseInfo/ {courseId}")

创建方法,同时在方法传入参数 couseId 值,添加@PathVariable 注解,表示通过路径得到 String 类型的 courseId 值。

l 代码如下:

public R getCourseInfo(@PathVariable String courseld){

}

调用 service 中 getCourseInfo 的方法,将参数传入查询课程基本信息。将基本信息返回给类型为 CourseInfoVo 的对象,因为在课程基本信息中有许多数据包括课程标题,课程分类等等,此外还有简介。

image.png

所以写返回的对象类型为 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,两张表中都含有相关数据,所以先查询两张表。

image.png先查询课程表,再查描述表又称简介表。

因为在 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);

//封装描述表的数据到courseInfoVocourseInfoVo.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 中后,添加方法注解。

image.png

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 中,编写方法。

 image.png

Ø 修改课程表

根据之前做过的添加,查询都是对两张表操作,所以修改应该也是对两张表:课程表和描述表进行操作,修改课程应分为修改课程表和修改描述表。

首先调用 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() ;

相关文章
|
3月前
|
JavaScript 前端开发 程序员
后端程序员的前端必备-jQuery核心学习笔记
后端程序员的前端必备-jQuery核心学习笔记
55 13
|
3月前
|
开发框架 缓存 前端开发
基于SqlSugar的开发框架循序渐进介绍(21)-- 在工作流列表页面中增加一些转义信息的输出,在后端进行内容转换
基于SqlSugar的开发框架循序渐进介绍(21)-- 在工作流列表页面中增加一些转义信息的输出,在后端进行内容转换
|
4月前
|
开发框架 前端开发 JavaScript
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
|
4月前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
|
5月前
|
Java
大事件后端项目04-----yml配置信息书写和获取,邮箱如何设计
大事件后端项目04-----yml配置信息书写和获取,邮箱如何设计
|
6月前
|
JSON JavaScript 前端开发
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
|
消息中间件 存储 XML
【易售小程序项目】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
【易售小程序项目】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
151 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-什么是mvc-后端Mvc架子和vc的创建4
前端学习笔记202305学习笔记第二十九天-什么是mvc-后端Mvc架子和vc的创建4
51 0
|
12月前
|
JSON 前端开发 数据格式
获取ztree树的选中子菜单信息并且提交给后端
获取ztree树的选中子菜单信息并且提交给后端
51 0
获取ztree树的选中子菜单信息并且提交给后端
报错信息 "ResultCode:403" 表示后端服务器返回的错误代码是403
报错信息 "ResultCode:403" 表示后端服务器返回的错误代码是403
306 1

热门文章

最新文章