【关注可白嫖源码】--课程设计--毕业设计--29730基于hadoop的校园餐厅菜品推荐系统设计与实现(案例分析)

📅 2026/7/14 6:34:43 👁️ 阅读次数 📝 编程学习
【关注可白嫖源码】--课程设计--毕业设计--29730基于hadoop的校园餐厅菜品推荐系统设计与实现(案例分析)
本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。
有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件

摘 要

本课题基于Hadoop平台,设计并实现了一套面向校园餐厅的菜品推荐系统,旨在提升高校师生的点餐效率和就餐满意度,同时优化餐厅的运营与管理模式。系统采用Python爬虫技术从校园餐饮平台或相关数据源中自动采集菜品信息、用户行为数据、评论数据等内容,确保数据来源丰富且更新及时。MySQL数据库用于高效地存储和管理菜品信息、用户资料、订单数据与推荐记录等,为系统的稳定运行提供了强有力的数据支撑。利用Hadoop强大的分布式计算能力,系统对用户历史行为和菜品特征进行深度分析,结合内容推荐与协同过滤算法,生成个性化的菜品推荐结果。前端用户界面友好,支持用户注册登录、菜品浏览、评论收藏、下单支付等功能,管理员端则提供菜品管理、订单管理、公告发布等模块。该系统架构合理、功能全面、推荐精准,具有良好的可扩展性和应用前景,为校园餐饮数字化升级提供了有效的解决方案和技术参考。

关键词:Hadoop;校园餐厅菜品推荐系统;Python爬虫;MySQL;

Abstract

This project is based on the Hadoop platform and designs and implements a dish recommendation system for campus restaurants, aiming to improve the ordering efficiency and dining satisfaction of university teachers and students, while optimizing the operation and management mode of restaurants. The system uses Python crawler technology to automatically collect dish information, user behavior data, comment data, and other content from campus catering platforms or related data sources, ensuring that the data sources are rich and updated in a timely manner. MySQL database is used to efficiently store and manage dish information, user profiles, order data, and recommendation records, providing strong data support for the stable operation of the system. By utilizing the powerful distributed computing capabilities of Hadoop, the system conducts in-depth analysis of user historical behavior and dish characteristics, and combines content recommendation and collaborative filtering algorithms to generate personalized dish recommendation results. The front-end user interface is user-friendly, supporting functions such as user registration and login, dish browsing, comment collection, order payment, etc. The administrator end provides modules such as dish management, order management, and announcement publishing. The system has a reasonable architecture, comprehensive functions, accurate recommendations, good scalability and application prospects, providing effective solutions and technical references for the digital upgrade of campus catering.

Keywords: Hadoop; Campus restaurant dish recommendation system; Python crawler; MySQL;

目录

摘 要

Abstract

第1章 绪论

1.1开发背景与意义

1.2国内外研究现状

1.3论文结构

第2章 主要技术和工具介绍

2.1 Hadoop框架介绍

2.2 MySQL 数据库

2.3 B/S结构

2.4 Python爬虫技术

第3章 系统分析

3.1可行性分析

3.1.1技术可行性

3.1.2经济可行性

3.2功能需求分析

3.3非功能需求分析

3.4数据采集、处理与分析

3.4.1数据采集和获取方法

3.4.2数据预处理和清洗

3.4.3数据存储和管理

3.4.4数据分析和处理结果分析

第4章 系统设计

4.1系统体系结构

4.2系统结构设计

4.3数据库设计

4.3.1概念设计

4.4.3数据库表设计

第5章 系统实现

5.1登录模块的实现

5.2用户功能模块的实现

5.2.1公告信息模块的实现

5.2.2新闻资讯模块的实现

5.2.3菜品信息模块的实现

5.3管理员功能模块的实现

5.3.1用户管理模块的实现

5.3.3轮播图管理模块的实现

5.3.4公告信息的实现

5.3.5资源管理模块的实现

第6章 系统测试

6.1 测试目的

6.2测试方法

6.3测试用例

6.3.1创建数据测试

6.3.2修改数据测试

6.3.3查询数据测试

6.4测试结果

第7章 总结

致 谢

参考文献

第1章 绪论

1.1开发背景与意义

随着校园生活水平的不断提高,学生对餐饮服务的需求也逐渐增加,尤其是在菜品选择和用餐体验方面。传统的校园餐饮服务往往缺乏个性化和智能化,导致学生在点餐时面临信息不全、推荐不精准等问题。此外,餐厅管理者也面临着如何有效分析学生需求、优化菜品管理和提升运营效率的挑战。

基于此,开发一个校园餐厅菜品推荐系统具有重要意义。通过结合大数据处理、推荐算法和智能化管理,系统能够根据学生的历史消费数据和偏好,提供个性化的菜品推荐,提升用餐体验。同时,管理员可以通过系统优化菜品推荐、促销活动等,提高餐厅的运营效率和资源配置。该系统不仅能有效解决传统餐饮服务中的痛点,还能为校园餐饮服务的智能化和个性化发展提供技术支持,推动校园餐饮行业向更高效、精准的方向发展。

第5章 系统实现

5.1登录模块的实现

为确保系统安全性,系统操作员只有在登录界面输入正确的用户名、密码、权限以及验证码,单击“登录”按钮后才能够进入本系统的主界面。登录界面如下图所示。

图5-1登录界面

登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断resultList来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:

/**

* 登录

* @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, "账号或密码不正确");

}

}

5.2用户功能模块的实现

5.2.1公告信息模块的实现

用户点击“公告信息”菜单,用户可以查看系统发布的最新公告、政策更新、活动通知等。界面展示如下图所示。

图5-2公告信息界面

5.2.2新闻资讯模块的实现

点击系统导航栏上的“”新闻资讯,将进入新闻资讯列表,用户可以查看系统发布的所有新闻资讯内容。点击某新闻资讯后进入详情页,可以查看该资讯的详细内容,用户可以点赞、收藏、评论等。如图所示。

图5-3新闻资讯列表界面

5.2.3菜品信息模块的实现

用户点击“菜品信息”,用户可以查看菜品类型、菜品推荐等进行购买。界面如下图所示。

图5-4菜品信息界面

5.3管理员功能模块的实现

5.3.1用户管理模块的实现

系统用户管理主要是对新用户的添加和旧用户的删除。新用户的添加主要是指添加用户名称并确定其密码;旧用户的删除也是从下拉菜单中找到对应的用户名称将其删除。不论是新用户添加还是旧用户的删除,这个权限只有管理员具有。用户管理界面如下图所示。

图5-5用户管理界面

5.3.3轮播图管理模块的实现

管理员点击“轮播图管理”这一菜单,可以管理系统首页的轮播图信息,提供系统宣传和通知功能。界面如下图所示。

图5-6轮播图管理界面

图片/文件/视频等的上传方法通过MultipartFile,代码如下:

@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, "上传失败");

}

5.3.4公告信息的实现

管理员点击“公告信息”这一菜单,可以发布、删除或编辑公告信息,并可以对公告信息进行分类管理。如下图所示。

图5-7公告信息界面

5.3.5资源管理模块的实现

管理员点击“资源管理”菜单,管理员可以上传、编辑或删除系统的资源,如文章、图片、视频等。这些资源可用于美容资讯模块的展示。管理员还可以对解读进行分类和标签化,方便用户查找和使用,如下图所示。

图5-8资源管理界面图

点赞+收藏+关注 →私信领取本源代码、数据库

关注博主下篇更精彩
一键三连!!!
一键三连!!!
一键三连!!!
感谢一键三连!!!