摘要
随着信息技术的迅猛发展,特别是在大数据、云计算和移动互联网等领域的不断创新,传统餐饮业也开始逐渐转型和升级,向智能化、便捷化、个性化方向发展。其中,餐厅点餐系统作为餐饮业数字化转型的关键一环,受到了广泛的关注和应用。
基于Spring Boot的餐厅点餐系统,正是应这一时代潮流而生。Spring Boot以其简洁、快速、易于集成的特点,成为了构建现代化Web应用的首选框架。它简化了Spring应用的初始搭建以及开发过程,使得开发者能够更加专注于业务逻辑的实现,而非繁琐的配置和部署。
本系统的开发,旨在通过技术手段提升餐厅的运营效率和服务质量。通过整合移动技术、数据库管理、用户认证授权、支付接口等多个功能模块,实现用户在线浏览菜单、自助点餐、移动支付、订单追踪、菜品评价等一系列功能,为顾客带来全新的用餐体验。
同时,该系统也充分考虑了餐厅管理者的需求,提供了菜品订单管理、座位信息管理、座位预约管理、联系餐厅管理等功能,帮助餐厅实现精细化管理和智能化决策。此外,系统还支持多种支付方式和个性化定制,满足不同餐厅和顾客的多样化需求。
综上所述,基于Spring Boot的餐厅点餐系统不仅是一个技术创新的产物,更是餐饮业数字化转型的重要里程碑。它的出现,将推动餐饮业向更加智能化、便捷化、个性化的方向发展,为顾客和餐厅创造更大的价值。
关键词:餐厅点餐系统;Spring Boot;Java语言
Abstract
With the rapid development of information technology, especially the continuous innovation in the fields of big data, cloud computing and mobile Internet, the traditional catering industry has also begun to gradually transform and upgrade to the direction of intelligence, convenience and personalization. Among them, the restaurant ordering system, as a key part of the digital transformation of the catering industry, has received widespread attention and application.
The restaurant ordering system based on Spring Boot is born in response to the trend of this era. Spring Boot has become the preferred framework for building modern web applications due to its simplicity, speed, and ease of integration. It simplifies the initial setup and development process of Spring applications, allowing developers to focus more on implementing business logic rather than tedious configuration and deployment.
The development of this system aims to improve the operational efficiency and service quality of restaurants through technological means. By integrating multiple functional modules such as mobile technology, database management, user authentication and authorization, and payment interfaces, a series of functions such as online menu browsing, self-service ordering, mobile payment, order tracking, and dish evaluation are achieved, bringing customers a brand new dining experience.
At the same time, the system also fully considers the needs of restaurant managers, providing functions such as dish order management, seat information management, seat reservation management, and contact restaurant management, helping restaurants achieve refined management and intelligent decision-making. In addition, the system also supports multiple payment methods and personalized customization to meet the diverse needs of different restaurants and customers.
In summary, the restaurant ordering system based on Spring Boot is not only a product of technological innovation, but also an important milestone in the digital transformation of the catering industry. Its emergence will drive the catering industry towards a more intelligent, convenient, and personalized direction, creating greater value for customers and restaurants.
Keywords: Restaurant ordering system; Spring Boot; Java language
目录
1 绪论
1.1 课题研究背景和意义
餐厅点餐系统是近年来随着餐饮业的快速发展和数字化转型而逐渐兴起的一个研究领域。随着消费者对于就餐体验的要求不断提高,传统的点餐方式已经无法满足现代餐饮市场的需求。因此,开发一款高效、便捷、智能的点餐系统成为了餐饮业发展的必然趋势。
课题研究背景方面,随着移动互联网的普及和智能设备的广泛应用,消费者越来越倾向于通过手机或其他智能设备来完成点餐过程。这种趋势促使餐厅必须跟上时代的步伐,进行数字化转型,以满足消费者的需求。同时,餐厅也面临着提高运营效率、降低成本、提升服务质量等多重挑战。因此,开发一款能够满足这些需求的点餐系统成为了餐饮业发展的迫切需求。
课题研究意义方面,餐厅点餐系统的研究不仅有助于提高餐厅的运营效率和服务质量,还能够为消费者带来更加便捷、个性化的用餐体验。通过点餐系统,餐厅可以实现订单的快速处理、库存的有效管理、销售数据的精准分析等功能,从而降低成本、提高盈利能力。同时,点餐系统还能够为消费者提供更加丰富的菜品选择、个性化的点餐推荐、实时的订单追踪等服务,提升消费者的满意度和忠诚度。
综上所述,餐厅点餐系统的课题研究背景和意义在于满足现代餐饮市场对于数字化转型的迫切需求,通过技术手段提高餐厅的运营效率和服务质量,为消费者带来更加便捷、个性化的用餐体验。这一研究不仅有助于推动餐饮业的创新发展,还能够为餐饮企业带来实实在在的经济效益和社会效益。
1.2 国内外研究现状
餐厅点餐系统作为餐饮行业信息化、智能化的重要体现,近年来得到了广泛的关注与研究。随着移动互联网、大数据、人工智能等技术的快速发展,点餐系统不仅简化了消费者的点餐流程,提高了餐厅的运营效率,还为消费者提供了更加个性化、智慧化的服务。
国内研究现状:
在国内,点餐系统的研究与应用取得了显著的进展。徐豪在其研究中提出了基于随机森林模型的推荐点餐系统,该系统通过微信小程序作为前端界面,为消费者提供扫码、登录、浏览菜单、下单、排队、推荐等功能,同时设计并实现了餐厅管理端,提供菜品管理、订单处理、数据统计等功能。该研究还对比了多种推荐算法的性能,最终选择随机森林作为推荐策略,结合隐含狄利克雷(LDA)模型,实现了个性化的菜品推荐功能。这一系统不仅提高了消费者的满意度和点餐体验,也为餐厅提供了更好的运营支持[1]。
另外,张芮绮则关注于线上餐厅管理系统的设计,强调了互联网模式在餐饮行业中的应用意义。该系统面向餐厅消费者、餐厅管理者和餐厅服务员,实现了餐品管理、人员管理、点餐等多项功能,体现了信息化、智能化的管理方式[2]。
宋晴和姚敦红则基于UML技术对餐厅点餐系统进行了设计,旨在提高点餐效率,方便餐厅管理者对相关业务进行管理。他们的研究强调了系统设计的重要性,以及UML技术在系统设计中的应用价值[3]。
在国际上,智慧食堂点餐系统的研发也取得了不少成果。例如,内蒙古赤那网络科技有限公司研发的智慧食堂点餐系统,解决了企业、单位、医院等职工就餐过程中的预约订餐问题,实现了自由订退餐、实时扣款等功能,极大地减少了管理成本,提高了管理效率[4]。
综上所述,餐厅点餐系统的研究与应用在国内外均取得了显著的进展,不仅简化了消费者的点餐流程,提高了餐厅的运营效率,还为消费者提供了更加个性化、智慧化的服务。随着技术的不断发展,未来点餐系统有望实现更加智能化、个性化的服务,为消费者带来更加便捷、高效的用餐体验。
国外研究现状:
国外餐厅点餐系统的研究现状呈现出一种高度集成化、智能化和个性化的趋势。随着科技的快速发展,特别是移动技术、物联网、人工智能和大数据分析等领域的进步,国外的点餐系统不仅在功能上日趋完善,还在用户体验和服务效率上实现了显著的提升。
移动应用和在线平台成为主流,顾客可以通过手机或电脑随时随地进行点餐,不仅方便了顾客,也提高了餐厅的运营效率。同时,这些系统通常与支付系统、会员管理系统等无缝对接,为顾客提供了一站式的服务体验。
在智能化方面,国外研究者正积极探索将人工智能和机器学习技术应用于点餐系统。例如,通过分析顾客的点餐历史和偏好,系统能够智能推荐菜品,提高顾客满意度。此外,一些先进的点餐系统还具备智能排班、库存管理和供应链优化等功能,帮助餐厅实现更高效的运营。
个性化服务也是当前研究的热点之一。通过收集和分析顾客的个人信息、口味偏好和用餐习惯等数据,点餐系统能够为顾客提供更加个性化的服务,如定制化的菜单、独特的用餐体验等。
总体而言,国外餐厅点餐系统的研究现状呈现出一种多元化、智能化和个性化的特点。随着技术的不断进步和创新,未来的点餐系统有望为餐厅和顾客带来更加便捷、高效和个性化的服务体验。
第一章是绪论,本文章的开头部分,对本题目的研究背景意义和国内外研究现状等一些做文字性的描述。
第二章是系统分析部分,包括系统总体需求描述、功能性角度分析系统需求、非功能性等各个方面分析系统是否可以实现。
第三章是系统设计部分,本文章的重要部分,提供了系统架构的详细设计和一些主要功能模块的设计说明。
第四章是系统的具体实现,介绍系统的各个模块的具体实现。
第五章在前几章的基础上对系统进行测试和运行。
最后对系统进行了认真的总结,以此对未来有一个新的展望。
2 系统分析
系统分析是开发一个项目的先决条件,通过系统分析可以很好的了解系统的主体用户的基本需求情况,同时这也是项目的开发的原因。进而对系统开发进行可行性分析,通常包括技术可行性、经济可行性等,可行性分析同时也是从项目整体角度进行的分析。然后就是对项目的具体需求进行分析,分析的手段一般都是通过用户的用例图来实现。接下来会进行详细的介绍。
2.1可行性分析
2.1.1技术可行性分析
基于Spring Boot的餐厅点餐系统在技术上是完全可行的。Spring Boot框架提供了丰富的功能和灵活的扩展性,使得开发快速、稳定、安全的Web应用成为可能。同时,结合现代的前端技术和数据库管理系统,我们可以实现用户友好的界面设计、高效的数据处理以及强大的后端逻辑支持。此外,Spring Boot还提供了强大的社区支持和丰富的资源,使得在开发过程中遇到问题时能够快速找到解决方案。因此,从技术角度来看,开发一个基于Spring Boot的餐厅点餐系统是完全可行的,并且有望为餐饮业带来显著的效益和改进。
2.1.2经济可行性分析
在经济可行性方面,基于Spring Boot的餐厅点餐系统具有显著的优势。Spring Boot是一个开源框架,使用它进行开发可以大大降低软件开发的成本。同时,通过整合现有的技术和资源,如开源的前端框架、数据库管理系统和第三方支付接口等,可以进一步减少系统的开发和维护成本。此外,点餐系统的实施可以提高餐厅的运营效率,减少人力成本,并提升顾客满意度,从而增加餐厅的收入。综合来看,基于Spring Boot的餐厅点餐系统在经济上是可行的,并且有望为餐厅带来长期的经济效益。
2.1.3操作可行性分析
在操作可行性方面,基于Spring Boot的餐厅点餐系统同样展现出极高的优势。系统采用用户友好的界面设计,使得餐厅员工和顾客都能轻松上手,无需复杂的培训即可快速掌握使用技巧。此外,系统提供直观的操作流程和明确的功能指引,使得点餐、下单、支付等过程变得简单而高效。同时,系统还具备强大的后台管理功能,方便餐厅员工对菜品、订单、库存等进行快速管理。因此,从操作层面来看,基于Spring Boot的餐厅点餐系统不仅易于使用,而且能够显著提高餐厅的工作效率,为餐厅和顾客带来便捷的操作体验。
2.2功能需求分析
1. 普通用户功能介绍:
注册登录:用户需要能够注册新账户并进行登录,以便访问系统的各项功能和信息。
首页:展示餐厅的最新菜品、促销活动等信息,以吸引用户访问和点餐。
公告消息:用户可以查看系统发布的重要通知和公告,如特别活动、餐厅营业时间等信息。
餐品资讯:提供与餐品相关的信息,如菜品介绍、口味推荐等内容,以帮助用户了解更多信息。
留言板:用户可以在留言板上留下意见、建议或评价,与餐厅进行互动交流。
菜品商城:提供用户浏览菜品、加入购物车、点餐等功能,为用户提供便捷的点餐体验。
商城管理:用户可以管理点餐的订单信息,包括查看订单状态、历史订单等。
座位信息:用户可以查看餐厅的座位信息,预约或选择位置进行就餐。
联系餐厅:提供联系餐厅的方式,如电话、地址等,方便用户进行沟通和预订。
我的账户:用户可以查看个人账户的基本信息和订单记录,管理个人点餐记录和信息。
个人首页:显示用户的个人信息概览,如姓名、联系方式等。
菜品订单:用户可以查看已下的菜品订单、订单状态等详情。
座位预约:用户可以预约餐厅的座位,选择就餐时间和位置。
联系餐厅:提供直接联系餐厅的方式,方便用户进行沟通和预订。
订单配送:用户可以查看订单配送情况,如订单状态、送达时间等信息。
收藏:用户可以收藏喜欢的菜品或餐厅,方便后续查看和点餐。
2. 管理员功能:
登录:管理员需要通过用户名和密码进行登录,以获取管理员权限。
后台首页:提供系统运行状态、重要数据统计、快捷导航等功能,以便管理员快速了解系统运行情况。
系统用户:管理员可以对系统用户进行管理,包括添加、删除、修改用户信息等操作。
菜品订单管理:管理员可以管理菜品订单信息,包括查看订单状态、处理异常订单、统计销售数据等。
座位信息管理:管理员可以管理餐厅的座位信息,包括座位数量、位置分布等。
座位预约管理:管理员可以管理座位预约情况,包括审核预约请求、调整座位安排等。
联系餐厅管理:管理员可以处理用户的联系请求,包括电话、邮件等方式的联系。
轮播图:管理员可以管理网站首页的轮播图内容,更新和编辑相关信息。
公告消息:管理员可以发布重要的系统公告和消息,通知用户相关重要信息。
留言管理:管理员可以管理用户在留言板上的留言,包括审核、回复等操作。
餐品资讯:管理员可以管理系统中发布的餐品资讯内容,包括添加、删除、编辑资讯内容等操作。
资讯分类:管理员可以管理餐品资讯的分类信息,包括添加、删除、编辑资讯分类等操作。
菜品商城:管理员可以管理商城的菜品信息、库存等内容,确保菜品的正常供应。
分类列表:管理员可以管理菜品的分类信息,包括添加、删除、编辑分类等操作。
订单列表:管理员可以查看和管理菜品订单列表,包括订单状态、交易情况等。
2.3用例分析
餐厅点餐系统的完整UML用例图分别是图2-1,图2-2。在参与者上包括普通用户、管理员。
普通用户角色的用例包括首页、公告消息、餐品资讯、留言板、菜品商城、 商城管理、座位信息、联系餐厅、我的账户、个人中心(个人首页、菜品订单、座位预约、联系餐厅、订单配送、收藏)。
图2-1 餐厅点餐系统普通用户角色用例图
管理员角色的用例包括后台首页、系统用户、菜品订单管理、座位信息管理、座位预约管理、联系餐厅管理、系统管理、留言管理、公告消息管理、资源管理、商城管理。
图2-2 餐厅点餐系统管理员角色用例图
2.4 业务流程分析
2.4.1登录流程
登录模块主要满足管理员以及用户的权限登录,用户登录流程图如图2-3所示。
图2-3 登录流程图
2.4.2注册流程
未有账号的用户可进入注册界面进行注册操作,用户注册流程图如图2-4所示。
图2-4 注册流程图
2.4.3添加信息流程
用户在添加信息时,信息编号自动生成,系统会对添加的信息进行验证,验证通过则添加至数据库,添加信息成功,反之添加失败。添加信息流程如图2-5所示。
图2-5 添加信息流程图
2.4.4删除信息流程
用户可选择要删除的信息进行信息删除操作,在删除信息时系统提示是否确定删除信息,是则删除信息成功,系统数据库将信息进行删除。删除信息流程图如图2-6所示。
图2-6删除信息流程图
3 系统总体设计
在上一章节中分析了餐厅点餐系统的功能性需求,并且根据需求分析了餐厅点餐系统中的用例。那么接下来就要开始对餐厅点餐系统架构、主要功能和数据库开始进行设计。
3.1系统功能模块设计
通过对餐厅点餐系统的功能需求分析以及用例分析,得出了餐厅点餐系统的功能模块图如图3-1所示。
3.2数据库设计
3.2.1 数据库E-R模型
下面是整个餐厅点餐系统的数据库表的E-R实体关系图,如图3-2所示:
3.2.2 数据库表设计
通过上一小节中餐厅点餐系统中总E-R关系图上得出一共需要创建很多个数据表。在此主要罗列几个主要的数据库表结构设计。
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | token_id | int | 10 | 0 | N | Y | 临时访问牌ID | |
2 | token | varchar | 64 | 0 | Y | N | 临时访问牌 | |
3 | info | text | 65535 | 0 | Y | N | ||
4 | maxage | int | 10 | 0 | N | N | 2 | 最大寿命:默认2小时 |
5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
7 | user_id | int | 10 | 0 | N | N | 0 | 用户编号: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | address_id | int | 10 | 0 | N | Y | 收货地址: | |
2 | name | varchar | 32 | 0 | Y | N | 姓名: | |
3 | phone | varchar | 13 | 0 | Y | N | 手机: | |
4 | postcode | varchar | 8 | 0 | Y | N | 邮编: | |
5 | address | varchar | 255 | 0 | N | N | 地址: | |
6 | user_id | mediumint | 8 | 0 | N | N | 用户ID:[0,8388607]用户获取其他与用户相关的数据 | |
7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
9 | default | bit | 1 | 0 | N | N | 0 | 默认判断 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | article_id | mediumint | 8 | 0 | N | Y | 文章id:[0,8388607] | |
2 | title | varchar | 125 | 0 | N | Y | 标题:[0,125]用于文章和html的title标签中 | |
3 | type | varchar | 64 | 0 | N | N | 0 | 文章分类:[0,1000]用来搜索指定类型的文章 |
4 | hits | int | 10 | 0 | N | N | 0 | 点击数:[0,1000000000]访问这篇文章的人次 |
5 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
6 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
7 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
8 | source | varchar | 255 | 0 | Y | N | 来源:[0,255]文章的出处 | |
9 | url | varchar | 255 | 0 | Y | N | 来源地址:[0,255]用于跳转到发布该文章的网站 | |
10 | tag | varchar | 255 | 0 | Y | N | 标签:[0,255]用于标注文章所属相关内容,多个标签用空格隔开 | |
11 | content | longtext | 2147483647 | 0 | Y | N | 正文:文章的主体内容 | |
12 | img | varchar | 255 | 0 | Y | N | 封面图 | |
13 | description | text | 65535 | 0 | Y | N | 文章描述 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | type_id | smallint | 5 | 0 | N | Y | 分类ID:[0,10000] | |
2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000]决定分类显示的先后顺序 |
3 | name | varchar | 16 | 0 | N | N | 分类名称:[2,16] | |
4 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
5 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该分类的作用 | |
6 | icon | text | 65535 | 0 | Y | N | 分类图标: | |
7 | url | varchar | 255 | 0 | Y | N | 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 | |
8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | auth_id | int | 10 | 0 | N | Y | 授权ID: | |
2 | user_group | varchar | 64 | 0 | Y | N | 用户组: | |
3 | mod_name | varchar | 64 | 0 | Y | N | 模块名: | |
4 | table_name | varchar | 64 | 0 | Y | N | 表名: | |
5 | page_title | varchar | 255 | 0 | Y | N | 页面标题: | |
6 | path | varchar | 255 | 0 | Y | N | 路由路径: | |
7 | position | varchar | 32 | 0 | Y | N | 位置: | |
8 | mode | varchar | 32 | 0 | N | N | _blank | 跳转方式: |
9 | add | tinyint | 3 | 0 | N | N | 1 | 是否可增加: |
10 | del | tinyint | 3 | 0 | N | N | 1 | 是否可删除: |
11 | set | tinyint | 3 | 0 | N | N | 1 | 是否可修改: |
12 | get | tinyint | 3 | 0 | N | N | 1 | 是否可查看: |
13 | field_add | text | 65535 | 0 | Y | N | 添加字段: | |
14 | field_set | text | 65535 | 0 | Y | N | 修改字段: | |
15 | field_get | text | 65535 | 0 | Y | N | 查询字段: | |
16 | table_nav_name | varchar | 500 | 0 | Y | N | 跨表导航名称: | |
17 | table_nav | varchar | 500 | 0 | Y | N | 跨表导航: | |
18 | option | text | 65535 | 0 | Y | N | 配置: | |
19 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
20 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | cart_id | int | 10 | 0 | N | Y | 购物车ID: | |
2 | title | varchar | 64 | 0 | Y | N | 标题: | |
3 | img | varchar | 255 | 0 | N | N | 0 | 图片: |
4 | user_id | int | 10 | 0 | N | N | 0 | 用户ID: |
5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
7 | state | int | 10 | 0 | N | N | 0 | 状态:使用中,已失效 |
8 | price | double | 9 | 2 | N | N | 0.00 | 单价: |
9 | price_ago | double | 9 | 2 | N | N | 0.00 | 原价: |
10 | price_count | double | 11 | 2 | N | N | 0.00 | 总价: |
11 | num | int | 10 | 0 | N | N | 1 | 数量: |
12 | goods_id | mediumint | 8 | 0 | N | N | 商品id:[0,8388607] | |
13 | type | varchar | 64 | 0 | N | N | 未分类 | 商品分类: |
14 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]用于产品规格描述 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | collect_id | int | 10 | 0 | N | Y | 收藏ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 收藏人ID: |
3 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
4 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
5 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
6 | title | varchar | 255 | 0 | Y | N | 标题: | |
7 | img | varchar | 255 | 0 | Y | N | 封面: | |
8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | comment_id | int | 10 | 0 | N | Y | 评论ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 评论人ID: |
3 | reply_to_id | int | 10 | 0 | N | N | 0 | 回复评论ID:空为0 |
4 | content | longtext | 2147483647 | 0 | Y | N | 内容: | |
5 | nickname | varchar | 255 | 0 | Y | N | 昵称: | |
6 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
9 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
10 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
11 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
表contact_the_restaurant (联系餐厅)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | contact_the_restaurant_id | int | 10 | 0 | N | Y | 联系餐厅ID | |
2 | regular_users | int | 10 | 0 | Y | N | 0 | 普通用户 |
3 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
4 | contact_time | datetime | 19 | 0 | Y | N | 联系时间 | |
5 | user_information | text | 65535 | 0 | Y | N | 用户信息 | |
6 | reply_to_message | text | 65535 | 0 | Y | N | 回复信息 | |
7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | dish_mall_id | int | 10 | 0 | N | Y | 菜品商城ID | |
2 | purchase_notice | varchar | 64 | 0 | Y | N | 购买须知 | |
3 | cart_title | varchar | 125 | 0 | Y | N | 标题:[0,125]用于产品html的标签中 | |
4 | cart_img | text | 65535 | 0 | Y | N | 封面图:用于显示于产品列表页 | |
5 | cart_description | varchar | 255 | 0 | Y | N | 描述:[0,255]用于产品规格描述 | |
6 | cart_price_ago | double | 8 | 2 | N | N | 0.00 | 原价:[1] |
7 | cart_price | double | 8 | 2 | N | N | 0.00 | 卖价:[1] |
8 | cart_inventory | int | 10 | 0 | N | N | 0 | 商品库存 |
9 | cart_type | varchar | 64 | 0 | N | N | 未分类 | 商品分类: |
10 | cart_content | longtext | 2147483647 | 0 | Y | N | 正文:产品的主体内容 | |
11 | cart_img_1 | text | 65535 | 0 | Y | N | 主图1: | |
12 | cart_img_2 | text | 65535 | 0 | Y | N | 主图2: | |
13 | cart_img_3 | text | 65535 | 0 | Y | N | 主图3: | |
14 | cart_img_4 | text | 65535 | 0 | Y | N | 主图4: | |
15 | cart_img_5 | text | 65535 | 0 | Y | N | 主图5: | |
16 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
17 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | dish_orders_id | int | 10 | 0 | N | Y | 菜品订单ID | |
2 | dish_name | varchar | 64 | 0 | Y | N | 菜品名称 | |
3 | type_of_dishes | varchar | 64 | 0 | Y | N | 菜品类型 | |
4 | price_of_dishes | int | 10 | 0 | Y | N | 0 | 菜品价格 |
5 | purchasing_users | int | 10 | 0 | Y | N | 0 | 购买用户 |
6 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
7 | user_phone_number | varchar | 64 | 0 | Y | N | 用户电话 | |
8 | user_address | varchar | 64 | 0 | Y | N | 用户地址 | |
9 | purchase_quantity | int | 10 | 0 | Y | N | 0 | 购买数量 |
10 | purchase_date | date | 10 | 0 | Y | N | 购买日期 | |
11 | purchase_amount | varchar | 64 | 0 | Y | N | 购买金额 | |
12 | order_category | varchar | 64 | 0 | Y | N | 订单类别 | |
13 | order_number | varchar | 64 | 0 | Y | N | 订单号码 | |
14 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
15 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | goods_id | mediumint | 8 | 0 | N | Y | 产品id:[0,8388607] | |
2 | title | varchar | 125 | 0 | Y | N | 标题:[0,125]用于产品和html的<title>标签中 | |
3 | img | text | 65535 | 0 | Y | N | 封面图:用于显示于产品列表页 | |
4 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]用于产品规格描述 | |
5 | price_ago | double | 8 | 2 | N | N | 0.00 | 原价:[1] |
6 | price | double | 8 | 2 | N | N | 0.00 | 卖价:[1] |
7 | sales | int | 10 | 0 | N | N | 0 | 销量:[0,1000000000] |
8 | inventory | int | 10 | 0 | N | N | 0 | 商品库存 |
9 | type | varchar | 64 | 0 | N | N | 商品分类: | |
10 | hits | int | 10 | 0 | N | N | 0 | 点击量:[0,1000000000]访问这篇产品的人次 |
11 | content | longtext | 2147483647 | 0 | Y | N | 正文:产品的主体内容 | |
12 | img_1 | text | 65535 | 0 | Y | N | 主图1: | |
13 | img_2 | text | 65535 | 0 | Y | N | 主图2: | |
14 | img_3 | text | 65535 | 0 | Y | N | 主图3: | |
15 | img_4 | text | 65535 | 0 | Y | N | 主图4: | |
16 | img_5 | text | 65535 | 0 | Y | N | 主图5: | |
17 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
18 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
19 | customize_field | text | 65535 | 0 | Y | N | 自定义字段 | |
20 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
21 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
22 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
23 | user_id | int | 10 | 0 | Y | N | 0 | 添加人 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | type_id | int | 10 | 0 | N | Y | 商品分类ID: | |
2 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
3 | name | varchar | 255 | 0 | Y | N | 商品名称: | |
4 | desc | varchar | 255 | 0 | Y | N | 描述: | |
5 | icon | varchar | 255 | 0 | Y | N | 图标: | |
6 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
7 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | hits_id | int | 10 | 0 | N | Y | 点赞ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | logistics_delivery_id | int | 10 | 0 | N | Y | 物流配送ID | |
2 | order_number | varchar | 64 | 0 | Y | N | 订单号 | |
3 | product_name | varchar | 64 | 0 | Y | N | 商品名称 | |
4 | purchase_quantity | varchar | 64 | 0 | Y | N | 购买数量 | |
5 | total_transaction_amount | double | 11 | 2 | Y | N | 0.00 | 交易总额 |
6 | the_date_of_issuance | date | 10 | 0 | Y | N | 发货日期 | |
7 | delivery_number | varchar | 30 | 0 | Y | N | 配送订单 | |
8 | ordinary_users | int | 10 | 0 | Y | N | 0 | 普通用户 |
9 | shipping_address | varchar | 64 | 0 | Y | N | 收货地址 | |
10 | delivery_status | varchar | 64 | 0 | Y | N | 配送状态 | |
11 | signing_status | varchar | 64 | 0 | Y | N | 签收状态 | |
12 | recommend | int | 10 | 0 | N | N | 0 | 智能推荐 |
13 | contact_name | varchar | 255 | 0 | Y | N | 联系人名字 | |
14 | merchant_id | int | 10 | 0 | Y | N | 商家id | |
15 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
16 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | message_id | int | 10 | 0 | N | Y | 留言板ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 用户ID: |
3 | title | varchar | 64 | 0 | Y | N | 标题: | |
4 | content | longtext | 2147483647 | 0 | N | N | 内容: | |
5 | nickname | varchar | 32 | 0 | N | N | 昵称: | |
6 | avatar | varchar | 255 | 0 | Y | N | 头像: | |
7 | | varchar | 125 | 0 | Y | N | 留言者邮箱 | |
8 | phone | varchar | 11 | 0 | Y | N | 留言者手机号码 | |
9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
11 | reply | longtext | 2147483647 | 0 | Y | N | 回复 | |
12 | reply_state | tinyint | 4 | 0 | Y | N | 0 | 回复状态 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | notice_id | mediumint | 8 | 0 | N | Y | 公告id: | |
2 | title | varchar | 125 | 0 | N | N | 标题: | |
3 | content | longtext | 2147483647 | 0 | Y | N | 正文: | |
4 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
5 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | order_id | int | 10 | 0 | N | Y | 订单ID: | |
2 | order_number | varchar | 64 | 0 | Y | N | 订单号: | |
3 | goods_id | mediumint | 8 | 0 | N | N | 商品id:[0,8388607] | |
4 | title | varchar | 32 | 0 | Y | N | 商品标题: | |
5 | img | varchar | 255 | 0 | Y | N | 商品图片: | |
6 | price | double | 10 | 2 | N | N | 0.00 | 价格: |
7 | price_ago | double | 10 | 2 | N | N | 0.00 | 原价: |
8 | num | int | 10 | 0 | N | N | 1 | 数量: |
9 | price_count | double | 8 | 2 | N | N | 0.00 | 总价: |
10 | norms | varchar | 255 | 0 | Y | N | 规格: | |
11 | type | varchar | 64 | 0 | N | N | 未分类 | 商品分类: |
12 | contact_name | varchar | 32 | 0 | Y | N | 联系人姓名: | |
13 | contact_email | varchar | 125 | 0 | Y | N | 联系人邮箱: | |
14 | contact_phone | varchar | 11 | 0 | Y | N | 联系人手机: | |
15 | contact_address | varchar | 255 | 0 | Y | N | 收件地址: | |
16 | postal_code | varchar | 9 | 0 | Y | N | 邮政编码: | |
17 | user_id | int | 10 | 0 | N | N | 0 | 买家ID: |
18 | merchant_id | mediumint | 8 | 0 | N | N | 0 | 商家ID: |
19 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
20 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
21 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]用于产品规格描述 | |
22 | state | varchar | 16 | 0 | N | N | 待付款 | 订单状态:待付款,待发货,待签收,已签收,待退款,已退款,已拒绝,已完成 |
23 | remark | text | 65535 | 0 | Y | N | 订单备注 | |
24 | delivery_state | varchar | 16 | 0 | Y | N | 未配送 | 发货状态:未配送,已配送 |
25 | vip_discount | double | 11 | 2 | Y | N | 0.00 | 折扣 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | praise_id | int | 10 | 0 | N | Y | 点赞ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
8 | status | bit | 1 | 0 | N | N | 1 | 点赞状态:1为点赞,0已取消 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | regular_users_id | int | 10 | 0 | N | Y | 普通用户ID | |
2 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
3 | user_gender | varchar | 64 | 0 | Y | N | 用户性别 | |
4 | user_age | varchar | 64 | 0 | Y | N | 用户年龄 | |
5 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
6 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | seat_information_id | int | 10 | 0 | N | Y | 座位信息ID | |
2 | seat_number | varchar | 64 | 0 | Y | N | 座位编号 | |
3 | number_of_seats | int | 10 | 0 | Y | N | 0 | 座位数量 |
4 | seat_position | varchar | 64 | 0 | Y | N | 座位位置 | |
5 | seat_image | varchar | 255 | 0 | Y | N | 座位图片 | |
6 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
7 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | seat_reservation_id | int | 10 | 0 | N | Y | 座位预约ID | |
2 | seat_number | varchar | 64 | 0 | Y | N | 座位编号 | |
3 | number_of_seats | int | 10 | 0 | Y | N | 0 | 座位数量 |
4 | seat_position | varchar | 64 | 0 | Y | N | 座位位置 | |
5 | regular_users | int | 10 | 0 | Y | N | 0 | 普通用户 |
6 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
7 | user_phone_number | varchar | 64 | 0 | Y | N | 用户电话 | |
8 | appointment_time | datetime | 19 | 0 | Y | N | 预约时间 | |
9 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | slides_id | int | 10 | 0 | N | Y | 轮播图ID: | |
2 | title | varchar | 64 | 0 | Y | N | 标题: | |
3 | content | varchar | 255 | 0 | Y | N | 内容: | |
4 | url | varchar | 255 | 0 | Y | N | 链接: | |
5 | img | varchar | 255 | 0 | Y | N | 轮播图: | |
6 | hits | int | 10 | 0 | N | N | 0 | 点击量: |
7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | upload_id | int | 10 | 0 | N | Y | 上传ID | |
2 | name | varchar | 64 | 0 | Y | N | 文件名 | |
3 | path | varchar | 255 | 0 | Y | N | 访问路径 | |
4 | file | varchar | 255 | 0 | Y | N | 文件路径 | |
5 | display | varchar | 255 | 0 | Y | N | 显示顺序 | |
6 | father_id | int | 10 | 0 | Y | N | 0 | 父级ID |
7 | dir | varchar | 255 | 0 | Y | N | 文件夹 | |
8 | type | varchar | 32 | 0 | Y | N | 文件类型 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | user_id | mediumint | 8 | 0 | N | Y | 用户ID:[0,8388607]用户获取其他与用户相关的数据 | |
2 | state | smallint | 5 | 0 | N | N | 1 | 账户状态:[0,10](1可用|2异常|3已冻结|4已注销) |
3 | user_group | varchar | 32 | 0 | Y | N | 所在用户组:[0,32767]决定用户身份和权限 | |
4 | login_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 上次登录时间: |
5 | phone | varchar | 11 | 0 | Y | N | 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时 | |
6 | phone_state | smallint | 5 | 0 | N | N | 0 | 手机认证:[0,1](0未认证|1审核中|2已认证) |
7 | username | varchar | 16 | 0 | N | N | 用户名:[0,16]用户登录时所用的账户名称 | |
8 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
9 | password | varchar | 64 | 0 | N | N | 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成 | |
10 | | varchar | 64 | 0 | Y | N | 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时 | |
11 | email_state | smallint | 5 | 0 | N | N | 0 | 邮箱认证:[0,1](0未认证|1审核中|2已认证) |
12 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
13 | open_id | varchar | 255 | 0 | Y | N | 针对获取用户信息字段 | |
14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
15 | vip_level | varchar | 255 | 0 | Y | N | 会员等级 | |
16 | vip_discount | double | 11 | 2 | Y | N | 0.00 | 会员折扣 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | group_id | mediumint | 8 | 0 | N | Y | 用户组ID:[0,8388607] | |
2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000] |
3 | name | varchar | 16 | 0 | N | N | 名称:[0,16] | |
4 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该用户组的特点或权限范围 | |
5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
8 | register | smallint | 5 | 0 | Y | N | 0 | 注册位置: |
9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
4 系统实现
餐厅点餐系统主要是根据前面的需求分析和总体设计来设计页面并实现业务逻辑。主要从界面实现、业务逻辑实现这两部分进行介绍。
4.1 普通用户功能模块
4.1.1 用户注册界面
不是餐厅点餐系统的用户可以通过在线进行注册,填写上自己的账号、密码、重复密码、昵称、邮箱登信息后点击“提交”按钮后将会验证是否有非空数据,再验证密码和重复密码是否一样,最后验证是否账号重复,都验证没问题后即可注册成功。注册实现了用户注册和发布者注册两部分,其用户注册界面展示如下图4-1所示。
图4-1用户注册界面图
注册逻辑代码如下:
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));
query.put("username",user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
4.1.2 用户登录界面
餐厅点餐系统上注册后的用户可以通过自己的用户名和密码进行登录,在用户填写好自己的用户名和密码信息并点击“登录”按钮后,将会先验证是否有非空数据,再验证填写的用户信息和数据库中保存的是否一致,一致后将会登录成功,登录成功后将会在左上角上显示用户信息;否则将会提示相应错误信息,用户登录界面如下图4-2所示。
图4-2用户登录界面图
登录的逻辑代码如下所示。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
Duration duration = Duration.ofSeconds(7200L);
redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
输入有效的用户名和密码信息,点击“登录”按钮,自动跳转到“首页”页面,首页界面如下图4-3所示。
图4-3首页界面图
4.1.3 菜品商城界面
当用户点击“菜品商城”这一菜单按钮,会显示管理员在后台发布的所有的菜品信息,支持通过关键词对菜品进行搜索,选择需要的菜品信息点击可以进入到菜品信息详细的介绍界面,同时可以进行购买,菜品商城界面如下图4-4所示。
图4-4菜品商城详情界面图
4.1.4我的购物车界面
当用户浏览到心仪的商品时,可以将商品添加至购物车内,查看购物车列表,修改或者删除购物车。我的购物车界面如下图4-5所示。
图4-5我的购物车界面图
4.1.5我的订单界面
用户可以查看订单的详细信息,包括订单编号、下单时间、订单备注等,可以对订单进行支付。我的订单界面如下图4-6所示。
图4-6我的订单界面图
4.1.6我的地址界面
用户输入收货人、手机号及详细地址可以对收货地址进行添加。我的地址界面如下图4-7所示。
图4-7我的地址界面图
4.1.7 座位信息界面
点击“座位信息”,用户可以查看餐厅的座位信息,预约或选择位置进行就餐。界面如下图4-8所示。
图4-8座位信息界面图
4.2管理员模块
4.2.1 系统用户界面
管理员点击“系统用户”这一菜单会显示管理员、普通用户这两个子菜单,管理员可以对这两个角色的信息进行增删改查操作。界面如下图4-9所示。
图4-9系统用户管理界面图
系统用户管理界面逻辑代码如下:
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
}
4.2.2菜品订单管理界面
管理员点击后台左边的“菜品订单管理”菜单后,管理员可以管理菜品订单信息,包括查看菜品价格、菜品名称、购买用户、用户电话、用户地址、订单状态、处理异常订单等。可以添加新的菜品订单。菜品订单管理界面如下图4-10和4-11所示。
图4-10菜品订单列表界面图
图4-11菜品订单添加界面图
4.2.3座位预约管理界面
管理员点击后台左边的“座位预约管理”菜单后,管理员可以管理座位预约情况,包括审核预约请求、调整座位安排等。座位预约管理界面如下图4-12所示。
图4-12座位预约管理界面图
4.2.4系统管理界面
管理员点击“系统管理”这一菜单会显示轮播图这一个子菜单,管理员可以对前台展示的轮播图进行设置,界面如下图4-13所示。
轮播图添加代码如下:
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
log.info("进入方法");
if (file.isEmpty()) {
return error(30000, "没有选择文件");
}
try {
//判断有没路径,没有则创建
String filePath = System.getProperty("user.dir") + "/src/main/resources/static/";
File targetDir = new File(filePath);
if (!targetDir.exists() && !targetDir.isDirectory()) {
if (targetDir.mkdirs()) {
log.info("创建目录成功");
} else {
log.error("创建目录失败");
}
}
String fileName = file.getOriginalFilename();
File dest = new File(filePath + fileName);
log.info("文件路径:{}", dest.getPath());
log.info("文件名:{}", dest.getName());
file.transferTo(dest);
JSONObject jsonObject = new JSONObject();
jsonObject.put("url", "/api/upload/" + fileName);
return success(jsonObject);
} catch (IOException e) {
log.info("上传失败:{}", e.getMessage());
}
return error(30000, "上传失败");
}
4.2.5公告消息管理界面
点击“公告消息管理”这个菜单,可以查看到系统中所有添加的通知公告,支持通过标题对通知公告进行查询,添加、删除等操作。公告消息管理界面如下图4-14所示。
图4-14公告消息管理界面图
4.2.6订单列表界面
管理员点击后台左边的“订单列表”菜单,可以查看所以有订单信息,包括商品名称、订单号、商品图片、价格 、原价、买家、总价、订单状态、买家、备注、创建时间等。还可以进行查询、重置和删除等操作。订单列表界面如下图4-15所示。
图4-15订单列表界面图
5 系统测试
5.1系统测试的目的
系统测试的目的是确保系统的功能完整、性能稳定,并验证系统是否符合预期的设计和需求。通过系统测试,可以发现和修复潜在的错误和缺陷,提高系统的质量和可靠性。同时,系统测试还可以评估系统在不同条件下的性能表现,包括并发性能、响应时间和容错能力等。通过全面的系统测试,可以确保系统在正式上线前达到高品质的状态。
5.2 系统测试用例
通过对用户登录功能、商品展示功能、商品添加功能、商品搜索功能以及密码修改功能进行了测试,测试如下表5-1、5-2、5-3、5-4、5-5所示。
测试用例编号 | 测试描述 | 预期结果 | 实际结果 | 是否通过 |
TC001 | 使用正确的用户名和密码进行登录 | 成功登录系统,跳转到用户首页 | 登录成功,跳转到用户首页 | 通过 |
TC002 | 使用不存在的用户名进行登录 | 显示错误提示信息:用户名不存在 | 显示错误提示信息:用户名不存在 | 通过 |
TC003 | 使用正确的用户名和错误的密码进行登录 | 显示错误提示信息:密码错误 | 显示错误提示信息:密码错误 | 通过 |
TC004 | 不输入用户名和密码直接点击登录按钮 | 显示错误提示信息:用户名和密码不能为空 | 显示错误提示信息:用户名和密码不能为空 | 通过 |
表5-2 商品展示功能测试表
测试用例编号 | 测试描述 | 预期结果 | 实际结果 | 是否通过 |
TC001 | 打开商品列表页面,检查是否能够正确展示商品 | 商品列表显示正确 | 商品列表显示正确 | 通过 |
TC002 | 点击商品详情查看按钮,检查是否能正常打开页面 | 商品详情页面显示正确 | 商品详情页面显示正确 | 通过 |
TC003 | 检查商品搜索功能 | 根据关键字搜索到相关商品并正确展示 | 根据关键字搜索到相关商品并正确展示 | 通过 |
表5-3 商品添加功能测试表
测试用例编号 | 测试描述 | 预期结果 | 实际结果 | 是否通过 |
TC001 | 使用合法的信息添加一个新商品 | 商品成功添加到系统 | 商品成功添加到系统 | 通过 |
TC002 | 使用已存在的商品名称添加一个新商品 | 显示错误提示信息:商品名称已存在 | 显示错误提示信息:商品名称已存在 | 通过 |
TC003 | 添加商品时不输入必填信息 | 显示错误提示信息:必填字段不能为空 | 显示错误提示信息:必填字段不能为空 | 通过 |
表5-4商品搜索功能测试表
测试用例编号 | 测试描述 | 预期结果 | 实际结果 | 是否通过 |
TC001 | 使用商品关键字进行搜索 | 搜索结果包含符合关键字的商品 | 搜索结果包含符合关键字的商品 | 通过 |
TC002 | 使用不存在的关键字进行搜索 | 搜索结果为空 | 搜索结果为空 | 通过 |
表5-5 密码修改功能测试表
测试用例编号 | 测试描述 | 预期结果 | 实际结果 | 是否通过 |
TC001 | 输入正确的原密码和新密码进行修改 | 密码成功修改 | 密码成功修改 | 通过 |
TC002 | 输入错误的原密码和新密码进行修改 | 显示错误提示信息:原密码错误 | 显示错误提示信息:原密码错误 | 通过 |
TC003 | 不输入原密码和新密码直接点击修改按钮 | 显示错误提示信息:密码不能为空 | 显示错误提示信息:密码不能为空 | 通过 |
5.3 系统测试结果
以上是对系统测试的一些典型测试用例的描述。通过这些测试,可以验证用户登录功能、商品展示功能、商品添加功能、商品搜索功能以及密码修改功能的正确性和稳定性。每个测试用例都有预期结果,并与实际结果进行对比,判断是否通过测试。通过全面的系统测试,可以确保系统的各项功能正常运行,并具备高质量的用户体验。
总结与展望
本次餐厅点餐系统的设计与实现,功能方面,通过功能模块图区分用户端与管理端各自的功能权限;数据库方面,数据库使用口碑较好的mysql进行数据的存储,开源的mysql等技术的使用,相对来说体积较小,服务稳定,减少系统开发成本费用,通过数据库表的E-R实体关系图建立了表单与表单之间的连接,区分不同的表单之间的关系,更好的完善数据库的内容;测试方面,通过测试用例检查餐厅点餐系统的设计缺陷和程序存在的错误,在系统测试阶段的过程中,出现了一些问题,例如,注册信息,没有规范用户在注册页面填写信息时输入两次密码,而导致后期登录错误,最后通过多次修改程序和测试解决了问题。最终经过不断的检测、修改,实现项目的稳定,达到了预期的设计效果。
系统整体的功能到达预期的效果,但页面的美化方面还是存在一些不足,例如:系统的图标过于简洁;wxss页面的渲染布局方面不够完善,人们在使用软件过程中,对某些功能不易找寻,针对此次项目产生的问题,日后将不断改进,使该项目更加完善。
参考文献
[1]徐豪.基于随机森林模型的推荐点餐系统设计与实现[D].兰州大学,2023.DOI:10.27204/d.cnki.glzhu.2023.002414.
[2]张芮绮.线上餐厅管理系统的设计[J].科技风,2023,(06):4-6.DOI:10.19392/j.cnki.1671-7341.202306002.
[3]宋晴,姚敦红.基于UML的餐厅点餐系统设计[J].信息与电脑(理论版),2020,32(13):87-88.
[4]倪自亮,智慧食堂点餐系统.内蒙古自治区,内蒙古赤那网络科技有限公司,2020-04-17.
[5]Suhendra R ,Takahashi R ,Agangi A , et al.Textural-compositional evolution of pyrite and metal remobilization during low-grade metamorphism of metapelite: Contribution to gold mineralization in the Luk Ulo Complex, Central Java, Indonesia[J].Ore Geology Reviews,2024,166105966-.
[6]Slameto ,Fahrudin E D ,Saputra W M .Effect of fertilizer composition and different varieties on yield, methane and nitrous oxide emission from rice field in East Java Indonesia[J].Frontiers in Agronomy,2024,6
[7]Hudalah D ,Octifanny Y ,Talitha T , et al.From Metropolitanization to Megaregionalization: Intentionality in the Urban Restructuring of Java’s North Coast, Indonesia[J].Journal of Planning Education and Research,2024,44(1):292-306.
[8]Handini E ,Hasenaka T ,Barber D N , et al.Systematics of slab-derived components in Central Java, Sunda Arc: Evidence for differential material transfer across the Southeast Asian convergent margin[J].Tectonophysics,2024,873230229-.
[9]王馗,吴勇灵.基于微信小程序的点餐系统设计与实现[J].现代信息科技,2023,7(22):30-35+39.DOI:10.19850/j.cnki.2096-4706.2023.22.007.
[10]苏兵.基于微服务的校园点餐系统后台的设计与实现[J].电脑与电信,2023,(11):23-28.DOI:10.15966/j.cnki.dnydx.2023.11.008.
[11]陈海燕,常莹,张燕宁.基于Android系统的校园点餐系统中不同数据存储方式的教学研究[J].电脑编程技巧与维护,2023,(09):57-60.DOI:10.16184/j.cnki.comprg.2023.09.012.
[12]曾慧群.基于Android的智慧点餐系统设计与实现[J].现代信息科技,2023,7(14):15-19.DOI:10.19850/j.cnki.2096-4706.2023.14.004.
[13]李志伟.基于Eclipse+SDK开发平台的无线点餐系统设计[J].信息与电脑(理论版),2023,35(12):125-128.
[14]叶梦君,焦冰.基于Linux的点餐系统的设计与实现[J].电脑知识与技术,2023,19(03):44-46+50.DOI:10.14004/j.cnki.ckt.2023.0153.
[15]刘德凤.酒店点餐系统的设计与实现[J].电子技术与软件工程,2022,(22):173-176.
[16]张彭飞.基于协同过滤的微信点餐推荐系统的设计与实现[D].吉林大学,2022.DOI:10.27162/d.cnki.gjlin.2022.007344.
[17]种倩倩,孙丽英,陈滨,等.基于微信小程序的点餐系统的设计与开发[J].电脑知识与技术,2022,18(19):66-69+73.DOI:10.14004/j.cnki.ckt.2022.1307.
[18]谷研硕,时振涛,孙申英,等.基于内容推荐算法的点餐系统的设计与实现[J].电脑知识与技术,2022,18(10):48-49.DOI:10.14004/j.cnki.ckt.2022.0815.
[19]王丽爱,周旭东,刘贤.基于MVC框架的手机点餐系统[J].电脑知识与技术,2022,18(05):76-78+84.DOI:10.14004/j.cnki.ckt.2022.0353.
[20]陈南平.基于SOA架构的移动Web点餐系统设计与实现[J].信息与电脑(理论版),2020,32(03):49-52.
致谢
至此论文结束,感谢您的阅读。首先,我要感谢我的父母对我的支持与理解,在两年的本科学习生活中,倾其所能的爱护我,使我能够心无旁骛,全心全意的投入到学习中;不断鼓励我,让我能够拥有不断前进的动力。其次还要感谢我的导师,感谢在这段时间给予我有效的建议,以至于我的毕设有了整体的设计思路,尽管我在实习期间很忙,论文撰写总是停停改改,但是导师依然十分负责,时不时的询问我的任务进展情况,跟进我的论文进度。在老师的帮助下,我逐步完成了自己的论文和程序,从导师身上也学习到很多知识,和经验,这些知识和经验令我受益匪浅。
此外,还要感谢我的同学,热心的解答了我在程序上遇到的问题,是他们在我编写程序过程中给了我很多的启发和感想,也帮助了我对于程序的调试和检测,让我受益良多。在这两年的时间里,我学会了许多专业的知识,还有老师们的谆谆教诲和同学们的帮助使我不断进步,能够做得更好;我也会不断给自己充电,不断突破,成为更好的自己。
最后向所有关心我、帮助我的老师及同学们表示衷心的感谢!
免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-
免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-
免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-