十二、将返回结果统一为json数据
在我的谷粒学苑(四)中介绍,传送门:
十三、实现讲师的多条件分页查询功能
根据讲师名称name,讲师头衔level、讲师入驻时间gmt_create(时间段)查询
1、 将讲师的所有条件封装成一个类
在entity包下创建vo包(view object),创建TeacherQuery类
@Data public class TeacherQuery { @ApiModelProperty(value = "教师名称,模糊查询") private String name; @ApiModelProperty(value = "头衔 1高级讲师 2首席讲师") private Integer level; @ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10") private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换 @ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10") private String end; }
2、在controller中写实现的功能
其实实现分页和多条件查询的逻辑代码更应该放在service层中,我们先写在controller层中,后续再进行优化
/** * 讲师的多条件分页查询 * @param current 当前页 * @param limit 每页数量 * @param teacherQuery 讲师条件 * @return */ @PostMapping("pageTeacher/{current}/{limit}") public R pageTeacher(@PathVariable long current, @PathVariable long limit, //使用RequestBody需要POST提交,不用使用GET required = false 表示可以缺省(没有条件就查全部) @RequestBody(required = false) TeacherQuery teacherQuery){ //创建page对象 Page<EduTeacher> pageTeacher = new Page<>(current, limit); //构建条件 QueryWrapper<EduTeacher> queryWrapper = new QueryWrapper<>(); //多条件组合查询 Integer level = teacherQuery.getLevel(); String name = teacherQuery.getName(); String begin = teacherQuery.getBegin(); String end = teacherQuery.getEnd(); //判断条件值是否为空,不为空则构造条件 if (!StringUtils.isEmpty(name)){ queryWrapper.like("name", name); //传入字段的名字和值 } if (!StringUtils.isEmpty(level)){ queryWrapper.like("level", level); } if (!StringUtils.isEmpty(begin)){ queryWrapper.ge("gmt_create", begin); //传入表中字段的名字和值 } if (!StringUtils.isEmpty(end)){ queryWrapper.le("gmt_create", end); } //实现分页 eduTeacherService.page(pageTeacher, queryWrapper); long total = pageTeacher.getTotal(); List<EduTeacher> records = pageTeacher.getRecords(); return R.ok().data("total", total).data("rows", records); }
3、在swagger中测试
启动运行,打开swagger-ui
点击 try it out
可以看到找到两个名字中带“王”的讲师。
十四、自动填充时间
由于我们每次插入数据时都要写插入时间和修改时间,非常麻烦。可以做一些操作让它自动填充。
1、封装自动填充类
在service_base下新建handler包,创建类MyMetaObjectHandler
@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); } }
2、在实体类上添加注解
十五、 实现讲师增加功能
1、逻辑代码
这个功能比较简单,在controller中完成
//添加讲师 @PostMapping("/addTeacher") public R createTeacher(@RequestBody EduTeacher eduTeacher){ boolean save = eduTeacherService.save(eduTeacher); if (save){ return R.ok(); } else { return R.error(); } }
2、测试
这里需要注意的是,时间有自动填充,是不需要传的;id可以自动生成,也不需要传。
成功,再看看数据库
如果插入的时候id报错了,把实体类上的id注解改为@TableId(value = "id", type = IdType.ID_WORKER_STR)
十六、实现讲师修改功能
讲师修改分为两个部分:根据id回显 和 修改讲师信息 。这两个功能都比较简单
1、根据id查询讲师
//根据id查询讲师 @GetMapping("/getTeacher/{id}") public R getTeacher(@PathVariable String id){ EduTeacher eduTeacher = eduTeacherService.getById(id); return R.ok().data("teacher", eduTeacher); }
2、修改讲师信息
//修改讲师 @PostMapping("updateTeacher") public R updateTeacher(@RequestBody EduTeacher eduTeacher){ boolean flag = eduTeacherService.updateById(eduTeacher); if (flag){ return R.ok(); } else { return R.error(); } }
修改也可以有不同的写法,比如可以用PutMapping,那么这时用RequestBody时需要手动把id设置上去
3、测试
(1)根据id查询
(2) 修改
不需要传时间,但因为根据id修改,所以要传id
将id为1的讲师level改为5