J009 美食推荐可视化大数据系统vue+springboot

文章结尾部分有CSDN官方提供的学长 联系方式名片

关注B站,私信获取! 麦麦大数据

编号: J009


视频

(此处可插入系统演示视频链接或说明)


1 系统简介

系统简介:本系统是一个基于 Vue + SpringBoot + MySQL 构建的 美食推荐与大数据可视化分析系统 。其核心功能围绕推荐算法、数据可视化、后台管理及用户互动 展开,旨在为用户提供个性化的美食推荐服务,同时为管理员提供全面的数据分析与管理平台。主要功能模块包括:用户登录注册、美食推荐、可视分析大屏、会员充值、数据管理等功能。


2 功能设计

该系统采用前后端分离架构(B/S),前端基于 Vue 技术栈构建响应式界面,后端采用 SpringBoot 提供 RESTful API 接口,MySQL 作为主数据库管理用户信息、推荐数据和行为日志等。前端使用 ECharts 实现多种图形图表的可视化分析,支持百度热力图、饼图、柱状图、折线图、漏斗图、仪表盘、词云等,整体视觉风格采用 Mint 主题 ,界面清新美观。同时,系统引入 UserCF + ItemCF 双协同过滤推荐算法 提升推荐精准度,并结合身份证识别与阿里沙箱支付模拟实现会员充值体系,具备一定创新性与实用性。

2.1 系统架构图

系统整体架构如下:

  • 用户层:通过浏览器访问系统,使用前端界面进行美食浏览、推荐查看和支付操作;
  • 前端层:基于 Vue + Vue Router + Axios + Element UI 构建,集成 ECharts 实现丰富可视化功能;
  • 后端层:SpringBoot 提供 API 接口,处理业务逻辑与数据请求,连接数据库和第三方服务;
  • 数据层:MySQL 存储用户、职位、推荐结果、行为数据等;
  • 算法层:协同过滤推荐模型(UserCF + ItemCF)独立训练,提供推荐接口;
  • 集成服务:集成身份证识别 API(如第三方 SDK)、阿里沙箱支付接口(模拟)实现会员认证与充值流程;
  • 可视化大屏:部署独立分析视图,集成 ECharts 多种图表组件,用于展示热门菜品、消费趋势等分析结果。

2.2 功能模块图

主要功能模块有:

  1. 用户登录注册与身份识别
  2. 食材推荐(基于协同过滤)
  3. 多维可视化分析大屏(ECharts 图表)
  4. 会员充值(模拟支付流程)
  5. 后台管理(增删改查)
  6. 个人中心(收藏、查看历史、设置)
  7. CSS 美化与交互体验优化

3 系统详细功能说明

3.1 登录 & 注册

  • 登录界面包含用户名/密码输入框,支持"记住密码"、"忘记密码"功能;
  • 注册支持真实姓名、手机号、身份证号(身份证识别技术验证)和密码;
  • 身份证识别功能调用第三方 SDK(如百度智能云OCR),自动识别用户身份证信息,提升注册安全性与便捷性;
  • 用户注册成功后跳转至首页,系统自动分配默认会员等级(如普通用户);

    登录后显示主页:

    店铺分析:

    价格分析:

词云分析:

美食评分地图:


数据查询:

浏览历史:

3.2 美食推荐系统

系统采用 UserCF + ItemCF 双协同过滤算法,融合用户行为与物品特征,提升推荐准确性:

3.2.1 UserCF(User-based Collaborative Filtering)
  • 基于用户相似度计算,找出"口味相近"的用户群体;
  • 推荐其喜欢的菜品给当前用户;
  • 用户相似度使用余弦相似度计算:
    sim ( u , v ) = r u ⋅ r v ∥ r u ∥ ∥ r v ∥ \text{sim}(u,v)=\frac{\mathbf{r}_u \cdot \mathbf{r}_v}{\|\mathbf{r}_u\| \|\mathbf{r}_v\|} sim(u,v)=∥ru∥∥rv∥ru⋅rv
    其中 r u \mathbf{r}_u ru 为用户 u u u 的菜品评分向量;
3.2.2 ItemCF(Item-based Collaborative Filtering)
  • 基于菜品相似度,推荐与用户已点菜品相似的其他菜品;
  • 菜品相似度通过共现矩阵和余弦相似度计算;
  • 使用用户-菜品评分矩阵(稀疏矩阵)进行推荐预测;

3.2.3 推荐流程
  1. 获取用户 ID;
  2. 从数据库读取用户历史行为(点餐记录、评分、收藏);
  3. 分别计算 UserCF 和 ItemCF 推荐列表;
  4. 加权融合结果(如 UserCF 占60%,ItemCF 占40%);
  5. 推荐 Top 10 菜品,展示在首页推荐栏;

优化点:结合时间衰减因子、地域偏好等特征,进一步提升推荐相关性。


3.3 可视化分析大屏

系统设计一个独立的可视化分析大屏,集成 ECharts 实现多种数据展示效果:

图表类型 功能说明
百度热力图 展示各地区美食消费热度,按城市、商圈分布
饼图 区域美食品类占比(如川菜、粤菜、小吃等)
柱状图 各类菜品销量排名(每日/每周/每月)
折线图 消费趋势变化(如"五一假期"销量激增)
漏斗图 用户点餐流程转化率分析(浏览 → 收藏 → 下单)
仪表盘 显示当前会员总数、活跃用户比例、推荐覆盖率
词云 可视化热门菜品词频,突出"火锅"、"烤肉"、"奶茶"等关键词

🎨 大屏支持全屏切换、数据刷新、主题切换(Mint 主题)等功能,适用于展厅、运营展示等场景。


3.4 会员充值业务(阿里沙箱支付模拟)

系统集成阿里沙箱支付(模拟环境),实现会员身份升级与充值流程:

功能流程:
  1. 用户点击"开通会员"按钮;
  2. 跳转到支付页面,选择会员类型(如VIP年卡、季度卡);
  3. 通过阿里沙箱接口发起支付请求;
  4. 模拟支付成功(无实际扣费),系统自动激活会员状态;
  5. 会员享受更多特权:
    • 推荐优先级提升
    • 免费使用推荐策略(如"智能营养搭配")
    • 积分返利(每消费1元=1分)

💡 安全机制 :支付金额和用户信息加密传输,使用 Token 验证用户合法性;

🔧 技术栈 :SpringBoot + Alipay SDK(沙箱环境) + Redis 缓存交易状态;


3.5 后台管理功能(Vue 管理后端)

管理员可通过后台管理系统实现对业务数据的增删改查:

  • 菜品管理:添加/修改/删除菜品、设置菜品分类(如川菜、甜品、饮品)、上传菜品高清图片;
  • 用户管理:查看用户列表、禁用违规账号、编辑用户资料;
  • 推荐日志管理:查看每日推荐记录,分析推荐成功率;
  • 数据监控:查看每日新增用户、充值订单、推荐点击量等统计图表;
  • 权限控制:使用 Spring Security 实现角色控制(普通用户、管理员、超级管理员);

🖥️ 前端使用 Vue + Element UI 构建管理界面,支持表格分页、搜索、导入/导出 Excel 功能。




3.6 个人中心

用户登录后可进入个人中心进行个性化设置:

  • 我的收藏:查看/管理收藏菜品;
  • 历史记录:查看最近点餐记录;
  • 会员信息:查看当前会员等级、有效期;
  • 个人设置:修改昵称、头像、绑定手机等;
  • 评价反馈:对推荐系统提交建议或吐槽;

3.7 CSS 美化与交互体验优化

系统采用精心设计的 CSS 样式,提升用户体验:

特性 实现方式
链接带选中颜色 :visited 伪类设置不同颜色,增强导航体验
按钮悬浮效果 hover 时改变背景色、阴影、字体颜色
图片悬浮透明度 opacity: 0.7;transition: opacity 0.3s; 实现优雅淡入淡出
卡片样式 使用 box-shadow、圆角 border-radius 实现立体感
Mint 主题 基于 Mint UI 设计风格,色调柔和、界面简洁,适合美食类主题

💡 使用 lessscss 进行样式模块化管理,便于维护;


4 程序核心算法与代码

4.1 代码说明

系统的核心算法主要包括:

  • 协同过滤推荐(UserCF + ItemCF):基于用户评分数据,使用余弦相似度进行推荐;
  • ECharts 可视化大屏构建:集成多种图表,实现动态数据展示;
  • 身份证识别:调用第三方接口识别用户身份信息;
  • 阿里沙箱支付模拟:使用 SpringBoot 调用模拟支付接口实现会员开通;

4.2 流程图

4.2.1 推荐算法流程图
复制代码
开始
   ↓
获取用户ID
   ↓
读取用户历史行为(评分、收藏、点餐)
   ↓
【UserCF】计算相似用户 → 推荐物品
   ↓
【ItemCF】计算相似菜品 → 推荐相关菜品
   ↓
加权融合推荐结果(权值可调)
   ↓
返回Top 10推荐菜品
   ↓
结束
4.2.2 会员充值流程
复制代码
用户点击开通会员
   ↓
选择会员套餐
   ↓
前端发送请求至后端
   ↓
后端调用Alipay沙箱接口
   ↓
模拟支付成功
   ↓
更新用户会员状态
   ↓
返回成功页面
   ↓
结束

4.3 代码实例

4.3.1 UserCF 推荐算法实现(Java)
java 复制代码
public List<Integer> recommendUserCF(int userId, int k) {
    List<Integer> recommendations = new ArrayList<>();
  
    // 获取用户评分向量(菜品 -> 评分)
    Map<Integer, Double> userRatings = ratingDAO.getAllRatingsByUser(userId);
  
    // 计算用户相似度
    List<UserSimilarity> similarities = new ArrayList<>();
    for (int otherUserId : userDAO.getAllUserIds()) {
        if (otherUserId != userId) {
            double similarity = calculateCosineSimilarity(userRatings, 
                                                         ratingDAO.getAllRatingsByUser(otherUserId));
            if (similarity > 0.0) {
                similarities.add(new UserSimilarity(otherUserId, similarity));
            }
        }
    }
  
    // 按相似度排序,取前K个用户
    similarities.sort((a, b) -> Double.compare(b.similarity, a.similarity));
    List<Integer> topKUsers = similarities.stream()
                                          .limit(k)
                                          .map(us -> us.userId)
                                          .collect(Collectors.toList());
  
    // 基于相似用户推荐未点过的菜品
    Map<Integer, Double> scoreMap = new HashMap<>();
    for (int similarUser : topKUsers) {
        Map<Integer, Double> userRatings2 = ratingDAO.getAllRatingsByUser(similarUser);
        for (Map.Entry<Integer, Double> entry : userRatings2.entrySet()) {
            int foodId = entry.getKey();
            double rating = entry.getValue();
          
            if (!userRatings.containsKey(foodId)) {
                scoreMap.put(foodId, scoreMap.getOrDefault(foodId, 0.0) + rating * 0.8);
            }
        }
    }
  
    // 按得分排序,返回Top 10
    return scoreMap.entrySet().stream()
                   .sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
                   .limit(10)
                   .map(Map.Entry::getKey)
                   .collect(Collectors.toList());
}

4.3.2 阿里沙箱支付模拟(SpringBoot)
java 复制代码
@PostMapping("/pay")
public ResponseEntity<String> pay(@RequestBody PaymentRequest request) {
    String alipayAppId = "2016092900586596";
    String alipayPrivateKey = "your_private_key";
    String alipayPublicKey = "your_public_key";
  
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", 
                                                       alipayAppId, alipayPrivateKey, "json", "GBK", 
                                                       alipayPublicKey, "RSA2");
  
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    alipayRequest.setNotifyUrl("https://your-domain.com/notify");
    alipayRequest.setReturnUrl("https://your-domain.com/return");
    alipayRequest.setBizContent("{\"out_trade_no\":\"" + request.getOrderId() + "\","
                              + "\"total_amount\":\"" + request.getAmount() + "\","
                              + "\"subject\":\"VIP会员开通\","
                              + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
  
    try {
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return ResponseEntity.ok(result);
    } catch (Exception e) {
        return ResponseEntity.status(500).body("支付失败");
    }
}

4.3.3 ECharts 可视化示例(Vue)
vue 复制代码
<template>
  <div class="chart-container">
    <el-card shadow="hover">
      <div id="map" style="width: 100%; height: 400px;"></div>
    </el-card>
  </div>
</template>

<script>
import * as echarts from 'echarts';
import 'echarts-gl'; // 支持热力图
import 'echarts/theme/mint.css'; // 使用Mint主题

export default {
  mounted() {
    this.initMap();
  },
  methods: {
    initMap() {
      const chart = echarts.init(document.getElementById('map'), 'mint');
      const data = [
        ['北京', 120],
        ['上海', 90],
        ['广州', 70],
        ['深圳', 80],
        ['成都', 50]
      ];
      chart.setOption({
        title: { text: '城市美食消费热力图' },
        visualMap: {
          min: 0,
          max: 200,
          calculable: true,
          top: 'middle',
          left: 'center'
        },
        series: [{
          type: 'scatter',
          coordinateSystem: 'cartesian2d',
          data: data,
          symbolSize: 12,
          itemStyle: {
            color: 'yellow'
          }
        }]
      });
    }
  }
};
</script>

4.3.4 数据库表结构(MySQL)
sql 复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    real_name VARCHAR(50),
    id_card VARCHAR(18),
    phone VARCHAR(20),
    membership_status INT DEFAULT 0, -- 0: 普通, 1: VIP
    membership_expire_date DATE,
    avatar VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE food (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    category VARCHAR(50),
    price DECIMAL(10,2),
    origin_city VARCHAR(50),
    image_url VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE rating (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    food_id INT,
    score INT,
    comment TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (food_id) REFERENCES food(id)
);

文章结尾部分有CSDN官方提供的学长 联系方式名片

关注B站,私信获取! 麦麦大数据

编号: J009

相关推荐
rfidunion15 小时前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
小翰子_15 小时前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端
Irene199115 小时前
在 Vue 中使用 TypeScript 的几种方式
vue.js·typescript
菜鸟笔记本15 小时前
linux设置定时备份mysql数据
linux·mysql·oracle
千寻技术帮15 小时前
10347_基于Springboot的新疆旅游管理系统
spring boot·mysql·旅游·在线旅游
程序员iteng16 小时前
AI一键图表生成、样式修改的绘图开源工具【easy-draw】
spring boot·开源·node.js
hhcccchh16 小时前
学习vue第八天 Vue3 模板语法和内置指令 - 简单入门
前端·vue.js·学习
yyf1989052516 小时前
Vue 框架相关中文文献
前端·javascript·vue.js
粥里有勺糖16 小时前
开发一个美观的 VitePress 图片预览插件
前端·vue.js·vitepress