项目介绍:
本项目(苍穹外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括 后台管理系统 和 小程序端应用 两部分。其中后台管理系统主要提供给餐饮企业内部员工使用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护,对餐厅的各类数据进行统计,同时也可进行来单语音播报功能。小程序端主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单、支付、催单等。
前端简要介绍:
本项目是一个前后端分离的项目,前端工程部署在nginx服务器上,后端使用springboot技术,
Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,它在项目部署中主要用来作为 HTTP 服务器部署静态资源,以及实现反向代理和负载均衡。
使用nginx好处
部署静态资源:Nginx 可以作为静态资源服务器,直接提供 CSS、JS、图片等静态文件的访问,减轻后端应用服务器的负担。配置时,可以在 nginx.conf
文件中设置 root
指令指向静态资源目录,并通过 location
指令来指定对应的 URL 路径。
反向代理:Nginx 作为反向代理服务器,可以隐藏服务器的信息,确保内网的安全。通过配置 server
块中的 location
指令,使用 proxy_pass
将请求转发到后端服务器。同时,可以设置 proxy_set_header
来传递客户端的真实 IP 等信息给后端服务器。
负载均衡:Nginx 可以通过 upstream
指令定义一个服务器组,然后使用不同的策略(如轮询、权重、IP哈希等)来分发请求到不同的服务器上,实现负载均衡。这有助于在多个服务器之间分散请求,提高网站或应用的可用性和响应速度。
后端准备工作:
1.Yapi :是设计阶段使用的工具,管理和维护接口。
2.swagger:在开发阶段使用的框架,帮助后端开发人员做后端的接口测试。
swagger介绍:
swagger是一个完整规范的框架,用于生成、描述、调用、可视化的restful风格的web服 务。
作用:* 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
* 功能测试
在本项目中使用的是knife4j框架,他是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
后端可以问的问题:
异常处理:全局异常处理器:
集中处理异常:全局异常处理器允许你在一个统一的地方处理所有控制器中抛出的异常,而不是在每个控制器方法中分别处理。
减少代码重复:通过集中处理异常,你可以减少重复代码,使得控制器类更加简洁,专注于业务逻辑。
统一异常响应格式:全局异常处理器可以定义统一的异常响应格式,这对于客户端来说是非常友好的,因为它们可以预期到一个一致的响应结构。
自定义异常处理逻辑:你可以自定义异常处理逻辑,比如根据不同的异常类型返回不同的响应信息或者状态码。
支持拦截机制:Spring 允许你通过 @ControllerAdvice
注解来定义全局异常处理器。这个注解可以与 @ExceptionHandler
注解结合使用,来指定如何处理特定的异常类型。
异常处理流程:
在 Spring 框架中,当一个异常在控制器(Controller)中没有被捕获时,它会向上抛到 Spring 的 DispatcherServlet。DispatcherServlet 是 Spring MVC 的核心调度器,它负责将请求分发到相应的控制器。如果控制器中的方法抛出了异常,DispatcherServlet 会利用 HandlerExceptionResolver 接口的实现来处理这些异常。
全局异常处理器通常通过实现 HandlerExceptionResolver
接口或使用 @ControllerAdvice
注解来定义。以下是异常处理的流程:
异常抛出:当控制器方法执行过程中发生异常时,该异常会被抛出。
异常捕获:Spring 的 DispatcherServlet
捕获到这个异常。
查找异常解析器:DispatcherServlet
会询问所有的 HandlerExceptionResolver
来查找是否有能够处理该异常的解析器。
处理异常:如果找到了相应的异常处理方法,Spring 会调用该方法来处理异常。
响应客户端:异常处理器负责生成一个响应(通常是 ResponseEntity
),并将其返回给客户端。
登录业务:
jwt:JWT(JSON Web Token)是一种用于双方之间传递安全信息的简洁的、URL安全的令牌格式。它可以用来在用户和服务器之间传递身份验证信息,而不需要在每个请求中都使用cookie或session。
JWT通常包含三部分:头部(通常包含令牌的类型及所使用的签名算法)、有效载荷(包含所要传递的信息。可以是用户的身份信息,也可以是其他业务需要的信息。里面还可以存储过期时间)和签名(用于验证消息在传输过程中没有被更改)。
传统session:
http协议本身是一种无状态的协议,如果用户向服务器提供了用户名和密码来进行用户认证,下次请求时,用户还要再一次进行用户认证才行。因为根据http协议,服务器并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储─份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样应用就能识别请求来自哪个用户。
JWT详细教程与使用_jwt教程-CSDN博客,jwt与seesion的区别。
localthread:
ThreadLocal 并不是一个Thread,而是Thread的局部变量。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
分页查询:PageHelper,底层是通过拦截器实现的
公共字段自动填充:
在**新增员工**或者**新增菜品分类**时需要设置创建时间、创建人、修改时间、修改人等字段,在**编辑员工**或者**编辑菜品分类**时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表中都会有这些字段。所以决定采用公共字段自动填充来实现。
方法:使用AOP切面编程,实现功能增强,来完成公共字段自动填充功能。
**实现步骤:**
1). 自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法
2). 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
3). 在 Mapper 的方法上加入 AutoFill 注解。
Redis
Redis是一个基于**内存**的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的**存储中间件**。
HttpClient
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
Spring Cache
介绍
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
- EHCache
- Caffeine
- Redis(常用)
微信支付接口:
**Spring Task** 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。
**定位:**定时任务框架
**作用:**定时自动执行某段Java代码
**cron表达式**其实就是一个字符串,通过cron表达式可以**定义任务触发的时间**
**构成规则:**分为6或7个域,由空格分隔开,每个域代表一个含义
每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)
websocket
WebSocket 是基于 TCP 的一种新的**网络协议**。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建**持久性**的连接, 并进行**双向**数据传输。
**HTTP协议和WebSocket协议对比:**
- HTTP是**短连接**
- WebSocket是**长连接**
- HTTP通信是**单向**的,基于请求响应模式
- WebSocket支持**双向**通信
- HTTP和WebSocket底层都是TCP连接
**思考:**既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?
**WebSocket缺点:**
服务器长期维护长连接需要一定的成本
各个浏览器支持程度不一
WebSocket 是长连接,受网络限制比较大,需要处理好重连
**结论:**WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用
建立连接的过程:
客户端(通常是浏览器)通过发送一个 HTTP 请求来初始化 WebSocket 连接。这个请求看起来像一个普通的 HTTP 请求,但它包含了一些特定的头部信息,以告知服务器这是一个 WebSocket 握手请求。
如果服务器同意升级请求,它会发送一个 HTTP 响应,确认握手成功,并关闭 HTTP 连接,同时开启 WebSocket 连接。
一旦客户端接收到服务器的响应,它会确认响应是否有效(检查 Sec-WebSocket-Accept
是否正确)。如果一切正常,WebSocket 连接就建立了,客户端和服务器就可以通过这个连接发送和接收数据了。
连接建立后,客户端和服务器就可以通过这个持久的连接发送和接收数据。WebSocket 数据帧可以包含文本、二进制数据或表示连接关闭的特殊帧。
当客户端或服务器想要关闭连接时,它们可以发送一个关闭帧。这将导致连接被关闭,释放资源。