1. 项目概述:咖啡共赏平台的设计初衷
作为一个咖啡爱好者兼全栈开发者,我一直想打造一个能让咖啡爱好者交流、分享和购买精品咖啡的线上平台。这个基于SpringBoot和Vue.js的咖啡商城项目,不仅实现了传统电商的核心功能,还融入了社区互动元素和智能推荐系统。
平台的核心定位是"共赏"而非单纯的买卖——用户可以在购买前查看其他咖啡爱好者的评价,分享自己的冲泡心得,甚至参与咖啡豆的众筹定制。这种模式特别适合精品咖啡这类注重体验和口碑的商品。
提示:在电商平台中加入社区元素时,要特别注意数据隔离。用户生成内容(UGC)模块需要与交易系统保持松耦合,这样未来扩展时不会互相影响。
2. 技术架构设计
2.1 整体技术栈选型
选择SpringBoot+Vue.js这套技术组合主要基于以下几个考量:
- 开发效率:SpringBoot的约定优于配置和Vue的渐进式特性,能快速搭建出原型
- 社区生态:两者都有丰富的组件库和插件,比如Spring Security和Element UI
- 团队适配:Java后端和前端分离的架构,便于分工协作
- 性能平衡:SpringBoot的并发处理能力配合Vue的轻量级前端,能支撑中等规模的用户量
技术栈详情:
- 后端:SpringBoot 2.7 + Spring Security + MyBatis-Plus
- 前端:Vue 3 + Vuex + Element Plus
- 数据库:MySQL 8.0(考虑过PostgreSQL,但团队更熟悉MySQL)
- 基础设施:阿里云ECS + OSS + Redis
2.2 架构设计要点
采用经典的三层架构,但做了些针对性优化:
- 表现层:Vue SPA应用,通过axios与后端交互
- 业务层:SpringBoot微服务,按功能划分为多个模块
- 数据层:MySQL主从复制,Redis缓存热点数据
特别设计了异步消息队列处理订单状态变更和通知,避免高并发时的系统阻塞。
3. 核心功能实现
3.1 用户系统设计
用户模块不仅是简单的注册登录,还包含完整的权限体系和社交功能:
java复制// JWT认证核心代码示例
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("roles", userDetails.getAuthorities());
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + JWT_EXPIRATION))
.signWith(SignatureAlgorithm.HS512, JWT_SECRET)
.compact();
}
权限控制采用RBAC模型,通过Spring Security的@PreAuthorize注解实现方法级权限控制。
3.2 商品系统实现
商品模块支持多级分类和复杂的搜索条件:
-
数据结构设计:
- 咖啡商品表(t_coffee):基础信息
- 咖啡属性表(t_attr):烘焙度、处理法等专业属性
- 分类表(t_category):树形结构存储分类
-
搜索优化:
- 基础搜索:MySQL全文索引
- 高级搜索:Elasticsearch集成(二期规划)
sql复制-- 商品表DDL示例
CREATE TABLE `t_coffee` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '商品名称',
`origin` varchar(50) COMMENT '产地',
`process` varchar(20) COMMENT '处理法',
`roast_level` tinyint COMMENT '烘焙度(1-5)',
`price` decimal(10,2) NOT NULL,
`stock` int DEFAULT 0,
`description` text,
`status` tinyint DEFAULT 1 COMMENT '上架状态',
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_search` (`name`,`origin`,`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.3 订单系统设计
订单模块是电商系统的核心,我们实现了:
-
状态机设计:
- 待支付 → 已支付 → 已发货 → 已完成
- 允许取消订单(支付前)和申请退款(支付后)
-
分布式事务处理:
- 使用Seata处理库存扣减与订单创建的分布式事务
- 采用最终一致性方案处理支付回调
注意:订单编号生成不要使用自增ID,建议采用"时间戳+随机数+用户ID哈希"的组合策略,避免被爬取和猜测。
4. 特色功能实现
4.1 智能推荐系统
结合两种推荐算法提升推荐效果:
-
基于物品的协同过滤(ItemCF):
- 计算咖啡之间的相似度
- 根据用户历史购买推荐相似商品
-
随机森林算法:
- 特征包括:用户画像、浏览记录、购买历史等
- 预测用户可能感兴趣的商品类别
算法实现示例:
python复制# 随机森林推荐示例代码
from sklearn.ensemble import RandomForestClassifier
# 准备特征数据
X = user_behavior_features
y = purchase_labels
# 训练模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)
# 预测推荐概率
probabilities = model.predict_proxy(new_user_features)
4.2 社区互动功能
-
咖啡评测系统:
- 多维评分(香气、酸度、醇厚度等)
- 带图评价和冲泡参数记录
-
弹幕互动:
- 商品详情页的视频支持弹幕
- WebSocket实时推送新弹幕
-
咖啡豆众筹:
- 用户可发起特定产区的咖啡豆团购
- 达到目标数量后触发采购流程
5. 部署与运维
5.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
volumes:
mysql_data:
5.2 监控方案
-
基础监控:Prometheus + Grafana
- JVM指标
- 接口响应时间
- 数据库性能
-
业务监控:
- 订单转化率
- 商品点击热力图
- 用户留存分析
-
日志收集:ELK Stack
- 错误日志告警
- 用户行为分析
6. 开发中的经验总结
6.1 踩过的坑
-
JWT续期问题:
- 初期设计忽略了token续期,导致用户频繁重新登录
- 解决方案:实现双token机制(access_token + refresh_token)
-
库存超卖问题:
- 高并发时出现库存扣减不一致
- 最终采用Redis分布式锁+数据库乐观锁双重保障
-
Vuex持久化:
- 页面刷新后Vuex状态丢失
- 引入vuex-persistedstate插件解决
6.2 性能优化点
-
前端优化:
- 路由懒加载
- 图片懒加载和WebP格式转换
- 组件级别代码分割
-
后端优化:
- Spring Cache注解缓存热点数据
- 批量接口减少网络请求
- Nginx开启gzip压缩
-
数据库优化:
- 读写分离
- 慢查询分析
- 适当的索引优化
7. 项目扩展方向
- 小程序端:基于uni-app开发微信小程序版本
- 国际化:支持多语言和多币种结算
- 供应链深化:对接咖啡农直采系统
- AI应用:
- 咖啡推荐聊天机器人
- 基于图像识别的咖啡豆评级
这个项目从技术选型到功能设计都充分考虑到了咖啡行业的特殊性,比如对商品专业属性的支持、社区互动功能的融入等。在实际开发过程中,最大的收获是如何平衡技术方案的先进性和团队的实现能力。