java-springboot外卖系统 基于SpringBoot的校园智慧点餐平台 面向中小商户的在线订餐与配送管理系统计算机毕业设计
本文介绍了一个基于Java SpringBoot框架的外卖系统毕业设计方案。该系统采用SpringBoot+MySQL技术栈,实现了从用户点餐到配送结算的完整业务流程。系统包含用户、餐厅、菜品、订单、支付等核心模块,支持多级菜品分类、促销活动、优惠券等功能。通过技术、操作、经济和法律四方面的可行性分析验证了项目的可行性,采用分层架构设计提高系统可维护性。系统实现了前后端分离开发,前端使用Vue框架
java-springboot外卖系统y5sm1y4x计算机毕业设计(配套有源码 程序 mysql数据库 论文)
本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。
午高峰一到,电话铃此起彼伏,手写单飞得满屋都是;骑手在店门口扎堆,堂食、外卖混为一锅粥。把“点餐-出餐-配送-结算”搬上云端,让顾客扫码就能下单、厨房按单顺序出菜、骑手一键接单导航、老板实时看营收,成为SpringBoot+MySQL技术栈里最接地气也最易落地的场景。系统围绕“菜品、订单、支付、库存、营销”五大核心,打通用户-餐厅-骑手三方闭环,功能清单如下:
-
用户:账号、姓名、头像、性别、手机号、余额、状态。
-
餐厅信息:名称、图片、联系人、电话、营业时间、地址、余额。
-
菜品分类:多级类目、图标、排序权重。
-
菜品信息:名称、图片、分类、推荐指数、口味、餐厅、单限、库存、评论数、价格、收藏数。
-
促销活动:同菜品结构,支持限时折扣、满减、买赠。
-
优惠券:名称、商户、面额、门槛、状态、有效期。
-
公告信息:分类、标题、简介、内容、点赞/收藏/点击。
-
公告信息评论:关联公告、头像、内容、回复。
-
菜品信息评论:星级评分、内容、回复。
-
促销活动评论:同上,支持活动晒图。
-
购物车:用户、菜品快照、数量、单价、小计。
-
订单:统一订单号、商品快照、数量、总价、优惠额、支付类型、状态、地址、电话、收货人、备注、退货审核、下单时间。
-
地址簿:收货人、电话、地址、默认标识。
-
收藏表:用户收藏菜品、餐厅、公告。
-
我的优惠券:领取时间、使用状态、适用商户。
-
客服聊天:用户提问、管理员回复、是否已读。
-
配置文件:轮播图、支付参数、配送费模板。
一句话总结:把“电话喊单”变成“数据跑单”,让每一道菜从点击支付到骑手送达全程在线,老板再也不用守着一叠小票算账。
注:以上是纯课题毕业设计功能介绍,并非实际开发完成,最终开发完成的毕业设计程序以下面的的环境软件、功能图和界面为准。
系统所需要的环境软件:idea、eclipse+mysql5.7、8.0+Navicat+JDK1.8+tomcat7.0
3 系统分析
3.1可行性分析
在开发系统以前,必须对系统开展可行性研究,目地是用有效的方法处理最大的问题。程序流程一旦开发出去满足用户的要求,便会产生许多益处。下面咱们就从技术性、操作、经济、法律等领域来挑选这一系统是不是会最后开发[9]。
3.1.1 技术可行性
本系统在技术层面使用Eclipse作为Java开发语言,后台管理系统使用了Spring Boot等开源框架,前端页面使用VUE,本系统选择MySQL数据库系统来开发完成本外卖系统。作为软件工程专业的学生,在大学开设的相关专业课程中都包含了这些技术,所以在系统开发技术及应用上都没有太大困难,因此系统开发在技术层面是完全可行的[10]。
3.1.2 操作可行性
外卖系统旨在为用户提供一个简单方便快捷的外卖系统。外卖系统的界面简洁,操作方便,即使是不具备很强的网络技术知识的用户也可以轻松使用。在管理员管理模块中,各项内容的管理操作界面也都简洁易懂的,实际操作也十分的简单。因此该系统具有可操作性[11]。
3.1.3 经济可行性
本项目所有功能的开发都是由本人独立完成,而且开发中使用的所有技术及工具也都开源的,易于学习和掌握的,所有省去了请专家开发指导的大笔费用,本系统的开发对计算机的软硬件的要求较低,因此这个系统在经济方面是完全可行的。
3.1.4 法律可行性
外卖系统属于自己设计的管理系统,因为这个系统在数据管理方面以及软件方面都是应用自己开发的开源代码,不存在模仿或盗用其他人的软件问题,是非常合法的[12]。
从上面给大家讲解的过程不难看出,外卖系统是一个全面优质的系统,我们开发的这个程序也是存在合法和必然性的,而且在技术方面也是过硬的,还节约了成本,难度不大,很适合用户进行操作。
3.2系统需求分析
本外卖系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户、餐厅信息和管理员这三者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优化界面,让用户、餐厅信息和管理员能使用环境更好的系统[13]。
对比要实现的功能来分析出用户的需求,可以让管理员在线对其进行添加、修改、查看、删除,这不仅提高管理员的工作效率,也满足了用户的需求,还大大的节省了时间。
本课题要求实现一套外卖系统,系统主要包括管理员模块和用户、餐厅信息模块。

图3-1管理员用例图
(2)用户用例图如下所示:

图3-2用户用例图
(3)餐厅信息用例图如下所示:

图3-3餐厅信息用例图
3.3其他系统需求分析
3.3.1性能要求
在开发了一个功能较为良好系统之后,首要考虑的就是它的性能要求,比如当用户使用它进行点击或提交功能时,它会产生多久的延迟,系统响应速度快不快,如果短时间同时有较多用户访问网站是否会产生系统崩溃,是否采用高并发接口,另外,存储功能进行中的代码量是否满足算法和数据结构,以及是否占用较大内存等:
(1)系统应具备快速的反映时间,对于并发特征得到解决。
(2)系统对用户密码是否进行了加密并进行大量安全处理。
(3)系统代码量是否简洁,不会占用计算机太多内存。
3.3.2安全要求
对于安全要求要进行可靠性分析,可靠性分析有利于可实现安全性、可靠 性设计与系统功能设计在数据源上的统一。就本系统的安全性能而言,数据的帐户和密码需要以明文形式显示,并严格加密。更改密码、修改个人数据、添加信息需要相应权限。用户点击业务信息,登录、用户登录信息、地址等都会被随时监控。
3.4 系统结构和流程设计
开发该系统主要选用了Spring Boot的架构设计,将主要表现层、业务逻辑层和数据访问层分离出来。表现层将请求的回应信息展现在java网页页面上便于客户访问,业务逻辑层负责获得并正确处理请求逻辑,确保SQL语句读取时取得成功或失败,数据访问层关键将数据信息拼写成SQL语句。由于分层次构造开展开发,可以使开发系统软件的耦合性减少,随后重用率提升,只在数据层对数据开展处理就可以了。随后由接口封装对象,业务层完成对系统的逻辑操作,在显示层展现和接受数据信息,用接口完成每个层间的数据信息的传送。实际操作的方法简洁明了,使体系能更快的运作。
操作流程需要进行设计,一个完整的系统可以流畅的操作下来是至关重要的,本系统的完整操作流程如图3-4所示:

图3-4系统操作流程图
本系统主要有管理员、用户、餐厅信息三种角色,进行登录时需要确保输入的内容与已经保存的账号信息一致,通过账户密码等方式来校验用户信息,输入正确则登入系统,输入错误则登入失败。系统登录流程,如图3-5所示:

图3-5系统登录流程图
在添加信息的时候,会判断是哪类用户,并根据用户类型判断执行是否合法,合法者可以进行添加,不合法者则不能进行此操作。管理员登录账号后可以对内容进行添加,拥有着最高的权限,用户、餐厅信息权限仅次于管理员。添加信息流程图如图3-6所示:

图3-6系统添加流程图
删除数据时与添加数据功能类似,删除数据具体流程如图3-7所示:

图3-7系统删除流程图
4系统设计
本次系统采用Spring Boot框架集进行开发,Spring Boot框架是一款企业界主流的软件开发框架,其简化了开发流程,大大缩减了软件开发所需的时间提高了软件的响应速度。系统基本结构图如图4-1所示。

图4-1 系统基本结构图
4.2 数据库设计
4.2.1 数据库实体
E-R图,即实体-联系图,它是一种通过对实例进行抽象,以可视化的方式来描述现实世界的概念模型。根据需求分析绘制出数据库的E-R图,能够直观地映射出各个表之间的关系。
用户信息包括;用户账号、用户姓名、头像、性别、手机号码、状态等信息,实体图如图4-2所示。

图4-2用户信息实体图
餐厅信息包括;餐厅名称、图片、联系人、联系电话、营业时间、餐厅地址等属性,实体图如图4-3所示。

图4-3餐厅信息实体图
菜品信息包括;零菜品名称、图片、菜品分类、推荐指数、口味、餐厅名称、餐厅地址、单限、库存、评论数、价格、收藏数等属性,如图4-4所示。

图4-4菜品信息实体图
促销活动包括菜品名称、图片、菜品分类、推荐指数、口味、餐厅名称、餐厅地址、单限、库存、评论数、价格、收藏数等属性,实体图如图4-5所示。

图4-5促销活动实体图
外卖系统总体E-R图 如图4-6所示:

图4-6外卖系统总体E-R图
5系统详细设计
5.1 前台用户功能模块
当用户打开系统的网址后,首先看到的就是首页界面。在这里,用户能够看到外卖系统的导航条显示首页、餐厅信息、菜品信息、促销活动、公告信息、购物车、客服、个人中心。系统首页界面如图5-1所示:

图5-1 系统首页界面
在注册流程中,用户在Vue前端填写必要信息(如用户名、密码等)并提交。前端将这些信息通过HTTP请求发送到Java后端。后端处理这些信息,检查用户名是否唯一,并将新用户数据存入MySQL数据库。完成后,后端向前端发送注册成功的确认,前端随后通知用户完成注册。这个过程实现了新用户的数据收集、验证和存储。如图5-2所示:

图5-2用户注册界面图
下面是用户注册关键代码:
<script>
export default {
data() {
return {
ruleForm: {
},
pageFlag : '',
tableName:"",
rules: {},
};
},
mounted(){
this.pageFlag = this.$storage.get("pageFlag");
let table = this.$storage.get("loginTable");
this.tableName = table;
},
created() {
},
destroyed() {
},
methods: {
// 获取uuid
getUUID () {
return new Date().getTime();
},
close(){
this.$router.push({ path: "/login" });
},
yonghutouxiangUploadChange(fileUrls) {
this.ruleForm.touxiang = fileUrls;
},
// 多级联动参数
// 注册
login() {
var url=this.tableName+"/register";
if((!this.ruleForm.yonghuzhanghao) && `yonghu` == this.tableName){
this.$message.error(`用户账号不能为空`);
return
}
if((!this.ruleForm.yonghuxingming) && `yonghu` == this.tableName){
this.$message.error(`用户姓名不能为空`);
return
}
if((!this.ruleForm.mima) && `yonghu` == this.tableName){
this.$message.error(`密码不能为空`);
return
}
if((this.ruleForm.mima!=this.ruleForm.mima2) && `yonghu` == this.tableName){
this.$message.error(`两次密码输入不一致`);
return
}
if(`yonghu` == this.tableName && this.ruleForm.lianxidianhua&&(!this.$validate.isMobile(this.ruleForm.lianxidianhua))){
this.$message.error(`联系电话应输入手机格式`);
return
}
if(this.ruleForm.touxiang!=null) {
this.ruleForm.touxiang = this.ruleForm.touxiang.replace(new RegExp(this.$base.url,"g"),"");
}
this.$http({
url: url,
method: "post",
data:this.ruleForm
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "注册成功",
type: "success",
duration: 1500,
onClose: () => {
this.$router.replace({ path: "/login" });
}
});
} else {
this.$message.error(data.msg);
}
在登录流程中,用户首先在Vue前端界面输入账号和密码。这些信息通过HTTP请求发送到Java后端。后端接收请求,通过与MySQL数据库交互验证用户凭证。如果认证成功,后端会返回给前端,允许用户访问系统。这个过程涵盖了从用户输入到系统验证和响应的全过程。如图5-3所示。

图5-3用户登录界面
下面是用户登录关键代码:
mounted() {
let menus = menu.list();
this.menus = menus;
for (let i = 0; i < this.menus.length; i++) {
if (this.menus[i].hasBackLogin=='是') {
this.roles.push(this.menus[i])
}
}
},
created() {
this.getRandCode()
},
destroyed() {
},
components: {
},
methods: {
//注册
register(tableName){
this.$storage.set("loginTable", tableName);
this.$storage.set("pageFlag", "register");
this.$router.push({path:'/register'})
},
// 登陆
login() {
if (!this.rulesForm.username) {
this.$message.error("请输入用户名");
return;
}
if (!this.rulesForm.password) {
this.$message.error("请输入密码");
return;
}
if(this.roles.length>1) {
if (!this.rulesForm.role) {
this.$message.error("请选择角色");
return;
}
let menus = this.menus;
for (let i = 0; i < menus.length; i++) {
if (menus[i].roleName == this.rulesForm.role) {
this.tableName = menus[i].tableName;
}
}
} else {
this.tableName = this.roles[0].tableName;
this.rulesForm.role = this.roles[0].roleName;
}
this.$http({
url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,
method: "post"
}).then(({ data }) => {
if (data && data.code === 0) {
this.$storage.set("Token", data.token);
this.$storage.set("role", this.rulesForm.role);
this.$storage.set("sessionTable", this.tableName);
this.$storage.set("adminName", this.rulesForm.username);
this.$router.replace({ path: "/index/" });
} else {
this.$message.error(data.msg);
}
});
},
getRandCode(len = 4){
this.randomString(len)
},
randomString(len = 4) {
let chars = [
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
]
let colors = ["0", "1", "2","3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]
let sizes = ['14', '15', '16', '17', '18']
let output = [];
for (let i = 0; i < len; i++) {
// 随机验证码
let key = Math.floor(Math.random()*chars.length)
this.codes[i].num = chars[key]
// 随机验证码颜色
let code = '#'
for (let j = 0; j < 6; j++) {
let key = Math.floor(Math.random()*colors.length)
code += colors[key]
}
this.codes[i].color = code
// 随机验证码方向
let rotate = Math.floor(Math.random()*60)
let plus = Math.floor(Math.random()*2)
if(plus == 1) rotate = '-'+rotate
用户点击餐厅信息,在餐厅信息页面的搜索栏输入餐厅名称,进行查询,还可以查看餐厅名称、图片、联系人、联系电话、营业时间、餐厅地址等信息,如图5-4所示:

图5-4餐厅信息页面
用户点击菜品信息,在菜品信息页面的搜索栏输入菜品名称、餐厅名称、价格,进行查询,还可以查看菜品名称、图片、菜品分类、推荐指数、口味、餐厅名称、餐厅地址、单限、库存、评论数、价格、收藏数等信息,还可以点击收藏或立即购买、添加到购物车评论等操作,如图5-5所示:

图5-5菜品信息页面
在个人中心页面可以输入个人详细信息,进行信息更新操作,还可以对修改密码、我的订单、我的地址、我收藏、我的优惠卷进行详细操作,如图5-6所示:

图5-6 个人中心界面
5.2 后台管理员功能模块
管理员要登录外卖系统,需要输入用户名和密码,选择登录角色进行登录,管理员登录界面如图5-7所示:

图5-7管理员登录界面
管理员功能:管理员登录系统后,能对主页、用户、餐厅信息、菜品分类、菜品信息、促销活动、系统管理、订单管理、用户资料进行操作。管理员功能如下图5-8所示:

图5-8管理员功能界面
用户信息功能在视图层(view层)进行交互,比如点击“新增”按钮或填写用户信息表单。这些用户信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如查询、新增、更新或删除用户信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便用户信息功能可以看到最新的信息或相应的操作反馈。在用户信息页面的输入栏中输入用户账号进行查询,可以查看到用户详细信息,并根据需要进行更改或者删除等操作;如图5-9所示。

图5-9用户界面图
餐厅信息功能在视图层(view层)进行交互,比如点击“新增”按钮或填写餐厅信息表单。这些餐厅信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如查询、新增、更新或删除餐厅信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便餐厅信息功能可以看到最新的信息或相应的操作反馈。在餐厅信息页面的输入栏中输入餐厅名称进行查询,可以查看到餐厅详细信息,并根据需要进行更改或者删除等操作;如图5-10所示。

图5-10餐厅信息界面图
管理员点击菜品分类;在菜品分类页面对菜品分类等信息,进行查询新增或删除菜品分类等操作;如图5-11所示。

图5-11菜品分类界面图
管理员点击菜品信息;在菜品信息页面对菜品名称、图片、菜品分类、推荐指数、口味、餐厅名称、餐厅地址、单限、库存、评论数、价格、收藏数 等信息,进行查询或删除菜品信息等操作;如图5-12所示。

图5-12菜品信息界面图
管理员点击促销活动;在促销活动页面对菜品名称、图片、菜品分类、推荐指数、口味、餐厅名称、餐厅地址、单限、库存、评论数、价格、收藏数等信息,进行查询或删除促销活动信息等操作;如图5-13所示。

图5-13促销活动界面图
管理员点击订单管理;在订单管理页面对订单编号、商品名称、商品图片、购买数量、价格、总价格、支付类型、状态、地址、电话、收货人、备注、商户名称、商品类型、卷编号、优惠额、统一订单编号、退货审核、下单时间等信息,进行查询或删除订单信息等操作;如图5-14所示。

图5-14订单管理界面图
5.3 后台餐厅信息功能模块
注册界面,第一次使用本系统的使用者,首先是要进行注册,点击“注册”,然后就会进入到注册的页面里面,将餐厅信息信息录入注册表,确认信息正确后,系统才会进入登录界面,餐厅信息登录成功后可使用本系统所提供的所有功能,如图5-15所示。

图5-15餐厅信息注册界面
源码无偿分享,文未领取
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)