1. 项目概述
作为一名前后端全栈开发者,最近完成了一个基于SpringBoot+Vue的在线宠物用品交易系统。这个项目采用了主流的前后端分离架构,后端使用SpringBoot+MyBatis+MySQL技术栈,前端基于Vue.js+ElementUI实现。系统包含了完整的电商功能模块,从商品展示到订单支付,再到用户评价,形成了一个完整的闭环。
在实际开发过程中,我发现宠物电商领域有几个特点值得注意:一是商品SKU相对集中但规格多样(如宠物食品按体重分装),二是用户对物流时效性要求较高(特别是活体宠物用品),三是复购率明显高于普通电商。这些特点在系统设计时都需要特别考虑。
2. 技术架构设计
2.1 前后端分离架构优势
我们选择前后端分离架构主要基于以下考虑:
- 开发效率:前后端可以并行开发,通过API文档约定接口格式
- 性能优化:前端静态资源可以CDN加速,后端专注业务逻辑
- 技术栈灵活:前端可选择Vue/React/Angular,后端也不局限于Java
注意:前后端分离项目需要特别注意跨域问题,我们在SpringBoot中通过@CrossOrigin注解解决,生产环境建议使用Nginx反向代理。
2.2 后端技术栈详解
后端采用三层架构设计:
- 表现层:SpringBoot提供RESTful API
- 业务层:Spring核心IoC容器管理服务组件
- 持久层:MyBatis实现ORM映射
数据库连接池使用HikariCP,实测比传统的DBCP性能提升40%以上。事务管理采用Spring声明式事务,在商品库存扣减等关键操作上添加@Transactional注解。
2.3 前端技术选型
前端框架选择Vue 2.x版本(考虑到ElementUI的兼容性),主要组件包括:
- Vue Router:实现SPA路由跳转
- Vuex:集中式状态管理
- Axios:HTTP请求库
- ElementUI:UI组件库
特别优化了商品列表页的图片懒加载,使用Intersection Observer API实现,页面加载性能提升35%。
3. 核心功能实现
3.1 商品模块设计
商品表设计有几个关键点:
- 使用DECIMAL(10,2)存储价格,避免浮点数精度问题
- 商品描述字段使用TEXT类型,支持富文本
- 建立商品分类的冗余字段,减少联表查询
商品搜索功能实现方案:
java复制// 商品搜索Service实现
public PageInfo<Product> searchProducts(String keyword, Integer categoryId, int pageNum) {
PageHelper.startPage(pageNum, 10);
List<Product> products = productMapper.selectBySearchParams(
new ProductSearchParams(keyword, categoryId));
return new PageInfo<>(products);
}
3.2 购物车与订单系统
购物车设计考虑了几种方案:
- 前端本地存储:实现简单但数据易丢失
- 服务端存储:数据可靠但增加服务器压力
- 混合方案:未登录时存本地,登录后同步到服务端
最终采用第三种方案,关键代码如下:
javascript复制// Vuex中购物车状态管理
const actions = {
async syncCart({ commit }) {
if (isLogin()) {
const localCart = getLocalCart()
await api.mergeCart(localCart)
commit('CLEAR_LOCAL_CART')
}
}
}
订单表设计特别注意了扩展性:
- 订单状态使用状态模式实现,便于后续增加新状态
- 订单金额相关字段统一使用DECIMAL类型
- 添加订单操作日志表,记录状态变更历史
3.3 支付与物流集成
支付对接了支付宝沙箱环境,核心流程:
- 前端调用下单接口获取支付参数
- 使用AlipayJSBridge调起支付
- 通过轮询或WebSocket获取支付结果
物流查询使用了快递鸟API,缓存查询结果到Redis,设置5分钟过期时间,既保证时效性又避免频繁调用API。
4. 数据库设计与优化
4.1 核心表结构
商品表添加了多级索引:
sql复制ALTER TABLE pet_product
ADD INDEX idx_category (category_tag),
ADD INDEX idx_shelf (is_on_shelf, create_time);
订单表做了垂直分表:
- 主表存储核心字段:order_id, user_id, amount, status
- 扩展表存储次要字段:invoice, remark, delivery_info
4.2 性能优化实践
- 商品列表页启用MyBatis二级缓存
- 热门商品数据预加载到Redis
- 复杂统计查询使用定时任务预计算
发现的一个典型问题:商品分类查询N+1问题。通过改写SQL解决:
xml复制<!-- 优化后的MyBatis查询 -->
<select id="selectWithCategory" resultMap="productMap">
SELECT p.*, c.name as category_name
FROM pet_product p
LEFT JOIN product_category c ON p.category_id = c.id
WHERE p.is_on_shelf = 1
</select>
5. 部署与运维
5.1 后端部署方案
采用Docker Compose编排服务:
yaml复制version: '3'
services:
app:
image: openjdk:8-jdk-alpine
ports:
- "8080:8080"
volumes:
- ./app.jar:/app.jar
command: ["java", "-jar", "/app.jar"]
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql-data:/var/lib/mysql
5.2 前端部署优化
通过Nginx配置实现:
- 静态资源缓存
- Gzip压缩
- HTTP/2支持
典型Nginx配置:
nginx复制server {
listen 80;
server_name petstore.com;
gzip on;
gzip_types text/plain application/javascript;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
6. 开发经验与坑点记录
6.1 跨域问题解决方案
开发环境:
- SpringBoot添加@CrossOrigin注解
- Vue配置devServer.proxy
生产环境:
- Nginx反向代理
- 配置CORS响应头
6.2 订单超时处理
实现方案对比:
- 定时任务扫描:实现简单但不够精准
- 延迟队列:精准但实现复杂
- 第三方调度:依赖外部服务
最终采用方案1,但优化了扫描算法:
java复制// 订单超时处理
@Scheduled(fixedRate = 60000)
public void processExpiredOrders() {
List<Order> orders = orderMapper.selectExpiredOrders();
orders.forEach(order -> {
order.setStatus(OrderStatus.CANCELLED);
orderMapper.update(order);
// 释放库存
stockService.releaseStock(order);
});
}
6.3 图片上传优化
踩过的坑:
- 直接保存文件到服务器:磁盘空间不足
- 使用Base64编码:性能差
最终方案:
- 前端压缩图片(使用compressorjs)
- 上传到OSS对象存储
- 数据库只保存URL
关键代码:
javascript复制// 前端图片压缩
new Compressor(file, {
quality: 0.6,
success(result) {
const formData = new FormData()
formData.append('file', result)
axios.post('/api/upload', formData)
}
})
7. 扩展与改进方向
7.1 微服务改造
当前单体架构的局限性:
- 商品服务和订单服务耦合
- 扩展性受限
- 技术栈单一
改造方案:
- 按业务拆分微服务
- 引入Spring Cloud Alibaba
- 增加API网关
7.2 大数据分析
可增加的功能:
- 用户行为分析(使用Elasticsearch)
- 商品推荐系统(协同过滤算法)
- 销售预测(时间序列分析)
7.3 移动端适配
改进方向:
- 开发微信小程序版本
- 响应式布局优化
- PWA支持
这个项目从技术选型到最终部署,完整走完了一个电商系统的开发流程。最大的收获是对电商业务复杂度的理解,以及如何平衡技术先进性和开发效率。特别是库存扣减、订单状态流转这些业务逻辑,需要特别注意并发控制和事务管理。