外卖项目(我是看这个需要实现的,自己练习用的)
本项目是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括系统管理后台和移动端应用两部分。
其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护。
移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。
1).用户层
本项目中在构建系统管理后台的前端页面,会用到H5、Vue.js、ElementUI等技术。
构建移动端应用时,会使用到微信小程序
这个是给用户端的前台页面 是基于vue和elementUI实现的
这一套是给后台员工使用的界面(照片展示不出来的原因是因为没有拿到他们原始的照片资源所以加载不上去)
3).应用层
SpringBoot: 快速构建Spring项目, 采用 “约定优于配置” 的思想, 简化Spring项目的配置开发。
Spring: 统一管理项目中的各种资源(bean), 在web开发的各层中都会用到。
SpringMVC:SpringMVC是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以无缝集成。
SpringSession: 主要解决在集群环境下的Session共享问题。
lombok:能以简单的注解形式来简化java代码,提高开发人员的开发效率。
Swagger: 可以自动的帮助开发人员生成接口文档,并对接口进行测试。
4).数据层
MySQL: 关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储。
MybatisPlus: 本项目持久层将会使用MybatisPlus来简化开发, 基本的单表增删改查直接调用框架提供的方法即可。
Redis: 基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存(降低数据库访问压力, 提供访问效率), 在性能优化中会使用。
5).工具
git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理。
maven: 项目构建工具。
junit:单元测试工具,开发人员功能实现完毕后,需要通过junit对功能进行单元测试。
功能实现
后台管理端的
模块 描述
登录/退出 内部员工必须登录后,才可以访问系统管理后台
员工管理 管理员可以在系统后台对员工信息进行管理,包含查询、新增、编辑、禁用等功能
分类管理 主要对当前餐厅经营的 菜品分类 或 套餐分类 进行管理维护, 包含查询、新增、修 改、删除等功能
菜品管理 主要维护各个分类下的菜品信息,包含查询、新增、修改、删除、启售、停售等功能
套餐管理 主要维护当前餐厅中的套餐信息,包含查询、新增、修改、删除、启售、停售等功能
订单明细 主要维护用户在移动端下的订单信息,包含查询、取消、派送、完成,以及订单报表下载等功能
用户端的
移动端应用主要提供给消费者使用。主要功能有:
模块 描述
登录/退出 在移动端, 用户也需要登录后使用APP进行点餐
点餐-菜单 在点餐界面需要展示出菜品分类/套餐分类, 并根据当前选择的分类加载其中的菜品信 息, 供用户查询选择
点餐-购物车 用户选中的菜品就会加入用户的购物车, 主要包含 查询购物车、加入购物车、删除 购物车、清空购物车等功能
订单支付 用户选完菜品/套餐后, 可以对购物车菜品进行结算支付, 这时就需要进行订单的支付
个人信息 在个人中心页面中会展示当前用户的基本信息, 用户可以管理收货地址, 也 可以查询历史订单数据
第一部分:环境搭建
数据库
dish表中的字段 表很多就不一样列举了
第二项目搭建
把前端提供的资源拉到resource目录下
通过一个配置类去映射前端静态文件
然后启动就可以访问了
1 后台的登录和退出功能实现逻辑
登录添加一个过滤器或拦截器,判断用户是否已经完成登录,如果没有登录则返回提示信息,跳转到登录页面。
2 员工管理
2.1新增员工
前台提交请求(提交过去的数据是json格式的)
(用requestBody注解来接收前端提交过来的json数据)
dao层 的逻辑实现
2.2员工信息分页查询
(使用到分页功能 要先去开启分页器 就是一个mybatis sql拦截器)
controller层 (接收前端提交过来的数据 page-当前页数,pagesize-页数,name-名字)
dao层的逻辑
2.3 启用、禁用员工账号
(禁用员工的时候 服务器返回给前端的数据给js处理 会丢失long类型的精度 所以要使用一个springmvc的消息转换器来把long类型统一转成string类型)
3 公共字段自动填充
在添加数据时, 将将=createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。(加入threadlocal来解决)
3.1 创建一个类用来得到和存入id值
3.2 用户过滤完 拿到id然后存入threadLocal中给后面的程序使用
3.3 创建一个处理器类(等程序一调用insert 或者update方法时就会自动执行两个中的一个方法)
3.4 去到实体类中写一个注解 需要自动补充的字段(@TableFie5 分类管理 ld(fill=FieldFill.insert)指定自动补充的策列
4 分类管理
4.1 新增分类
4.2 分类信息分页查询
4.3 删除分类
4.4 修改分类
4.5 列表查询
5 菜品管理
5.1 文件上传下载(会涉及到一个图片的上传和下载)
文件上传时,对页面的form表单有如下要求:
表单属性 | 取值 | 说明 |
method | post | 必须选择post方式提交 |
enctype | multipart/form-data | 采用multipart格式上传文件 |
type | file | 使用input的file控件上传 |
会用到两个组件 common-fileupload和commons-io
5.1.1 到application中写磁盘中的路径
5.1.2 然后获取这个值(通过value注解)
5.1.3 上传上来的是springboot自动帮我们写到这个MultipartFile 这个类中的 我们去调里面的一个transferto这个api就可以实现转存了
5.1.4 输出转存到磁盘中的照片
5.2 新增菜品
5.2.1 因为前端传递的对象里面包含了 菜品 菜品下面又对应的多种口味 所有创建一个菜品dto对象来接收它
5.1.2拿到前端提交过来的对象 插入数据库中
5.1.3 因为每个菜品对应下面有多个口味就涉及到另一张表
5.1.4 因为涉及到两个表 需要保持数据的一致性 需要去到接口中加上一个transtion事务注解
这里就会涉及到transtional的失效问题
1 是要看数据库本身的表是设置什么引擎 如果是myisam是不支持事务的 所以要改成innodb
2 trantional用在方法上需要把方法改成public
3 如果a类去调用b类 b类加了事务注解 此时注解无效
4 抛出来的异常被你用catch掉了
5.3 菜品信息分页查询
5.3.1 菜品分页查询也是涉及到两张表
5.4 修改菜品
5.5 删除菜品
为什么用到for循环呢 因为有一个是单独删除和批量删除这样子可以做到一个方法实现两个功能
5.6 菜品停售
这里用到的for循环跟上面一样的逻辑
5.7 列表查询
6 套餐管理
6.1 新增套餐
6.1.1 也是需要用到dto对象 用来接收前端传递过来的json对象
6.1.2 插入数据的逻辑