在线教育day2

任务:

  1. 前后端分离概念
  2. 讲师CRUD操作

1. 前后端分离概念

在线教育day2_第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类型,管理版本依赖和公共依赖
  • 创建子工程
    在线教育day2_第2张图片

本项目父工程为Spring Boot工程,子工程全部为Maven工程。


2.2.2 创建项目
  • 创建父工程
    在线教育day2_第3张图片
  • 创建子工程

在线教育day2_第4张图片

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
    用代码生成器来生成以上代码
    在线教育day2_第5张图片
实现findAll功能

1. 编写Controller代码:
在线教育day2_第6张图片
2. 编写Config类
在线教育day2_第7张图片
3. 编写启动类
在线教育day2_第8张图片
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

再次测试:
在这里插入图片描述


讲师逻辑删除功能
  1. 设置配置插件
 /**
     * 逻辑删除插件
     */
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
  1. 实体类设置注解
    @ApiModelProperty(value = "逻辑删除 1(true)已删除,0(false)未删除")
    @TableLogic
    private Boolean isDeleted;
  1. Controller类里面编写删除方法
    //逻辑删除讲师方法
    @DeleteMapping("{id}")//id需要通过路径来传递
    public boolean removeTeacher(@PathVariable String id){//获取路径中的ID值
        boolean flag = teacherService.removeById(id);
        return flag;
    }
  1. post测试
  • swagger测试

    整合Swagger2

    1. 配置Swagger配置类
    2. 导入依赖
    3. 添加注解
    4. 浏览器输入localhost:8001/swagger-ui.html进行测试
      在线教育day2_第9张图片
      在线教育day2_第10张图片
  • postman测试


统一返回结果对象

  1. 创建子模块common_utils
  2. 创建interface,定义数据返回状态码
  3. 定义数据返回格式

这里是链式编程
在线教育day2_第11张图片


讲师分页功能

  1. 配置分页插件
    在线教育day2_第12张图片

  2. 编写讲师分页方法
    在线教育day2_第13张图片


多条件组合查询带分页

  1. 将各个查询条件封装成为一个对象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;
}
  1. 在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格式的数据

在线教育day2_第14张图片在线教育day2_第15张图片


添加讲师

  1. 类上添加自动填充注解
   @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)//自动填充
    private Date gmtCreate;


    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)//自动填充
    private Date gmtModified;
  1. 创建自动填充时间接口
@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);
    }
}
  1. 编写Controller代码
/******************* 5.添加讲师接口*************************/
    @PostMapping("addTeacher")
    public R addTeacher(@RequestBody EduTeacher eduTeacher){
        boolean flag = teacherService.save(eduTeacher);
        if(flag) return R.ok();
        else return R.error();
    }

讲师修改功能

  1. 根据讲师id查找讲师
 //6.根据讲师ID进行查询
    @GetMapping("getTeacher/{id}")
    public R getTeacher(@PathVariable Integer id){
        EduTeacher eduTeacher = teacherService.getById(id);
        return R.ok().data("teacher", eduTeacher);
    }
  1. 讲师修改
//7.讲师信息修改
    @PostMapping("updateTeacher")
    public R updateTeacher(@RequestBody EduTeacher eduTeacher){
        boolean flag = teacherService.updateById(eduTeacher);
        if(flag)return R.ok();
        else return R.error();
    }

统一异常处理

  1. 异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
   //指定出现了什么异常,会执行该方法
   @ExceptionHandler(Exception.class)
   @ResponseBody //为了返回数据
   public R Error(Exception e){
       e.printStackTrace();
       return R.error().message("执行了全局异常处理...");
   }
}

  1. 测试
    在线教育day2_第16张图片
    在线教育day2_第17张图片
    在这里插入图片描述

(完)

你可能感兴趣的:(springboot)