2023年秋张栋老师软件工程第一次作业

目录

智慧食堂点餐服务系统分析设计报告

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 功能需求

  1. 用户账户管理:用户注册、登录、登出。
  2. 点餐系统:菜品浏览、点餐、调整份数、实时价格计算、订单生成和取消。
  3. 支付结算:账户余额显示、在线支付、订单结算、充值功能。
  4. 后台管理:菜品管理、订单管理、用户管理、数据分析报告。

3.2 非功能需求

  1. 性能要求: 系统响应时间在2秒内,支持1000并发用户操作。
  2. 可用性: 系统年均正常运行时间率应达到99%。
  3. 安全性: 系统应保障用户信息和交易数据的安全,采用HTTPS加密通讯。

3.3 限制条件

  • 系统开发采用Python语言和Flask框架。
  • 数据库使用MySQL。
  • 系统应在Windows和Linux平台上均能运行。

4. 用例模型

4.1 用例图

在这里插入图片描述

4.2 用例描述

用例描述

用户注册

主要参与者: 新用户
目标: 在系统中创建一个新的用户账户。
前提条件: 用户未注册且访问注册页面。
触发条件: 用户在注册页面提交注册信息。
基本流程:

  1. 用户进入注册页面。
  2. 用户输入用户名、邮箱、密码等注册信息。
  3. 系统对输入信息进行验证,确保无误且未被占用。
  4. 系统创建新的账户,并自动发送验证邮件到用户邮箱。
  5. 用户通过邮件中的链接完成邮箱验证。
  6. 系统提示注册成功,并引导用户登录。
    异常流程:
  • 如果用户输入的信息不完整或格式错误,系统提示并要求用户重新输入。
  • 如果用户名或邮箱已被占用,系统提示用户更换后重试。
    后置条件: 用户账户成功创建,并处于未登录状态。
用户登录

主要参与者: 注册用户
目标: 用户成功登录系统。
前提条件: 用户已经注册。
触发条件: 用户提交登录表单。
基本流程:

  1. 用户输入用户名和密码。
  2. 系统验证用户名和密码。
  3. 系统确认凭证无误,允许用户登录。
  4. 用户被重定向到首页或上一次浏览的页面。
    异常流程:
  • 如果用户名不存在或密码错误,系统显示错误信息。
  • 如果用户忘记密码,系统提供“忘记密码”选项,引导用户重置密码。
    后置条件: 用户登录成功,系统记录用户状态为已登录。
用户点餐

主要参与者: 注册用户
目标: 用户完成在线点餐。
前提条件: 用户已经登录。
触发条件: 用户在菜单页面选择菜品。
基本流程:

  1. 用户浏览菜单,并选择感兴趣的菜品。
  2. 用户选择菜品数量并添加到购物车。
  3. 用户查看购物车,可以修改菜品数量或移除菜品。
  4. 用户提交订单。
  5. 系统确认订单,并提示用户等待配餐。
    异常流程:
  • 如果用户尝试添加不存在的菜品,系统提示错误并要求用户重新选择。
  • 如果用户未完成订单便离开,系统可保存当前的购物车状态以便下次继续。
    后置条件: 用户的订单已提交,系统更新菜品库存状态。
用户结账

主要参与者: 注册用户
目标: 用户完成订单支付。
前提条件: 用户已经点餐并提交订单。
触发条件: 用户点击“结账”按钮。
基本流程:

  1. 用户选择支付方式(如在线支付或到店支付)。
  2. 如果选择在线支付,用户完成支付信息输入并确认支付。
  3. 系统处理支付请求,并返回支付结果。
  4. 如果支付成功,系统显示支付成功信息,并提供订单详情。
    异常流程:
  • 如果支付失败,例如因为信用卡信息错误或余额不足,系统提示用户支付失败并提供重试选项。
    后置条件: 支付完成,订单状态更新为“已支付”,用户可以准备取餐或等待送餐。
配餐员管理订单

主要参与者: 食堂配餐员
目标: 配餐员高效管理和配送订单。
前提条件: 用户已提交订单并且订单已支付。
触发条件: 配餐员在后台管理系统中接收到新的订单。
基本流程:

  1. 配餐员登录到后台管理系统。
  2. 系统显示待处理的订单列表。
  3. 配餐员选择一个订单并查看详细的菜品信息。
  4. 配餐员根据订单信息开始准备菜品,并更新订单状态为“正在准备”。
  5. 菜品准备完毕后,配餐员将订单状态更新为“配餐完成”并通知用户取餐或开始配送。
    异常流程:
  • 如果所选订单的菜品缺货或有特殊要求,配餐员需要与用户联系协调解决方案。
    后置条件: 订单被处理,用户收到取餐或配送通知,系统记录订单完成情况。

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 表字段描述

字段名数据类型描述
UserIDINT AUTO_INCREMENT用户ID,自增主键
NameVARCHAR(255)用户姓名
BalanceDECIMAL(10,2)用户余额
ContactVARCHAR(255)用户联系方式
RegistrationTimeDATETIME用户注册时间
StatusVARCHAR(50)用户状态
PasswordVARCHAR(255)用户密码

diningstatistics 表字段描述

字段名数据类型描述
DiningStatisticsIDINT AUTO_INCREMENT餐饮统计ID,自增主键
TimeSlotDATETIME时间段
NumberOfDinersINT用餐人数,默认为0

dishcategory 表字段描述

字段名数据类型描述
CategoryIDINT AUTO_INCREMENT菜品分类ID,自增主键
NameVARCHAR(255)分类名称

staff 表字段描述

字段名数据类型描述
StaffIDINT AUTO_INCREMENT员工ID,自增主键
NameVARCHAR(255)员工姓名
PositionVARCHAR(255)员工职位
OrdersHandledINT处理订单数量,默认为0
TotalIncomeDECIMAL(10,2)总收入,默认为0.00
PasswordVARCHAR(255)员工密码

table 表字段描述

字段名数据类型描述
TableIDINT AUTO_INCREMENT餐桌ID,自增主键
QRCodeTEXT餐桌二维码
CapacityINT餐桌容量

customertable 表字段描述

字段名数据类型描述
UserIDINT用户ID,外键关联customer表,与TableID共同作为复合主键
TableIDINT餐桌ID,外键关联table表,与UserID共同作为复合主键
ArrivalTimeDATETIME到达时间
DepartureTimeDATETIME离开时间

dish 表字段描述

字段名数据类型描述
DishIDINT AUTO_INCREMENT菜品ID,自增主键
NameVARCHAR(255)菜品名称
DescriptionTEXT菜品描述
PriceDECIMAL(10,2)菜品价格
CategoryIDINT菜品分类ID,外键关联dishcategory表

order 表字段描述

字段名数据类型描述
OrderIDINT AUTO_INCREMENT订单ID,自增主键
CustomerIDINT用户ID,外键关联customer表
TotalPriceDECIMAL(10,2)订单总价
StatusVARCHAR(50)订单状态
TableIDINT餐桌ID,外键关联table表
OrderTimeDATETIME下单时间
StartTimeDATETIME开始时间
EndTimeDATETIME结束时间

orderitem 表字段描述

字段名数据类型描述
OrderIDINT订单ID,外键关联order表,与DishID共同作为复合主键
DishIDINT菜品ID,外键关联dish表,与OrderID共同作为复合主键
QuantityINT数量
StatusVARCHAR(50)订单项状态,默认为’Pending’
StartTimeDATETIME开始时间
EndTimeDATETIME结束时间

paymentrecord 表字段描述

字段名数据类型描述
RecordIDINT AUTO_INCREMENT支付记录ID,自增主键
OrderIDINT订单ID,外键关联order表
AmountDECIMAL(10,2)支付金额
PaymentTimeDATETIME支付时间
PaymentMethodVARCHAR(50)支付方式

seat 表字段描述

字段名数据类型描述
SeatIDINT AUTO_INCREMENT座位ID,自增主键
TableIDINT餐桌ID,外键关联table表
QRCodeTEXT座位二维码
IsOccupiedTINYINT(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表中。
  • 查看订单: 顾客可以查看自己的所有订单详情,包括订单项和总价等,这些信息从OrderOrderItem表中获取并显示给用户。
  • 支付订单: 顾客可以对选定的订单进行支付操作,支付成功后,订单状态更新为“已支付”,并在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开发中的作用,特别是单元测试和集成测试在确保代码质量中的重要性,并通过编写和执行测试用例确保了我们代码的健壮性

  • 综上所述,这次课设项目对我来说不仅仅是一次编码与设计实践,更是一个提升技术和积累面向对象分析与设计知识的过程。我对自己在项目中所取得的进步感到自豪,并期待将这些经验运用到未来的工作中(希望是游戏和动漫方面的)。随着课设项目结束,我期待着持续学习和成长,同时对能够在完成这样的项目学习知识涨经验感到感激。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值