《苍穹外卖Day2:大一菜鸟的代码升空纪实》

Day2

目录

Day2

1.补充Day1知识

2.完成任务报告

3.任务中的收获

4.知识点的扩展

4.1ThreadLocal

4.2PageHelper

4.3@JosnFormat与@DataTimeFormat

4.4全局统一日期格式


作者是根据黑马课程学的

1.补充Day1知识

1.我在第一天时说到了Swagger与knife4j,它们的作用很强大(上图)

​编辑

就是通过相应注解可以自动帮你生成一个接口文档,这很有助于开发人员的开发,前端人员也可以通过这个文档来开发,减少沟通成本(自动生成接口文档(太香了))

2.怎么使用,我再发一下

2.1引入依赖

​编辑

2.2配置

​编辑

3.最核心的是它的注解的使用(先看一下)

​编辑

简单解释一下:

  1. @Api就是作用于Controller上的(效果)

​编辑

​编辑

2.ApiModel就是作用到封装类中的(类上注入

​编辑

​编辑

3 .@ApiModelProperty就是作用于实体类属性上的(属性注入)

​编辑

​编辑

  1. @ApiOperation就是作用于Controller方法上的(方法注入)

​编辑

​编辑

2.完成任务报告

1.今天完成了5个接口的实现,(添加员工,分页查询员工,修改员工账号状态,根据ID查询员工,修改员工)

2.每次完成一个接口就进行了业务代码上传仓库的操作(作者亲测魔法没有Steam++好用,Steam++上传更快,好吧我用魔法就没有上传成功过)

3.任务中的收获

1.功能测试的方式有两种:

1.1通过接口文档测试 (主要是这个,老师给的接口文档似乎是有问题的那个参数类型没有对应上

1.2通过前后端联调测试(需要前端代码完善才能测试)

1.3我还是建议使用Apifox这个工具来进行接口测试(别人有的它一定有)

2.传参的方式:

1 .路径传参 :如:Localhost:8080/emp/1 ,就是写在了访问路径上而且用/分割 的(1就可以看作一个参数,这个1的参数名为status ),那么我们服务端想要接收这个参数,必须使用注解 @PathVariable ("这里面写传过来的参数名(status呗) "),如果你接收参数的类型名称与参数名相同 ,那么可以直接写注解 @PathVariable,不写参数名了 ,但是你对应的Mapping注解的路径**必须这样写(假如你参数名为id , @Mapping("/访问路径/{参数名id}"))*

​编辑
2.地址栏传参 :如:Localhost:8080/emp?name="给值 ", 就是写在了访问路径上而且用 ?分割 的,那么我们服务端想要接收这个参数,必须使用注解 @RequestParam ("这里面写传过来的参数名(name呗 )"),如果你接收参数的类型名称与参数名相同 ,那么可以直接写注解@RequestParam,不写参数名了因为这是简单参数传值Mapping注解的访问路径不需要写参数名

​编辑
3.请求体传参:一般传JOSN的数据,如图

​编辑

我们要接收这个请求头,那么必须写这个注解@RequestBody(这个绝对不能省略

​编辑

而且你都用请求体传参了,里面的属性至少不是一个吧,所以建议使用封装类来接收( 注意:请求体内的属性名与封装类中的属性名要一一对应,才能自动封装到类中,才能接收到值)

总结:所以我们就保持访问参数名与服务端中的属性名一致 (出错的几率小,但是你必须知道这个原理是怎么回事

3.写查询回显的接口(根据id查询)时,因为接口文档要求返回员工的所有数据给客户端(那么其中就包含了员工的密码 ),虽然员工的密码进行了MD5加密后再存入的数据库 ,但是加密的密码是不是也不要显示 给客户端,别人一个F12看到那个密码总归是不好的(保证安全) ,所以我们就给从数据库中查到的值重新赋值一个密码(不要把密码给暴露出去,不管是不是加密的

​编辑

4.我发现老师这里封装的Result是定义的泛型,而web中的老师的Result却没有定义泛型(区别不大)

5.完成接口时学会了多用更具体的实体类接收参数 ,原先写tlias时是一个员工实体类用到死,现在是根据具体参数,来封装实体类来接收(还有根据接口文档来封装)

6.学会了多定义一些常量来给值(如:一些状态码,消息提示,默认值等等),看起来更加优雅美观

4.知识点的扩展

4.1ThreadLocal

1.为什么要使用到它:你想这是一个外卖系统涉及到登录 操作,如果有人没有登录就直接通过路径来访问相应功能 ,那么是不是应该进行一个校验 (这里使用的JWT令牌校验 ),通过才能访问

​编辑

​编辑

了解这个过程后,登录人是不是有唯一标识ID ,如果你去操作某个功能,是不是要记录下你的操作记录,那么管理端是不是要根据ID,来确认是谁在操作,所以这个功能就是有它来实现的

2.先了解一下它:执行一个任务时是不是有多个线程来执行 (抢票是不是多个人同时抢),而ThreadLocal就是每个线程自己特有的空间 ,别的线程不能访问(下面是它的方法)

​编辑

3.进行思考:那么怎么实现这个取出登录人ID的操作呢?登录是不是也要一个接口来实现,那么服务端就必须有对应代码来实现(是不是就是查询数据库,有数据就登录成功,没有则失败 ),登录成功时,我们会接收到登录人的信息(包含ID) ,那么我们是不是可以先实现准备一个线程的ThreadLocal (登录操作肯定是一个线程在完成) (如图)

​编辑

我们将登录人ID赋值给ThreadLocal ,那么现在这个ThreadLocal是不是确定下来了 ,以后你要操作人ID,你从ThreadLocal中取出来就行了

4.老师似乎没有进行ThreadLocal的移除(web中老师进行了移除,最好移除,防止内存泄漏

4.2PageHelper

1.介绍:PageHelper是Mybatis提供的一个插件

2.怎么使用:(先导入依赖)

​编辑

先看一下

​编辑

就是你给它一个页码值和页数值 ,它会动态的进行分页查询,我们不需要再写Limit

3.原理:它是基于TreadLocal 来实现的,上面说了TreadLocal是不是可以存值,而PageHelper就是基于它来进行的存(页码值,页数值) ,等我们的SQL 语句实现的时候就会 出来动态的进行分页查询(类似于动态SQL)

4.上面为什么调用selectByPage时(明明返回的应该是一个集合 ,怎么用Page来接收),其实Page是继承于ArrayList集合的 (增加了一些功能,它可以获取总页码(getTotal() ,下面的第一条语句就是来获取总数),我们真实的数据(那个集合)通过getResult()来获取数据库返回的数据),

​编辑

5 .注意:PageHelper只能对它下面的第一个Mapper的SQL语句进行动态查询

4.3@JosnFormat与@DataTimeFormat

1.是我们遇到的一些问题,才了解了这个,问题是我们数据库中的时间类型的数据返回给前端展示是变成了数组展示(要解决它)

  1. @JosnFormat 就是可以将我们后端的数据转换成JSON形式的数据 (这样就不是展示数组了),其实这里应该想到什么(序列化,对,就是通过序列化来实现的这个转换功能 ),它其实还可以进行反序列化操作,就是上面反转过来就是

  2. @DataTimeFormat 就是将前端传过来的时间(假如你用LocalDateTime来接收,格式是不是有要求 )而它就是将传过来的时间格式进行一个转换,变成我们想要的格式

4.4全局统一日期格式

1.在配置类中继承WebMvcConfigurationSupport,实现其中的方法

​编辑

​编辑

2.设置一个对象转换器

​编辑

3.这样就可以了

相关推荐
Code哈哈笑1 小时前
【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
java·前端·数据库·spring boot·后端
无名之逆1 小时前
Hyperlane: Unleash the Power of Rust for High-Performance Web Services
java·开发语言·前端·后端·http·rust·web
薯条不要番茄酱2 小时前
【SpringBoot】从环境准备到创建SpringBoot项目的全面解析.
java·spring boot·后端
caihuayuan59 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计
Kookoos10 小时前
ABP vNext + EF Core 实战性能调优指南
数据库·后端·c#·.net·.netcore
揣晓丹11 小时前
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
java·vue.js·spring boot·后端·开源
豌豆花下猫12 小时前
Python 3.14 新特性盘点,更新了些什么?
后端·python·ai
caihuayuan513 小时前
Vue生命周期&脚手架工程&Element-UI
java·大数据·spring boot·后端·课程设计
明月与玄武16 小时前
Spring Boot中的拦截器!
java·spring boot·后端
菲兹园长16 小时前
SpringBoot统一功能处理
java·spring boot·后端