# 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(前提:本次请求处于同一个线程) ![img.png](assets/img.png) - 新增分类 - 分类信息分页查询 - 删除分类 > 需检测依赖关系,如:菜品和分类是否管理、套餐和分类是否管理 > > 创建自定义业务异常,以及在全局异常处理中,编写对应的异常处理器 - 修改分类 ## 第四部分 - 文件上传下载(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函数中 ![img.png](assets/img4.png) ```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 ![img.png](assets/img2.png) ``` amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); ``` ![img.png](assets/img3.png) - 订单列表 【完成】 - 后台订单明细 【完成】 - 订单修改 【完成】 - 再来一单 【完成】 > 存在bug:加入菜品或者套餐被删除、下架,客户端却可以再来一单 > > 修复思路:再来一单前,需要判断此商品是否已经下架或删除了【未完成】 - 支付 后面有空的话,采用支付宝沙箱模拟支付 【未完成】 ## 第七部分 1. 短信缓存 2. 菜品缓存 - 查询菜品缓存 - 清除菜品缓存 - 后台新增菜品 - 后台修改菜品 - 后台删除菜品【完成】 - 停售起售【完成】 3. 套餐缓存(采用Spring Cache注解式开发) - 查询套餐缓存 - 清除套餐缓存 - 后台新增套餐 - 后台修改套餐【完成】 - 后台删除套餐 - 停售起售【完成】 4. 加入sharding jdbc实现读写分离 补充1:解决克隆虚拟机“后遗症” ![](assets/image-20230412215824079.png) 参考:[Slave_IO_Running: NO](https://blog.csdn.net/weixin_40816738/article/details/100054450?spm=1001.2014.3001.5506) 因为主库和从库数据不同步,所以我把之前测试同步的数据库给删了,然后......就没法同步了... ![](assets/image-20230412220058790.png) 参考:[Slave_SQL_Running: No](https://www.cnblogs.com/q1359720840/p/15839116.html) 补充2:通信链路故障 ![](assets/image-20230413205907861.png) 解决:[MySQL连接异常Communications link failure](https://www.cnblogs.com/huanshilang/p/14767399.html)