文章结尾部分有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 功能模块图

主要功能模块有:
- 用户登录注册与身份识别
- 食材推荐(基于协同过滤)
- 多维可视化分析大屏(ECharts 图表)
- 会员充值(模拟支付流程)
- 后台管理(增删改查)
- 个人中心(收藏、查看历史、设置)
- 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 推荐流程
- 获取用户 ID;
- 从数据库读取用户历史行为(点餐记录、评分、收藏);
- 分别计算 UserCF 和 ItemCF 推荐列表;
- 加权融合结果(如 UserCF 占60%,ItemCF 占40%);
- 推荐 Top 10 菜品,展示在首页推荐栏;
✅ 优化点:结合时间衰减因子、地域偏好等特征,进一步提升推荐相关性。
3.3 可视化分析大屏
系统设计一个独立的可视化分析大屏,集成 ECharts 实现多种数据展示效果:
| 图表类型 | 功能说明 |
|---|---|
| 百度热力图 | 展示各地区美食消费热度,按城市、商圈分布 |
| 饼图 | 区域美食品类占比(如川菜、粤菜、小吃等) |
| 柱状图 | 各类菜品销量排名(每日/每周/每月) |
| 折线图 | 消费趋势变化(如"五一假期"销量激增) |
| 漏斗图 | 用户点餐流程转化率分析(浏览 → 收藏 → 下单) |
| 仪表盘 | 显示当前会员总数、活跃用户比例、推荐覆盖率 |
| 词云 | 可视化热门菜品词频,突出"火锅"、"烤肉"、"奶茶"等关键词 |
🎨 大屏支持全屏切换、数据刷新、主题切换(Mint 主题)等功能,适用于展厅、运营展示等场景。
3.4 会员充值业务(阿里沙箱支付模拟)
系统集成阿里沙箱支付(模拟环境),实现会员身份升级与充值流程:
功能流程:
- 用户点击"开通会员"按钮;
- 跳转到支付页面,选择会员类型(如VIP年卡、季度卡);
- 通过阿里沙箱接口发起支付请求;
- 模拟支付成功(无实际扣费),系统自动激活会员状态;
- 会员享受更多特权:
- 推荐优先级提升
- 免费使用推荐策略(如"智能营养搭配")
- 积分返利(每消费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 设计风格,色调柔和、界面简洁,适合美食类主题 |
💡 使用
less或scss进行样式模块化管理,便于维护;
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




