目录
Day1 部署环境、登录
环境配置
一些小知识点的深挖
登录
JWT令牌
用于实现登录校验,全称是JSON Web Token,是基于json格式的安全令牌 -> 传输声明或用户信息(加密)
详细请看文章:SpringBoot实现登录校验(JWT令牌)
在代码的yml文件里设置了这三种参数
- 如何查看用户登录时传递给后台的到底是什么东西?(也就是抓包)
打算使用postman进行抓包,看看登录校验到底传的是什么东西(顺带学习测试了,跑)
另外不太清楚wireshark和postman又是有啥相同和不同的地方
是明文传输到后端的,这个想想办法修改一下前端代码
密码的存储【mysql】
密码加密存储 - MD5加密方法(单向加密,不能还原),同时修改数据库和JAVA代码
前后端联动的方法
- 前端如何找到后端呢
nginx实现前后端联调
负载均衡【实现:配置多个服务器】、访问速度高(因为有缓存)、保证后端的安全(前端不能直接请求到后端)
详情请参见这篇文章 一文快速搞懂Nginx —— Nginx 详解
感觉和计网的一些知识可以串起来了,NAT是不是用在这里的呢?
用到的技术
接口相关
- YApi
上传一个接口文档,也许应该先写接口文档 -> 开发接口
但是YApi现在禁止注册了,就先掠过吧 - Swagger
可以看接口文档,测试接口的工具
- 关键代码
- 常用注解
DAY2 员工相关需求的实现
基本概念
DTO
DTO是一种设计模式,用于在应用程序的不同层之间传输数据。DTO通常用于将数据从一个层(如持久化层)传递到另一个层(如视图层),主要是为了将前端传来的数据封装成一个对象。
后端开发中的测试
后端和前端同时开发,后端的测试以接口测试为主(就是上面那个swagger)
ThreadLocal
它是线程私有的,A线程的ThreaLocal变量,B线程不能使用(线程隔离的)
问题来了,线程间通信如何进行呢?【估计以后会学到】
应用的方法
开发 新建员工 功能的流程
-
找到接口
需要实现的接口是controller里的save方法(也就是前端接收到的数据,需要通过DTO的方法,存在持久层里,也就是数据库里)
PostMapping:应该对接到的后端地址
ApiOperation:Swagger的注解
接收的RequestBody:处理HTTP请求中的请求体(request body),通常是json或xml格式
Q: 如果不写RequestBody,会怎么样呢?因为我们是post的json,所以不加会解析不了数据,导致DTO这个对象是空的。
post请求可以不加@RequestBody注解么? -
实现接口,并且顺腾摸瓜实现插入数据库的方法
这里需要用@Select注解
-
优化
- A. 数据库中存在用户名unique的设定,需要在遇到这种情况的时候捕获提示并且处理错误
方法1:先插入,返回异常处理异常(黑马的方法)
处理位置:handler,别忘了注解
问题:其实也是非常依赖报错信息的,万一报错信息修改了之后,这种方法就没有办法解析了。
方法2: 先查询,查询发现有对象之后(也就是发现了有这个username在数据库里),就抛出自定义的错误类+捕获这个处理的类(我的英文写的有点不太好大家凑活看)
主类:
- B. 插入数据库时,需要动态地修改createUser和updateUser
诉求:需要获取登录的时候得到的ID,JWT获取ID,但是想在service使用ID
方法:ThreadLocal的使用
开发 启用禁用员工 功能的流程
显然我们需要修改员工的状态
首先我们需要获取用户状态,以及用户id,由于用户状态是path的方式传递的,而id是query方式
因此采取PathVariable获取status,id使用query可以直接获取
接下来的流程就和之前一样:
写service的函数,service调用employeeMapper的同名方法(也就是进行数据处理,写sql语句的地方)
另一种初始化的方法:使用builder(之所以可以进行是因为有这个注解)
开发 员工信息修改 功能的流程
首先需要获取员工信息,然后放在输入框上,剩下的就是修改想要的部分
至于新的倒是没有什么,但是我觉得弹幕说的挺对的,前端没有请求的数据不要返回,这样还安全一点
我的收获
- 在MapperXML写的代码,感觉都是比较复杂的(条件比较多的),当然也很方便复用;简单的似乎就直接@注解里写了
- 感觉流程大概明白了,先Controller接收到信息,然后Controller分给对应的service去干活,service如果需要处理数据又需要调对应的mapper干活(持久层操作)
- TODO day2的菜单自己完成了,建议大家有时间可以自己完成一下,流程和前边基本是一样的
DAY 3 重点:多表联合查询
需求分析
今天所做的是和菜品相关的功能,而菜品包含了口味,菜品和口味是分表存储的。
除此之外,菜品和菜单也有联系。
以上的需求中,因为菜品表和多个其他的表建立了联系,所以增加新纪录、删除新纪录的时候都需要额外注意
知识点记录
自定义注解(AOP的实现)
这篇感觉讲的不错: Java @Aspect 切面
由于我们经常需要更新数据或上传新数据,因此经常会产生createTime,createUser,updateTime, updateUser这四个元素,而在菜品、菜单、人员都可能产生这四个元素,因此为了简化写作,可以采用自定义注解去自动填充含有这四个元素的实体
首先定义了注解实现的场景:update和insert,为此创建了一个枚举类
首先先定义一个注解,需要描述它的作用范围(target),描述它的生存周期(retention)
然后定义一个切面,切点(在哪里触发),以下定义了应该匹配哪个方法
然后开始写逻辑,逻辑肯定是update的情况【只更新Update相关的两个元素】,create的情况【4个元素都需要赋值】
获取实体以及操作类型
然后就是业务进行操作,通过反射进行赋值
文件上传
由于不想费时间进行阿里云的文件上传,所以尝试拿本地当作服务器的上传对象,则需要修改一些内容。
前面的代码和老师的保持一致,即获取上传文件,为上传文件生成一个新名字,也就是下边这段代码的逻辑。
在名字做好之后,需要写具体上传的逻辑
也就是获取文件,然后把文件写在某个位置
其中重点是如何确认这个位置,最开始我直接用本地的绝对位置代替了,但最后会报错不能访问,原因是用file:文件绝对位置访问是危险而且不被允许的。那么则需要springboot配置映射的地址,或者我用了比较简单的方法,就是通过F12观测了页面其他png等存储的位置,找到这个位置之后,使用这个相对位置作为存储的位置以及访问的位置
save_path是一个绝对路径,img则是配置之后的一个相对路径
多表联合查询、删除
在逻辑内用到了left outer join的方法
这个就不细讲了,可以搜索其他的文章进行查看,总之在这里算是用SQL语句实战去记住多表联合的方法了。
我的收获:
- 稍微对AOP思想和实现有一些理解了
- 业务逻辑写的更快了,大概明白了书写的流程
DAY5&DAY7 缓存的使用
※ 微信小程序部分我先跳了,主要是先梳理一下JAVA部分的知识
原因:虽然我们已经有MySQL数据库了,但是有一些信息经常使用,总是去访问数据库不仅增加数据库负担,而且速度也会有一些限制。因此我们想到使用缓存来降低数据库访问压力,并且提升速度
在这里使用的是Redis,它会把内容存在内存里,读写速度都很快
Redis的基本使用方法
Redis需要自己下载,下载完成后需要启动server服务,启动后是这样的。
然后可以设置redis的密码,在文件redis.windows.conf中修改requirepass(或取消注释),这样客户端连接服务器端就需要密码了
终端操作方法
类型 | 关键字 |
---|---|
字符串 | String |
列表 | List |
哈希键值对 | Hash |
集合 | Set |
有序列表 | ZSet |
具体的看这一篇就够了:Redis基础
总体来说比较容易
JAVA操作方法
首先需要导包,在pom.xml里导入spring-boot-starter-data-redis(版本看自己需要)
使用RedisTemplate类进行操作
类型 | 关键字 | 数据操作类型 |
---|---|---|
字符串 | String | ValueOperations (简单键值操作) |
列表 | List | ListOperations |
哈希键值对 | Hash | HashOperations |
集合 | Set | SetOperations |
有序列表 | ZSet | ZSetOperations |
具体方法也可以看这篇讲的很不错的:Spring Data Redis
Spring Cache的使用方法
上边的操作比较繁琐,而且经常会遇到,redis里没有->去mysql里找回来->存到redis里的操作
因此为了简化操作,可以使用spring cache进行操作