苍穹外卖的个人总结[持续更新]

Day1 部署环境、登录

环境配置

一些小知识点的深挖

登录

JWT令牌

用于实现登录校验,全称是JSON Web Token,是基于json格式的安全令牌 -> 传输声明或用户信息(加密)
在这里插入图片描述
详细请看文章:SpringBoot实现登录校验(JWT令牌)
在代码的yml文件里设置了这三种参数
在这里插入图片描述

  1. 如何查看用户登录时传递给后台的到底是什么东西?(也就是抓包)
    打算使用postman进行抓包,看看登录校验到底传的是什么东西 (顺带学习测试了,跑)
    另外不太清楚wireshark和postman又是有啥相同和不同的地方
    是明文传输到后端的,这个想想办法修改一下前端代码
密码的存储【mysql】

密码加密存储 - MD5加密方法(单向加密,不能还原),同时修改数据库和JAVA代码

前后端联动的方法
  1. 前端如何找到后端呢
    nginx实现前后端联调
    负载均衡【实现:配置多个服务器】、访问速度高(因为有缓存)、保证后端的安全(前端不能直接请求到后端)
    详情请参见这篇文章 一文快速搞懂Nginx —— Nginx 详解

感觉和计网的一些知识可以串起来了,NAT是不是用在这里的呢?

用到的技术

接口相关
  1. YApi
    上传一个接口文档,也许应该先写接口文档 -> 开发接口
    但是YApi现在禁止注册了,就先掠过吧
  2. Swagger
    可以看接口文档,测试接口的工具
  • 关键代码
    在这里插入图片描述
  • 常用注解
    在这里插入图片描述

DAY2 员工相关需求的实现

基本概念

DTO

DTO是一种设计模式,用于在应用程序的不同层之间传输数据。DTO通常用于将数据从一个层(如持久化层)传递到另一个层(如视图层),主要是为了将前端传来的数据封装成一个对象。

后端开发中的测试

后端和前端同时开发,后端的测试以接口测试为主(就是上面那个swagger)

ThreadLocal

它是线程私有的,A线程的ThreaLocal变量,B线程不能使用(线程隔离的)
问题来了,线程间通信如何进行呢?【估计以后会学到】

应用的方法

开发 新建员工 功能的流程

  1. 找到接口
    需要实现的接口是controller里的save方法(也就是前端接收到的数据,需要通过DTO的方法,存在持久层里,也就是数据库里)
    在这里插入图片描述
    PostMapping:应该对接到的后端地址
    ApiOperation:Swagger的注解
    接收的RequestBody:处理HTTP请求中的请求体(request body),通常是json或xml格式
    Q: 如果不写RequestBody,会怎么样呢?因为我们是post的json,所以不加会解析不了数据,导致DTO这个对象是空的。
    post请求可以不加@RequestBody注解么?

  2. 实现接口,并且顺腾摸瓜实现插入数据库的方法
    这里需要用@Select注解
    在这里插入图片描述

  3. 优化

  • 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(之所以可以进行是因为有这个注解)
在这里插入图片描述

在这里插入图片描述

开发 员工信息修改 功能的流程

首先需要获取员工信息,然后放在输入框上,剩下的就是修改想要的部分
在这里插入图片描述
至于新的倒是没有什么,但是我觉得弹幕说的挺对的,前端没有请求的数据不要返回,这样还安全一点

我的收获

  1. 在MapperXML写的代码,感觉都是比较复杂的(条件比较多的),当然也很方便复用;简单的似乎就直接@注解里写了
  2. 感觉流程大概明白了,先Controller接收到信息,然后Controller分给对应的service去干活,service如果需要处理数据又需要调对应的mapper干活(持久层操作)
  3. TODO day2的菜单自己完成了,建议大家有时间可以自己完成一下,流程和前边基本是一样的

DAY 3 重点:多表联合查询

需求分析

今天所做的是和菜品相关的功能,而菜品包含了口味,菜品和口味是分表存储的。
除此之外,菜品和菜单也有联系。
以上的需求中,因为菜品表和多个其他的表建立了联系,所以增加新纪录、删除新纪录的时候都需要额外注意

知识点记录

自定义注解(AOP的实现)

这篇感觉讲的不错: Java @Aspect 切面
由于我们经常需要更新数据或上传新数据,因此经常会产生createTime,createUser,updateTime, updateUser这四个元素,而在菜品、菜单、人员都可能产生这四个元素,因此为了简化写作,可以采用自定义注解去自动填充含有这四个元素的实体

首先定义了注解实现的场景:update和insert,为此创建了一个枚举类
自定义枚举
首先先定义一个注解,需要描述它的作用范围(target),描述它的生存周期(retention)
在这里插入图片描述
然后定义一个切面,切点(在哪里触发),以下定义了应该匹配哪个方法
在这里插入图片描述
然后开始写逻辑,逻辑肯定是update的情况【只更新Update相关的两个元素】,create的情况【4个元素都需要赋值】
获取实体以及操作类型
在这里插入图片描述
然后就是业务进行操作,通过反射进行赋值
在这里插入图片描述

文件上传

由于不想费时间进行阿里云的文件上传,所以尝试拿本地当作服务器的上传对象,则需要修改一些内容。

前面的代码和老师的保持一致,即获取上传文件,为上传文件生成一个新名字,也就是下边这段代码的逻辑。
上传文件逻辑1
在名字做好之后,需要写具体上传的逻辑
也就是获取文件,然后把文件写在某个位置
写入文件
其中重点是如何确认这个位置,最开始我直接用本地的绝对位置代替了,但最后会报错不能访问,原因是用file:文件绝对位置访问是危险而且不被允许的。那么则需要springboot配置映射的地址,或者我用了比较简单的方法,就是通过F12观测了页面其他png等存储的位置,找到这个位置之后,使用这个相对位置作为存储的位置以及访问的位置
在这里插入图片描述
save_path是一个绝对路径,img则是配置之后的一个相对路径
在这里插入图片描述

多表联合查询、删除

在逻辑内用到了left outer join的方法
这个就不细讲了,可以搜索其他的文章进行查看,总之在这里算是用SQL语句实战去记住多表联合的方法了。

我的收获:

  1. 稍微对AOP思想和实现有一些理解了
  2. 业务逻辑写的更快了,大概明白了书写的流程

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(版本看自己需要)
redis包
使用RedisTemplate类进行操作

类型关键字数据操作类型
字符串StringValueOperations (简单键值操作)
列表ListListOperations
哈希键值对HashHashOperations
集合SetSetOperations
有序列表ZSetZSetOperations

具体方法也可以看这篇讲的很不错的:Spring Data Redis

Spring Cache的使用方法

上边的操作比较繁琐,而且经常会遇到,redis里没有->去mysql里找回来->存到redis里的操作
因此为了简化操作,可以使用spring cache进行操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值