任务:
- 前后端分离概念
- 讲师CRUD操作
1. 前后端分离概念
接口:Controller,Service,Mapper
2. 讲师管理模块
2.1 建表
//创建数据库
crate database guli_edu;
use guli_edu;
//创建老师表
CREATE TABLE edu_teacher(
id char(19) PRIMARY KEY NOT NULL COMMENT '讲师ID',
name VARCHAR(20) NOT NULL COMMENT '讲师姓名',
intro VARCHAR(500) NOT NULL DEFAULT '' COMMENT '讲师简介',
career VARCHAR(500) DEFAULT NULL COMMENT '讲师资历,一句话说明讲师',
level int(10) UNSIGNED NOT NULL COMMENT '头衔 1高级讲师 2首席讲师',
avatar VARCHAR(255) DEFAULT NULL COMMENT '讲师头像',
sort int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序',
is_deleted TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除,0(false)未删除',
gmt_create datetime NOT NULL COMMENT '创建时间',
gmt_modified datetime NOT NULL COMMENT '更新时间',
UNIQUE KEY uk_name (name)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='讲师'
2.2 建立项目
2.2.1概述:
- 创建父工程
pom类型,管理版本依赖和公共依赖 - 创建子工程
本项目父工程为Spring Boot工程,子工程全部为Maven工程。
2.2.2 创建项目
- 创建父工程
- 创建子工程
2.3 开发讲师管理模块
- applications.properties文件
# 服务端口
server.port=8001
# 服务名
spring.application.name=service-edu
# 环境设置:dev(开发环境)、test(测试环境)、prod(生产环境)
spring.profiles.active=dev
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- Controller
- Service
- Mapper
用代码生成器来生成以上代码
实现findAll功能
1. 编写Controller代码:
2. 编写Config类
3. 编写启动类
4. 测试
输入http://localhost:8001/eduservice/edu-teacher/findAll,结果如下。
看到时间格式不是我们想要的默认情:况下json时间格式带有时区,并且是世界标准时间,和我们的时间差了八个小时。在application.properties中设置在配置文件中配置。
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
再次测试:
讲师逻辑删除功能
- 设置配置插件
/**
* 逻辑删除插件
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
- 实体类设置注解
@ApiModelProperty(value = "逻辑删除 1(true)已删除,0(false)未删除")
@TableLogic
private Boolean isDeleted;
- Controller类里面编写删除方法
//逻辑删除讲师方法
@DeleteMapping("{id}")//id需要通过路径来传递
public boolean removeTeacher(@PathVariable String id){//获取路径中的ID值
boolean flag = teacherService.removeById(id);
return flag;
}
- post测试
-
swagger测试
整合Swagger2
- 配置Swagger配置类
- 导入依赖
- 添加注解
- 浏览器输入localhost:8001/swagger-ui.html进行测试
-
postman测试
统一返回结果对象
- 创建子模块common_utils
- 创建interface,定义数据返回状态码
- 定义数据返回格式
这里是链式编程
讲师分页功能
-
配置分页插件
-
编写讲师分页方法
多条件组合查询带分页
- 将各个查询条件封装成为一个对象TeacherQuery ;
@Data
public class TeacherQuery {
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 12:03:45")
private String begin;
@ApiModelProperty(value = "查询结束时间", example = "2019-12-02 12:23:56")
private String end;
}
- 在Controller中写对条件组合查询接口
//4.多条件组合查询带分页
@PostMapping("pageTeacherCondition/{current}/{limit}")
public R pageTeacherCondition(@PathVariable long current,//当前页
@PathVariable long limit,//页大小
@RequestBody(Required = false
)TeacherQuery teacherQuery//查询条件
){
//创建一个Page对象
Page<EduTeacher> pageTeacher = new Page<>(current, limit);
//构建条件
QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
//多条件组合查询--------------------------------------
String name = teacherQuery.getName();
Integer level = teacherQuery.getLevel();
String begin = teacherQuery.getBegin();
String end = teacherQuery.getEnd();
if(!StringUtils.isEmpty(name)){
wrapper.like("name", name);
}
if(!StringUtils.isEmpty(level.toString())){
wrapper.eq("level", level);
}
if(!StringUtils.isEmpty(begin)){
wrapper.ge("gmt_create", begin);//大于等于开始时间
}
if(!StringUtils.isEmpty(end)){
wrapper.le("gmt_create", end);//小于等于结束时间
}
//调用方法实现查询分页
teacherService.page(pageTeacher, wrapper);//这里多了一个wrapper查询条件
long total = pageTeacher.getTotal();//返回数据 total
List<EduTeacher> records = pageTeacher.getRecords();//返回数据records
return R.ok().data("total", total).data("rows",records);//返回数据total+records
}
@RequestBody:使用Json传递数据,把Json数据封装到对应的对象里面;需要post传递数据,get取不到
@ResponseBody:返回Json格式的数据
添加讲师
- 类上添加自动填充注解
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)//自动填充
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)//自动填充
private Date gmtModified;
- 创建自动填充时间接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified",new Date(), metaObject);
}
}
- 编写Controller代码
/******************* 5.添加讲师接口*************************/
@PostMapping("addTeacher")
public R addTeacher(@RequestBody EduTeacher eduTeacher){
boolean flag = teacherService.save(eduTeacher);
if(flag) return R.ok();
else return R.error();
}
讲师修改功能
- 根据讲师id查找讲师
//6.根据讲师ID进行查询
@GetMapping("getTeacher/{id}")
public R getTeacher(@PathVariable Integer id){
EduTeacher eduTeacher = teacherService.getById(id);
return R.ok().data("teacher", eduTeacher);
}
- 讲师修改
//7.讲师信息修改
@PostMapping("updateTeacher")
public R updateTeacher(@RequestBody EduTeacher eduTeacher){
boolean flag = teacherService.updateById(eduTeacher);
if(flag)return R.ok();
else return R.error();
}
统一异常处理
- 异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
//指定出现了什么异常,会执行该方法
@ExceptionHandler(Exception.class)
@ResponseBody //为了返回数据
public R Error(Exception e){
e.printStackTrace();
return R.error().message("执行了全局异常处理...");
}
}
- 测试
(完)