1. 项目概述
今天要分享的是一个前后端分离的美食信息推荐系统,采用SpringBoot+Vue.js+MyBatis+MySQL技术栈实现。这个系统最大的特点是将推荐算法与美食信息管理相结合,为用户提供个性化的美食推荐服务。
作为一名长期从事前后端开发的技术博主,我发现很多美食类网站都存在推荐内容单一、交互体验差的问题。这个项目通过前后端分离架构和智能推荐算法,很好地解决了这些痛点。系统后端采用SpringBoot框架,前端使用Vue.js,数据库选用MySQL,整体架构清晰,易于扩展和维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型解析
后端技术栈:
- SpringBoot 2.7.x:简化Spring应用的初始搭建和开发过程
- MyBatis 3.5.x:优秀的持久层框架,支持定制化SQL
- MySQL 8.0:关系型数据库,存储系统核心数据
- Redis 6.x:缓存用户行为和热门美食数据,提升系统响应速度
前端技术栈:
- Vue.js 3.x:渐进式JavaScript框架,构建用户界面
- Element Plus:基于Vue 3的组件库,提供丰富的UI组件
- Axios:处理HTTP请求,实现前后端数据交互
- ECharts:可视化图表库,展示美食数据统计信息
提示:选择SpringBoot+Vue.js组合主要考虑到两者都有活跃的社区支持、丰富的生态系统,以及良好的开发体验。这种组合在中小型项目中特别适用。
2.2 系统架构图
系统采用典型的前后端分离架构:
code复制┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Vue.js │ ←→ │ Spring Boot │ ←→ │ MySQL │
│ 前端应用 │ │ 后端服务 │ │ 数据库 │
└─────────────┘ └─────────────┘ └─────────────┘
↑ ↑
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ 用户浏览器 │ │ Redis缓存 │
└─────────────┘ └─────────────┘
这种架构的优势在于:
- 前后端职责分离,开发效率高
- 接口复用性强,便于多端适配
- 系统扩展性好,各层可独立升级
- 性能优化空间大,可针对性地进行缓存处理
3. 数据库设计
3.1 核心数据表结构
系统设计了三个核心数据表,分别存储用户信息、美食信息和用户行为数据。
用户信息表(users)
| 字段名 | 类型 | 描述 | 设计考虑 |
|---|---|---|---|
| user_id | BIGINT | 用户ID,主键 | 使用自增主键,确保唯一性 |
| username | VARCHAR(50) | 用户名 | 限制长度,避免存储过长字符串 |
| password_hash | VARCHAR(64) | 密码哈希值 | 使用SHA-256加密存储 |
| VARCHAR(50) | 邮箱 | 用户唯一标识之一 | |
| phone | VARCHAR(20) | 手机号 | 可选登录方式 |
| register_time | DATETIME | 注册时间 | 记录用户注册时间点 |
| last_login | DATETIME | 最后登录时间 | 用于分析用户活跃度 |
| preference_tags | VARCHAR(100) | 偏好标签(JSON) | 存储用户美食偏好,格式如["川菜","甜品"] |
美食信息表(foods)
| 字段名 | 类型 | 描述 | 设计考虑 |
|---|---|---|---|
| food_id | BIGINT | 美食ID,主键 | 自增主键 |
| food_name | VARCHAR(50) | 美食名称 | 限制长度,避免过长 |
| description | TEXT | 美食描述 | 使用TEXT类型存储可能较长的描述 |
| category | VARCHAR(30) | 分类 | 如"川菜"、"粤菜"等 |
| price_range | VARCHAR(20) | 价格区间 | 如"50-100元" |
| rating | FLOAT | 平均评分 | 1-5分,根据用户评分计算 |
| image_url | VARCHAR(100) | 图片链接 | 存储美食图片URL |
| create_time | DATETIME | 创建时间 | 记录美食添加时间 |
| update_time | DATETIME | 更新时间 | 记录最后修改时间 |
用户行为表(user_behaviors)
| 字段名 | 类型 | 描述 | 设计考虑 |
|---|---|---|---|
| behavior_id | BIGINT | 行为ID,主键 | 自增主键 |
| user_id | BIGINT | 用户ID | 关联users表 |
| food_id | BIGINT | 美食ID | 关联foods表 |
| behavior_type | VARCHAR(20) | 行为类型 | "VIEW"(浏览),"COLLECT"(收藏),"RATE"(评分) |
| rating_value | FLOAT | 评分值 | 1-5分,仅当behavior_type="RATE"时有值 |
| behavior_time | DATETIME | 行为时间 | 记录行为发生时间 |
| additional_info | VARCHAR(100) | 附加信息(JSON) | 存储额外信息,如浏览时长等 |
3.2 数据库优化策略
-
索引设计:
- 为所有主键创建聚簇索引
- 为user_behaviors表的user_id和food_id创建联合索引
- 为foods表的category字段创建普通索引
-
分表考虑:
- 用户行为数据增长快,考虑按月份分表
- 热门美食数据可单独缓存到Redis
-
字段优化:
- 使用合适的数据类型,避免空间浪费
- 对可能为空的字段设置默认值
- 对大文本字段(如description)考虑使用压缩存储
