# take_out
**Repository Path**: qmcx-ming/reggie_take_out
## Basic Information
- **Project Name**: take_out
- **Description**: 外卖项目
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-04-10
- **Last Updated**: 2023-11-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 瑞吉外卖记录
> 说明:
> - master分支采用了读写分离,使用 未读写分离的项目,请切换到v1.0分支
> `git checkout v1.0`
> - 图片资源在master分支的public下,自行解压到对应的目录
> 未记录视频上的一些步骤,如:产品原型什么的
## 第一部分
- 数据库搭建
> 小黑框导入 和 图形化导入
- maven工程搭建
> 导入对应的springboot依赖和其他jar依赖、以及yml配置、
- 登录和退出
## 第二部分
- 登录过滤
> 使用过滤器 Filter 及 启动类类添加注解 `@ServletComponentScan`
>
> `AntPathMatcher` Spring提供的路径匹配器
- 新增员工
> 全局异常处理器 → 解决员工用户名唯一
- 分页及条件查询
> MyBatisPlus分页插件
- 修改员工信息(含员工状态禁用启用)
## 第三部分
- 公共自动字段填充及优化
元数据对象处理器
> 在插入、更新数据时,统一处理一些表中的的某些字段,如:update_time、create_time...
>
> 在实体类的需要填充的属性上,需要加入@TableField注解,指定自动填充的策略
>
> 动态获取用户id 使用ThreadLocal(前提:本次请求处于同一个线程)

- 新增分类
- 分类信息分页查询
- 删除分类
> 需检测依赖关系,如:菜品和分类是否管理、套餐和分类是否管理
>
> 创建自定义业务异常,以及在全局异常处理中,编写对应的异常处理器
- 修改分类
## 第四部分
- 文件上传下载(IO)
> 上传(本地计算机到服务器) → MultipartFile
>
> 下载(两种:① 将文件保存到本地 ② 直接在浏览器打开,即服务端将文件以流的形式展示到浏览器上)
>
> 我们所用的是第二种,步骤:→ 1.读取文件-输入流 2.响应-输出流
- 新增菜品
- 菜单分类显示(根据分类类型获取分类数据)
- 涉及两张表 dish、dish_flavor
- 设置多张表需要加上事务控制
DTO:数据传输对象(Data Transfer Object)
- 分页查询
BeanUtils.copyProperties(原对象,目标对象,忽略属性拷贝)
- 菜品修改
- 数据回显
- 修改菜品
- 停售起售 【完成】
- 批量删除 【完成】
- 单个删除 【完成】
> 删除思路,可采用软删,即is_deleted = 1,代表已删除
>
> 为了解决名称唯一问题,更改菜品名称,在原菜品名称的基础上增减UUID
- 批量起售 【完成】
- 批量停售 【完成】
## 第五部分
- 新增套餐
- 获取分类列表(之前写过)
- 根据分类获取菜品
- 保存菜品信息(涉及两张表)
- 分页查询
- 删除套餐
- 短信发送
> 具体流程知道即可
- 手机验证码登录
- 起售停售(仿造 前面所写的菜品停售起售即可 `cv`大法) 【完成】
- 套餐编辑 【完成】
- 根据套餐id获取套餐信息(回显) 【完成】
## 第六部分
- 前台登录过滤
> 但是有bug,用户登录的情况下,竟然也可以访问后台
> 还有就是,后台用户登录,前台用户会被挤掉 `ThreadLocal` 的值会变成后台用户的id
> 【未完成】
- 地址簿功能
- 新增地址
- 获取用户所有地址信息
- 设置默认地址
- 根据地址id获取地址信息(回显) 【完成】
- 获取默认地址
- 地址信息修改 【完成】
- 回显后标签选中问题 【完成】
在 address-edit.html 中,initData函数中

```html
// 标签选中
this.form.label === '公司' ? this.activeIndex = 1 : 0;
this.form.label === '家' ? this.activeIndex = 2 : 0;
this.form.label === '学校' ? this.activeIndex = 3 : 0;
```
- 删除地址 完成
- 菜品展示
- 根据分类id查询对应的起售菜品信息
- 根据分类id查询对应的起售套餐信息
- 购物车
- 添加购物车
- 当前菜品或者套餐是否在购物车中
- 是,增加数量
- 否,新增
- 查询购物车
- 清空购物车
- 减少选中的商品数量 【完成】
- 订单
- 下单
- 查询购物车
- 查询用户
- 查询地址
- 插入订单信息
- 批量插入订单详细
AtomicInteger

```
amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
```

- 订单列表 【完成】
- 后台订单明细 【完成】
- 订单修改 【完成】
- 再来一单 【完成】
> 存在bug:加入菜品或者套餐被删除、下架,客户端却可以再来一单
>
> 修复思路:再来一单前,需要判断此商品是否已经下架或删除了【未完成】
- 支付 后面有空的话,采用支付宝沙箱模拟支付 【未完成】
## 第七部分
1. 短信缓存
2. 菜品缓存
- 查询菜品缓存
- 清除菜品缓存
- 后台新增菜品
- 后台修改菜品
- 后台删除菜品【完成】
- 停售起售【完成】
3. 套餐缓存(采用Spring Cache注解式开发)
- 查询套餐缓存
- 清除套餐缓存
- 后台新增套餐
- 后台修改套餐【完成】
- 后台删除套餐
- 停售起售【完成】
4. 加入sharding jdbc实现读写分离
补充1:解决克隆虚拟机“后遗症”

参考:[Slave_IO_Running: NO](https://blog.csdn.net/weixin_40816738/article/details/100054450?spm=1001.2014.3001.5506)
因为主库和从库数据不同步,所以我把之前测试同步的数据库给删了,然后......就没法同步了...

参考:[Slave_SQL_Running: No](https://www.cnblogs.com/q1359720840/p/15839116.html)
补充2:通信链路故障

解决:[MySQL连接异常Communications link failure](https://www.cnblogs.com/huanshilang/p/14767399.html)