B站黑马苍穹外卖总结

3,797 阅读8分钟

项目介绍:开发一个微信小程序,可以在上面实现对外卖的购买。在这上面,我们可以添加我们想要购买的菜品,加入购物车,选择地址,支付。后端会收到订单提示,对订单进行处理。

1.先说后端

后端功能有数据统计,可以查看近七日(或者几日)收入数据,关于订单的售卖清空,新增的用户多少,那个菜品畅销。员工,菜品,套餐,分类的各种操作

2.员工管理

即可以登录后端的人员的管理。主要操作如下

image.png 按照视频的流程,员工管理分为新增,分页查询,账号的启用禁用和修改员工信息

(2.1)员工的新增

主要两个问题,比如用户名一样了,要抛异常,在全局异常处理器处理。新增员工要insert创建人的ID,创建员工的人的ID要通过ThreadLocal解决--在请求每次经过拦截时设置登录用户ID即可。

(2.2)员工的分页查询

没特别的

(2.2)员工的账号启用

用的是修改的方法,可以和员工修改用同一个update,Mapper层的update方法的接受参数是一个员工类,所以在service实现时要new一个对象,放入想要修改的参数即可

3.分类管理

然后来说,说到分类就要联系到咱们的菜品和套餐了。菜品嘛好说的,就比如红烧鱼,清蒸大虾这就是一个菜品,单独的一个菜品。但菜品也有分类,比如红烧鱼,就算鱼类,清蒸大虾算虾类。套餐是几个菜品组合到一起的,套餐也有分类,比如这个叫人气套餐A,人气套餐B这样。套餐管理如下:

image.png

分类的查询修改添加没别的,主要注意一下删除分类。分类不能随便删除,先查一下这个分类有没有关联菜品,有没有关联套餐,没得话可以删


4.菜品管理

image.png 说一下新增菜品吧,新增菜品的同时还需要在口味表同时insert。需要注意的是,新增口味需要一个属性叫dish_id,以便辨认这个口味是那个菜品的,但是菜品刚刚添加,需要在Mapper的方法添加:useGeneratedKeys="true" keyProperty="id",来获得刚添加菜品的id。
菜品的删除,要考虑菜品是不是起售中,有没有关联套餐,都成立了删除菜品的同时还要删除菜品的口味
菜品的修改,每次修改菜品也需要修改菜品口味。为了方便,直接删除所有口味,然后添加新口味。

5.套餐管理

image.png 新增套餐也要新增菜品,分页查询没什么,删除套餐看看起售否?删除传来一个1,2,3这样的形式,controller接受时这样:(@RequestParam List ids)然后套餐和关联的菜品都要删除。

6.订单管理

image.png

image.png

订单搜索
可以看看涉及到String类型获取。
接单
直接update
拒单
订单存在且状态为待接单再update,退钱
派送订单
订单存在且状态为已接单再update
取消订单
如果付款就退钱update

完成订单
订单存在且是派送中

(后台)数据统计

image.png

StringUtils.join使用

LocalDateTime beginTime = LocalDateTime.of(localDate, LocalTime.MIN)->年月日转化跟详细的时间

.stream().reduce(Integer::sum).get()使用,和各种变形

SQL语句编写

7.C端购物车

前端传来的数据模型有菜品和套餐id和菜品口味,根据这些数据查找购物车是否有相同的对象,有的话,就让数量加一。不存在就根据菜品或者套餐id查询对应的物品,设置信息,加入一条数据到购物车。
删除购物车某一个商品数量减一,也是先查,数量为1就删除,负则就update。

8.C端地址

设置默认地址,先把所有地址设置为0,在根据id把地址设置为1。别的没什么。

9.C端订单

用户下单
看地址是否为空。购物车是否为空,再考虑插入订单表,订单明细表。(下单操作是没点记支付的前的哪一步操作---也就是点击去支付这个按钮,就调用方法)
订单支付
就是付费了。我们先把购物车清空,然后修改订单的支付状态,支付时间啥的就行。(websocket发语言提示)
取消订单
咱们要先判读订单存在么?订单是不是支付过了(支付过了要退款),然后订单状态,退款理由啥的更新一下update

看一下一些技巧吧

关于redis和缓存Spring-Cache

image.png

image.png

关于登录时JWT令牌拦截器处理流程

传递账号和密码,根据账号查找对象,存在的话对比密码。登录成功在controller生成JWT令牌,需要传递密钥,时间,和传递的登录员工ID。Jwt令牌要放入的信息,设置签名使用的签名算法和签名使用的密钥,和过期时间
拦截器实现HandlerInterceptor接口的preHandle方法,先判断当前拦截到的是Controller的方法还是其他资源,从请求头获取令牌,然后校验。
全局配置类继承WebMvcConfigurationSupport,然后注册自定义拦截器。

关于分模块开发,模块的继承聚合版本的控制

分模块开发
比如pojo分出去,until分出去单独成立一个模块,别的模块要用这些模块只需要在pom.xml里导入模块的坐标即可。如项目sky-server的pom.xml导入sky-common和sky-pojo的坐标。

image.png

模块继承
主要是依赖的传递。在子模块的parent里面加入父模块的< groupId>即可(groupId会继承下来,自己的可以删去),父工程打包方式要设置为pom

image.png

模块版本控制
父工程 < dependencyManagement>来管理,这个标签只代表控制版本号,并不代表引入了这个依赖。为了方便管理版本properties自定义属性

image.png

模块聚合
快速构建项目,比如打包

image.png

关于Spring-task

其中的maven坐标spring-boot-starter里面包含了spring-context

image.png

image.png

关于Websocket

双向通信,常用于实时聊天

关于AOP和枚举类型的使用

自定义注解要加注解,配合枚举类型来做判断。
来了解一下概念

切入点Pointcut

被我们拦截的方法

通知

拦截到方法之后,增强的内容

切面

切入点和通知的结合,我们要对那个方法做什么增强操作。

通知类型

After,Before,Around(意思是拦截到方法的前、后,或者在方法前后来做增强)

关于git

image.png

image.png

image.png

image.png

image.png

image.png

image.png

关于nginx

了解安装,每次目录的作用

image.png

负载均衡

反向代理

项目的部署

1.前端项目上传到html/
2.配置nginx.conf文件,反向代理,防火墙的关闭

关于公共字段填充

了解一下自动装配

关于swagger

关于全局异常处理

类上面加@RestControllerAdivce表示这是全局异常处理,方法上的@ExceptionHandler()括号里面表示,捕获的那种异常。
来了解一下异常的流程,Controller--service--mapper,异常从底层向上抛,到Controller后,有异常就交给全局异常处理,响应异常信息。没全局异常处理的话Controller把异常抛给spring框架,会返回一个JSON格式的信息,但不一定是我们想要的。

关于Bean类

比方阿里云上传文件
config包下封装了AliOssUtil的Bean对象,AliOssProperties读取yml的配置信息存在@Component,utils包下写方法。

主从复制和读写分离

image.png

主库配置

1./etc/my.cnf修改信息,mysql重启一下
2.GRANT REPLICATION SLAVE ON . to 'xiaoming'@'%'identified by 'Root@123456';授权一个用户用于主库从库数据通信
3.show master status;

从库配置

1.同上,不过二进制日志不用管了。(id唯一)重启mysql
2.change master to master_host='',master_user='',master_password='',master_log_file='',master_log_pos=; 然后start slave;
3.show slave status;

主从复制(条件)

增删改调用的是主数据库,这些操作会记录成二进制日志。从数据库,会读取主数据库的日志,然后重做将改变应用到自己的数据库中

读写分离(目的)

目的是实现增删改调用主库,查询调用一个或者多个从库。从而减轻数据库的压力

1.sharding-jdbc(Maven坐标)的导入
2.application.yml的编写(要了解spring下面各个配置的意义啊)

image.png

Docker容器

Linux

当前步骤吖:
1.安装jdk,java-version检测是否安装成功
2.安装Tomcat,8080端口防火墙记得开放,然后启动一下看看是否成功
3.安装mysql,先卸载mariadb,在安装,设置mysql开机自启,3306防火墙要关闭,密码重新设置,Datagrip连接主机IP地址测试要成功
4.安装lrzsz
5.手动部署项目(后台运行不挂断)

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png