本文纯粹学习记录,非商业用途。
本文重点记录后端技术总结,采用 Spring Boot + MyBatisPlus 技术完成项目系统的开发。并通过Linux 系统完成项目的部署。
通过外卖系统项目的开发 + 项目部署整个流程,梳理自身所学的相关知识点。完成实践练习。
前端技术采用 Vue + ElementUI + Axios 搭建。
数据库采用 MySql5.7 并实现数据库的读写分离进行数据库的管理。
提示:以下是本篇文章正文内容
实体类采用 Lombok 进行封装。
其他实体类,菜品、套餐等等进行类似的封装。
数据库对应关系表:
由于页面展示需要,菜品需要展示对应绑定的菜品口味表,所以通过拓展实体类进行请求响应数据。
数据层采用 MyBatis-plus 技术实现数据层对数据库的映射。
业务层采用 MyBatis-Plus 实现业务层接口(这里仅展示其中的基础代码,对应其他接口和实现类)
接口代码:
实现类代码:
(这里仅展示其中的基础代码,对应其他表现层)
登录验证采用邮箱验证,随机生成验证码。
用户登录状态验证:通过 HttpSession 跟踪,验证对象是否登录并保存用户的登陆状态。
用户登录验证码通过 redis 进行缓存,登陆后清除。
登录页面展示:
发送邮箱验证码代码:
登录验证代码:
页面展示:
图片展示是管理端通过上传图片保存到对应存储地址,展示时通过访问对应地址显示。
菜品或套餐列表通过请求接口,响应回传数据进行展示。
请求参数有菜品分类ID以及销售状态,用菜品实体类进行接受。
前端菜品请求代码:
购物车页面展示:
购物车列表通过用户ID获取请求Api接口代码:
购物车的新增,通过购物车的新增请求实现对数据库数据的修改。
请求体中获取购物车实体参数,通过判断数据库内是否存在对应菜品或套餐。来实现商品数量的新增。
购物车新增代码:
购物车商品数量的减少或清空与新增类似。
个人主页页面展示:
用户订单和历史订单均为请求订单Api接口。
Api接口代码:
地址管理的请求Api接口类似。
订单支付代码:
由于用户下单,需要同时向数据库的订单表和订单详细表进行操作,故而需要在业务层重写新增操作且需要开启事务管理。
Api接口代码:
员工管理通过新增员工、员工信息以及员工状态修改等对员工数据表进行修改。
分页查询以及条件查询代码:
分类管理则是对所有菜品或套餐的所属分类进行增删改查,而由于分类管理具有绑定的下属管理,所以在删除分类以及修改分类操作时需要对菜品或者套餐进行根据分类 ID 查询。若分类并未被绑定才能进行操作。
删除操作需要进行绑定查询可以在业务层重写对应的删除代码。
代码:
然后再通过表现层调用接口完成删除操作。
分类修改操作类似。
菜品管理页面展示:
其他页面展示均类似。
由于菜品的新增修改和删除会同时对菜品表和口味表进行操作,故重写对应代码并用事务管理。
新增代码:
修改和删除操作类似。
套餐管理与菜品管理类似。
订单管理同上。
读写分离的意义
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
本文采用的是 sharding 技术来实现的数据库读写分离。
这里引用了一下其他大神博主的文章。
转载:如何实现数据库的读写分离
到 MavenRepository 找到并导入 sharding 的依赖包
配制代码:
(在配置里可能会出现无法识别的属性,选择无视就好。)
在这里启动项目可能会报出 Bean 的冲突错误。
具体原因是由于 Druid 和 ShardingJdbc 都会创建一个数据源连接的 Bean 而导致的 Bean 冲突。
解决办法:
#允许bean定义覆盖(DataSourceBean冲突)
main:
allow-bean-definition-overriding: true
前后端对话格式一致。
回传参数代码:
全局异常,全部统一进行拦截处理。
代码:
其他异常处理可以通过添加对应异常类型进行处理。
代码:
由于用户频繁访问数据库的同一资源,当访问量较大时会造成数据库的效率降低。故而可以通过缓存优化,将访问量较大的某一数据表单进行缓存,当用户访问时返回缓存的结果。
出于学习用途为了较为直观看到 redis 缓存的测试结果,将 redis 默认的序列化器更换为字符串类型便于通过观察。
序列化器配制代码:
对菜品数据进行 redis 缓存:
Git版本控制:
用 swagger 生成 Api 接口文档文档。
测试效果:
这里用的是手动打包上传的方式。
Linux 测试效果:
将项目产生的日志目录输出到 TakeOut.log
(这里需要注意 Linux 上的的 Jre 版本和自己的项目工程所用的版本会不会出现版本冲突)
在整个项目流程中,完整梳理了一边自己所学以及项目所需要的技术框架。在书写代码的过程中同样也遇到了很对不明所以的 Bug 而在不断的查找资料中逐渐得到解决。虽然很折磨人也很掉头发,但是在不断的遇到 Bug 解决 Bug 中的自己所得到的锻炼同样巨大,而最重要的也是自己能够逐渐形成一个完善的意识,即在今后的学习道路上如何进步以及在工作中所遭遇的问题应该如何解决。
而在本文中所遇到的 Bug 就不再赘述了。