一、系统简介
苍穹外卖系统是为餐饮企业定制的数字化解决方案,包含管理端后台和用户端小程序两部分。管理端面向餐饮企业员工,支持菜品、套餐、订单等核心业务的数字化管理;用户端面向消费者,提供在线点餐、支付、订单跟踪等功能。系统旨在通过前后端分离架构与主流技术栈,实现餐饮业务的高效运营与用户体验升级。
二、功能简介
2.1 管理端功能
- 员工管理:支持员工账号的创建、编辑、禁用及权限分配,保障系统操作安全。
- 分类管理:维护菜品分类与套餐分类,支持分类的新增、修改、删除及状态切换。
- 菜品 / 套餐管理:对菜品和套餐进行全生命周期管理,包括信息录入、图片上传、价格调整、启售 / 停售控制等。
- 订单管理:处理用户订单(查询、取消、派送、完成),支持订单报表下载与数据分析。
- 数据统计:提供营业额、用户增长、订单趋势等多维度数据报表,辅助经营决策。
- 来单提醒:通过 WebSocket 实现新订单语音播报,提升接单效率。
2.2 用户端功能
- 微信登录:通过微信授权快速登录,简化用户操作流程。
- 菜品浏览:按分类展示菜品及套餐,支持规格查询、收藏与加入购物车。
- 购物车管理:实现菜品添加、数量调整、删除及一键清空,支持多规格组合下单。
- 订单支付:集成在线支付功能,支持订单结算、支付状态查询及退款申请。
- 个人中心:管理收货地址、查看历史订单、修改个人信息及账号安全设置。
三、技术栈与系统结构
3.1 技术栈
技术分类 | 技术名称 | 版本 / 说明 |
---|---|---|
前端框架 | Vue.js + ElementUI | 管理端采用 Vue.js 构建单页应用,ElementUI 提供组件库,实现响应式布局与交互逻辑。 |
小程序开发 | 微信小程序 | 用户端基于微信原生框架开发,支持跨平台部署与社交分享功能。 |
后端框架 | Spring Boot | 2.7.x,快速构建后端服务,集成 Spring MVC、MyBatis 等模块,实现 “约定优于配置”。 |
网关层 | Nginx | 1.20.x,作为反向代理服务器,实现请求转发、负载均衡(轮询策略)及静态资源部署。 |
数据库 | MySQL | 8.0,存储核心业务数据(员工、菜品、订单等 11 张表),支持事务与复杂查询。 |
缓存 | Redis | 6.2,存储高频访问数据(如用户会话、热销菜品),提升系统响应速度。 |
中间件 | Apache HttpClient | 发起 HTTP 请求,实现与第三方服务(如支付接口)的通信。 |
工具链 | Git + Maven + Swagger | Git 用于版本控制,Maven 管理依赖与构建,Swagger(Knife4j)自动生成接口文档并支持在线测试。 |
3.2 系统结构
分层架构设计:
- 用户层:
- 管理端:基于 Vue.js 的 Web 界面,通过 Nginx 部署静态资源。
- 用户端:微信小程序,通过微信开发者工具编译发布。
- 网关层:
- Nginx 监听 80 端口,通过反向代理将前端请求(如
/api/employee/login
)转发至后端服务(http://localhost:8080/admin/employee/login
)。 - 支持负载均衡配置,当后端服务器集群部署时,按轮询策略分配请求。
- Nginx 监听 80 端口,通过反向代理将前端请求(如
- 应用层:
- Controller 层:处理前端请求,调用 Service 层逻辑,返回数据格式(如
Result<EmployeeLoginVO>
)。 - Service 层:实现业务逻辑(如员工登录校验、订单状态更新),调用 Mapper 层操作数据库。
- 工具类:封装 JWT 令牌生成(用于身份验证)、MD5 加密(密码安全处理)、Excel 导出(POI 工具)等通用功能。
- Controller 层:处理前端请求,调用 Service 层逻辑,返回数据格式(如
- 数据层:
- MySQL:存储关系型数据,通过 MyBatis 实现 ORM 映射(如
EmployeeMapper
接口查询员工信息)。 - Redis:存储非关系型数据(如购物车临时数据、缓存菜单列表),通过
spring-data-redis
简化操作。
- MySQL:存储关系型数据,通过 MyBatis 实现 ORM 映射(如
四、数据库 & ER 图
4.1 数据库设计
4.1.1 数据库概述
- 数据库名称:
sky_take_out
- 设计工具:MySQL Workbench
- 核心功能:存储餐饮业务全流程数据,包括员工管理、菜品维护、订单处理、用户信息等。
4.1.2 表结构详情(11 张表)
序号 | 表名 | 中文名 | 核心字段及说明 |
---|---|---|---|
1 | employee |
员工表 | id (主键,自增)、username (唯一用户名,用于登录)、password (MD5 加密密码)、name (姓名)、status (状态:1 - 启用,0 - 禁用) |
2 | category |
分类表 | id (主键)、name (分类名称,如 “热菜”“套餐”)、type (类型:1 - 菜品分类,2 - 套餐分类)、sort (排序优先级) |
3 | dish |
菜品表 | id (主键)、name (菜品名称)、category_id (所属分类 ID,关联category.id )、price (单价,精确到分)、status (状态:1 - 启售,0 - 停售)、image (菜品图片路径) |
4 | dish_flavor |
菜品口味表 | id (主键)、dish_id (关联菜品 ID,dish.id )、name (口味名称,如 “微辣”“多糖”)、value (口味值,用于前端展示) |
5 | setmeal |
套餐表 | id (主键)、name (套餐名称)、category_id (所属分类 ID,关联category.id )、price (套餐总价)、status (状态:1 - 启售,0 - 停售)、image (套餐图片路径) |
6 | setmeal_dish |
套餐菜品关系表 | id (主键)、setmeal_id (套餐 ID,关联setmeal.id )、dish_id (菜品 ID,关联dish.id )、number (菜品数量) |
7 | user |
用户表 | id (主键)、openid (微信用户唯一标识)、name (用户姓名)、phone (手机号)、address (默认收货地址)、create_time (注册时间) |
8 | address_book |
地址表 | id (主键)、user_id (用户 ID,关联user.id )、consignee (收货人)、phone (联系电话)、detail (详细地址)、is_default (是否为默认地址:1 - 是,0 - 否) |
9 | shopping_cart |
购物车表 | id (主键)、user_id (用户 ID,关联user.id )、dish_id (菜品 ID,关联dish.id )、setmeal_id (套餐 ID,关联setmeal.id )、number (数量)、create_time (添加时间) |
10 | orders |
订单表 | id (主键)、user_id (用户 ID,关联user.id )、employee_id (处理订单的员工 ID,关联employee.id )、status (订单状态:1 - 待付款,2 - 待接单,3 - 已接单,4 - 派送中,5 - 已完成,6 - 已取消)、amount (订单总额)、order_time (下单时间)、checkout_time (支付时间) |
11 | order_detail |
订单明细表 | id (主键)、order_id (订单 ID,关联orders.id )、dish_id (菜品 ID,关联dish.id )、setmeal_id (套餐 ID,关联setmeal.id )、name (商品名称,菜品或套餐名)、number (数量)、amount (单品金额) |
4.2 ER 图(实体关系图)
4.2.1 核心实体关系
4.2.2 关系说明
- 员工与订单:
- 一对多(1:M):一个员工可处理多个订单,订单通过
employee_id
关联到处理人。
- 一对多(1:M):一个员工可处理多个订单,订单通过
- 分类与菜品 / 套餐:
- 一对多(1:M):一个分类下可包含多个菜品或套餐,菜品 / 套餐通过
category_id
关联分类。
- 一对多(1:M):一个分类下可包含多个菜品或套餐,菜品 / 套餐通过
- 菜品与口味:
- 一对多(1:M):一个菜品可拥有多种口味(如 “甜度”“辣度”),口味通过
dish_id
关联菜品。
- 一对多(1:M):一个菜品可拥有多种口味(如 “甜度”“辣度”),口味通过
- 套餐与菜品:
- 多对多(M:N):一个套餐由多个菜品组成,一个菜品可属于多个套餐,通过
setmeal_dish
中间表记录数量关系。
- 多对多(M:N):一个套餐由多个菜品组成,一个菜品可属于多个套餐,通过
- 用户与地址 / 购物车 / 订单:
- 一对多(1:M):一个用户可维护多个地址、多个购物车记录及多个订单,通过
user_id
关联。
- 一对多(1:M):一个用户可维护多个地址、多个购物车记录及多个订单,通过
- 订单与订单明细:
- 一对多(1:M):一个订单包含多条明细(每个菜品或套餐为一条记录),通过
order_id
关联。
- 一对多(1:M):一个订单包含多条明细(每个菜品或套餐为一条记录),通过
五、页面功能截图(示例)
略
六、后期系统优化计划
- 性能优化:
- 对高频查询接口(如菜品列表、用户订单)增加 Redis 缓存,降低数据库压力。
- 优化 MySQL 索引(如为
dish.category_id
、orders.user_id
添加索引),提升查询效率。
- 功能扩展:
- 新增库存预警功能:当菜品库存低于阈值时,管理端自动触发提醒(短信 / 站内信)。
- 开发骑手端小程序:支持骑手接单、配送轨迹实时更新,完善订单全流程闭环。
- 安全性增强:
- 引入OAuth2.0替代 JWT,实现更细粒度的权限控制(如按角色分配菜单权限)。
- 定期进行代码审计与安全漏洞扫描,对敏感数据(如用户支付信息)进行加密存储。
- 技术升级:
将后端框架升级至 Spring Boot 3.x,兼容 Java 17,提升系统稳定性与新特性支持。
迁移至容器化部署(Docker + Kubernetes),实现动态扩缩容与自动化运维