云计算百科
云计算领域专业知识百科平台

springboot家常菜点餐系统12121-计算机课程设计、毕业设计

第一章 绪论

1.1 研究背景与意义

  传统的餐饮点餐方式是依靠纸质菜单和人工记录来实现的,其操作过程十分繁琐,并且信息传递也比较缓慢。随着居民生活水平的提高,家庭用餐场景中对于菜品多样化的关注、营养搭配的考虑以及儿童专属饮食的重视程度也越来越高[1]。家常菜点餐包含用户偏好记载,订单状况追踪,商家菜单更新等诸多方面,传统的管理模式无法应对不断增多的业务繁杂程度。信息化技术的介入给以上问题提供了一种可能的解决途径,创建在线点餐系统可以将菜品展示、订单处理、用户管理等功能整合起来,从而降低由于人工干预所造成的差错率[2]。现实中商家要立即更新菜品信息、处理用户售后问题,顾客希望快速找到菜品、订单等信息,系统管理员负责家庭信息和饮食资源的统筹工作,这体现了一个集多种功能于一身的点餐管理系统[3]。研究意义有诸多,具体如下。系统依靠规范的业务流程设计,把线下分散的操作转移到线上统一的管理当中来,从而提高点餐的速度以及数据的准确性。订单管理及售后模块可以对商家每一个订单进行跟踪,进而降低商家的运营成本。儿童饮食管理、资源管理功能给特殊饮食需求人群提供有针对性的服务,提高系统的实用性。该系统的创建与实现可以给类似的小型餐饮企业赋予可复制的技术方案,推进餐饮行业的数字化转型实践。

1.2 国内外研究现状

  国内关于点餐系统的研究起步比较晚但是发展很快。早期的研究主要是针对酒店场景的单机版点餐软件,功能比较简单。伴随着互联网技术的普及,在线点餐也成了研究的热点。刘德凤对酒店点餐业务进行了系统的构思,设计出一个由预订、点菜、结账等部分组成、用B/S架构进行跨平台访问的系统[4]。史莉娟等人把网络点餐技术应用到食堂管理当中,用数字化手段改善排队和结算的过程,从而提高就餐的效率[5]。叶涛对于航空场景下的点餐系统,在高空环境之下,对网络稳定、交互方便性等各方面进行考虑之后提出离线缓存和断点续传的方案[6]。时庭庭将会员管理机制与酒店会员点餐系统结合起来,实现积分的累积以及消费行为的分析[7]。国内的研究大多集中在某个场景的功能实现上,对于通用性和多角色协同方面还有待提高。本系统在普通用户、商家和管理员这三个角色的基础上增加了儿童饮食和家庭信息管理模块,扩大了点餐系统业务范围。

  国外的点餐系统研究开始得比较早,技术成熟度高。Yan等人用仿真和实验的方法研究了餐厅厨房排水系统的设计参数和沉积物的关系,从基础设施的角度来改善餐饮运营环境[8]。Riazi等人利用动态规划以及智能体模型创建了农产品仓储系统,他们所提出的建模思路给予点餐系统库存管理模块一些参考价值[9]。Shao等人利用Spring Boot框架创建了在线点餐系统,证明了使用Spring Boot可以快速创建餐饮业务应用[10]。Yang用Spring Cloud微服务架构来创建点餐系统,从而达到提高系统弹性以及可扩展性的目的[11]。赵等人的跨平台工业产品订单系统中订单状态机、跨端数据同步机制给点餐系统的订单管理模块提供借鉴[12]。国外对于技术架构以及系统性能的研究比较深入,但是针对家庭场景和儿童饮食管理的专门研究较少。本系统在参考国外先进技术架构的基础上,根据国内家常菜点餐的实际需要做定制化的开发。

1.3 主要研究内容

  本文主要研究家常菜点餐系统的开发和实现,从需求分析到系统部署全部完成。通过对于传统点餐业务流程的梳理来找到普通用户、商家用户以及系统管理员这三个角色之间的功能边界。普通用户关注菜品浏览、下单支付、订单查询和收货地址的管理,商家用户对菜品信息进行维护、处理订单和提供售后服务,系统管理员负责家庭信息审核、儿童饮食内容管理和资源发布。技术上选择Spring Boot搭建RESTful API服务,Vue开发响应式前端页面,MySQL做用户信息、订单记录、菜品数据、儿童饮食内容的存储。前后端分离架构使接口复用、独立部署成为可能。在系统实现的过程中,主要对订单状态流转、售后审核流程以及儿童饮食内容审核流程做了重点的设计,保证业务逻辑的严密性。编码完成后进行功能测试和性能验证,主要测试登录注册、菜品查询、订单创建、售后申请等主要功能。最终交付一个功能齐全、使用方便的家常菜点餐系统。

第二章 相关技术介绍

2.1 Spring Boot框架

  Spring Boot是基于Spring框架创建的,使用自动配置和起步依赖来简化企业级应用的开发。该框架按照约定优先于配置的原则来减少XML配置文件的编写工作量,使开发人员可以集中精力去实现业务逻辑。本系统中,Spring Boot担当起后端服务的主要职责,对前端发出的HTTP请求进行处理,并对订单创建、菜品查询、用户认证等业务操作作出响应。框架内置的Tomcat服务器支持应用独立运行,降低部署复杂度。Spring Boot提供的starters依赖管理机制保证各个组件之间的版本兼容性,防止出现依赖冲突的问题。使用Spring Boot的拦截器来完成用户的身份认证和权限控制,保证接口的安全访问。业务层用Service组件封装具体的逻辑,控制器层负责请求解析和响应返回,形成清晰的分层结构[13]。

2.2 Vue框架

  Vue是一个渐进式的JavaScript框架,主要用来构建用户界面。核心库只关注视图层,用响应式数据绑定和组件化开发模式提高前端开发效率。本系统中Vue负责所有的前端页面的创建,即用户登录注册页、菜品列表展示页、订单管理页以及儿童饮食查询页等。由于具有组件化的特性,所以页面可以被拆分成可以重复使用的独立单元,例如菜品卡片组件、分页组件、表单组件等等,从而减小代码的冗余程度。Vue Router模块用来管理前端路由,在单页应用下实现页面的切换而不刷新整个浏览器。Axios库封装HTTP请求,与Spring Boot后端API进行数据交互。Vue的虚拟DOM机制可以提高页面渲染的速度,使菜品列表滚动加载和订单状态实时更新等场景中保持良好的交互体验[14]。

2.3 MySQL数据库

  MySQL属于关系型数据库管理系统,体积小、速度快、成本低,被普遍使用在Web应用开发当中。此数据库用的是标准的SQL语句来进行查询操作,具备事务处理、索引管理、数据备份等功能。本系统用MySQL来完成所有的业务数据的持久化存储工作。用户账户信息、收货地址、订单记录、菜品信息、儿童饮食内容、家庭信息等数据都存放在MySQL数据库里。数据库设计为第三范式,减小数据重复以及更新异常的发生。就订单查询、菜品搜索这类高频操作创建相应的索引,从而加快检索的速度。事务机制保证订单创建时库存扣减和订单生成是原子性的,不会出现数据不一致的情况[15]。

2.4 前后端分离架构

  前后端分离架构把前端界面和后端服务分成两个分别部署的单元。前端完成界面展示和用户交互,后端给业务逻辑以及数据存取提供API接口。两者使用HTTP协议来完成数据的交互,通信格式一般用JSON。本系统中Vue创建的前端应用运行在浏览器端,Spring Boot创建的后端服务运行在服务器端。前后端开发可以同时进行,前端工程师做页面交互和组件的设计,后端工程师做API的开发以及数据库的操作。分离架构使前端可以更换技术栈而不会影响到后端服务,后端接口也可以被不同的客户端使用。系统部署的时候,前端的静态资源是由Nginx来托管,而后端服务则是独立运行的,两者之间使用跨域配置来完成通信。这样就提高了系统的灵活性和可维护性[16]。

第三章 系统分析

3.1 功能需求分析

3.1.1 普通用户角色功能需求

  普通用户进入系统后可进行登录注册操作,完成身份认证。在菜品信息查询模块,用户按关键词或分类检索菜品并查看详情。收货地址管理支持地址增删改查,便于订单配送。订单管理模块展示用户历史订单,支持查看状态与发起售后。儿童饮食查询按年龄段或标题筛选饮食内容。家庭信息管理允许用户维护家庭成员资料。订单配送查询追踪已发货订单物流状态。普通用户用例图如图3-1所示。

  image 图3-1普通用户用例图

3.1.2 商家用户角色功能需求

  商家用户登录后台管理系统后,可对儿童饮食内容进行管理,包括饮食标题、适用年龄段、食材清单等信息的添加与编辑。菜品信息管理模块支持商家上架新菜品、设置价格库存及下架滞销菜品。订单列表管理展示商家收到的所有订单,支持按状态筛选与查看详情。订单配送管理模块更新订单发货状态并填写物流信息。订单售后管理处理买家发起的退款或退货请求,进行审核与回复。商家用户用例图如图3-2所示。

  image 图3-2商家用户用例图

3.1.3 系统管理员角色功能需求

  系统管理员拥有最高权限,可管理全部业务数据。家庭信息管理模块支持查看、编辑或删除用户提交的家庭信息记录。儿童饮食管理模块对商家发布的饮食内容进行审核,决定是否公开显示。资源管理模块发布平台公告与餐饮资讯,管理文章分类与标签。菜品信息管理模块监管所有商家上架的菜品,处理违规内容。订单列表管理、订单配送管理与订单售后管理模块从平台维度监控订单流转与售后处理进度。系统管理员用例图如图3-3所示。

  image 图3-3系统管理员用例图

3.2 可行性分析

3.2.1 技术可行性

  系统采用Spring Boot、Vue与MySQL作为技术栈,三者均为成熟开源技术,社区活跃且文档丰富。Spring Boot简化Java后端开发流程,Vue提供高效前端交互能力,MySQL保障数据可靠存储。开发环境可使用IntelliJ IDEA与VS Code等常见工具,无需特殊硬件配置。相关技术已在大量Web项目中得到验证,技术风险较低。

3.2.2 操作可行性

  系统界面设计遵循用户日常使用习惯,普通用户通过浏览器即可访问全部功能,无需安装额外软件。商家用户与系统管理员的操作界面采用后台管理风格,菜单布局清晰,功能入口明确。订单处理、菜品管理、儿童饮食发布等核心操作流程简洁,用户经过短暂熟悉即可掌握使用方法。

3.2.3 经济可行性

  系统开发所需软件均为免费或社区版本,Spring Boot、Vue、MySQL及开发工具不产生授权费用。系统可部署于普通服务器或个人计算机上,硬件成本较低。系统上线后能够减少人工点餐环节的人力投入,降低餐饮门店运营成本。投入产出比合理,经济上具备可行性。

第四章 系统设计

4.1 系统架构设计

  系统采用前后端分离架构,将展示层、业务逻辑层与数据存储层明确分离。前端基于Vue框架构建用户界面,通过Axios发起异步请求调用后端API。后端基于Spring Boot框架提供服务端逻辑,Controller层接收请求并调用Service层处理业务,数据持久层通过MyBatis或JPA与MySQL数据库交互[17]。系统架构图如图4-1所示。

image 图4-1系统架构图

4.2 系统结构功能设计

  系统功能按照角色可以分为三个主要模块。普通用户模块有登录注册、菜品信息查询、收货地址管理、订单管理、儿童饮食查询、家庭信息管理、订单配送查询。商家用户模块有儿童饮食管理、菜品信息管理、订单列表管理、订单配送管理、订单售后管理。系统管理员模块分为家庭信息管理、儿童饮食管理、资源管理、菜品信息管理、订单列表管理、订单配送管理、订单售后管理等部分。各个模块之间使用相同的接口进行数据交换,从而达到模块之间的独立性以及系统的整体性。该系统的功能结构图如图4-2所示。

image 图4-2系统功能结构图

4.3 系统流程设计

4.3.1 菜品信息查询流程设计

  用户进入菜品信息查询页面后,可按关键词或分类筛选菜品。系统接收查询参数后从数据库检索匹配记录,返回菜品列表供用户浏览。用户点击具体菜品进入详情页,可查看规格、价格及描述信息。菜品信息查询流程图如图4-3所示。

  

image

图4-3菜品信息查询流程图

4.3.2 订单创建流程设计

  用户将菜品加入购物车后确认下单,系统生成订单记录并扣减对应库存。订单状态初始为待付款,用户完成支付后状态变更为待发货。若支付超时,系统自动取消订单并恢复库存。订单创建流程图如图4-4所示。

  

image

图4-4订单创建流程图

4.3.3 订单售后流程设计

  用户对已签收订单发起售后申请,填写售后类型与原因。系统生成售后记录并通知商家审核。商家审核通过后执行退款操作,订单状态更新为已退款;若审核拒绝,订单保持原状态并反馈拒绝原因。订单售后流程图如图4-5所示。

  

image

图4-5订单售后流程图

4.3.4 儿童饮食发布流程设计

  商家用户填写饮食标题、适用年龄段、食材清单及做法步骤后提交发布申请。系统将内容状态标记为待审核,系统管理员审核通过后内容在前端展示,审核不通过则退回商家修改。儿童饮食发布流程图如图4-6所示。

  

image

图4-6儿童饮食发布流程图

4.3.5 订单配送流程设计

  商家对待发货订单进行打包操作,填写物流单号并更新配送状态。系统生成配送记录,用户可在前端查询物流进度。用户签收后订单状态变更为已完成,配送流程终止。订单配送流程图如图4-7所示。

  

image

图4-7订单配送流程图

4.4 数据库设计

4.4.1 概念模型设计

  系统包含用户、订单、菜品、儿童饮食等诸多业务实体,各个实体间存在着诸多关联关系。概念模型把现实世界中的业务对象抽象成实体和属性,定义实体之间联系类型,为后面逻辑模型的设计打下基础。实体之间的一对一、一对多、多对多关系用E-R图来可视化地表示出来,使数据结构更加清晰易懂[18]。全局E-R模型如图4-8所示。

  image 图4-8全局ER图

  根据系统分析,系统的主要实体有:用户账户、普通用户、商家用户、收货地址、订单、订单售后、物流配送、菜品信息、儿童饮食、家庭信息,各个实体具体的属性如下图所示。

  (1)用户账户实体主要包括用户id、用户名、密码等属性。如图4-9所示。

  image 图4-9用户账户实体属性图

  (2)普通用户实体主要包括普通用户id、用户姓名、用户性别等属性。如图4-10所示。

  image 图4-10普通用户实体属性图

  (3)商家用户实体主要包括商家用户id、店铺名称、商家姓名等属性。如图4-11所示。

  image 图4-11商家用户实体属性图

  (4)收货地址实体主要包括收货地址id、姓名、手机、地址等属性。如图4-12所示。

  image 图4-12收货地址实体属性图

  (5)订单实体主要包括订单id、订单号、商品标题、价格、数量等属性。如图4-13所示。

  image 图4-13订单实体属性图

  (6)订单售后实体主要包括订单售后id、订单号、商品标题、售后状态等属性。如图4-14所示。

  image 图4-14订单售后实体属性图

  (7)物流配送实体主要包括物流配送id、订单号、商品名称、购买数量等属性。如图4-15所示。

  image 图4-15物流配送实体属性图

  (8)菜品信息实体主要包括菜品信息id、标题、卖价、原价等属性。如图4-16所示。

  image 图4-16菜品信息实体属性图

  (9)儿童饮食实体主要包括儿童饮食id、饮食编号、饮食标题、适用年龄段等属性。如图4-17所示。

  image 图4-17儿童饮食实体属性图

  (10)家庭信息实体主要包括家庭信息id、家庭编号、用户姓名、用户性别等属性。如图4-18所示。

  image 图4-18家庭信息实体属性图

4.4.2 数据库表设计

  数据库逻辑设计把概念模型转成MySQL数据库里具体的表结构,确定各个表的字段名称,数据类型,长度以及约束条件。设计过程按照规范化的标准来开展工作,从而达到降低数据重复出现、保证数据完整的目的。外键约束保证表之间的参照完整性,使关联的数据一致[19]。系统共有28张数据表,本文主要对10张业务表进行说明。

  (1)用户账户表主要用来存储系统用户的登录凭证与基本信息。主要包括用户id、用户名、密码、用户组、手机号码等字段。如表4-1所示。

表4-1用户账户表

序号字段名数据类型长度备注
1 用户id int 11 主键
2 用户名 varchar 16 唯一
3 密码 varchar 64 加密存储
4 用户组 varchar 32 角色标识
5 手机号码 varchar 11 联系方式
6 昵称 varchar 16 显示名称
7 创建时间 timestamp – 注册时间

  (2)普通用户表主要用来存储普通用户的扩展信息。主要包括普通用户id、用户姓名、用户性别、联系电话等字段。如表4-2所示。

表4-2普通用户表

序号字段名数据类型长度备注
1 普通用户id int 11 主键
2 用户姓名 varchar 64 真实姓名
3 用户性别 varchar 64 男/女
4 联系电话 varchar 16 手机号
5 用户id int 11 外键
6 创建时间 datetime – 记录创建时间

  (3)收货地址表主要用来存储用户的收货地址信息。主要包括收货地址id、姓名、手机、地址、用户id等字段。如表4-3所示。

表4-3收货地址表

序号字段名数据类型长度备注
1 收货地址id int 11 主键
2 姓名 varchar 32 收货人
3 手机 varchar 13 联系电话
4 地址 varchar 255 详细地址
5 用户id int 11 外键
6 创建时间 timestamp – 创建时间

  (4)订单表主要用来存储用户下单的交易记录。主要包括订单id、订单号、商品标题、价格、数量、订单状态等字段。如表4-4所示。

表4-4订单表

序号字段名数据类型长度备注
1 订单id int 11 主键
2 订单号 varchar 64 唯一编号
3 商品标题 varchar 255 菜品名称
4 价格 double – 成交价
5 数量 int 11 购买数量
6 总价 double – 订单总额
7 订单状态 varchar 16 状态标识
8 买家id int 11 外键

  (5)订单售后表主要用来存储用户售后申请记录。主要包括订单售后id、订单号、商品标题、售后状态、售后类型等字段。如表4-5所示。

表4-5订单售后表

序号字段名数据类型长度备注
1 订单售后id int 11 主键
2 订单号 varchar 64 关联订单
3 商品标题 varchar 255 菜品名称
4 售后状态 varchar 16 审核状态
5 售后类型 varchar 255 退款/退货
6 创建时间 timestamp – 申请时间

  (6)物流配送表主要用来存储订单配送过程的物流信息。主要包括物流配送id、订单号、商品名称、购买数量、配送状态等字段。如表4-6所示。

表4-6物流配送表

序号字段名数据类型长度备注
1 物流配送id int 11 主键
2 订单号 varchar 64 关联订单
3 商品名称 varchar 64 菜品名称
4 购买数量 varchar 64 数量
5 配送状态 varchar 64 未配送/已配送
6 签收状态 varchar 64 未签收/已签收

  (7)菜品信息表主要用来存储商家发布的菜品数据。主要包括菜品信息id、标题、卖价、原价、商品库存、上架状态等字段。如表4-7所示。

表4-7菜品信息表

序号字段名数据类型长度备注
1 菜品信息id int 11 主键
2 标题 varchar 125 菜品名称
3 卖价 double – 销售价格
4 原价 double – 原价格
5 商品库存 int 11 库存数量
6 上架状态 smallint 6 0下架1上架
7 商家用户 int 11 发布商家

  (8)儿童饮食表主要用来存储儿童专属饮食内容。主要包括儿童饮食id、饮食编号、饮食标题、适用年龄段、审核状态等字段。如表4-8所示。

表4-8儿童饮食表

序号字段名数据类型长度备注
1 儿童饮食id int 11 主键
2 饮食编号 varchar 64 唯一编号
3 饮食标题 varchar 64 内容标题
4 适用年龄段 varchar 64 年龄范围
5 审核状态 varchar 16 审核中/通过
6 发布用户 int 11 发布商家

  (9)家庭信息表主要用来存储普通用户的家庭成员数据。主要包括家庭信息id、家庭编号、用户姓名、用户性别、联系电话等字段。如表4-9所示。

表4-9家庭信息表

序号字段名数据类型长度备注
1 家庭信息id int 11 主键
2 家庭编号 varchar 64 唯一编号
3 用户姓名 varchar 64 成员姓名
4 用户性别 varchar 64 性别
5 联系电话 varchar 64 联系方式
6 普通用户 int 11 关联用户

  (10)商家用户表主要用来存储商家的扩展信息。主要包括商家用户id、店铺名称、商家姓名、商家电话等字段。如表4-10所示。

表4-10商家用户表

序号字段名数据类型长度备注
1 商家用户id int 11 主键
2 店铺名称 varchar 64 店铺名
3 商家姓名 varchar 64 联系人
4 商家电话 varchar 16 联系电话
5 用户id int 11 外键
6 审核状态 varchar 16 入驻审核

第五章 系统实现

5.1 普通用户功能实现

5.1.1 登录注册功能实现

  用户通过登录注册模块完成身份验证。前端提交登录凭证至UserController的login方法,该方法接收用户名、邮箱或手机号及密码,对密码进行RSA解密后与数据库中加密密码比对,验证通过后生成Token并存入Redis,同时返回用户信息及Token。注册时调用signUp方法校验用户名唯一性并对密码加密存储。登录注册界面如图5-1所示。

  image 图5-1登录注册界面

  核心代码实现如下:

@PostMapping("login")

public Map<String, Object>login(@RequestBody Map<String, String> data,HttpServletRequesthttpServletRequest) {

String username =data.get("username");

String password =data.get("password");

password =RsaUtils.decryptByPrivateKey(password);

ListresultList=service.selectBaseList(service.select(map, new HashMap<>()));

if (byUsername.getPassword().equals(md5password)) {

accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

redisTemplate.opsForValue().set(accessToken.getToken(),accessToken, duration);

  }

  }

5.1.2 菜品信息查询功能实现

  菜品信息查询功能允许用户浏览菜品列表或按条件检索。前端请求被DishesInformationController的get_list方法处理,该方法继承自BaseController,调用service.selectToPage方法执行分页查询,根据前端传递的查询参数动态构建SQL条件,返回包含数据列表和总数的分页结果。用户可通过菜品名称、类型等字段进行精确或模糊搜索。菜品信息查询界面如图5-2所示。

  image 图5-2菜品信息查询界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

5.1.3 收货地址管理功能实现

  收货地址管理用于用户维护个人地址信息。AddressController提供add方法接收前端提交的地址数据,包含手机号和地址的非空校验,校验通过后调用service.insert方法将地址信息存入数据库。用户可对已有地址进行修改或删除,set方法负责更新操作,del方法执行逻辑删除。收货地址管理界面如图5-3所示。

  image 图5-3收货地址管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>addMap=service.readBody(request.getReader());

  if (addMap.get("phone")==null){

  throw newIllegalArgumentException("手机号不能为空");

  }

  this.service.insert(addMap);

  }

5.1.4 订单管理功能实现

  订单管理模块支持用户查看个人订单列表及详情。OrderController的get_list方法调用service.selectToPage获取分页订单数据。商家视角下通过get_business_order_list方法构建多表关联查询,连接订单表和商品表,根据商家用户ID筛选订单,并支持按订单号、商品标题、联系人姓名和订单状态进行条件筛选。订单管理界面如图5-4所示。

  image 图5-4订单管理界面

  核心代码实现如下:

@RequestMapping("/get_business_order_list")

public Map&lt;String, Object&gt;getBusinessOrderList(HttpServletRequestrequest) {

Stringsql= "SELECT t1.*FROM order t1 LEFT JOIN goods t2 ON t1.goods_id = t2.goods_id WHERE t2.user_id = "+query.get("user_id");

  if(!StringUtils.isEmpty(query.get("order_number"))){

  sql=sql+ " and t1.order_number like '%"+query.get("order_number")+"%'";

  }

  map.put("list",service.selectBaseList(sql));

  }

5.1.5 儿童饮食查询功能实现

  儿童饮食查询功能允许普通用户浏览适合儿童的饮食食谱。ChildrensDietController的get_list方法处理查询请求,继承自BaseController,通过service.selectToPage方法返回分页数据。用户可按适用年龄段、内容类型等条件进行筛选,查看食谱的食材用料、制作步骤及功效说明。儿童饮食查询界面如图5-5所示。

  image 图5-5儿童饮食查询界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

5.1.6 家庭信息管理功能实现

  家庭信息管理用于普通用户填写和维护家庭成员信息。FamilyInformationController的add方法接收前端提交的家庭编号、成员姓名、性别、联系电话等数据,去除空字符串后构建实体对象,调用addEntity方法完成数据库插入。用户可通过set方法修改信息,通过del方法删除记录。家庭信息管理界面如图5-6所示。

  image 图5-6家庭信息管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value =entry.getValue();

  return valueinstanceofString && ((String) value).isEmpty();

  });

  this.addEntity(family_information);

  }

5.1.7 订单配送查询功能实现

  订单配送查询功能使用户能够追踪已下单商品的物流状态。LogisticsDeliveryController继承BaseController,其get_list方法通过service.selectToPage查询物流配送记录,返回包含配送单号、承运公司、配送进度、预计送达时间等信息的列表,用户可根据订单号快速定位配送详情。订单配送查询界面如图5-7所示。

  image 图5-7订单配送查询界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

5.2 商家用户功能实现

5.2.1 儿童饮食管理功能实现

  商家用户通过儿童饮食管理模块发布和维护儿童食谱。ChildrensDietController的add方法接收食谱编号、标题、适用年龄段、食材汇总、制作步骤等数据,自动填充审核状态为默认值后调用addEntity插入数据库。set方法支持商家修改已发布的食谱内容,updateExamineState方法可调整食谱的审核状态。儿童饮食管理界面如图5-8所示。

  image 图5-8儿童饮食管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

ChildrensDietchildrens_diet= newChildrensDiet();

childrens_diet.setDiet_headline(paramMap.get("diet_headline")==null?null:String.valueOf(paramMap.get("diet_headline")));

childrens_diet.setExamine_state(paramMap.get("examine_state")==null?null:String.valueOf(paramMap.get("examine_state")));

this.addEntity(childrens_diet);

  }

5.2.2 菜品信息管理功能实现

  菜品信息管理使商家能够维护自家店铺的菜品。DishesInformationController的add方法接收店铺名称、营养标签、商品标题、价格、库存等参数,构建实体对象后调用addEntity保存。set方法用于更新菜品信息,包括修改价格、库存和上下架状态(listStatus字段),确保前台展示实时准确的菜品数据。菜品信息管理界面如图5-9所示。

  image 图5-9菜品信息管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

DishesInformationdishes_information= newDishesInformation();

dishes_information.setStore_name(paramMap.get("store_name")==null?null:String.valueOf(paramMap.get("store_name")));

dishes_information.setCart_price(paramMap.get("cart_price")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price"))));

this.addEntity(dishes_information);

  }

5.2.3 订单列表管理功能实现

  商家用户通过订单列表管理查看和处理顾客订单。OrderController的get_business_order_list方法执行关联查询,以商家用户ID为条件筛选出属于该商家的所有订单,支持按订单号、商品名称和订单状态进行筛选,分页返回结果。商家可根据订单状态进行发货、完成等操作。订单列表管理界面如图5-10所示。

  image 图5-10订单列表管理界面

  核心代码实现如下:

@RequestMapping("/get_business_order_list")

public Map&lt;String, Object&gt;getBusinessOrderList(HttpServletRequestrequest) {

Stringsql= "SELECT t1.*FROM order t1 LEFT JOIN goods t2 ON t1.goods_id = t2.goods_id WHERE t2.user_id = "+query.get("user_id");

  if(!StringUtils.isEmpty(query.get("state"))){

  sql=sql+ " and t1.state= '"+query.get("state")+"'";

  }

  map.put("list",service.selectBaseList(sql));

  }

5.2.4 订单配送管理功能实现

  订单配送管理模块允许商家更新订单的物流状态。LogisticsDeliveryController继承BaseController,商家可通过set方法修改配送记录,更新配送单号、物流公司和配送进度。前端提交修改请求后,控制器调用service.update方法执行数据更新,确保顾客能实时获取准确的配送信息。订单配送管理界面如图5-11所示。

  image 图5-11订单配送管理界面

  核心代码实现如下:

  @PostMapping("/set")

  @Transactional

  public Map<String, Object>set(HttpServletRequestrequest) throwsIOException{

  Map<String,String> query =this.service.readQuery(request);

  Map<String,String> config =this.service.readConfig(request);

  Map<String,Object> body =this.service.readBody(request.getReader());

  this.service.update(query, config, body);

  }

5.2.5 订单售后管理功能实现

  订单售后管理处理顾客的退款或退货申请。OrderAfterSaleController的add方法校验订单号和订单编号不能为空,校验通过后调用service.insert保存售后申请记录。商家可通过set方法更新售后处理状态(如审核通过、已退款等),通过get_list方法分页查看所有售后申请单。订单售后管理界面如图5-12所示。

  image 图5-12订单售后管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>addMap=service.readBody(request.getReader());

  if (addMap.get("order_number")==null){

  throw newIllegalArgumentException("订单id不能为空");

  }

  this.service.insert(addMap);

  }

5.3 系统管理员功能实现

5.3.1 家庭信息管理功能实现

  系统管理员可查看和管理所有普通用户提交的家庭信息。FamilyInformationController的get_list方法以分页形式展示全部家庭记录,管理员通过get_obj方法获取单条详情进行查看。对于违规或错误信息,管理员可调用del方法删除记录,确保平台数据的规范性和合法性。家庭信息管理界面如图5-13所示。

  image 图5-13家庭信息管理界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

  @RequestMapping(value = "/del")

  @Transactional

  public Map<String, Object>del(HttpServletRequestrequest) {

  Map<String,String> query =service.readQuery(request);

  this.service.delete(query, config);

  }

5.3.2 儿童饮食管理功能实现

  管理员对平台上所有儿童饮食内容进行统一审核和管理。ChildrensDietController提供get_list方法查询全部食谱,管理员通过updateExamineState方法修改食谱的审核状态(未审核、已通过、未通过),控制内容的可见性。对于不合规的食谱,管理员也可通过del方法直接删除。儿童饮食管理界面如图5-14所示。

  image 图5-14儿童饮食管理界面

  核心代码实现如下:

@GetMapping("/update_examine_state")

public StringupdateExamineState(Long id, StringnewState) throwsIOException{

queryMap.put("id",String.valueOf(id));

ChildrensDietchildrens_diet=service.findOne(queryMap);

childrens_diet.setExamine_state(newState);

this.setEntity(queryMap,newHashMap&lt;&gt;(),childrens_diet);

  }

5.3.3 资源管理功能实现

  资源管理包括轮播图、公告等前端展示内容的维护。SlidesController和NoticeController均继承BaseController,管理员通过add方法添加轮播图或公告,需校验标题非空;通过set方法修改内容,通过del方法删除资源。get_list方法以分页形式展示所有资源项,便于管理员统一管理。资源管理界面如图5-15所示。

  image 图5-15资源管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object>add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>addMap=service.readBody(request.getReader());

  if (addMap.get("title")==null){

  throw newIllegalArgumentException("标题不能为空");

  }

  this.service.insert(addMap);

  }

5.3.4 菜品信息管理功能实现

  管理员对所有商家的菜品信息拥有全局管理权限。DishesInformationController的get_list方法返回所有商家的菜品分页列表,管理员可通过set方法修改任何菜品的价格、库存和上下架状态,对于违规菜品可调用del方法删除,确保平台菜品信息的规范性和市场秩序。菜品信息管理界面如图5-16所示。

  image 图5-16菜品信息管理界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

  @RequestMapping(value = "/del")

  @Transactional

  public Map<String, Object>del(HttpServletRequestrequest) {

  Map<String,String> query =service.readQuery(request);

  this.service.delete(query, config);

  }

5.3.5 订单列表管理功能实现

  管理员可查看系统中所有用户的订单记录。OrderController的get_list方法提供全平台订单的分页查询,支持按订单号、用户信息、订单状态等多维度筛选。管理员无法直接修改订单金额,但可查看异常订单并协助处理,确保平台交易秩序的公平性和可追溯性。订单列表管理界面如图5-17所示。

  image 图5-17订单列表管理界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

5.3.6 订单配送管理功能实现

  管理员对所有订单的物流配送信息拥有全局查看和干预权限。LogisticsDeliveryController的get_list方法返回全平台物流配送记录,管理员可调用set方法修正错误的配送单号或物流状态,在商家处理不及时时协助更新配送信息,保障用户体验。订单配送管理界面如图5-18所示。

  image 图5-18订单配送管理界面

  核心代码实现如下:

  @PostMapping("/set")

  @Transactional

  public Map<String, Object>set(HttpServletRequestrequest) throwsIOException{

  Map<String,String> query =this.service.readQuery(request);

  Map<String,String> config =this.service.readConfig(request);

  Map<String,Object> body =this.service.readBody(request.getReader());

  this.service.update(query, config, body);

  }

5.3.7 订单售后管理功能实现

  管理员负责最终裁决商家和顾客之间的售后纠纷。OrderAfterSaleController的get_list方法展示所有售后申请单,管理员可查看申请详情和商家处理意见,通过set方法直接修改售后单的最终处理状态(如强制退款、驳回申请),确保售后流程公平公正。订单售后管理界面如图5-19所示。

  image 图5-19订单售后管理界面

  核心代码实现如下:

  @RequestMapping("/get_list")

  public Map<String, Object>getList(HttpServletRequestrequest) {

  Map<String, Object> map =service.selectToPage(service.readQuery(request),service.readConfig(request));

  return success(map);

  }

  @PostMapping("/set")

  @Transactional

  public Map<String, Object>set(HttpServletRequestrequest) throwsIOException{

  this.service.update(query, config, body);

  }

第六章 系统测试

6.1 测试目的

  系统测试旨在验证家常菜点餐系统是否满足设计需求与业务规范。通过执行预设测试用例,检查各功能模块在正常与异常输入条件下的响应行为,确认数据在用户、商家与管理员三端之间的一致性。测试过程关注订单状态流转的准确性、菜品信息展示的正确性、儿童饮食审核机制的完整性以及用户权限控制的严密性。测试结果用于评估系统稳定性与可用性,为系统上线提供依据[20]。

6.2 测试方法

  采用黑盒测试方法对系统各功能模块进行验证。测试环境包括本地开发环境与测试服务器,浏览器端模拟用户操作行为。测试用例覆盖登录注册、菜品查询、订单创建、售后申请、儿童饮食发布与审核等核心业务流程。每项测试输入预期结果与实测结果进行比对,记录不符合预期的缺陷并提交修复。回归测试确保缺陷修复后不影响其他功能正常运行。测试数据采用真实业务数据与模拟数据相结合的方式,保证测试有效性。

6.3 测试内容

  (1)登录注册功能测试如表6-1所示。

表6-1登录注册测试用例表

测试内容测试步骤预期结果实际结果
用户注册 填写用户名、密码、邮箱,选择普通用户身份后点击注册 提示注册成功,跳转登录页 符合预期
用户登录 输入已注册账号密码点击登录 成功进入系统首页 符合预期
密码错误 输入正确用户名与错误密码 提示密码错误,登录失败 符合预期
重复注册 使用已存在的用户名再次注册 提示用户名已存在 符合预期

  (2)菜品信息查询功能测试如表6-2所示。

表6-2菜品信息查询测试用例表

测试内容测试步骤预期结果实际结果
关键词搜索 输入菜品名称关键词后点击查询 返回包含关键词的菜品列表 符合预期
分类筛选 选择商品分类后点击查询 返回该分类下的所有菜品 符合预期
排序功能 点击价格排序按钮 菜品按价格升序或降序排列 符合预期
查看详情 点击菜品卡片 跳转详情页显示完整信息 符合预期

  (3)订单创建功能测试如表6-3所示。

表6-3订单创建测试用例表

测试内容测试步骤预期结果实际结果
添加购物车 选择菜品规格与数量后加入购物车 购物车显示添加的商品 符合预期
确认下单 选择收货地址后点击下单 生成订单并跳转支付页 符合预期
库存扣减 下单成功后查看商品库存 库存数量相应减少 符合预期
取消订单 在待付款状态取消订单 订单状态变更为已取消,库存恢复 符合预期

  (4)儿童饮食发布功能测试如表6-4所示。

表6-4儿童饮食发布测试用例表

测试内容测试步骤预期结果实际结果
商家发布 填写饮食标题、年龄段、做法后提交 内容进入待审核状态 符合预期
管理员审核 管理员通过审核操作 内容在前端儿童饮食列表展示 符合预期
审核拒绝 管理员拒绝审核并填写回复 内容退回商家,显示拒绝原因 符合预期
饮食查询 用户按年龄段搜索已通过饮食 返回匹配的饮食内容 符合预期

  (5)订单售后功能测试如表6-5所示。

表6-5订单售后测试用例表

测试内容测试步骤预期结果实际结果
发起售后 用户对已签收订单发起退款申请 生成售后记录,状态为未审核 符合预期
商家审核通过 商家点击通过审核 订单状态变更为已退款 符合预期
商家审核拒绝 商家填写拒绝原因后拒绝 订单状态恢复,显示拒绝原因 符合预期
管理员介入 管理员对争议售后修改审核结果 售后状态更新为已通过 符合预期

测试结论

  经过完整的测试流程后,家常菜点餐系统各个功能模块可以正常运行。登录注册模块能够正确校验用户身份,阻止非法访问。菜品信息查询模块反应快,关键词搜索和分类筛选功能可以正确地返回所要的结果。订单创建模块可以正确地对库存进行扣减,并且可以对状态流转进行处理,支付超时取消也能够正常运行。儿童饮食发布和审核过程中,商家提交的内容经过管理员审核之后正确展示或者退回,审核状态会同步更新。订单售后模块可以实现用户发起申请、商家审核和管理员介入的全部流程,退款操作执行准确。测试过程中出现的缺陷均已修复,经过回归测试。系统功能完整性、数据一致性、操作便捷性均符合家常菜点餐业务日常管理的要求。

项目分享:大家可自取用于参考学习,获取方式可私信哦!

赞(0)
未经允许不得转载:网硕互联帮助中心 » springboot家常菜点餐系统12121-计算机课程设计、毕业设计
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!