@TOC
springboot586一款基于BS的美食网站的设计与实现--论文
选题背景
由于互联网技术的快速发展,使得各部门都是以数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统也应运而生,其中,美食网站就是其中的重要组成部分[1]。
计算机技术出现之前人们使用的管理方法已无法满足现代人们的需求,即人工来完成美食的管理,这种方法存在着工作效率低以及保密性差,易出错等问题,同时还会生成大量的文本和数据,在检索数据时极大不便。而此次设计的美食网站,拥有对信息的快速检索、保存了大量的美食信息,具有信息系统保存的稳定性高和维护成本低等优点,对美食管理的工作效率也能提高。它不仅可以提高管理人员的工作效率,减少工作人员的负担,也可以使美食管理工作的质量得到保障,提高管理水平。
1.2 研究目的及意义
本课题的提出意在开发一个一款基于BS的美食网站的设计与实现,它的出发点必须是实用,操作简单,界面友好,让有用户需求的人群共享同一个信息渠道,实现用户的双方线上、线下互动。近年来,随着网络平台和电子媒体越来越深入的合作,用户获得资讯的速度越来越快。同时也能够在第一时间查询到想要的信息,因此给各用户带来了巨大的经济效益,互联网的出现本身存在的节省资源,提高工作效率以及它的庞大的市场需求等特点,用户也就越来越重视美食网站带来的便利。
1.3 研究的主要内容
作为一个美食的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计美食网站应达到以下目标:
(1)界面要美观友好,检索要快捷简易,数据存储要安全可靠;
(2)全面展示所有系统信息管理,并可推荐展示最新美食信息;
(3)便于用户快捷地进行美食信息查询;
(4)用户可以随时修改自己的基本资料;
(5)实现美食信息共享的功能;
2 平台开发相关技术
2.1 Java语言
java是一种面向对象的面向对象编程语言,它不仅吸收了C++语言的优点,而且摒弃了C++不可理解的多继承和指针的概念,所以Java语言功能强大,使用方便。JavaScript作为一种动态网页制作技术,jQuery提供了丰富而强大的脚本语言库支持。二者结合使用可以有效提高开发效率和质量。Java语言是静态面向对象编程语言的代表,是面向对象理论的优秀实现,使程序员能够优雅地思考复杂的编程。
Java是简单性的、面向对象、分布式、健壮性、安全性、平台独立、可移植性的、多线程、动态性的。它的应用使软件开发过程更加灵活,提高了软件质量,增强了软件可重用性。在当今网络技术迅速发展的情况下,Java已成为目前最流行的编程语言之一。Java是一种开源语言。Java可以编写桌面应用程序、Web应用程序、分布式系统、嵌入式系统应用程序等。
2.2 springboot框架
Spring Boot是由Pivotal团队提供的轻量级框架,其“开箱即用”及“约定优于配置”的策略可以使开发者全身心的投入到业务逻辑代码的编写中,极大地提高了软件开发项目的效率。相比于Spring框架而言,Spring Boot框架更加能够节省程序员配置XML的时间,Spring Boot项目允许开发者使用它的所有模块和开发功能,此外, Spring Boot内置了服务器,简化了开发者启用服务器的整体流程,Spring Boot还可以自动适配不同类型的数据库以满足用户快速连接后台数据库管理的需求,这极大地方便了用户快速搭建应用程序的实现过程。 2014年4月,Spring Boot 1.0.0发布,截止到2022年2月,发布的Spring Boot版本为Spring Boot 3.0.0-M1。在系统的设计与开发中,为了能够快速搭建软件后台服务的开发环境,从技术实现的难度以及平台开发的成本两个方面考虑,Spring Boot框架能够使开发者更关注平台功能的业务逻辑代码实现,可采用Spring Boot框架搭建系统为前端电子商城App提供数据服务。因此,本案例项目后台开发选择Spring Boot框架。
2.3 MySQL数据库
数据库在软件项目中扮演着操作管理数据的角色同时还能够保证数据的独立性、一致性和安全性,并为系统访问数据提供有效方式不仅如此数据库还能大大减少程序员开发程序时间。在日常能够接触实用的一般有两类数据库,一类是以(Oracle,DB2,SQL Server,MySQL )为代表的关系型数据库和以(NoSql、MongeDB)为代表的非关系型数据库,两类数据库各有各的优缺点。其中非关系型数据库又分为网络数据库和层级数据库。-网络数据库是指在计算机网络系统中应用数据库技术然后借助网络技术将存储于数据库中的大量信息及时发布出去;在成熟的数据库技术的帮助下,计算机网络实现了对网络中的各种数据的有效管理,用户与网络中的数据库数据交互也借此得以进行。IMS也是最早研制成功的数据库系统。关系数据结构、关系操作集合、关系完整性约束构成了关系模型。作为数据库另外一种区分方式的存储介质被大家分为磁盘和内存这 两种。例如:关系型数据库就存储在磁盘中,非关系型数据库则存储在内存中。典型的关系型数据库有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite。小型关系型数据库:Microsoft Access,SQLite;中型关系型数据库:SQL Server,Mysql;大型关系型数据库:Oracle,DB2。
大家常用的其他关系形数据库系统大多是MySQL AB公司开发的,其中MySQL也是由这家开发的,所应用的分布式数据库管理系统是客户机/服务器体系结构得益于此结构,而且用这个系统建造的数据库具有很强的适用性,用C和C++编写的系统让他拥有很强的适用性所以他可以在大部分操作系统上使用并能和php结合。不同的API函数针对不同的语言(C,C++,JAVA等)来处理不同数据;为了更好地支持多CPU多线程通过使用核心线程来实现;提供的存储机制分为事务和非事务存储机制;MySQL采用双重许可,不管是从MySQL AB公司获得正式的商业许可又或是许可条款下以免费软件或开放源码软件的方式使用MySQL软件都是被允许的。
MySQL作为数据库拥有很多优点,其中由于是开放源码,所以使用成本特别低,而它体积小的特点决定了速度快的特性。因此,My Sql具有开放性,多线程支持多种API,可跨数据库连接,国际化,数据库体积巨大等特点。简单的来说 ,MySql是一个开放的、快速的、多线程的、多用户的数据库服务器。
选用MySQL作为数据库的其中一个原因就是支持多线程,支持多线程的特点为利用系统资源提供了便捷并因此大大提高了系统运行速度和效率,而且连接数据库的方式多样包括但不局限于TCP/IP、ODBC和JDBC等途径;但是没有东西是完美无缺的,即便MySQL也如此,虽说它有着众多优点但其功能不够强大,规模也相对较小,无法应对大型数据哭的处理。但是对于本系统来说,选用MySQL作为数据库,其功能性能已绰绰有余,如果要进行二次开发的数据库表结构空间的扩展也是完全可行的。综上所述,MySQL是作为本系统数据库的最优选择。
2.4 B/S架构
B/S结构就是指系统客户端与服务器分离,客户端通过浏览器访问服务端进行操作[10]。
B/S结构目前广泛应用于绝大部分系统搭建中,这种结构摒弃C/S结构客户端服务端不分离的缺点,具有更多的优势:
(1)跨平台性:B/S的标准由标准化组织确立,适用于绝大多数的系统搭建,通用于应用之间。
(2)低维护成本:客户端和服务器端分离,减轻了两端的压力,尤其是客户端,对客户端设备,硬件、软件要求都比较低,并且系统需要升级或维护时,只需要在服务器端升级或维护就可以,使相应的费用减少。
3系统需求分析
在今天的社会生活中,互联网已经变得非常普遍和重要。充分利用互联网技术可以解决许多问题。目前,美食管理也面临着自身的问题。该系统能够很好地解决这些问题。系统中用户的数据在系统中非常关键,因此系统数据应该组织起来,因为数据是以某种格式存储的,而不是无序的。其概念是,它可以按照长期稳定的格式在计算机内存中共享。数据库管理系统主要用于保存、修改、添加索引数据和设置数据库。为了确保系统数据管理的顺利实施,一些有能力的处理器可以管理数据,而无需专业人员处理。创建数据表时,可以调整、重新组织和重建数据表中的数据,以确保数据的可靠性。在数据库系统设计中,MySQL主要用于实现数据的集中管理。各方面表现良好。
3.1 功能需求分析
本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的Spring Boot 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改,对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、订单管理等功能进行操作;
本管理系统的用例图根据角色权限进行分类,主要可分为管理员用例、用户用例和餐厅用例。
(1)管理员用例图
管理员用例图依据管理员的权限需求以及对系统的管理需求进行分析,主要包括了登录、个人信息修改,对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、订单管理等进行操作,管理员用例图如下所示:
图3-1 管理员用例图
(2)用户用例图
用户用例图根据用户的需求进行分析,包括登录注册、个人信息修改、美食文化管理等。用户用例图如下所示:
图3-2用户用例图
(3)餐厅用例图
餐厅用例图根据餐厅的需求进行分析,包括登录注册、个人信息修改、餐厅信息管理、美食信息管理、订单管理等。餐厅用例图如下所示:
图3-3餐厅用例图
3.2性能需求分析
系统的性能是指操作系统完成现有程序的有效性和稳定性和响应速度,操作系统完成一项任务,与系统本身的设计、路由、网络性能测试、设备使用等方面密切相关,如果任何一个环节出现问题,都会影响整个系统的性能。因此,需要对网络设置、系统运行、硬件组合、程序应用等方面进行全面检查,然后集中精力解决哪一部分的问题。
在程序的应用、系统的运行、硬件的组合、网络的设置等方面,对性能影响最大的就是程序的应用和系统的运行,因为这两个方面的问题如果不容易被发现,隐蔽性非常强。硬件的组合、网络设置只要有问题,一般都能立即发现。主要了解系统的运行性能运行思路,应用程序需要具体的问题也需要有具体的解决方案。
3.3 系统可行性分析
为了完成该系统,必须进行可行性分析。该制度的可行性关系到该制度的生存。分析其意义,该系统可以弥补美食管理模式的不足,通过系统减少工作量,提高管理者和用户的工作效率。这反映了更多的意义和价值。在系统完成后,分析具体的现实情况,看它是否能满足预期要求,并确定开始开发建设系统。从美食网站开发的建设、相关技术、操作、运行和社会等方面进行了可行性分析。
3.3.1 技术可行性
技术可行性是分析系统都需要用到哪些技术知识,语法是否规范标准,代码量多大,是否具有可移植性。系统使用java语言,在市面上有非常多成熟使用的案例,从技术角度是没有问题的,并且在学校的学习中对于这些技术就会有了一定的掌握,开发过类似的项目。
3.3.2 操作可行性
该系统具有体积小、占地少、能耗低等特点。学校电脑和校园网络均能满足需求。该系统具有操作简便、直观、易于操作的特点。操作简单,快速,只要经过简单的训练,就能让管理者使用。
因此,该系统不仅在操作上可行,而且在实际应用中也是可行的。
3.3.3运行可行性
运行可行性也可以说是系统可用性的体现,美食网站本身具有运行可行性的特点,其界面的设计清晰、功能权限分配合理、操作方便。本论文设计的是美食网站,通过技术的结合提出一套切实可行的解决方案。不同的用户接入之后不需要经过特殊的训练就可以运行到对应功能模块中。
3.3.4社会可行性
广义上讲,社会可行性包括道德方面、法律方面和社会方面,每一个方面都会影响制度的形成。这个系统是独立的,不具有任何信息传播的性质,更不涉及道德层面、法律层面;本系统也没有触发法,没有赌博、黄色等类型的信息,也符合国家法律,不会显示任何触发法信息;就社会而言,本系统是一个轻量级的美食网站,方便客户提供更好的服务。它将给人们带来快速有效的查询功能,也具有一定的贡献意义。总的来说,该系统在社会上也是可行的。
3.4系统流程图分析
流程图是用具体的图形符号和相应的线条来表示系统执行的整个过程。因为这种图可以很容易地描述系统的一系列过程,所以它的所有图形符号都是比较关键的,基本上一个图形符号可以表示一个过程的一个步骤。流程图不仅提供了一个比较完整、全面的实施过程,而且可以发现整个团队协同设计过程中可能存在的缺陷和不足,便于在后续过程中及时对系统进行修正和改进。
通过流程图可以对系统的需求和相关流程进行分析,可以详细细分为各个部分的设计。对于设计人员来说在开发过程中要能够以流程图为基础,能够快速的提高自己的逻辑思维,并且也能够指导后续的操作在系统设计中最重要的部分就是程序的设计,然后具体的编写程序,流程图是设计过程中的重要工具,下面是流程图的部分设计。
3.4.1 登录流程图
登录流程是该系统的第一个流程,登录的第一步是输入账号、密码登录,系统会验证账号与密码是否正确,正确时系统会判断账号类型再进入不同的后台;不正确时,会返回到登录的第一步,输入用户重新执行登录流程。该流程如图3-4所示。
图3-4登录流程图
3.4.2 添加新用户流程图
添加新用户的流程是先查询新用户名是否已存在,如已有该用户名,需重拟用户名并同时输入新用户的其它信息,添加新用户到数据库时会先验证数据是否完整,信息都正确且完整时,返回并刷新用户列表;信息不正确时,会返回输入信息的那一步。该流程如图3-5所示。
图3-5添加新用户流程图
4 系统软件的总体设计
4.1系统的基本要求
(1)功能要求:管理员可以管理自己的个人中心,对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、订单管理等进行管理 [3]。
(2)性能:可以准确无误的在不同的操作系统中登录到用户、餐厅或者管理员的相应界面进行轻松的操作[4]。
(3)环境要求:支持不同的操纵系统和不同的平台,可用于Windows系列、Vista系统等多种操作系统。
4.2 系统开发目标
本美食网站的主要开发目标如下:
(1)减少后台管理人员的工作量,对餐厅的信息进行系统的管理;
(2)必须要方便快捷的查看搜索信息并管理信息;
(3)用户是具有多样性的,所以界面要设置的简单明了,操作更要方便快捷。
4.3 系统总体架构设计
本系统使用的数据库为MySQL数据库[10],选择该数据库的原因是因为该数据库开源、免费,且相对简便,且由于使用人数众多,在处理问题上会得到更多已知的帮助。本系统作为一个美食网站,其体量并不会很大,也很适合MySQL数据库的特点。综上所述,本项目采用MySQL作为本项目的数据库和进行数据表的设计。
如图4-1是该系统软件的总体功能结构图:
图4-1 总体功能结构图
4.4 系统数据库的设计
4.4.1数据库设计原则
要学习程序设计,如果您想了解数据库管理系统或根据需要开发的系统接口,则必须创建一个数据库管理系统模型来存储数据。这样就不需要在应用程序编程期间将信息加载到操作系统页面中,从而提高了整个系统的效率。信息数据库管理系统中存储着大量的数据,可以说是管理信息系统建设的中心和基础。该信息库管理系统还提供了管理信息系统建设中添加、删除、修改和搜索的操作功能,使管理信息系统建设可以快速查询所需数据,而不是直接从程序代码中查找。信息库管理系统将信息表的各个组成部分按照具体的方法进行组合,准确地组合、分类并构成信息库管理系统。
4.4.2数据库E/R图
ER图是由实体及其关系构成的图,通过E/R图可以清楚地描述系统涉及到的实体之间的相互关系。在系统中对一些主要的几个关键实体如下图:
(1) 餐厅实体属性图如下所示:
图4-2餐厅实体属性图
(2) 餐厅信息实体属性图如下所示:
图4-3餐厅信息实体属性图
(3) 美食文化实体属性图如下所示:
图4-4美食文化实体属性图
(4) 美食信息实体属性图如下所示:
图4-5美食信息实体属性图
(5) 订单实体属性图如下所示:
图4-6订单实体属性图
4.4.3 数据库表
该系统采用的数据库是MySQL,根据该系统的数据存储特点进行数据库关系表的设计。下面是该系统中关键部分关系表的详细信息。
表4-1:美食信息评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
refid | bigint | 关联表id | |||
userid | bigint | 用户id | |||
avatarurl | longtext | 4294967295 | 头像 | ||
nickname | varchar | 200 | 用户名 | ||
content | longtext | 4294967295 | 评论内容 | ||
reply | longtext | 4294967295 | 回复内容 |
表4-2:美食文化评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
refid | bigint | 关联表id | |||
userid | bigint | 用户id | |||
avatarurl | longtext | 4294967295 | 头像 | ||
nickname | varchar | 200 | 用户名 | ||
content | longtext | 4294967295 | 评论内容 | ||
reply | longtext | 4294967295 | 回复内容 |
表4-3:餐厅信息评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
refid | bigint | 关联表id | |||
userid | bigint | 用户id | |||
avatarurl | longtext | 4294967295 | 头像 | ||
nickname | varchar | 200 | 用户名 | ||
content | longtext | 4294967295 | 评论内容 | ||
reply | longtext | 4294967295 | 回复内容 |
表4-4:购物车表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
tablename | varchar | 200 | 商品表名 | meishixinxi | |
userid | bigint | 用户id | |||
goodid | bigint | 商品id | |||
goodname | varchar | 200 | 商品名称 | ||
picture | longtext | 4294967295 | 图片 | ||
buynumber | int | 购买数量 | |||
price | float | 单价 | |||
discountprice | float | 会员价 | |||
cantingzhanghao | varchar | 200 | 商户名称 |
表4-5:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
表4-6:关于我们
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
subtitle | varchar | 200 | 副标题 | ||
content | longtext | 4294967295 | 内容 | ||
picture1 | longtext | 4294967295 | 图片1 | ||
picture2 | longtext | 4294967295 | 图片2 | ||
picture3 | longtext | 4294967295 | 图片3 |
表4-7:订单
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
orderid | varchar | 200 | 订单编号 | ||
tablename | varchar | 200 | 商品表名 | meishixinxi | |
userid | bigint | 用户id | |||
goodid | bigint | 商品id | |||
goodname | varchar | 200 | 商品名称 | ||
picture | longtext | 4294967295 | 商品图片 | ||
buynumber | int | 购买数量 | |||
price | float | 价格 | 0 | ||
discountprice | float | 折扣价格 | 0 | ||
total | float | 总价格 | 0 | ||
discounttotal | float | 折扣总价格 | 0 | ||
type | int | 支付类型 | 1 | ||
status | varchar | 200 | 状态 | ||
address | varchar | 200 | 地址 | ||
tel | varchar | 200 | 电话 | ||
consignee | varchar | 200 | 收货人 | ||
remark | varchar | 200 | 备注 | ||
logistics | longtext | 4294967295 | 物流 | ||
cantingzhanghao | varchar | 200 | 商户名称 |
表4-8:公告资讯
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-9:收藏表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
refid | bigint | 商品id | |||
tablename | varchar | 200 | 表名 | ||
name | varchar | 200 | 名称 | ||
picture | longtext | 4294967295 | 图片 | ||
type | varchar | 200 | 类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) | 1 | |
inteltype | varchar | 200 | 推荐类型 | ||
remark | varchar | 200 | 备注 |
表4-10:地址
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
address | varchar | 200 | 地址 | ||
name | varchar | 200 | 收货人 | ||
phone | varchar | 200 | 电话 | ||
isdefault | varchar | 200 | 是否默认地址[是/否] |
表4-11:美食信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
meishibianhao | varchar | 200 | 美食编号 | ||
meishimingcheng | varchar | 200 | 美食名称 | ||
caixifenlei | varchar | 200 | 菜系分类 | ||
meishizhaopian | longtext | 4294967295 | 美食照片 | ||
meishikouwei | varchar | 200 | 美食口味 | ||
meishixiangqing | longtext | 4294967295 | 美食详情 | ||
cantingzhanghao | varchar | 200 | 餐厅账号 | ||
cantingmingcheng | varchar | 200 | 餐厅名称 | ||
clicktime | datetime | 最近点击时间 | |||
reversetime | datetime | 倒计结束时间 | |||
clicknum | int | 点击次数 | 0 | ||
price | float | 价格 |
表4-12:美食文化
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
bianhao | varchar | 200 | 编号 | ||
biaoti | varchar | 200 | 标题 | ||
fengmian | longtext | 4294967295 | 封面 | ||
fabushijian | date | 发布时间 | |||
neirong | longtext | 4294967295 | 内容 | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-13:用户
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
mima | varchar | 200 | 密码 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
xingbie | varchar | 200 | 性别 | ||
yonghudianhua | varchar | 200 | 用户电话 | ||
touxiang | longtext | 4294967295 | 头像 | ||
money | float | 余额 | 0 |
表4-14:餐厅信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
cantingzhanghao | varchar | 200 | 餐厅账号 | ||
cantingmingcheng | varchar | 200 | 餐厅名称 | ||
cantingweizhi | varchar | 200 | 餐厅位置 | ||
cantingdianhua | varchar | 200 | 餐厅电话 | ||
cantingfengmian | longtext | 4294967295 | 餐厅封面 | ||
cantingxiangqing | longtext | 4294967295 | 餐厅详情 |
表4-15:餐厅
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
cantingzhanghao | varchar | 200 | 餐厅账号 | ||
mima | varchar | 200 | 密码 | ||
cantingmingcheng | varchar | 200 | 餐厅名称 | ||
cantingweizhi | varchar | 200 | 餐厅位置 | ||
cantingdianhua | varchar | 200 | 餐厅电话 | ||
cantingfengmian | longtext | 4294967295 | 餐厅封面 | ||
money | float | 余额 | 0 |
5 系统软件功能的具体实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
餐厅信息:在餐厅信息页面的输入栏中输入餐厅账号和餐厅名称进行查询,可以查看到餐厅详细信息,并根据需要进行评论或收藏操作;餐厅信息页面如图5-2所示:
图5-2餐厅信息详细页面
美食信息:在美食信息页面的输入栏中输入美食名称、餐厅账号和选择菜系分类进行查询,可以查看到美食详细信息,并根据需要进行添加到购物车、立即购买、评论或收藏操作;美食信息页面如图5-3所示:
图5-3美食信息详细页面
购物车:在购物车页面可以查看到商品名称、图片、价格、数量、总价等详细信息,并进行点击购买或删除操作,购物车页面如图5-4所示:
图5-4购物车详细页面
个人中心:在个人中心页面可以对个人中心、我的订单、我的地址和我的收藏进行详细操作;
我的订单:在我的订单页面可以对未支付、已支付、已发货、已完成、已退款和已取消订单进行详细操作;如图5-5所示:
图5-5我的订单界面
5.2后台模块实现
后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。
图5-6 后台登录界面
5.2.1管理员模块实现
管理员进入主页面,主要功能包括对个人中心、餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、订单管理等进行操作。管理员主页面如图5-7所示:
图5-7 管理员主界面
管理员点击餐厅管理。在餐厅页面输入餐厅账号和餐厅位置进行查询、新增或删除餐厅列表,并根据需要对餐厅详情信息进行详情、修改或删除操作;如图5-8所示:
图5-8餐厅管理界面
管理员点击用户管理。进入用户页面输入用户账号和选择性别进行查询、修改或删除用户列表,并根据需要对用户详细信息进行详情、修改或删除操作。如图5-9所示:
图5-9用户管理界面
管理员点击餐厅信息管理。在餐厅信息页面输入餐厅账号和餐厅名称进行查询或删除餐厅信息列表,并根据需要对餐厅详细信息进行详情、修改、查看评论或删除操作。如图5-10所示:
图5-10餐厅信息管理界面
管理员点击美食信息管理。在美食信息页面输入美食名称、餐厅账号和选择菜系分类进行查询或删除美食信息列表,并根据需要对美食信息详细信息进行详情、修改、查看评论或删除操作。如图5-11所示:
图5-11美食信息管理界面
管理员点击美食文化管理。在美食文化页面输入美食名称、材料和选择分类进行查询或删除美食文化列表,并根据需要对热门美食详细信息进行详情、修改、查看评论或删除操作。如图5-12所示:
图5-12美食文化管理界面
管理员点击系统管理。在公告资讯页面输入标题进行查询、新增或删除公告资讯列表,并根据需要对公告资讯详细信息进行详情、修改或删除操作;还可以对关于我们、系统简介和轮播图管理进行详细操作。如图5-13所示:
图5-13系统管理界面
5.2.2用户模块实现
用户进入系统可以对个人中心、美食文化管理等功能进行操作。用户主页面如图5-14所示:
图5-14用户主界面
用户点击美食文化管理。在美食文化页面输入标题、用户账号和选择是否通过进行查询、新增或删除美食文化列表,并根据需要对美食文化详细信息进行修改、查看评论或删除操作。如图5-15所示:
图5-15美食文化管理界面
5.2.3餐厅模块实现
餐厅进入系统可以对个人中心、餐厅信息管理、美食信息管理、订单管理等功能进行操作。餐厅主页面如图5-16所示:
图5-16 餐厅主界面
餐厅点击餐厅信息管理。在餐厅信息页面输入餐厅账号和餐厅名称行查询或、新增或删除餐厅信息列表,并根据需要对餐厅详细信息进行详情、修改、查看评论或删除操作。如图5-17所示:
图5-17餐厅信息管理界面
餐厅点击美食信息管理。在美食信息页面输入美食名称、餐厅账号和选择菜系分类进行查询、新增或删除美食信息列表,并根据需要对美食信息详细信息进行详情、修改、查看评论或删除操作。如图5-18所示:
图5-18美食信息管理界面
订单管理,在已支付订单页面可以对索引、订单编号、商品名称、商品图片、购买数量、价格、折扣价格、总价格、折扣总价格、支付类型、状态、地址、电话、收货人、备注、商户名称、下单时间等内容进行详情、发货和删除等操作,还可对已完成订单、已发货订单、未支付订单、已取消订单、已退款订单进行相对应操作。如图5-19所示:
图5-19美食信息管理界面
系统测
DiscussmeishixinxiServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.DiscussmeishixinxiDao;
import com.entity.DiscussmeishixinxiEntity;
import com.service.DiscussmeishixinxiService;
import com.entity.vo.DiscussmeishixinxiVO;
import com.entity.view.DiscussmeishixinxiView;
@Service("discussmeishixinxiService")
public class DiscussmeishixinxiServiceImpl extends ServiceImpl<DiscussmeishixinxiDao, DiscussmeishixinxiEntity> implements DiscussmeishixinxiService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<DiscussmeishixinxiEntity> page = this.selectPage(
new Query<DiscussmeishixinxiEntity>(params).getPage(),
new EntityWrapper<DiscussmeishixinxiEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<DiscussmeishixinxiEntity> wrapper) {
Page<DiscussmeishixinxiView> page =new Query<DiscussmeishixinxiView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<DiscussmeishixinxiVO> selectListVO(Wrapper<DiscussmeishixinxiEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public DiscussmeishixinxiVO selectVO(Wrapper<DiscussmeishixinxiEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<DiscussmeishixinxiView> selectListView(Wrapper<DiscussmeishixinxiEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public DiscussmeishixinxiView selectView(Wrapper<DiscussmeishixinxiEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
DiscusscantingxinxiServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.DiscusscantingxinxiDao;
import com.entity.DiscusscantingxinxiEntity;
import com.service.DiscusscantingxinxiService;
import com.entity.vo.DiscusscantingxinxiVO;
import com.entity.view.DiscusscantingxinxiView;
@Service("discusscantingxinxiService")
public class DiscusscantingxinxiServiceImpl extends ServiceImpl<DiscusscantingxinxiDao, DiscusscantingxinxiEntity> implements DiscusscantingxinxiService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<DiscusscantingxinxiEntity> page = this.selectPage(
new Query<DiscusscantingxinxiEntity>(params).getPage(),
new EntityWrapper<DiscusscantingxinxiEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<DiscusscantingxinxiEntity> wrapper) {
Page<DiscusscantingxinxiView> page =new Query<DiscusscantingxinxiView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<DiscusscantingxinxiVO> selectListVO(Wrapper<DiscusscantingxinxiEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public DiscusscantingxinxiVO selectVO(Wrapper<DiscusscantingxinxiEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<DiscusscantingxinxiView> selectListView(Wrapper<DiscusscantingxinxiEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public DiscusscantingxinxiView selectView(Wrapper<DiscusscantingxinxiEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
StoreupController.java
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.StoreupEntity;
import com.entity.view.StoreupView;
import com.service.StoreupService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 收藏表
* 后端接口
* @author
* @email
* @date 2023-01-07 10:12:43
*/
@RestController
@RequestMapping("/storeup")
public class StoreupController {
@Autowired
private StoreupService storeupService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,StoreupEntity storeup,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,StoreupEntity storeup,
HttpServletRequest request){
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( StoreupEntity storeup){
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
ew.allEq(MPUtil.allEQMapPre( storeup, "storeup"));
return R.ok().put("data", storeupService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(StoreupEntity storeup){
EntityWrapper< StoreupEntity> ew = new EntityWrapper< StoreupEntity>();
ew.allEq(MPUtil.allEQMapPre( storeup, "storeup"));
StoreupView storeupView = storeupService.selectView(ew);
return R.ok("查询收藏表成功").put("data", storeupView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
StoreupEntity storeup = storeupService.selectById(id);
return R.ok().put("data", storeup);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
StoreupEntity storeup = storeupService.selectById(id);
return R.ok().put("data", storeup);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request){
storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(storeup);
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
storeupService.insert(storeup);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody StoreupEntity storeup, HttpServletRequest request){
storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(storeup);
storeupService.insert(storeup);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody StoreupEntity storeup, HttpServletRequest request){
//ValidatorUtils.validateEntity(storeup);
storeupService.updateById(storeup);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
storeupService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<StoreupEntity> wrapper = new EntityWrapper<StoreupEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
wrapper.eq("userid", (Long)request.getSession().getAttribute("userId"));
}
int count = storeupService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
IndexAside.vue
<template>
<el-aside class="index-aside" width="200px">
<div class="index-aside-inner">
<el-menu default-active="1">
<el-menu-item @click="menuHandler('/')" index="1">
<!-- <i class="el-icon-s-home"></i> -->
首页
</el-menu-item>
<sub-menu
v-for="menu in menuList"
:key="menu.menuId"
:menu="menu"
:dynamicMenuRoutes="dynamicMenuRoutes"
></sub-menu>
</el-menu>
</div>
</el-aside>
</template>
<script>
import SubMenu from "@/components/index/IndexAsideSub";
export default {
data() {
return {
menuList: [],
dynamicMenuRoutes: []
};
},
components: {
SubMenu
},
mounted() {
// 获取动态菜单数据并且渲染
this.menuList = JSON.parse(sessionStorage.getItem("menuList") || "[]");
this.dynamicMenuRoutes = JSON.parse(
sessionStorage.getItem("dynamicMenuRoutes") || "[]"
);
},
methods: {
menuHandler(path) {
this.$router.push({ path: path });
}
}
};
</script>
<style lang="scss" scoped>
.index-aside {
margin-top: 80px;
overflow: hidden;
.index-aside-inner {
width: 217px;
height: 100%;
overflow-y: scroll;
}
}
</style>