一、系统架构设计
1. 技术栈选择
- 前端:React/Vue.js + 小程序框架(微信/支付宝)
- 后端:Spring Boot/Django/Node.js
- 数据库:MySQL/MongoDB(关系型+非关系型结合)
- 缓存:Redis
- 消息队列:RabbitMQ/Kafka
- 搜索服务:Elasticsearch
- 支付接口:微信支付/支付宝支付
2. 微服务架构模块
- 用户服务:用户注册、登录、信息管理
- 商品服务:商品展示、分类、搜索
- 订单服务:下单、支付、订单状态管理
- 库存服务:库存同步、扣减、预警
- 配送服务:配送员管理、路线规划
- 促销服务:优惠券、满减活动
二、核心下单流程实现
1. 商品选择与购物车功能
```javascript
// 前端购物车组件示例
class ShoppingCart {
constructor() {
this.items = [];
}
addItem(product, quantity = 1) {
const existingItem = this.items.find(item => item.id === product.id);
if (existingItem) {
existingItem.quantity += quantity;
} else {
this.items.push({...product, quantity});
}
this.calculateTotal();
}
calculateTotal() {
return this.items.reduce((total, item) => {
return total + (item.price * item.quantity);
}, 0);
}
}
```
2. 下单接口实现(Spring Boot示例)
```java
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/create")
public ResponseEntity createOrder(
@RequestBody OrderRequest orderRequest,
@RequestHeader("Authorization") String token) {
// 1. 验证用户身份
Long userId = jwtTokenUtil.getUserIdFromToken(token);
// 2. 验证库存
if (!inventoryService.checkStock(orderRequest.getItems())) {
throw new RuntimeException("库存不足");
}
// 3. 创建订单
Order order = orderService.createOrder(userId, orderRequest);
// 4. 扣减库存(分布式事务)
try {
inventoryService.reduceStock(order.getItems());
} catch (Exception e) {
// 回滚订单
orderService.cancelOrder(order.getId());
throw new RuntimeException("下单失败,库存不足");
}
return ResponseEntity.ok(new OrderResponse(order));
}
}
```
3. 数据库设计(关键表)
```sql
-- 订单表
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`order_no` varchar(32) NOT NULL COMMENT 订单号,
`total_amount` decimal(10,2) NOT NULL COMMENT 订单总金额,
`pay_amount` decimal(10,2) NOT NULL COMMENT 实付金额,
`status` tinyint NOT NULL DEFAULT 0 COMMENT 订单状态,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pay_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`)
);
-- 订单商品表
CREATE TABLE `order_items` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_id` bigint NOT NULL,
`product_id` bigint NOT NULL,
`product_name` varchar(100) NOT NULL,
`product_image` varchar(255) DEFAULT NULL,
`current_price` decimal(10,2) NOT NULL,
`quantity` int NOT NULL,
`product_sku_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`)
);
```
三、关键功能实现
1. 库存同步与防超卖
```java
// Redis分布式锁实现库存扣减
public boolean reduceStockWithLock(Long productId, int quantity) {
String lockKey = "lock:product:" + productId;
try {
// 尝试获取锁,设置过期时间防止死锁
boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if (!locked) {
return false;
}
// 查询当前库存
Integer stock = productMapper.selectStockById(productId);
if (stock < quantity) {
return false;
}
// 扣减库存
productMapper.reduceStock(productId, quantity);
return true;
} finally {
// 释放锁
redisTemplate.delete(lockKey);
}
}
```
2. 支付功能集成
```javascript
// 微信支付示例
async function createWechatPayOrder(orderId, totalFee) {
const params = {
body: 叮咚买菜订单,
out_trade_no: orderId,
total_fee: totalFee,
spbill_create_ip: 用户IP,
notify_url: 支付结果通知地址,
trade_type: JSAPI,
openid: 用户openid
};
const response = await axios.post(/api/payment/wechat, params);
// 调用微信支付JS API
WeixinJSBridge.invoke(
getBrandWCPayRequest,
response.data.payParams,
function(res) {
if (res.err_msg === "get_brand_wcpay_request:ok") {
// 支付成功处理
}
}
);
}
```
3. 订单状态管理
```java
public enum OrderStatus {
PENDING_PAYMENT(0, "待支付"),
PAID(1, "已支付"),
PREPARING(2, "备货中"),
DELIVERING(3, "配送中"),
COMPLETED(4, "已完成"),
CANCELLED(5, "已取消"),
REFUNDED(6, "已退款");
private final int code;
private final String desc;
// 构造方法、getter等
}
// 状态流转规则
public class OrderStateMachine {
public boolean canTransition(OrderStatus current, OrderStatus next) {
switch (current) {
case PENDING_PAYMENT:
return next == OrderStatus.CANCELLED || next == OrderStatus.PAID;
case PAID:
return next == OrderStatus.PREPARING || next == OrderStatus.CANCELLED;
// 其他状态流转规则...
default:
return false;
}
}
}
```
四、性能优化与高可用设计
1. 缓存策略:
- 商品详情、分类等热点数据使用Redis缓存
- 实现多级缓存(本地缓存+分布式缓存)
2. 异步处理:
- 使用消息队列处理支付结果通知、库存变更等异步操作
- 订单创建后发送消息到RabbitMQ,由消费者处理后续逻辑
3. 限流与降级:
- 对下单接口实施令牌桶限流
- 库存不足时快速失败,避免系统过载
4. 数据一致性:
- 使用分布式事务(Seata)保证订单与库存的数据一致性
- 最终一致性方案:通过消息队列+本地消息表实现
五、测试与部署方案
1. 测试策略:
- 单元测试:JUnit + Mockito
- 接口测试:Postman + Newman
- 压力测试:JMeter模拟高并发场景
- 全链路测试:使用Pinpoint/SkyWalking追踪调用链
2. CI/CD流程:
- GitLab CI/CD实现自动化构建与部署
- 蓝绿部署或金丝雀发布策略
3. 监控与告警:
- Prometheus + Grafana监控系统指标
- ELK收集与分析日志
- 关键业务指标告警(如下单成功率、支付失败率)
六、扩展功能建议
1. 智能推荐:基于用户购买历史推荐商品
2. 预售功能:支持时令商品的预售
3. 供应链协同:与供应商系统对接实现自动补货
4. 绿色包装选项:用户可选择环保包装
5. 无接触配送:疫情期间的特殊配送方式
以上方案可根据实际业务需求和技术栈进行调整,核心在于保证高并发场景下的系统稳定性和数据一致性,同时提供流畅的用户体验。