Bootstrap

苍穹外卖总结

代码地址:gobeyye/sky-take-out

一、项目简介

本项目(苍穹外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括 系统管理后台 和 小程序端应用 两部分。其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护,对餐厅的各类数据进行统计,同时也可进行来单语音播报功能。小程序端主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单、支付、催单等。

二、重要技术点

2.1 nginx 反向代理:

nginx 本身也是一个 web 服务器。

nginx 反向代理,就是将前端发送的动态请求由 nginx 转发到后端服务器。

nginx 反向代理的好处:

  • 提高访问速度:

    因为 nginx 本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx 就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。

  • 进行负载均衡:

    所谓负载均衡,就是把大量的请求按照我们指定的方式,均衡的分配给集群中的每台服务器。

  • 保证后端服务安全:

    因为一般后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把 nginx 作为请求访问的入口,请求到达 nginx 后转发到具体的服务中,从而保证后端服务的安全。

image-20241025215153672

2.2 Swagger(接口文档在线生成):

本项目中的应用: 在线生成接口文档方便调试。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。

它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作。

  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担。

  3. 功能测试。

使用步骤:

  1. 导入 knife4j 的maven坐标。
  2. 在配置类中加入 knife4j 相关配置。
  3. 设置静态资源映射(访问接口文档的地址),否则接口文档页面无法访问。

常用注解:

注解说明
@Api用在类上,例如Controller,表示对类的说明
@ApiModel用在类上,例如entity、DTO、VO
@ApiModelProperty用在属性上,描述属性信息
@ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用

2.3 Redis:

Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件

官网:https://redis.io
中文网:https://www.redis.net.cn/

服务启动命令:

redis-server.exe redis.windows.conf

Redis 数据类型

Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型,value 有 5 种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

解释说明:

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

使用 Spring Data Redis 来操作 Redis:

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

网址:Spring Data Redis 官网

使用方法:

  1. 导入Spring Data Redis 的 maven 坐标。
  2. 配置 Redis 数据源。
  3. 编写配置类,创建 RedisTemplate 对象(通过方法注解创建)。
  4. 通过 RedisTemplate 对象操作 Redis。

2.4 HttpClient(发送 http 请求):

本项目中的应用: 先微信提供的接口发送请求。

HttpClient 作用:

  • 发送HTTP请求。
  • 接收响应数据。

通过使用 HttpClient,我们就可以在 Java 程序中发送 Http 请求,访问别的服务器。

HttpClient应用场景:

当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时

image-20241025195820898

使用方式:

  1. 导入对应的 maven 坐标。
  2. 创建 HttpClient 对象。
  3. 创建 Http 请求对象。
  4. 调用 HttpClient 的 execute 方法发送请求。

2.5 微信小程序开发:

官方网址: https://mp.weixin.qq.com/cgi-bin/wx?token=&lang=zh_CN

注册地址: https://mp.weixin.qq.com/wxopen/waregister?action=step1

微信登录流程图:

image-20241025195837892

2.6 Spring Cache(缓存):

本项目中的应用: 作用在查询操作频繁且数据变动不大的场景,可以有效的减轻数据库的压力,并提升查询速度。这个和 RedisTemplate 的作用有点类似,不过维度不太一样。

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine
  • Redis(常用)

使用它,首先需要导入依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>  		            		       	 <version>2.7.3</version> 
</dependency>

常用注解:

注解说明
@EnableCaching开启缓存注解功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

2.7 微信支付:

本项目中的应用: 由于我们不是企业,所以没有申请证书的资格,也就使用不了微信支付,所以在项目中,采用跳过支付流程。点击下单,我们就直接认为支付完成。

官网:微信支付官网

image-20241026161757245

2.8 Spring Task(定时任务):

本项目中的应用:订单状态定时处理。

Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

应用场景:

image-20241025202006844

cron 表达式在线生成器:https://cron.qqe2.com/

2.9 WebSocket(双向数据传输):

本项目中的应用: 用来实现来单提醒和客户催单。

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

使用方式:

  1. 导入 WebSocket 的 maven 坐标。
  2. 创建 WebSocket 服务端组件,用于和客户端通信。
  3. 注册 WebSocket 的服务端组件。

2.10 Apache ECharts(图表):

本项目中的应用: 用来实现数据的可视化图。

Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
官网地址:https://echarts.apache.org/zh/index.html

常见效果展示:

image-20241025211933102

2.11 Apache POI(操作 excel):

Apache POI 是一个处理 Miscrosoft Office 各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对 Miscrosoft Office 各种文件进行读写操作。

一般情况下,POI 都是用于操作 Excel 文件。使用前需要导入对应的 maven 坐标。

三、优化点

  1. 在第二页点击查询,那么会把条件和页数一起带给后端,这样显然不是我们想要的,正常的逻辑是,点击查询默认页数从 1 开始,像百度,chrome 之类的都是这么做的。

image-20241026161427807

  1. 修改登入页面的背景图片,显得自然点。

image-20241025213430145

四、总结

序号数据表名中文名称
1employee员工表
2category分类表
3dish菜品表
4dish_flavor菜品口味表
5setmeal套餐表
6setmeal_dish套餐菜品关系表
7user用户表
8address_book地址表
9shopping_cart购物车表
10orders订单表
11order_detail订单明细表

通过观察上面的数据库表的设计不难发现,即使有的表可以合并起来,但是还是能区分就区分(类似菜品表和菜品口味表),这样的设计体现了分表操作,有效的减低表的复杂程度,便于维护。

通过本次项目的实践,我最直观的感受就是项目大体架构和数据库表的设计是最困难的,一开始不一定能想出正确的,需要通过后续的不断调整才能实现一个合适的。

学习方式对我来说也有很大的改变,之前是学好知识点再做,现在是边做边学。有时候会先用,用完后再学习原理。查找资源和阅读文档的能力是非常重要的。

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话,还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

在这里插入图片描述

;