谷粒学苑项目实战(二):讲师管理模块搭建(下)
2023-03-14 22:47:44 时间
十二、将返回结果统一为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
相关文章
- 开发笔记:如何对【动态链接库】文件进行加密保护?
- OpenHarmony - ArkUI(TS)声明式开发之底部导航栏
- 面试突击:线程安全问题的解决方案有哪些?
- HDF驱动开发流程解析
- 浏览器瞬间变成相册 教你开启Chrome隐藏新功能
- 图解 Rocky Linux 9 安装步骤
- Windows 系统下常用的网络配置命令
- 修复 Ubuntu 中的 “Pending Update of Firefox snap” 错误
- 如何在 Linux 中连接到串行控制台
- CPU突然飙高,系统反应慢怎么排查,我来教教你
- 用 Go 学算法之归并排序
- Linux内存管理(Golang实现)
- Go语言切片原生支持并发吗?
- 为什么进程使用的内存尺寸(虚拟存储)可以比物理内存还大?
- GitHub与GitLab有何不同,您该选那个?
- 面试突击:线程安全问题是如何产生的?
- Vue2剥丝抽茧-响应式系统之数组
- Firefox 火狐浏览器 105 工具栏正测试统一管理扩展按钮
- 如何清理 Snap 保留的旧软件包以释放磁盘空间
- Linux 怎么防止 ssh 被暴力破解