基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现

基于 Spring Boot + Vue3 的烹饪交流学习系统 设计与实现

一、项目概述

随着人们对烹饪学习与交流需求的增加,传统线下学习模式在菜谱管理、内容发现、交流共享与个性化推荐等方面存在明显不足。为此,本项目基于 Spring Boot + Vue3 技术栈,构建一套烹饪交流学习平台(前后端分离),旨在为普通用户与管理员提供一个包含菜谱发布、智能推荐、学习交流、视频教学与排行榜等功能的数字化平台,提升菜谱内容质量与用户学习体验。

二、系统架构与技术栈

  • 前端:Vue3 + Element Plus(管理端:cookie-web-admin,用户端:cookie-web-user
  • 后端:Java + Spring Boot + MyBatis(cookie-boot
  • 数据库:MySQL 8.x
  • 其它:Node.js、npm/yarn、Maven、IntelliJ IDEA、Navicat

系统采用前后端分离架构,后端暴露 RESTful API,前端通过统一接口调用并按角色(管理员 / 普通用户)展示不同页面与权限。

三、主要功能

3.1管理员功能需求

(1)登录

管理员通过个人账号,登录后台管理系统。

(2)个人信息管理

管理员可以查看和修改个人基本信息(姓名、联系方式、邮箱等),保证账号信息的准确性。

(3)密码修改

管理员可以修改登录密码,增强账号安全性。

(4)用户管理

对用户基本信息进行查看操作,可以为用户重置密码,删除用户以及停用违规用户账号。

(5)菜谱管理

管理员可以管理用户发布的菜谱内容,主要包括审核、编辑、删除、查看详情等操作。对于菜谱质量管理,管理员可以根据菜谱内容质量进行标记分类,包括美图菜谱、精品菜谱、新手友好等标签,同时标记菜谱难度等级为初级、中级或高级。此外,在评论管理模块中,管理员可以查看用户对菜谱的评论信息,并对不合规的评论内容进行删除处理。

(6)菜谱视频管理

管理员在这里可以统一管理用户上传的做菜视频,对于不合规的视频,可以进行下架处理。

(7)厨艺大比拼审核

审核用户发布的厨艺大比拼信息,并可删除不合规的信息。

(9)统计分析

分析点击数、收藏数、点赞数、评论数等维度信息,比如Top收藏菜谱、Top10点赞菜谱,好评最多的几个菜谱,好评率等。

(10)字典管理

维护菜谱分类、口味、烹调方法等字典数据,为前端选择控件提供统一数据来源。

(11)公告管理

发布、编辑、启用/停用公告,向用户推送重要通知。

3.2用户功能需求

(1)注册与登录

用户通过账号密码注册、登录用户端系统,完善基础信息。

(2)菜谱智能推荐

用户选择食材、厨具后,系统为用户按照菜谱难度推荐菜谱,并推荐两道搭配菜,点击菜谱进入菜谱详情页面,里面介绍食材和制作步骤等信息,在详情页展示制作视频。

(3)菜谱学习与交流

查看已发布的所有菜谱列表,点击菜谱名称,可以查看菜谱详情。可以点赞、收藏。做菜交流:用户在这里上传用这个菜谱做的菜的图片、辅助文字进行描述,也可以在这里上传自己的做菜视频,供其他用户学习交流。

(4)菜谱排行榜

根据点赞数、收藏数、评价数,展示Top10菜谱。

(5)今天吃什么

点击按钮,随机抽取一道菜供用户参考。

(6)厨艺大比拼

用户可在此发布比赛,包括比赛标题、时间、地点和要求等信息,发布后待管理员审核通过后,其他用户可以报名比赛。报名比赛后,用户线下参与比赛。

(7)公告

用户在这里查看管理员发布的公告信息。

(8)个人中心

  1. 我的菜谱

用户可以点击添加按钮来发布自己的菜谱,包含菜谱分类、食材配方、制作步骤、制作视频等详细信息。发布后,可通过编辑按钮修改菜谱内容,同时可以查看管理员的审核信息,或选择删除已发布的菜谱。

  1. 历史记录

查看之前点击过的菜谱列表,按照点击时间倒序排序。

  1. 我的比赛

用户可以查看自己发布的比赛,支持编辑比赛内容、查看管理员审核信息或删除比赛。点击发布按钮可创建新的比赛活动。此外,用户还可以查看已报名的比赛,并对不需要参加的比赛进行退赛操作。

  1. 个人信息

修改个人信息。

  1. 修改密码

用户在这里修改账号密码。

四、菜谱推荐算法

1、 算法类型:多维度加权评分算法

这个推荐算法采用了多维度加权评分的方法,类似于协同过滤和内容推荐的结合体。

2、 主要流程

1)数据预处理阶段*// 获取候选菜谱(只推荐审核通过的菜谱)
java 复制代码
// 获取候选菜谱(只推荐审核通过的菜谱)
List<TRecipe> candidateRecipes = getCandidateRecipes(request);
2) 多维度评分计算

对每个候选菜谱计算5个维度的得分:

食材匹配度 (35%权重)
java 复制代码
private BigDecimal calculateIngredientMatchScore(List<String> recipeIngredients, List<String> selectedIngredients) {
    int matchedCount = 0;
    for (String selected : selectedIngredients) {
        for (String recipe : recipeIngredients) {
            if (recipe.contains(selected) || selected.contains(recipe)) {
                matchedCount++;
                break;
            }
        }
    }
    BigDecimal matchRate = new BigDecimal(matchedCount).divide(new BigDecimal(selectedIngredients.size()), 2, RoundingMode.HALF_UP);
    return matchRate.compareTo(BigDecimal.valueOf(0.1)) > 0 ? matchRate : BigDecimal.valueOf(0.1);
}

计算逻辑:

  • 遍历用户选择的每种食材

  • 检查菜谱是否包含该食材(模糊匹配)

  • 计算匹配率:匹配食材数 ÷ 用户选择食材总数

  • 最低保证0.1分(避免完全不匹配)

器具匹配度 (25%权重)
java 复制代码
private BigDecimal calculateToolMatchScore(String recipeTools, List<String> selectedTools) {
    int matchedCount = 0;
    for (String selected : selectedTools) {
        if (recipeTools.contains(selected)) {
            matchedCount++;
        }
    }
    return matchedCount == 0 ? BigDecimal.valueOf(0.3) : 
           new BigDecimal(matchedCount).divide(new BigDecimal(selectedTools.size()), 2, RoundingMode.HALF_UP);
}

计算逻辑:

  • 检查菜谱需要的器具是否在用户选择中

  • 如果完全不匹配,给0.3的基础分(容错性)

  • 否则按匹配比例打分

饮食平衡度 (20%权重)
java 复制代码
private BigDecimal calculateDietBalanceScore(List<String> recipeIngredients) {
    // 统计荤素比例
    int meatCount = 0, vegetableCount = 0, stapleCount = 0;
    
    // 计算各类型食材得分
    BigDecimal meatScore = calculateCategoryScore(meatCount, 1, 2);      // 荤菜:1-2份
    BigDecimal vegetableScore = calculateCategoryScore(vegetableCount, 2, 3); // 素菜:2-3份
    BigDecimal stapleScore = calculateCategoryScore(stapleCount, 1, 2);   // 主食:1-2份
    
    return meatScore.add(vegetableScore).add(stapleScore).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP);
}

荤素分类映射:

  • 荤菜:猪肉、牛肉、鸡肉、鱼虾、鸡蛋等

  • 素菜:各类蔬菜、豆腐等

  • 主食:面食、米饭、面包等

难度适配度 (10%权重)
  • 无偏好时:初级菜谱+0.9分,中级+0.7分

  • 有偏好时:完全匹配+1分,不匹配+0.6分

时间适配度 (10%权重)
  • 根据用户设置的最大烹饪时间进行匹配

  • 在时间范围内:+1分,超出:+0.5分

3)综合评分计算
java 复制代码
BigDecimal totalScore = ingredientScore.multiply(INGREDIENT_WEIGHT)
    .add(toolScore.multiply(TOOL_WEIGHT))
    .add(dietBalanceScore.multiply(DIET_BALANCE_WEIGHT))
    .add(difficultyScore.multiply(DIFFICULTY_WEIGHT))
    .add(timeScore.multiply(TIME_WEIGHT));

4) 排序与推荐

shell 复制代码
// 按得分降序排序
recipeScores.sort((a, b) -> b.getTotalScore().compareTo(a.getTotalScore()));

// 返回结果
RecipeRecommendationResponseDto response = new RecipeRecommendationResponseDto();
response.setMainRecipe(recipeScores.get(0).getRecipe());  // 得分最高的作为主菜
response.setSideRecipes(recipeScores.subList(1, 3));      // 接下来2个作为搭配菜

3、 算法优势

  1. 精确匹配:食材和器具的精准匹配度计算

  2. 营养均衡:自动分析荤素搭配比例

  3. 个性化:根据用户偏好进行难度和时间适配

  4. 容错性强:即使某些维度匹配度低也能给出合理推荐

  5. 可扩展性:权重可以根据需求动态调整

4、 评分区间

  • 总得分范围:0.0 - 1.0

  • 各维度得分:0.0 - 1.0

  • 最低得分保证:确保每个菜谱都有展示机会

5、 实际效果

用户选择"土豆、猪肉、炒锅"时:

  • 土豆炖肉得分高(食材+器具完美匹配)

  • 清炒土豆丝得分中等(食材匹配但缺少肉类)

  • 红烧排骨得分低(缺少主要食材)

这个算法既保证了推荐的准确性,又考虑了用户体验和营养均衡,是一个实用性很强的智能推荐系统!

相关推荐
jinanwuhuaguo2 小时前
OpenClaw办公人员核心技能深度培训体系:从认知重塑到数字组织构建的全链路实战指南
java·大数据·开发语言·人工智能·openclaw
zihao_tom2 小时前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端
不会写DN2 小时前
Protocol Buffers(.proto)实战入门:Go 生态最常用的接口定义语言
java·前端·golang
lifallen2 小时前
Flink Agents:从 DataStream 到 Agent 算子的接入与装配
java·大数据·人工智能·python·语言模型·flink
014-code2 小时前
MySQL 很实用的 SQL 语句清单(排障与日常运维)
sql·mysql
oYD3FlT322 小时前
MyBatis-缓存与注解式开发
java·缓存·mybatis
小邓的技术笔记2 小时前
开发实战:asp.net core + ef core 实现动态可扩展的分页查询方案
后端·asp.net
小小小米粒2 小时前
原生 JS:数据和视图「分离」,必须手动同步原生 JS 里,数据是数据,视图是视图,两者完全没关系
前端·javascript·vue.js