智慧食堂点餐服务系统分析设计报告
1. 引言
1.1 编写目的
本报告旨在通过系统的面向对象分析与设计,为开发“智慧食堂点餐服务系统”提供详细的文档支持。报告将阐明系统需求,展示系统设计的UML模型,并描述实现细节和测试策略,以指导和记录软件开发过程。
1.2 项目背景
随着数字化转型的发展,智慧食堂成为提高校园餐饮服务效率的关键。本项目为某大学食堂研发一个智慧点餐系统,旨在优化用餐流程,缓解高峰期拥堵,降低人力成本,提升用餐体验。
1.3 定义
- 智慧食堂: 结合现代信息技术,实现自助点餐、支付、取餐的餐厅自动化服务系统。
- UML: 统一建模语言(Unified Modeling Language),用于软件系统分析与设计的标准化建模语言。
1.4 参考资料
- UML 2.0 规范文档
- 《面向对象分析与设计》, Grady Booch等著
- Python Web 开发文档
2. 项目概述
2.1 项目目标
开发一个完整的模拟智慧食堂点餐服务系统,实现以下目标:
- 允许用户通过在线登录系统获取空闲餐位进行点菜和结账。
- 为食堂工作人员提供高效的配餐管理界面。
- 支持菜品和订单的实时数据分析。
2.2 运作模式
用户通过在线登录食堂APP获取空闲餐位后进行点餐和支付,工作人员根据点餐信息制作菜品并进行配餐。系统实时更新点餐单据,用户据此订单取餐。
2.3 受众
本系统的主要受众为大学生和教职工,以及食堂的工作人员。
3. 需求分析
3.1 功能需求
- 用户账户管理:用户注册、登录、登出。
- 点餐系统:菜品浏览、点餐、调整份数、实时价格计算、订单生成和取消。
- 支付结算:账户余额显示、在线支付、订单结算、充值功能。
- 后台管理:菜品管理、订单管理、用户管理、数据分析报告。
3.2 非功能需求
- 性能要求: 系统响应时间在2秒内,支持1000并发用户操作。
- 可用性: 系统年均正常运行时间率应达到99%。
- 安全性: 系统应保障用户信息和交易数据的安全,采用HTTPS加密通讯。
3.3 限制条件
- 系统开发采用Python语言和Flask框架。
- 数据库使用MySQL。
- 系统应在Windows和Linux平台上均能运行。
4. 用例模型
4.1 用例图
4.2 用例描述
用例描述
用户注册
主要参与者: 新用户
目标: 在系统中创建一个新的用户账户。
前提条件: 用户未注册且访问注册页面。
触发条件: 用户在注册页面提交注册信息。
基本流程:
- 用户进入注册页面。
- 用户输入用户名、邮箱、密码等注册信息。
- 系统对输入信息进行验证,确保无误且未被占用。
- 系统创建新的账户,并自动发送验证邮件到用户邮箱。
- 用户通过邮件中的链接完成邮箱验证。
- 系统提示注册成功,并引导用户登录。
异常流程:
- 如果用户输入的信息不完整或格式错误,系统提示并要求用户重新输入。
- 如果用户名或邮箱已被占用,系统提示用户更换后重试。
后置条件: 用户账户成功创建,并处于未登录状态。
用户登录
主要参与者: 注册用户
目标: 用户成功登录系统。
前提条件: 用户已经注册。
触发条件: 用户提交登录表单。
基本流程:
- 用户输入用户名和密码。
- 系统验证用户名和密码。
- 系统确认凭证无误,允许用户登录。
- 用户被重定向到首页或上一次浏览的页面。
异常流程:
- 如果用户名不存在或密码错误,系统显示错误信息。
- 如果用户忘记密码,系统提供“忘记密码”选项,引导用户重置密码。
后置条件: 用户登录成功,系统记录用户状态为已登录。
用户点餐
主要参与者: 注册用户
目标: 用户完成在线点餐。
前提条件: 用户已经登录。
触发条件: 用户在菜单页面选择菜品。
基本流程:
- 用户浏览菜单,并选择感兴趣的菜品。
- 用户选择菜品数量并添加到购物车。
- 用户查看购物车,可以修改菜品数量或移除菜品。
- 用户提交订单。
- 系统确认订单,并提示用户等待配餐。
异常流程:
- 如果用户尝试添加不存在的菜品,系统提示错误并要求用户重新选择。
- 如果用户未完成订单便离开,系统可保存当前的购物车状态以便下次继续。
后置条件: 用户的订单已提交,系统更新菜品库存状态。
用户结账
主要参与者: 注册用户
目标: 用户完成订单支付。
前提条件: 用户已经点餐并提交订单。
触发条件: 用户点击“结账”按钮。
基本流程:
- 用户选择支付方式(如在线支付或到店支付)。
- 如果选择在线支付,用户完成支付信息输入并确认支付。
- 系统处理支付请求,并返回支付结果。
- 如果支付成功,系统显示支付成功信息,并提供订单详情。
异常流程:
- 如果支付失败,例如因为信用卡信息错误或余额不足,系统提示用户支付失败并提供重试选项。
后置条件: 支付完成,订单状态更新为“已支付”,用户可以准备取餐或等待送餐。
配餐员管理订单
主要参与者: 食堂配餐员
目标: 配餐员高效管理和配送订单。
前提条件: 用户已提交订单并且订单已支付。
触发条件: 配餐员在后台管理系统中接收到新的订单。
基本流程:
- 配餐员登录到后台管理系统。
- 系统显示待处理的订单列表。
- 配餐员选择一个订单并查看详细的菜品信息。
- 配餐员根据订单信息开始准备菜品,并更新订单状态为“正在准备”。
- 菜品准备完毕后,配餐员将订单状态更新为“配餐完成”并通知用户取餐或开始配送。
异常流程:
- 如果所选订单的菜品缺货或有特殊要求,配餐员需要与用户联系协调解决方案。
后置条件: 订单被处理,用户收到取餐或配送通知,系统记录订单完成情况。
4.3 用例场景
场景1: 用户注册
场景2: 用户登录
场景3: 用户点餐
场景4: 用户结账
场景5: 配餐员管理订单
5. 静态模型
5.1 类图
5.2 包图
6. 动态模型
6.1 顺序图(用户点餐流程)
6.2 活动图(用户点餐流程)
6.3 状态图
7. 系统设计
7.1 系统架构
系统采用MVC架构,前后端分离,前端使用HTML、CSS和JavaScript,后端使用Flask框架和MySQL数据库以及python。
7.2 数据库设计
customer 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
UserID | INT AUTO_INCREMENT | 用户ID,自增主键 |
Name | VARCHAR(255) | 用户姓名 |
Balance | DECIMAL(10,2) | 用户余额 |
Contact | VARCHAR(255) | 用户联系方式 |
RegistrationTime | DATETIME | 用户注册时间 |
Status | VARCHAR(50) | 用户状态 |
Password | VARCHAR(255) | 用户密码 |
diningstatistics 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
DiningStatisticsID | INT AUTO_INCREMENT | 餐饮统计ID,自增主键 |
TimeSlot | DATETIME | 时间段 |
NumberOfDiners | INT | 用餐人数,默认为0 |
dishcategory 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
CategoryID | INT AUTO_INCREMENT | 菜品分类ID,自增主键 |
Name | VARCHAR(255) | 分类名称 |
staff 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
StaffID | INT AUTO_INCREMENT | 员工ID,自增主键 |
Name | VARCHAR(255) | 员工姓名 |
Position | VARCHAR(255) | 员工职位 |
OrdersHandled | INT | 处理订单数量,默认为0 |
TotalIncome | DECIMAL(10,2) | 总收入,默认为0.00 |
Password | VARCHAR(255) | 员工密码 |
table 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
TableID | INT AUTO_INCREMENT | 餐桌ID,自增主键 |
QRCode | TEXT | 餐桌二维码 |
Capacity | INT | 餐桌容量 |
customertable 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
UserID | INT | 用户ID,外键关联customer表,与TableID共同作为复合主键 |
TableID | INT | 餐桌ID,外键关联table表,与UserID共同作为复合主键 |
ArrivalTime | DATETIME | 到达时间 |
DepartureTime | DATETIME | 离开时间 |
dish 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
DishID | INT AUTO_INCREMENT | 菜品ID,自增主键 |
Name | VARCHAR(255) | 菜品名称 |
Description | TEXT | 菜品描述 |
Price | DECIMAL(10,2) | 菜品价格 |
CategoryID | INT | 菜品分类ID,外键关联dishcategory表 |
order 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
OrderID | INT AUTO_INCREMENT | 订单ID,自增主键 |
CustomerID | INT | 用户ID,外键关联customer表 |
TotalPrice | DECIMAL(10,2) | 订单总价 |
Status | VARCHAR(50) | 订单状态 |
TableID | INT | 餐桌ID,外键关联table表 |
OrderTime | DATETIME | 下单时间 |
StartTime | DATETIME | 开始时间 |
EndTime | DATETIME | 结束时间 |
orderitem 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
OrderID | INT | 订单ID,外键关联order表,与DishID共同作为复合主键 |
DishID | INT | 菜品ID,外键关联dish表,与OrderID共同作为复合主键 |
Quantity | INT | 数量 |
Status | VARCHAR(50) | 订单项状态,默认为’Pending’ |
StartTime | DATETIME | 开始时间 |
EndTime | DATETIME | 结束时间 |
paymentrecord 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
RecordID | INT AUTO_INCREMENT | 支付记录ID,自增主键 |
OrderID | INT | 订单ID,外键关联order表 |
Amount | DECIMAL(10,2) | 支付金额 |
PaymentTime | DATETIME | 支付时间 |
PaymentMethod | VARCHAR(50) | 支付方式 |
seat 表字段描述
字段名 | 数据类型 | 描述 |
---|---|---|
SeatID | INT AUTO_INCREMENT | 座位ID,自增主键 |
TableID | INT | 餐桌ID,外键关联table表 |
QRCode | TEXT | 座位二维码 |
IsOccupied | TINYINT(1) | 是否被占用,默认为0(否) |
7.3 接口设计
为确保前后端分离,系统定义了RESTful API接口,具体如下:
用户相关接口
- POST
/api/users/register
:注册新用户 - POST
/login
:用户登录 - GET
/logout
:用户登出 - POST
/recharge
:用户余额充值 - GET
/order
:查看用户自身订单
菜单和菜品相关接口
- GET
/api/menu
:获取菜单数据 - GET
/dish-details/<int:dish_id>
:获取菜品详情
订单相关接口
- POST
/place-order
:顾客提交订单 - POST
/cancel-order/<int:order_id>
:取消订单 - DELETE
/delete-order/<int:order_id>
:删除订单 - GET
/order-details/<int:order_id>
:获取订单详情 - POST
/pay-order
:支付订单
工作人员相关接口
- POST
/staff_register
:工作人员注册 - POST
/staff_login
:工作人员登录 - GET
/staff_portal
:工作人员查看所有点餐记录
订单配餐状态更新接口
- POST
/start-order-preparation/<int:order_id>
:处理订单的配餐开始 - POST
/complete-order-preparation/<int:order_id>
:处理订单的配餐完成
统计和报告接口
- POST
/api/dining-statistics/add
:添加用餐统计数据 - DELETE
/api/dining-statistics/delete/<int:order_id>
:删除用餐统计数据 - GET
/api/reports/popular-dishes
:获取最受欢迎的菜品 - GET
/api/reports/dining-statistics
:获取食堂各时间段的用餐人数统计 - GET
/api/reports/average-preparation-time
:获取平均点餐配餐时间 - GET
/api/reports/staff-workload
:获取工作人员的工作量 - GET
/api/reports/total-income
:获取累计收入
其他接口
- GET
/api/orders
:获取所有订单
8. 系统实现
8.1 系统环境配置
我们的智慧食堂点餐服务系统在构建时考虑了多种因素,以保证既能在开发阶段提供快速迭代,也能在生产环境中提供稳定可靠的服务。以下是系统环境配置的详细信息:
- 操作系统: 在Windows上可运行,其他并未测试。
- 编程语言: 使用Python 3.10.6,兼顾了最新的语言特性和稳定的社区支持。
- 后端框架: 选择Flask 3.0.0,因其轻量级且易于扩展,非常适合快速开发和原型设计。
- 前端技术: 使用Bootstrap 4.x构建响应式用户界面,确保用户在不同设备上都有良好体验。
- 数据库: MySQL作为关系型数据库管理系统,使用pymysql作为Python连接库,保证了数据存储的可靠性和高效性。
- 依赖管理: 使用pip作为Python包管理器,便于管理项目依赖。
8.2 功能模块实现
8.2.1 用户认证模块
用户认证模块利用了JWT(JSON Web Tokens)进行用户的身份验证。此模块包含以下功能:
- 注册: 用户可以创建新账户,信息将保存在
Customer
表中。密码通过werkzeug.security
进行哈希处理,保证安全性。 - 登录: 用户登录时,系统验证用户名和密码,通过则发放JWT令牌,用于会话管理和后续请求的身份验证。
- 登出: 登出功能将清除用户的会话信息,使当前JWT令牌失效。
8.2.2 订单管理模块
订单管理模块负责处理与顾客订单相关的所有操作。其主要功能如下:
- 提交订单: 顾客通过选择菜品将订单项提交至系统,系统记录订单信息并将其存储在
Order
表及相关的OrderItem
表中。 - 查看订单: 顾客可以查看自己的所有订单详情,包括订单项和总价等,这些信息从
Order
和OrderItem
表中获取并显示给用户。 - 支付订单: 顾客可以对选定的订单进行支付操作,支付成功后,订单状态更新为“已支付”,并在
PaymentRecord
表中记录支付信息。 - 取消订单: 顾客有权在订单未支付前取消订单,系统将订单状态更新为“已取消”。
- 删除订单: 顾客可以删除已完成或已取消的订单,系统将从数据库中移除相关订单的记录。
- 配餐管理: 工作人员可以开始订单的配餐过程,将订单状态更新为“准备配餐中”,配餐完成后再次更新状态为“配餐完成”。
8.2.3 报表统计模块
报表统计模块用于对餐厅运营数据进行汇总和分析,提供的功能包括:
- 用餐统计: 对不同时间段内的用餐人数进行统计,帮助了解餐厅的客流量。
- 菜品销量报表: 显示各菜品的总销量,以便识别最受欢迎的菜品。
- 平均配餐时间: 计算从开始到完成配餐所需的平均时间,帮助评估厨房运行效率。
- 工作人员工作量: 统计各工作人员处理的订单数量,评估工作量分配是否均衡。
- 累计收入: 显示餐厅至今的总收入情况。
8.2.4 菜单浏览模块
菜单浏览模块允许用户查看餐厅提供的所有菜品,其主要功能如下:
- 查看菜单: 显示所有菜品及其描述、价格和分类,用户可以浏览并选择菜品进行点餐。
- 菜品详情: 用户可以查看每个菜品的详细信息,如简单描述、价格等。
8.2.6 餐桌管理模块
餐桌管理模块管理与顾客餐桌相关的各类信息,其主要功能如下:
- 餐桌分配: 当顾客登录系统时,如果有空余餐桌,系统会自动为顾客分配一张餐桌,并更新餐桌容量。
- 餐桌释放: 顾客登出时,系统释放其使用的餐桌,相应地更新餐桌的容量信息。
8.2.7 余额管理模块
余额管理模块用于处理顾客账户余额的相关操作,其功能如下:
- 余额充值: 顾客可以向自己的账户余额充值,充值后的金额可用于支付订单。
- 查看支付记录: 用户可以查看自己的支付记录,包括支付时间、金额和支付方式等详细信息。
9. 测试分析
9.1 测试策略
为了确保系统的质量,采用了以下测试策略:
- 单元测试: 用于测试系统中的独立模块,例如用户认证、用户点餐,订单处理等各个功能点。
- 集成测试: 测试模块间的接口和整体的工作流程,确保模块之间协同工作无误。
9.2 测试用例与测试结果分析
主界面(包括每类菜品和菜品详情):
9.2.1 用户注册
- 输入: 提供用户名、密码和联系信息等。
- 操作: 用户提交注册表单。
- 预期输出: 用户信息储存于数据库,密码加密处理,返回注册成功消息,跳转至登录界面。
如图所示:
9.2.2 顾客登录
- 输入: 提供用户名和密码。
- 操作: 顾客提交登录表单。
- 预期输出: 系统验证顾客信息,成功则存储会话并跳转至首页并显示欢迎信息,否则显示错误消息。如果顾客有未完成的餐桌分配,则更新到达时间;如果没有分配餐桌并且有空餐桌,分配餐桌并更新餐桌容量。
- 如图:
9.2.3 顾客点餐
- 输入: 登录状态下顾客选择菜品并设置数量。
- 操作: 提交点餐请求。
- 预期输出: 系统生成新的订单记录,更新数据库中相关数据,显示订单详情。
- 如图:
- 在我的订单界面显示,订单状态为“未支付”:
9.2.4 顾客查看订单
- 输入: 登录状态下顾客请求查看自己的订单。
- 操作: 在顾客界面按下查看订单详情按钮。
- 预期输出: 显示订单的详细信息,包括每个菜品的名字、数量、价格和子总额,以及订单的总价格。
- 如图:
9.2.4 顾客取消订单
- 输入: 登录状态下顾客选择要取消的订单。
- 操作: 提交取消订单请求。
- 预期输出: 系统取消订单,更新数据库中相关数据,返回订单取消成功消息。
- 如图:
- 订单状态更新为“已取消”:
9.2.5 顾客删除订单
- 输入: 登录状态下顾客选择要删除的订单。
- 操作: 提交删除订单请求。
- 预期输出: 如果订单状态允许删除,则系统删除订单和相关的订单项记录,返回删除成功消息;如果不允许,显示错误消息。
如图:
9.2.6 顾客支付订单
- 输入: 登录状态下顾客选择要支付的订单。
- 操作: 提交支付请求。
- 预期输出: 系统验证支付信息,成功则更新订单状态为已支付,记录支付信息,否则显示错误消息。
- 如图:
- 余额不足时:
- 余额充足时:
- 订单状态更新为“已支付”:
9.2.7 顾客充值余额
- 输入: 登录状态下顾客输入充值金额。
- 操作: 提交充值请求。
- 预期输出: 系统增加顾客余额,记录充值信息,返回充值成功消息。
- 如图:
9.2.8 顾客查看支付记录
- 输入: 登录状态下用户请求查看其支付记录。
- 操作: 用户在余额充值界面中查看支付记录。
- 预期输出: 系统从数据库中检索用户的支付记录,并在用户界面中展示支付记录的列表,包括记录ID、订单ID、支付金额、支付时间和支付方式等详细信息。
- 如图:
9.2.9 工作人员注册
-
输入: 提供工作人员的姓名、职位和密码。
-
操作: 工作人员提交注册表单。
-
预期输出: 工作人员信息储存于数据库,密码加密处理,返回注册成功消息,跳转至登录界面。
-
如图:
-
9.2.10 工作人员登录
- 输入: 提供工作人员ID和密码。
- 操作: 工作人员提交登录表单。
- 预期输出: 验证工作人员信息,成功则存储会话并跳转至工作人员界面,否则显示错误消息。
- 如图:
-登录成功后可在以下界面查看当前所有未完成的订单信息
9.2.11 工作人员配餐操作
- 输入: 登录状态下工作人员选择一个待配餐订单。
- 操作: 提交开始配餐请求。
- 预期输出: 系统记录配餐开始时间,更新订单状态为“准备配餐中”,“开始配餐”选项替换为“完成配餐”选项,返回配餐操作成功消息。
- 如图:
9.2.12 工作人员完成配餐操作
- 输入: 登录状态下工作人员选择一个正在配餐的订单。
- 操作: 提交配餐完成请求。
- 预期输出: 系统记录配餐完成时间,更新订单状态为“配餐完成”,提示顾客取餐,工作人员操作界面的订单列表相应订单消失,返回配餐完成成功消息。
- 如图:
9.2.13 获取报告数据
-
输入: 工作人员请求查看报告。
-
操作: 选择报告界面。
-
预期输出: 显示各类报告,如最受欢迎的菜品、不同时间段的用餐人数统计、平均配餐时间、工作人员工作量和累计收入。
-
最受欢迎的菜品:
-
不同时间段的用餐人数统计:
-
平均配餐时间:
-
工作人员工作量:
-
累计收入:
9.2.14 顾客登出
- 输入: 登录状态下顾客请求登出。
- 操作: 按下登出按钮。
- 预期输出: 清除顾客的会话信息,释放相关的餐桌资源,返回登出成功消息,并跳转至首页。
- 如图:
- 登出成功弹出提示信息:
10. 总结与展望
-
在参与智慧食堂点餐服务系统的开发过程中,我深入体验了面向对象分析与设计(OOAD)的理论与实践的结合。这一过程中,我不仅仅是在编码,更是在运用和实践了UML(统一建模语言)中的相关图如用例图、类图、顺序图和状态图等多种图形来辅助我的设计。用户认证模块的实现让我具体应用了封装和抽象的原则,通过设计紧凑的类和方法来执行身份验证、会话管理和密码加密。在这里,我深刻理解了封装对于保持系统安全性和维护性的重要性。
-
在构建订单管理模块时,我通过用Python语言类似地创建类和对象来表示顾客,订单、订单项和支付记录等实体,精细地运用了继承和多态的概念。在这里,我学习到了如何设计数据库来存储和处理订单信息,如何在后端有效地处理前端的请求,以及如何将数据返回给客户端进行显示。这是对我的编程技能和逻辑思维的极大锻炼。
-
此外,我还学会了如何将现实世界的业务流程映射到web系统设计中,构建动态模型来模用户点餐、订单处理和支付结算等行为。通过顺序图,活动图还有状态图,我能够清晰地展示各个对象之间的交互,并确保了系统行为的一致性和正确性。
-
在系统的测试阶段,我认识到了自动化测试在web开发中的作用,特别是单元测试和集成测试在确保代码质量中的重要性,并通过编写和执行测试用例确保了我们代码的健壮性
-
综上所述,这次课设项目对我来说不仅仅是一次编码与设计实践,更是一个提升技术和积累面向对象分析与设计知识的过程。我对自己在项目中所取得的进步感到自豪,并期待将这些经验运用到未来的工作中(希望是游戏和动漫方面的)。随着课设项目结束,我期待着持续学习和成长,同时对能够在完成这样的项目学习知识涨经验感到感激。