基于大数据+机器学习的饮食计划推荐可视化分析平台设计与实现
💗博主介绍:✌全网粉丝20W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌
💗主要服务内容:免费功能设计、选题定题、开题报告、任务书、程序开发、论文编写和辅导、论文降重、程序讲解、答辩辅导等,欢迎咨询~
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例(持续更新,值得收藏!)✅
2025-2026年计算机毕业设计选题推荐:计算机专业毕业设计题目大全✅
全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南✅
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人
一.前言
随着人们健康意识的不断提升,饮食管理成为日常生活中重要的一环。我们开发了一款基于大数据的饮食计划推荐可视化分析平台。该平台以Java语言为基础,采用Spring Boot框架构建,结合Hadoop强大的数据处理能力以及决策树算法的精准预测,为用户提供全方位的饮食健康管理服务。
用户在主页可快速浏览平台功能。通过注册登录进入个人中心,完善健康数据,如身高、体重、运动习惯等,平台据此生成个性化的饮食计划。在食物信息模块,用户能查询各类食物的营养成分,还能通过食物类别预测功能,借助深度学习算法,快速识别食物类别。饮食计划数据模块记录用户每日饮食执行情况,便于回顾调整。健康食谱提供丰富多样且营养均衡的食谱,满足不同口味需求。营养建议和健康目标模块,根据用户健康数据和饮食执行情况,动态调整,助力用户达成健康目标。排行榜则激发用户积极性,增加互动性。MySQL数据库保障数据安全稳定存储,系统管理模块实现后台高效运维。该平台旨在通过先进技术,帮助用户科学饮食,提升健康水平,享受健康生活每一天。
二.技术环境
开发语言:Java
Java框架:SpringBoot
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
爬虫框架:Scrapy
大数据框架:Hadoop
开发软件:Idea
前端框架:vue.js
可视化技术:Echarts
三.功能设计
本研究旨在开发一款基于大数据的饮食计划推荐可视化分析平台,以满足用户在健康管理与饮食规划方面的多样化需求。该平台的核心功能围绕用户健康数据的采集与分析展开,通过整合用户的基本健康信息、饮食偏好以及日常活动情况,利用深度学习算法生成个性化的饮食计划。平台的“食物信息”模块为用户提供详尽的食材营养成分查询服务,同时结合“食物类别预测”功能,借助图像识别技术快速准确地识别用户上传的食物图片,进一步丰富食物数据库。
在饮食计划的制定过程中,平台综合考虑用户的健康目标,如减脂、增肌或维持健康体重等,结合营养建议模块,为用户提供科学的饮食建议和营养搭配方案。平台还提供丰富的“健康食谱”资源,用户可以根据自己的口味偏好和饮食需求选择合适的食谱,并在“饮食计划数据”模块中记录每日的饮食执行情况,以便平台实时监测并调整饮食计划。
为了增强用户之间的互动性,平台设计了“排行榜”功能,鼓励用户分享自己的健康成就和饮食经验,形成积极向上的健康生活氛围。平台的“系统管理”模块确保了数据的安全性与隐私性,保障平台的稳定运行。通过“个人中心”,用户可以随时查看自己的健康数据、饮食计划执行情况以及健康目标的达成进度,实现全方位的健康管理。
系统总体功能结构图如下所示:

四.数据设计
系统需要数据库存储系统中的信息,MySQL数据库能够处理系统的信息,当考研信息爬虫与分析需要数据的时候,MySQL数据库能够取得数据交给服务端处理。MySQL数据库能够使用可视化软件操作,管理员可以在可视化软件对数据库的信息管理。
系统数据层设计包括了E-R设计,系统数据实体的设计依赖于E-R的分析和设计,通过E-R能够得到数据库表的设计,E-R能够描述系统所涉及到的实体,还能够描述系统中不同实体的联系和关系。系统总体E-R图如下所示:

五.部分效果展示
5.1前台用户功能实现效果
该平台的前台功能丰富多样,首页为用户提供了平台的整体概览和导航入口。用户可以在“食物信息”模块查询各类食物的营养成分和健康价值,获取饮食知识。在“饮食计划”模块,用户会收到根据自身健康数据生成的个性化饮食建议,帮助合理安排每日饮食。“健康食谱”提供丰富多样的健康菜谱,满足不同口味需求。“排行榜”展示用户健康成就,激发参与热情。“科普知识”模块则提供健康饮食相关的科普文章,提升用户健康意识。系统首页页面如图所示:

在食物信息模块,用户可以通过输入食物名称、烹饪时间、食材或烹饪方式等关键词进行精准查询。查询结果页面不仅展示食物的详细信息,如营养成分、烹饪步骤和图片,还提供互动功能。用户可以对喜欢的食物进行收藏,方便日后查看;也可以通过点赞或踩表达对食物的喜爱或不满,还能发表评论与其他用户交流心得,分享烹饪经验或建议,增强用户之间的互动性。食物信息页面如图所示:

个人中心是用户管理个人资料的核心区域,用户可以在此修改密码、更新健康数据、查看营养建议、设置健康目标、收藏喜欢的食谱,全面掌握个人健康管理。个人中心页面如图所示:

5.2后台管理员功能实现效果
管理员主页面作为系统控制中心,提供全面的管理功能。页面通常详细列出所有管理模块,包括主页、用户、食物信息、饮食计划、健康数据、营养建议、健康目标、健康食谱、排行榜、饮食计划数据、食物类别预测、系统管理、个人中心等,确保管理员能够高效地进行日常管理工作。整个页面布局清晰,功能模块化,便于管理员快速定位和操作。管理员主页界面如图所示:

管理员在食物信息模块中拥有强大的管理权限。点击进入后,可通过输入食物名称、烹饪时间、食材或烹饪方式等信息进行精准查询,快速定位所需食物。查询结果页面展示食物列表,管理员可在此添加新食物条目,完善平台食物数据库;也可删除不符合要求或过时的食物信息,保持数据的准确性和时效性。管理员还能查看每种食物的详细信息,包括营养成分、烹饪步骤等,并可对这些详细内容进行修改或删除操作,确保平台提供的食物信息始终准确、可靠且符合用户需求。食物信息界面如图所示:

管理员点击“饮食计划”模块后,可输入饮食计划的名称、适用人群或烹饪方式等信息进行查询,快速找到目标计划。查询结果以列表形式展示,管理员能够在此基础上添加新的饮食计划,丰富平台内容;也可以删除不再适用或重复的计划,优化信息库。对于每个饮食计划的详细信息,管理员可以查看、修改,确保计划的科学性和准确性。管理员还能查看用户对饮食计划的评论,了解用户反馈,及时处理不当评论,维护平台的健康交流环境。饮食计划界面如图所示:

管理员点击“健康数据”模块后,可输入标题、姓名或血糖水平等关键信息进行查询,快速定位相关健康数据记录。查询结果显示为列表形式,管理员能够查看每条记录的详细信息,包括用户的基本健康指标、饮食习惯等。管理员还可以对健康数据进行修改,以确保数据的准确性和完整性。根据用户的健康数据,管理员可以生成针对性的营养建议,帮助用户更好地管理饮食和健康。管理员也具备删除健康数据详细信息的权限,以维护数据的安全性和隐私性。健康数据界面如图所示:

管理员点击“营养建议”模块后,可输入标题、用户姓名或健康程度等信息进行查询,快速定位相关营养建议列表。查询结果展示所有符合条件的建议条目,管理员可查看每条建议的详细内容,包括建议的具体措施、适用人群、健康目标等。若发现建议内容有误或需调整,管理员可直接进行修改,以确保建议的科学性和实用性。对于不再适用或重复的营养建议,管理员可进行删除操作,优化建议库,保障平台信息的质量和准确性。营养建议界面如图所示:

管理员点击“健康食谱”模块后,可通过输入食谱名称、食谱类型或用户姓名等信息进行查询,快速获取相关食谱列表。在列表中,管理员可以查看每条食谱的详细信息,包括食材、烹饪步骤、营养成分等,并能对食谱内容进行修改,以确保其准确性和实用性。管理员还可以查看用户对食谱的评论,了解反馈并及时处理不当内容。对于不再适用或重复的食谱,管理员可直接删除,维护食谱库的整洁与权威性。健康食谱界面如图所示:

看板为管理员提供了全面的可视化数据概览。通过食物词云直观展示热门食物,食物类别统计呈现各类食物占比,烹饪难度统计帮助了解用户偏好。饮食计划数据展示计划执行情况,碳水化合物、热量、蛋白质、脂肪统计为营养分析提供依据,预测食物类别则显示模型预测结果。这些数据助力管理员精准把握平台运营状况,优化内容与服务。看板界面如图所示:

六.部分功能代码
/**
* hadoop 配置
*/
@Configuration
@ConditionalOnProperty(name="hadoop.name-node")
public class HadoopConfig {
@Value("${hadoop.name-node}")
private String nameNode;
/**
* 配置
*/
public org.apache.hadoop.conf.Configuration getConfiguration() {
//读取配置文件
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("dfs.replication", "1");
conf.set("fs.defaultFS", nameNode);
conf.set("mapred.job.tracker", nameNode);
conf.set("dfs.client.use.datanode.hostname", "true");
return conf;
}
/**
* Configuration conf=new Configuration();
* 创建一个Configuration对象时,其构造方法会默认加载hadoop中的两个配置文件,
* 分别是hdfs-site.xml以及core-site.xml,这两个文件中会有访问hdfs所需的参数值,
* 主要是fs.default.name,指定了hdfs的地址,有了这个地址客户端就可以通过这个地址访问hdfs了。
* 即可理解为configuration就是hadoop中的配置信息。
* @return
*/
public FileSystem createFs() {
try {
URI uri = new URI(nameNode.trim());
FileSystem fs = FileSystem.get(uri, this.getConfiguration(), "root");
return fs;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Component
public class HadoopGroup {
@Resource
private HadoopConfig hadoopConfig;
public static String timeType = "timeType";
public static String className;
public static String columnName;
public void run(List<Object> list) throws Exception {
FileSystem fs = hadoopConfig.createFs();
Path inputPath = new Path("/input/group/" + className + "/" + columnName + "/" + timeType + ".json");
Path outputPath = new Path("/output/group/" + className + "/" + columnName + "/" + timeType);
if (fs.exists(inputPath)) {
fs.delete(inputPath, true);
}
if (fs.exists(outputPath)) {
fs.delete(outputPath, true);
}
if (!CollectionUtils.isEmpty(list)) {
ObjectMapper mapper = new ObjectMapper();
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fs.create(inputPath)))) {
for (Object obj : list) {
writer.write(mapper.writeValueAsString(obj));
writer.newLine();
}
}
Job job = Job.getInstance(hadoopConfig.getConfiguration(), "group_" + columnName + "_" + timeType);
// 设置jar中的启动类,可以根据这个类找到相应的jar包
job.setJarByClass(SpringbootSchemaApplication.class);
job.setMapperClass(ValueMapper.class);
job.setCombinerClass(ValueReduce.class);
job.setReducerClass(ValueReduce.class);
// 设置Mapper的输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(DoubleWritable.class);
// 设置reduce的输出
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
FileInputFormat.addInputPath(job, inputPath);
FileOutputFormat.setOutputPath(job, outputPath);
//提交程序 并且监控打印程序执行情况
job.waitForCompletion(true);
boolean jobSuccess = job.waitForCompletion(true);
if (jobSuccess) {
//读取MapReduce作业的输出结果
List<Map<String, Object>> dataList = new ArrayList<>();
try (InputStream in = fs.open(new Path(outputPath, "part-r-00000")); Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] parts = line.split("\t");
if (parts.length == 2) {
Map<String, Object> dataMap = new HashMap<>();
switch (timeType) {
case "年":
SimpleDateFormat year = new SimpleDateFormat("yyyy");
dataMap.put(year.format(columnName), parts[0]);
break;
case "月":
SimpleDateFormat month = new SimpleDateFormat("yyyy-MM");
dataMap.put(month.format(columnName), parts[0]);
break;
case "日":
SimpleDateFormat day = new SimpleDateFormat("yyyy-MM-dd");
dataMap.put(day.format(columnName), parts[0]);
break;
default:
dataMap.put(columnName, parts[0]);
}
dataMap.put("total" , Double.parseDouble(parts[1]));
dataList.add(dataMap);
}
}
}
// 使用ObjectMapper将数据列表转换为JSON格式
ObjectMapper mapper1 = new ObjectMapper();
mapper1.enable(SerializationFeature.INDENT_OUTPUT); // 可选,用于格式化输出
String localJsonFilePath = System.getProperty("user.dir") + "/group_" + className + "_" + columnName + "_" + timeType + ".json";
// 将JSON字符串写入本地文件
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(localJsonFilePath), StandardCharsets.UTF_8))) {
String jsonContent = mapper1.writeValueAsString(dataList);
writer.write(jsonContent);
}
}
}
}
/**
* 分词
*/
public static class ValueMapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {
/**
* @param key 默认情况下,是MapReduce所读取到的一行文本的起始偏移量
* @param value 默认情况下,是MapReduce所读取到的一行文本的内容,hadoop中的序列化类型为Text
* @param context 是用户自定义逻辑处理完成后输出的KEY,在此处是单词,String
* @throws IOException 异常
* @throws InterruptedException 异常
*/
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 防止中文乱码
String line = new String(value.getBytes(), 0, value.getLength(), "UTF-8").trim();
if (StringUtils.isNotEmpty(line)) {
JSONArray array = new JSONArray(line);
for (int i = 0; i < array.length(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
context.write(new Text(jsonObject.get(columnName).toString()), new DoubleWritable(1));
}
}
}
}
/**
* 处理Map传入的内容
*
* @author Ruison
* on 2019/7/6 - 15:09
*/
public static class ValueReduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
private DoubleWritable result = new DoubleWritable();
/**
* @param key 第一个Text: 是传入的单词名称,是Mapper中传入的
* @param values 第二个:LongWritable 是该单词出现了多少次,这个是MapReduce计算出来的,比如 hello出现了11次
* @param context 第三个Text: 是输出单词的名称 ,这里是要输出到文本中的内容
* @throws IOException 异常
* @throws InterruptedException 异常
*/
@Override
public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
Double sum = new Double(0);
for (DoubleWritable val : values) {
sum += val.get();
}
result.set(sum);
if (key != null && result != null) {
context.write(key, result);
}
}
}
public static void setTimeType(String timeType) {
HadoopGroup.timeType = timeType;
}
public static void setClassName(String className) {
HadoopGroup.className = className;
}
public static void setColumnName(String columnName) {
HadoopGroup.columnName = columnName;
}
}
为什么选择我们
大学毕业那年,曾经有幸协助指导老师做过毕业设计课题分类、论文初选(查看论文的格式)、代码刻录等打杂的事情,也帮助过同界N多同学完成过毕业设计工作,毕业后在一家互联网大厂工作8年,先后从事Java前后端开发、系统架构设计等方面的工作,有丰富的编程能力和水平,也在工作之余指导过别人完成过一些毕业设计的工作。2016年至今,团队已指导上万名学生顺利通过毕业答辩,目前是csdn特邀作者、CSDN全栈领域优质创作者,博客之星、掘金/华为云/B站/知乎等平台优质作者,计算机毕设实战导师,专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎咨询~✌
最后
💕💕
最新计算机毕业设计选题篇-选题推荐
小程序毕业设计精品项目案例-200套
Java毕业设计精品项目案例-200套
Python毕业设计精品项目案例-200套
大数据毕业设计精品项目案例-200套
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。
更多推荐



所有评论(0)