💗博主介绍:✌全网粉丝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套
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐