1. 项目概述
这个基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的精品水果电商系统,是我去年为一个本地连锁水果品牌开发的线上销售平台。系统采用前后端分离架构,后端使用Java技术栈,前端基于Vue3组合式API开发,完整实现了从商品展示、购物车管理到订单支付的全流程电商功能。
特别说明:本文分享的代码实现思路和架构设计,都是经过生产环境验证的成熟方案,文中会特别标注实际运营中遇到的性能瓶颈和解决方案。
2. 技术架构解析
2.1 后端技术栈选型
SpringBoot2.7.3作为基础框架,相比旧版本:
- 内置Tomcat9.0.64(支持HTTP/2)
- 更好的Actuator监控端点
- 更精细的内存配置(特别重要,后面会讲OOM问题的排查)
MyBatis-Plus 3.5.2的选择考虑:
java复制// 示例:MP的乐观锁配置
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
实际踩坑:高并发下单时需要特别注意@Version字段的更新时机,我们最终采用Redis分布式锁+MP乐观锁的双重保障。
2.2 前端技术方案
Vue3的组合式API相比选项式API:
- 商品详情页代码量减少40%
- 复用逻辑抽离为hooks(如useCart)
- 更好的TypeScript支持
typescript复制// 典型的组合式函数示例
export function useProductAPI() {
const loading = ref(false)
const getProductDetail = async (id: string) => {
loading.value = true
try {
return await axios.get(`/api/product/${id}`)
} finally {
loading.value = false
}
}
return { loading, getProductDetail }
}
3. 核心功能实现
3.1 商品模块设计
MySQL8.0的特性应用:
sql复制-- 使用窗口函数实现同类商品推荐
SELECT
*,
RANK() OVER(PARTITION BY category_id ORDER BY sales_count DESC) AS rank_val
FROM product
WHERE status = 1;
商品SKU的存储方案对比:
| 方案类型 | 优点 | 缺点 | 最终选择 |
|---|---|---|---|
| JSON存储 | 灵活 | 难查询 | ❌ |
| EAV模型 | 可扩展 | 性能差 | ❌ |
| 垂直分表 | 平衡性好 | 开发复杂 | ✅ |
3.2 购物车优化实践
核心数据结构:
java复制public class CartItem {
private Long skuId;
private Integer quantity;
private LocalDateTime addTime; // 用于LRU清理
}
性能优化点:
- 采用Redis Hash结构存储(用户ID为key)
- 定期异步持久化到MySQL
- 本地缓存热门商品价格(解决Redis穿透)
4. 订单系统实现
4.1 下单流程设计
关键状态机:
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> CANCELLED: 用户取消
PAID --> SHIPPED: 发货
SHIPPED --> COMPLETED: 确认收货
实际开发中遇到的坑:
- 支付超时处理(采用RabbitMQ延迟队列)
- 库存扣减的时序问题(先锁库存再创建订单)
4.2 支付对接方案
微信支付v3接口集成要点:
- 平台证书自动更新机制
- 敏感信息加密(使用MySQL8.0的AES_ENCRYPT)
- 幂等性处理(数据库唯一索引+本地缓存)
5. 性能优化实战
5.1 MySQL调优
配置示例:
ini复制# my.cnf关键参数
innodb_buffer_pool_size = 4G # 物理内存的70%
innodb_io_capacity = 2000 # SSD配置
binlog_group_commit_sync_delay = 100
索引优化案例:
sql复制-- 错误示例
ALTER TABLE order_info ADD INDEX idx_status (status);
-- 正确做法
ALTER TABLE order_info ADD INDEX idx_status_created (status, created_at);
5.2 JVM调优
生产环境配置:
bash复制java -jar \
-Xmx2g -Xms2g \
-XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
your-application.jar
GC日志分析工具:
- GCeasy
- IBM HeapAnalyzer
- 自研的日志解析脚本
6. 安全防护措施
6.1 常见攻击防护
防护方案对照表:
| 攻击类型 | 防护措施 | 实现位置 |
|---|---|---|
| XSS | Vue的v-html过滤 + 后端Jackson转义 | 前后端双重防护 |
| CSRF | SameSite Cookie + 自定义Header校验 | Nginx + 前端拦截器 |
| SQL注入 | MyBatis参数绑定 + 正则过滤 | DAO层全局处理 |
6.2 数据安全策略
敏感数据处理流程:
- 前端加密(CryptoJS)
- 传输加密(HTTPS + 自定义报文加密)
- 存储加密(MySQL AES_ENCRYPT)
- 展示脱敏(Jackson自定义序列化)
7. 部署架构设计
7.1 容器化方案
Docker Compose示例:
yaml复制version: '3.8'
services:
app:
image: openjdk:17-jdk
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 5s
retries: 3
7.2 监控方案
Prometheus监控指标示例:
yaml复制- pattern: '/api/order/create'
metrics:
- name: order_create_latency
help: 'Order create latency'
type: 'histogram'
labels:
method: '$method'
status: '$status'
8. 文档体系建设
8.1 API文档生成
Swagger配置技巧:
java复制@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info().title("水果电商API")
.version("v1")
.contact(new Contact().name("DevTeam")))
.externalDocs(new ExternalDocumentation()
.description("接口规范文档"));
}
8.2 数据库文档
使用SchemaCrawler生成ER图:
bash复制java -jar schemacrawler.jar \
--server=mysql --database=fruit_store \
--user=root --password=**** \
--info-level=standard --command=schema \
--output-format=png --output-file=er_diagram.png
这个项目从技术选型到最终上线历时3个月,期间遇到的典型问题包括:MySQL连接池爆满、Vue3的SSR兼容性问题、微信支付证书更新机制等。最终的解决方案都在文中相应部分做了详细说明,希望能给正在开发类似系统的同行提供参考。