1. 项目概述
去年接手了一个宠物用品电商平台的重构项目,原系统采用传统JSP+Servlet架构,存在前后端耦合严重、迭代效率低下等问题。经过技术选型,最终采用SpringBoot+Vue的前后端分离架构,6个月后系统成功上线,性能提升300%,开发效率提高40%。本文将分享这个项目的完整实现方案。
现代宠物用品电商平台需要应对高并发访问、快速迭代需求以及多样化的用户交互体验。传统单体架构在扩展性和开发效率上存在明显瓶颈,而前后端分离架构通过清晰的职责划分,让专业的人做专业的事。
2. 技术选型与架构设计
2.1 后端技术栈选择
选择SpringBoot作为后端框架主要基于以下考量:
- 自动配置特性大幅减少XML配置,我们的配置代码量减少了70%
- 内嵌Tomcat容器简化部署,打包后的JAR文件可直接通过
java -jar命令运行 - 与Spring生态无缝集成,特别是Spring Security和Spring Data的配合使用
- Actuator端点提供系统监控能力,我们自定义了/dbcheck端点检测数据库连接状态
数据库选用MySQL 8.0,主要考虑因素:
- JSON字段支持,用于存储商品扩展属性
- 窗口函数简化了销售排行榜等复杂查询
- 成本效益比商业数据库更优
2.2 前端技术决策
Vue.js作为前端框架的优势:
- 组件化开发模式,我们的UI组件复用率达到65%
- 响应式数据绑定,购物车状态管理代码减少40%
- Vue CLI提供的现代前端工作流,集成ESLint、Babel等工具
- 与Element UI完美配合,快速构建管理后台界面
特别说明:选择Element UI而非Ant Design的主要原因是其更适合中后台系统的视觉风格,且表单验证机制更符合我们的业务场景。
3. 数据库设计与实现
3.1 核心表结构优化
用户表(user_info)的密码存储采用BCrypt加密:
java复制// Spring Security的密码编码器配置
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
商品表(product)设计时的关键决策:
- 价格字段使用DECIMAL(10,2)而非FLOAT,避免浮点精度问题
- 库存字段设置无符号属性,防止负数库存
- 建立全文索引加速商品搜索
sql复制CREATE TABLE `product` (
`product_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`product_name` VARCHAR(100) NOT NULL,
`price` DECIMAL(10,2) UNSIGNED NOT NULL,
`stock` INT UNSIGNED NOT NULL DEFAULT 0,
`category_id` INT NOT NULL,
`description` TEXT,
`spec_json` JSON COMMENT '商品规格',
PRIMARY KEY (`product_id`),
FULLTEXT INDEX `idx_search` (`product_name`, `description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 订单系统设计
订单表(order_info)采用分库分表设计:
- 按用户ID哈希分片,解决单表数据量过大问题
- 状态字段使用ENUM类型确保数据一致性
- 建立组合索引(user_id, create_time)加速查询
java复制// 订单状态枚举定义
public enum OrderStatus {
UNPAID, PAID, SHIPPED, COMPLETED, CANCELLED, REFUNDED
}
4. 核心功能实现
4.1 商品展示模块
商品列表API实现要点:
- 分页查询使用MyBatis-Plus的Page对象
- 缓存热点商品数据,我们使用Redis缓存TOP100商品
- 采用DTO模式隔离实体与接口数据
java复制@GetMapping("/products")
public Result<Page<ProductDTO>> listProducts(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size,
@RequestParam(required = false) Integer categoryId) {
Page<Product> productPage = productService.page(new Page<>(page, size),
new QueryWrapper<Product>()
.eq(categoryId != null, "category_id", categoryId)
.orderByDesc("sales"));
return Result.success(productPage.convert(this::convertToDTO));
}
4.2 购物车实现
购物车关键技术点:
- 未登录用户使用浏览器localStorage存储
- 已登录用户数据持久化到数据库
- 采用乐观锁解决并发修改问题
vue复制<template>
<div class="cart-item">
<el-checkbox v-model="item.selected"></el-checkbox>
<img :src="item.productImage" class="product-image">
<div class="product-info">
<h4>{{ item.productName }}</h4>
<el-input-number
v-model="item.quantity"
:min="1"
:max="item.stock"
@change="updateQuantity(item)">
</el-input-number>
</div>
</div>
</template>
<script>
export default {
methods: {
async updateQuantity(item) {
try {
await this.$axios.put(`/cart/${item.id}`, {
quantity: item.quantity,
version: item.version // 乐观锁版本号
});
} catch (error) {
this.$message.error('更新数量失败');
}
}
}
}
</script>
5. 支付系统集成
5.1 支付流程设计
支付状态机实现:
java复制public class PaymentService {
@Transactional
public void processPayment(Long orderId) {
Order order = orderRepository.findById(orderId)
.orElseThrow(() -> new BusinessException("订单不存在"));
if (order.getStatus() != OrderStatus.UNPAID) {
throw new BusinessException("订单状态异常");
}
// 调用支付网关
PaymentResult result = paymentGateway.pay(order);
if (result.isSuccess()) {
order.setStatus(OrderStatus.PAID);
order.setPaymentTime(LocalDateTime.now());
orderRepository.save(order);
// 触发库存扣减
inventoryService.reduceStock(order);
}
}
}
5.2 支付安全措施
关键安全策略:
- 接口参数签名验证
- 支付结果异步通知+主动查询双重确认
- 敏感数据加密传输
- 风控规则:同一IP短时间多次支付触发验证码
6. 部署与运维
6.1 生产环境配置
Nginx关键配置:
nginx复制server {
listen 80;
server_name petstore.example.com;
location /api/ {
proxy_pass http://backend-server;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 75s;
}
location / {
root /var/www/petstore-frontend;
try_files $uri $uri/ /index.html;
}
}
6.2 监控方案
我们采用的监控组合:
- Prometheus采集SpringBoot Actuator指标
- Grafana展示关键业务指标看板
- ELK收集和分析业务日志
- 自定义健康检查接口检测第三方服务状态
7. 踩坑经验分享
7.1 跨域问题解决
开发环境解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
生产环境注意事项:
- 严格限制allowedOrigins域名
- 预检请求缓存时间不宜过长
- 敏感接口禁用CORS,采用Nginx反向代理
7.2 性能优化实践
数据库优化措施:
- 为常用查询添加覆盖索引
- 大表查询强制指定索引
- 定期执行
ANALYZE TABLE更新统计信息
缓存策略改进:
- 多级缓存:Redis → Caffeine → 数据库
- 热点数据预加载
- 缓存雪崩防护:随机过期时间
8. 项目扩展方向
已规划的扩展功能:
- 推荐系统:基于用户行为的协同过滤
- 智能客服:集成NLP问答引擎
- 直播带货:WebRTC实时视频支持
- 供应链管理:对接供应商API
技术演进路线:
- 服务化拆分:Spring Cloud微服务架构
- 数据中台:构建统一数据分析平台
- 云原生转型:Kubernetes容器化部署
这个项目给我的深刻体会是:架构设计需要平衡短期交付压力和长期可维护性。我们在第三个月进行了两次重大重构,就是因为早期过于追求速度而忽视了代码质量。建议在项目初期就建立严格的技术评审机制,特别是对核心模块的设计要进行充分论证。