在线教育day2

任务:

  1. 前后端分离概念
  2. 讲师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

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


讲师逻辑删除功能
  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进行测试
      在这里插入图片描述
      在这里插入图片描述
  • postman测试


统一返回结果对象
  1. 创建子模块common_utils
  2. 创建interface,定义数据返回状态码
  3. 定义数据返回格式

这里是链式编程
在这里插入图片描述


讲师分页功能
  1. 配置分页插件
    在这里插入图片描述

  2. 编写讲师分页方法
    在这里插入图片描述


多条件组合查询带分页
  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格式的数据

在这里插入图片描述在这里插入图片描述


添加讲师
  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. 测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值