基于SpringBoot+vue的外卖点餐系统设计与实现

news2025/2/4 19:35:24

博主介绍:  

大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。
我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下进行项目开发,具有丰富的项目经验和开发技能。我的代码风格规范、优美、易读性强,同时也注重性能优化、代码重构等方面的实践和经验总结。
我有丰富的成品Java毕设项目经验,能够为学生提供各类个性化的开题框架和实际运作方案。同时我也提供相关的学习资料、程序开发、技术解答、代码讲解、文档报告等专业服务。

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

Java项目精品实战案例(300套)

外卖点餐系统源码下载地址:

https://download.csdn.net/download/weixin_54828627/87720002

一、效果演示

基于springboot+vue的外卖点餐系统演示视频

二、前言介绍

随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。

三、主要技术

技术名作用
SpringBoot后端框架
Vue前端框架
MySQL数据库

四、系统设计(部分)

4.1、主要功能模块设计         

4.2、模块设计 

五、功能截图

5.1、用户功能模块

用户通过点击后台管理,进入页面可以进行首页、个人中心、订单管理、配送单管理、商品评价管理、我的收藏管理等功能模块,进行相对应操作,如图5-1所示。

图5-1用户功能界面

5.1.1、订单管理

图5-2订单管理界面

5.1.2、配送单管理

图5-3配送单管理界面

5.1.3、商品评价管理

图5-4商品评价管理界面

5.1.4、我的收藏管理

图5-5我的收藏管理界面

5.2管理员功能模块

5.2.1、管理员登录

图5-6管理员登录界面

5.2.2、个人信息

图5-7个人信息界面

5.2.3、用户管理

图5-8用户管理界面

5.2.4、商家管理

图5-9商家管理界面

5.2.5、菜品分类管理

图5-10菜品分类管理界面图

5.2.6、菜品管理

图5-11菜品管理界面图

5.2.7、订单管理

图5-12订单管理界面图

5.3、商家功能模块

商家通过点击后台管理,进入页面可以进行首页、个人中心、菜品管理、订单管理、配送单管理、商品评价管理、我的收藏管理等功能模块,进行相对应操作,如图5-13所示。

图5-13商家功能界面

5.3.1、菜品管理

图5-14菜品管理界面

5.3.2、订单管理:

图5-15订单管理界面

5.3.3、配送单管理

图5-16配送单管理界面

5.4、用户前台功能模块

通过进入网站可以查看首页、商家、菜品、登录、后台管理等功能模块,如图5-17所示

图5-17 网站首页界面图

5.4.1、用户登录

图5-18 登录界面图

5.4.2、个人中心

图5-19个人中心界面图

5.4.3、菜品详情

图5-20菜品详情界面图

5.5、骑手功能模块

骑手通过点击后台管理,进入页面可以进行首页、个人中心、订单管理、配送单管理、商品评价管理等功能模块,进行相对应操作,如图5-21所示。

图5-21骑手功能界面

5.5.1、订单管理

图5-22订单管理界面

5.5.2、配送单管理

图5-23配送单管理界面

5.5.3、商品评价管理

图5-24商品评价管理界面

六、数据库设计(部分)

数据库是整个软件编程中最重要的一个步骤,对于数据库问题主要是判定数据库的数量和结构公式的创建。外卖点餐系统   使用的是Mysql进行对数据库进行管理,进行保证数据的安全性、稳定性等。

系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:

管理员信息实体属性图如图6-2所示。

图6-2管理员信息实体属性图

用户管理实体属性图如图6-3所示。

图6-3用户管理实体属性图

商家管理实体属性图如图6-4所示。

图6-4商家管理实体属性图

骑手管理实体属性图如图6-5所示。

图6-5骑手管理实体属性图

七、代码参考

package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ResourceUtils;
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.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;

/**
 * 通用接口
 */
@RestController
public class CommonController{
	@Autowired
	private CommonService commonService;
	
	@Autowired
	private ConfigService configService;
	
	private static AipFace client = null;
	
	private static String BAIDU_DITU_AK = null;
	
	@RequestMapping("/location")
	public R location(String lng,String lat) {
		if(BAIDU_DITU_AK==null) {
			BAIDU_DITU_AK = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")).getValue();
			if(BAIDU_DITU_AK==null) {
				return R.error("请在配置管理中正确配置baidu_ditu_ak");
			}
		}
		Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
		return R.ok().put("data", map);
	}
	
	/**
	 * 人脸比对
	 * 
	 * @param face1 人脸1
	 * @param face2 人脸2
	 * @return
	 */
	@RequestMapping("/matchFace")
	public R matchFace(String face1, String face2) {
		if(client==null) {
			/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
			String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
			String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
			String token = BaiduUtil.getAuth(APIKey, SecretKey);
			if(token==null) {
				return R.error("请在配置管理中正确配置APIKey和SecretKey");
			}
			client = new AipFace(null, APIKey, SecretKey);
			client.setConnectionTimeoutInMillis(2000);
			client.setSocketTimeoutInMillis(60000);
		}
		JSONObject res = null;
		try {
			File file1 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face1);
			File file2 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face2);
			String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
			String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
			MatchRequest req1 = new MatchRequest(img1, "BASE64");
			MatchRequest req2 = new MatchRequest(img2, "BASE64");
			ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
			requests.add(req1);
			requests.add(req2);
			res = client.match(requests);
			System.out.println(res.get("result"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return R.error("文件不存在");
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
	}
    
	/**
	 * 获取table表中的column列表(联动接口)
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/option/{tableName}/{columnName}")
	public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		if(StringUtils.isNotBlank(level)) {
			params.put("level", level);
		}
		if(StringUtils.isNotBlank(parent)) {
			params.put("parent", parent);
		}
		List<String> data = commonService.getOption(params);
		return R.ok().put("data", data);
	}
	
	/**
	 * 根据table中的column获取单条记录
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/follow/{tableName}/{columnName}")
	public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		params.put("columnValue", columnValue);
		Map<String, Object> result = commonService.getFollowByOption(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 修改table表的sfsh状态
	 * @param table
	 * @param map
	 * @return
	 */
	@RequestMapping("/sh/{tableName}")
	public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
		map.put("table", tableName);
		commonService.sh(map);
		return R.ok();
	}
	
	/**
	 * 获取需要提醒的记录数
	 * @param tableName
	 * @param columnName
	 * @param type 1:数字 2:日期
	 * @param map
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/remind/{tableName}/{columnName}/{type}")
	public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("table", tableName);
		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));
			}
		}
		
		int count = commonService.remindCount(map);
		return R.ok().put("count", count);
	}
	
	/**
	 * 单列求和
	 */
	@IgnoreAuth
	@RequestMapping("/cal/{tableName}/{columnName}")
	public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		Map<String, Object> result = commonService.selectCal(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 分组统计
	 */
	@IgnoreAuth
	@RequestMapping("/group/{tableName}/{columnName}")
	public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		List<Map<String, Object>> result = commonService.selectGroup(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * (按值统计)
	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
	public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		List<Map<String, Object>> result = commonService.selectValue(params);
		return R.ok().put("data", result);
	}
	
}

八、技术交流

大家点赞、收藏、关注、评论啦 、查看文章结尾👇🏻获取联系方式👇🏻

精彩专栏推荐订阅下方专栏👇🏻👇🏻👇🏻👇🏻

Java项目精品实战案例(300套)

​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android知识笔记】应用进程(二)

Service的启动原理 向AMS发送startService请求 startService时会首先拿到AMS的Binder代理对象,向AMS发起startService请求: AMS处理startService请求 接下来看AMS端处理应用的startService请求: 回忆一下应用进程启动流程: 接下来看如果Service所在应用进程没有启动的情…

GitLab 私有 Go Modules 的搭建配置

配置步骤 配置 GitLab Access Token 将 GitLab Access Token 写入到 ~/.netrc 文件里(也就是根目录下的 .netrc 文件),没有则新建,并写入内容:machine git.tenorshare.cn login ${USER_NAME} password ${GITLAB_ACCESS_TOKEN},其中 ${USER_NAME} 是GitLab 用户名,${GIT…

K8S的部署项目流程

步骤 &#xff08;1&#xff09;条件准备 &#xff08;2&#xff09;制作镜像 &#xff08;3&#xff09;docker启动程序 &#xff08;4&#xff09;启动制作好的镜像&#xff0c;看是否可以访问 &#xff08;5&#xff09;上传镜像到镜像容器中&#xff08;如&#xff1a;阿里…

Hive最全总结,学习与面试,看这一篇就行了!

废话不多说,上题: 1.Hadoop中两个⼤表实现join的操作,简单描述。 (1)Hive中可以通过分区来减少数据量;(2)还可以通过优化HQL语句,⽐如只查询需要的字段,尽量避免全表、全字段查询; 2.Hive中存放是什么? 表。存的是和hdfs的映射关系,hive是逻辑上的数据仓库,…

使用docker安装portainer

portainer是一个非常好用的docker可视化工具&#xff0c;这篇文章就介绍一下怎么使用docker来安装portainer。 第一步&#xff1a;在docker仓库查找portainer的版本 docker search portainer 我们可以看到&#xff0c;第一个portainer/portainer的描述中说了&#xff0c;这个仓…

【数据架构实践】Netflix 万亿级实时数据基础架构的四个创新阶段

Netflix 是一个很棒的地方&#xff0c;周围有许多了不起的同事。我为参与将共同信念变为现实的旅程中的每个人感到无比自豪。我想花点时间分享一下团队的主要成就&#xff1a; 我们在 Netflix 的所有组织中将流数据用例从 0 增加到 2000 多个。我们构建和发展了成功的产品&…

【Spring框架】getBean的更多用法

目录 用法1&#xff1a;根据名称获取Bean对象用法2&#xff1a;根据类型获取Bean对象用法3&#xff1a;根据名称类型来获取Bean对象 用法1&#xff1a;根据名称获取Bean对象 UserService userService (UserService)context.getBean("user");用法2&#xff1a;根据类…

如何利用量比和换手率?

1 量比 有人说&#xff0c;量比指标是盘口语言的翻译器&#xff0c;堪称股市风向标&#xff01;这一说法究竟从何而来&#xff0c;量比大小到底意味着什么呢&#xff1f; 量比是衡量相对成交量的指标。它是指股市开市后平均每分钟的成交量与过去5个交易日平均每分钟成交量之比…

【高并发网络通信架构】4.高效事件驱动模型:Reactor 模型

目录 一&#xff0c;往期文章 二&#xff0c;基本概念 1.前言 2.基本框架 3.核心特征 4.工作流程 5.用“网络通信”来理解 Reactor 模型 三&#xff0c;代码实现 1.使用 epoll 进行多路复用实现 Reactor 模式的操作流程 2.Reactor 模式实现代码&#xff08;参考&…

【SQL】Your password has expired. To log in you must change it.......

在配置SQL的编辑器的时候&#xff0c;连接过程出现了如下的错误&#xff1a; Your password has expired. To log in you must change it using a client that supports expired passwords.当连接到 SQL 时&#xff0c;如果出现 “Your password has expired. To log in you m…

【LSTM】理解LSTM

原文&#xff1a;https://colah.github.io/posts/2015-08-Understanding-LSTMs/ 递归神经网路 Humans don;t start their thinking from scratch every second. 人类都不是每一秒都从零开始思考。 from scratch 从零开始 当你读到这篇文章时&#xff0c;你理解每个单词时&a…

会议音响系统麦克风阵列波束形成算法C语言实现

+v hezkz17进数字音频系统研究开发交流答疑 一 应用麦克风阵列波束成形算法做的项目产品 二 麦克风波束形成技术应用领域? 麦克风波束形成技术是一种利用多个麦克风阵列来实现声音定向捕捉和增强的技术。通过对多个麦克风信号进行处理和合成,可以使麦克风系统在特定方向…

【Matlab】智能优化算法_蚁群优化算法ACO

【Matlab】智能优化算法_蚁群优化算法ACO 1.背景介绍2.废话不多说&#xff0c;直接上代码3.文件结构4.详细代码及注释4.1 ACO.m4.2 createColony.m4.3 createGraph.m4.4 drawBestTour.m4.5 drawGraph.m4.6 drawPhromone.m4.7 ACO.mfitnessFunction.m4.8 rouletteWheel.m4.9 upd…

ubuntu创建多用户并使用ssh链接

添加多个同时登录的用户 以下内容中的“username”根据自己需求自己定义 1.创建新用户 sudo useradd username2.给新用户添加管理权限 sudo vim /etc/sudoers打开的文件中添加如下内容 username ALL(ALL:ALL) ALL3.设置密码 输入&#xff1a; sudo passwd username打开的…

使用golang+antlr4构建一个自己的语言解析器

Goland 中Antlr4插件 在goland中安装Antlr4插件&#xff0c;用于识别输入的字符在在语法文件中生成的语法树的样子&#xff0c;大概就是如下的摸样 下载步骤&#xff1a; 1.点击文件中的设置选项 2.在插件目录下输入Antlr4搜索插件 3.点击安装即可 编写自己的语言语法文件…

DDD落地实践复盘 - 记理论培训事件风暴

DDD毕竟是一个指导方法&#xff0c;想落地扎根还是需要很多尝试的&#xff0c;笔者整理了一下在部门内践行推广之初的复盘小结&#xff0c;这可能是多数团队在推广DDD时都会遇到的问题&#xff0c;希望能对大家有所帮助。 DDD在部门进行两次尝试&#xff0c;一次是PPT培训&…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)

页面和自定义组件生命周期 在开始之前&#xff0c;先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;E…

springMVC(四)—— 简化配置之不用再写@Repository类

这种简化配置的方法在下面这篇博客中已经用到了&#xff0c;但是因为太重要了&#xff0c;所以把他单独拿出来讲。 springMVC&#xff08;三&#xff09;—— 整合SSM框架_玛丽莲茼蒿的博客-CSDN博客IDEAtomcat 8。https://blog.csdn.net/qq_44886213/article/details/1316570…

【六袆 - Java】Kafka的由来,Kafka创始人,Kafka企业级应用开发;Kafka是一种分布式流处理平台和消息队列系统;

kafka是一门什么技术&#xff1f; Kafka是一种分布式流处理平台和消息队列系统&#xff0c;用于解决高吞吐量、低延迟的数据处理和消息传递问题。它最初由LinkedIn开发&#xff0c;旨在应对LinkedIn在大规模社交网络中处理实时数据流的需求。 它的由来 Kafka的历史可以追溯到…

git学习笔记 |常用命令

文章目录 Git学习笔记是什么&#xff1f;Git的工作机制Git和代码托管中心 Git的常用命令设置签名本地库初始化 git init添加到暂存区 git add将暂存区的文件提交到本地库 git commit查看历史版本 git log/git reflog版本穿梭 git reset Git的分支分支命令合并分支时代码冲突删除…