苍穹外卖项目总结

苍穹外卖

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

1.功能

1). 管理端功能

员工登录/退出 , 员工信息管理 , 分类管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 订单管理 ,数据统计,来单提醒。

2). 用户端功能

微信登录 , 收件人地址管理 , 用户历史订单查询 , 菜品规格查询 , 购物车功能 , 下单 , 支付、分类及菜品浏览。

2.技术

1). 用户层

本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序。

2). 网关层

Nginx是一个服务器,主要用来作为Http服务器,部署静态资源,访问性能高。在Nginx中还有两个比较重要的作用:反向代理和负载均衡, 在进行项目部署时,要实现Tomcat的负载均衡,就可以通过Nginx来实现。

3). 应用层

SpringBoot:快速构建Spring项目, 采用 "约定优于配置" 的思想, 简化Spring项目的配置开发。

SpringMVC:SpringMVC是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以无缝集成。

Spring Task:  由Spring提供的定时任务框架。

httpclient:  主要实现了对http请求的发送。

Spring Cache:  由Spring提供的数据缓存框架

JWT:  用于对应用程序上的用户进行身份验证的标记。

阿里云OSS:  对象存储服务,在项目中主要存储文件,如图片等。

Swagger: 可以自动的帮助开发人员生成接口文档,并对接口进行测试。

POI:  封装了对Excel表格的常用操作。

WebSocket: 一种通信网络协议,使客户端和服务器之间的数据交换更加简单,用于项目的来单、催单功能实现。

4). 数据层

MySQL:关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储。

Redis:基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存。

Mybatis:本项目持久层将会使用Mybatis开发。

pagehelper: 分页插件。

spring data redis: 简化java代码操作Redis的API。

5). 工具

git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理。

maven: 项目构建工具。

junit:单元测试工具,开发人员功能实现完毕后,需要通过junit对功能进行单元测试。

postman:  接口测工具,模拟用户发起的各类HTTP请求,获取对应的响应结果。

2.1git版本控制

  1. 创建Git本地仓库(IDEA中的VCS-import into Version Control -Create Git Respository -选择文件)
  2. 创建Git远程仓库

访问Gitee - 基于 Git 的代码托管和研发协作平台,新建仓库

3.将本地文件推送到Git远程仓库

Commit and push

4.添加Git远程仓库地址

复制远程地址-右键工程-git-Reponsitory

2.2nginx反向代理和负载均衡

1. nginx反向代理

前端请求与后端请求不一致

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

nginx 反向代理的好处:

  • 提高访问速度

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

  • 进行负载均衡

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

  • 保证后端服务安全

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

proxy_pass:该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式。

如上代码的含义是:监听80端口号, 然后当我们访问 http://localhost:80/api/../..这样的接口的时候,它会通过 location /api/ {} 这样的反向代理到 http://localhost:8080/admin/上来。

2.nginx 负载均衡

负载均衡算法:轮询,加权轮询,随机,最少连接,最快响应时间,源地址hash,依据ip分配方式(这样每个访客可以固定访问一个后端服务)

2.3Swagger(生成接口文档和测试)

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务它的主要作用是:

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

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

  3. 功能测试

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

1.使用步骤

1.导入 knife4j 的maven坐标(在pom.xml中添加依赖)

2.在配置类中加入 knife4j 相关配置(WebMvcConfiguration.java)

3.设置静态资源映射,否则接口文档页面无法访问  WebMvcConfiguration.java

2.常用注解:

2.4Redis

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

主要特点:

  • 基于内存存储,读写性能高

  • 适合存储热点数据(热点商品、资讯、新闻)

  • 企业应用广泛

1.数据类型

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

  • 字符串(string):普通字符串,Redis中最简单的数据类型

  • 哈希(hash):也叫散列,类似于Java中的HashMap结构

  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList

  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet

  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装

2.5HttpClient

HttpClient作用:

  • (在Java程序中)发送HTTP请求

  • (在Java程序中)接收响应数据

HttpClient应用场景:

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

实现步骤:

  1. 创建HttpClient对象

  2. 创建请求对象

  3. 发送请求,接受响应结果

  4. 解析结果

  5. 关闭资源

2.6Spring Task

定位:定时任务框架

作用:定时自动执行某段Java代码

1). 信用卡每月还款提醒 3). 火车票售票系统处理未支付订单

1.cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

举例:

2022年10月12日上午9点整 对应的cron表达式为:0 0 9 12 10 ? 2022

说明:一般的值不同时设置,其中一个设置,另一个用?表示。

cron表达式在线生成器:在线Cron表达式生成器

2.使用步骤

1). 导入maven坐标 spring-context

2). 启动类添加注解 @EnableScheduling 开启任务调度

3). 自定义定时任务类

2.7WebSocket

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

HTTP协议和WebSocket协议对比:

  • HTTP是短连接

  • WebSocket是长连接

  • HTTP通信是单向的,基于请求响应模式

  • WebSocket支持双向通信

  • HTTP和WebSocket底层都是TCP连接

思考:既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?

WebSocket缺点:

服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接,受网络限制比较大,需要处理好重连

结论:WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用

WebSocket应用场景:

1). 视频弹幕  2). 网页聊天  3). 体育实况更新  4). 股票基金报价实时更新

2.8Apache ECharts

Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。

Apache Echarts官方提供的快速入门:快速上手 - 使用手册 - Apache ECharts

用于营业额统计

3.功能

3.1登录

MD5加密

1.修改数据库中明文密码,改为MD5加密后的密文

2.修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对.Serviceimpl中

 password = DigestUtils.md5DigestAsHex(password.getBytes());

3.2新增员工

1.Serviceimpl

2.完善

2.1全局异常处理器

录入的用户名已存,抛出的异常后没有处理

通过全局异常处理器来处理。

2.2JWT

新增员工时,创建人id和修改人id设置为固定值

解决:

通过某种方式动态获取当前登录员工的id。

1.员工登录成功后会生成JWT令牌并响应给前端

2.后续请求中,前端会携带JWT令牌,通过JWT令牌可以解析出当前登录员工id

解析出登录员工id后,如何传递给Service的save方法?

通过ThreadLocal进行传递。

2.3ThreadLocal

介绍:

ThreadLocal 并不是一个Thread,而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

常用方法:

  • public void set(T value) 设置当前线程的线程局部变量的值

  • public T get() 返回当前线程所对应的线程局部变量的值

  • public void remove() 移除当前线程的线程局部变量

3.3分页查询

1.PageHelper

在EmployeeServiceImpl中实现pageQuery方法:

此处使用 mybatis 的分页插件 PageHelper 来简化分页代码的开发。底层基于 mybatis 的拦截器实现。故在pom.xml文中添加依赖(初始工程已添加)

EmployeeMapper.xml

2.日期格式化

完善

1). 方式一

在属性上加上注解,对日期进行格式化

但这种方式,需要在每个时间属性上都要加上该注解,使用较麻烦,不能全局处理。

2). 方式二(推荐 )

在WebMvcConfiguration中扩展SpringMVC的消息转换器,统一对日期类型进行格式处理

3)@DateTimeFormat注解是Spring框架提供的一个注解,用于指定日期和时间的格式。这个注解可以应用于字段、方法参数或方法上

3.4公共字段填充(AOP)

公共字段:创建时间,创建人id,修改~

也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。

实现步骤:

1). 自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法

2). 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值

3). 在 Mapper 的方法上加入 AutoFill 注解

3.5文件上传(阿里云OSS )

文件上传,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。

1). 定义OSS相关配置

application-dev.yml   application.yml

2). 读取OSS配置

3). 生成OSS工具类对象

3.6根据菜品id查询对应的套餐id

3.7来单提醒

设计思路:

  • 通过WebSocket实现管理端页面和服务端保持长连接状态

  • 当客户支付后,调用WebSocket的相关API实现服务端向客户端推送消息

  • 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报

  • 约定服务端发送给客户端浏览器的数据格式为JSON,字段包括:type,orderId,content

    • type 为消息类型,1为来单提醒 2为客户催单

    • orderId 为订单id

    • content 为消息内容

在OrderServiceImpl中注入WebSocketServer对象,修改paySuccess方法,

@Autowired
    private WebSocketServer webSocketServer;
	/**
     * 支付成功,修改订单状态
     *
     * @param outTradeNo
     */
    public void paySuccess(String outTradeNo) {
        // 当前登录用户id
        Long userId = BaseContext.getCurrentId();

        // 根据订单号查询当前用户的订单
        Orders ordersDB = orderMapper.getByNumberAndUserId(outTradeNo, userId);

        // 根据订单id更新订单的状态、支付方式、支付状态、结账时间
        Orders orders = Orders.builder()
                .id(ordersDB.getId())
                .status(Orders.TO_BE_CONFIRMED)
                .payStatus(Orders.PAID)
                .checkoutTime(LocalDateTime.now())
                .build();

        orderMapper.update(orders);
		//
        Map map = new HashMap();
        map.put("type", 1);//消息类型,1表示来单提醒
        map.put("orderId", orders.getId());
        map.put("content", "订单号:" + outTradeNo);

        //通过WebSocket实现来单提醒,向客户端浏览器推送消息
        webSocketServer.sendToAllClient(JSON.toJSONString(map));
        ///
    }

BaseContext 通常是一个用于存储和管理应用上下文信息的类。

使用BaseContext的好处包括:

  • 线程安全:因为它可能使用了ThreadLocal,所以它确保了每个线程都有自己独立的上下文副本,避免了多线程环境下的数据竞争和不一致。
  • 全局访问:在任何地方都可以通过BaseContext访问当前的用户信息或其他上下文数据,使得数据传递更为方便。

使用ThreadLocal来存储上下文信息是线程安全的,因为每个线程都有自己的ThreadLocal变量副本。但是,开发者需要确保在使用完毕后适当地清理这些变量,以避免内存泄漏。

BaseContext 中

催单

3.8销量排名

在Java中,@Builder注解是Lombok库提供的一个功能,它允许你自动生成一个类的构建器(Builder)模式实现。构建器模式是一种设计模式,用于创建对象,特别是当对象有许多可选参数时。使用@Builder注解可以让你更容易地创建对象,而不必编写大量的构造器或者使用set方法。

以下是@Builder注解的主要作用:

  1. 自动生成Builder类:当你在一个类上使用@Builder注解时,Lombok会在编译时自动生成一个内部的静态Builder类,这个类包含了所有类字段的设置方法。

  2. 链式调用:生成的Builder类允许你以链式调用的方式设置字段值,这提高了代码的可读性和简洁性。

  3. 可选参数:Builder模式允许你有多个可选参数,而不必为每个可能的参数组合编写多个构造器。

  4. 不可变对象:使用Builder模式可以更容易地创建不可变对象,因为你只需要在Builder类中生成一个构建方法,该方法返回一个所有字段都被最终设置的对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值