项目介绍:开发一个微信小程序,可以在上面实现对外卖的购买。在这上面,我们可以添加我们想要购买的菜品,加入购物车,选择地址,支付。后端会收到订单提示,对订单进行处理。
1.先说后端
后端功能有数据统计,可以查看近七日(或者几日)收入数据,关于订单的售卖清空,新增的用户多少,那个菜品畅销。员工,菜品,套餐,分类的各种操作
2.员工管理
即可以登录后端的人员的管理。主要操作如下
按照视频的流程,员工管理分为新增,分页查询,账号的启用禁用和修改员工信息
(2.1)员工的新增
主要两个问题,比如用户名一样了,要抛异常,在全局异常处理器处理。新增员工要insert创建人的ID,创建员工的人的ID要通过ThreadLocal解决--在请求每次经过拦截时设置登录用户ID即可。
(2.2)员工的分页查询
没特别的
(2.2)员工的账号启用
用的是修改的方法,可以和员工修改用同一个update,Mapper层的update方法的接受参数是一个员工类,所以在service实现时要new一个对象,放入想要修改的参数即可
3.分类管理
然后来说,说到分类就要联系到咱们的菜品和套餐了。菜品嘛好说的,就比如红烧鱼,清蒸大虾这就是一个菜品,单独的一个菜品。但菜品也有分类,比如红烧鱼,就算鱼类,清蒸大虾算虾类。套餐是几个菜品组合到一起的,套餐也有分类,比如这个叫人气套餐A,人气套餐B这样。套餐管理如下:

分类的查询修改添加没别的,主要注意一下删除分类。分类不能随便删除,先查一下这个分类有没有关联菜品,有没有关联套餐,没得话可以删
4.菜品管理
说一下新增菜品吧,新增菜品的同时还需要在口味表同时insert。需要注意的是,新增口味需要一个属性叫dish_id,以便辨认这个口味是那个菜品的,但是菜品刚刚添加,需要在Mapper的方法添加:useGeneratedKeys="true" keyProperty="id",来获得刚添加菜品的id。
菜品的删除,要考虑菜品是不是起售中,有没有关联套餐,都成立了删除菜品的同时还要删除菜品的口味
菜品的修改,每次修改菜品也需要修改菜品口味。为了方便,直接删除所有口味,然后添加新口味。
5.套餐管理
新增套餐也要新增菜品,分页查询没什么,删除套餐看看起售否?删除传来一个1,2,3这样的形式,controller接受时这样:(@RequestParam List ids)然后套餐和关联的菜品都要删除。
6.订单管理


订单搜索
可以看看涉及到String类型获取。
接单
直接update
拒单
订单存在且状态为待接单再update,退钱
派送订单
订单存在且状态为已接单再update
取消订单
如果付款就退钱update
完成订单
订单存在且是派送中
(后台)数据统计

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


关于登录时JWT令牌拦截器处理流程
传递账号和密码,根据账号查找对象,存在的话对比密码。登录成功在controller生成JWT令牌,需要传递密钥,时间,和传递的登录员工ID。Jwt令牌要放入的信息,设置签名使用的签名算法和签名使用的密钥,和过期时间
拦截器实现HandlerInterceptor接口的preHandle方法,先判断当前拦截到的是Controller的方法还是其他资源,从请求头获取令牌,然后校验。
全局配置类继承WebMvcConfigurationSupport,然后注册自定义拦截器。
关于分模块开发,模块的继承聚合版本的控制
分模块开发
比如pojo分出去,until分出去单独成立一个模块,别的模块要用这些模块只需要在pom.xml里导入模块的坐标即可。如项目sky-server的pom.xml导入sky-common和sky-pojo的坐标。

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

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

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

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


关于Websocket
双向通信,常用于实时聊天
关于AOP和枚举类型的使用
自定义注解要加注解,配合枚举类型来做判断。
来了解一下概念
切入点Pointcut
被我们拦截的方法
通知
拦截到方法之后,增强的内容
切面
切入点和通知的结合,我们要对那个方法做什么增强操作。
通知类型
After,Before,Around(意思是拦截到方法的前、后,或者在方法前后来做增强)
关于git







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

负载均衡
反向代理
项目的部署
1.前端项目上传到html/
2.配置nginx.conf文件,反向代理,防火墙的关闭
关于公共字段填充
了解一下自动装配
关于swagger
关于全局异常处理
类上面加@RestControllerAdivce表示这是全局异常处理,方法上的@ExceptionHandler()括号里面表示,捕获的那种异常。
来了解一下异常的流程,Controller--service--mapper,异常从底层向上抛,到Controller后,有异常就交给全局异常处理,响应异常信息。没全局异常处理的话Controller把异常抛给spring框架,会返回一个JSON格式的信息,但不一定是我们想要的。
关于Bean类
比方阿里云上传文件
config包下封装了AliOssUtil的Bean对象,AliOssProperties读取yml的配置信息存在@Component,utils包下写方法。
主从复制和读写分离

主库配置
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下面各个配置的意义啊)

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









