一、系统架构设计
1. 前端架构
- 技术栈:React/Vue + TypeScript + Ant Design/Element UI
- 核心页面:
- 首页(商品分类展示、促销活动)
- 商品详情页(商品信息、规格选择、库存显示)
- 购物车页面(商品列表、数量修改、全选/反选)
- 订单确认页(收货地址、配送时间、优惠券选择)
- 支付页面(多种支付方式集成)
2. 后端架构
- 技术栈:Spring Cloud/Spring Boot + MyBatis/JPA + Redis + MySQL
- 微服务拆分:
- 商品服务(商品信息、库存管理)
- 订单服务(订单创建、状态管理)
- 用户服务(用户信息、地址管理)
- 支付服务(对接第三方支付)
- 促销服务(优惠券、满减活动)
二、核心功能实现
1. 商品选择与购物车功能
```java
// 商品服务接口示例
public interface ProductService {
// 获取商品详情
ProductDetailDTO getProductDetail(Long productId);
// 检查库存
boolean checkInventory(Long productId, int quantity);
// 更新库存(下单时调用)
boolean reduceInventory(Long productId, int quantity);
}
// 购物车服务接口
public interface CartService {
// 添加商品到购物车
CartItem addToCart(Long userId, Long productId, int quantity);
// 获取购物车列表
List getCartItems(Long userId);
// 修改商品数量
boolean updateQuantity(Long userId, Long productId, int newQuantity);
}
```
2. 订单创建流程
```java
// 订单服务核心逻辑
@Transactional
public Order createOrder(OrderCreateRequest request) {
// 1. 验证用户和购物车
User user = userService.getUserById(request.getUserId());
List cartItems = cartService.getCartItems(request.getUserId());
// 2. 验证库存
for (CartItem item : cartItems) {
if (!productService.checkInventory(item.getProductId(), item.getQuantity())) {
throw new RuntimeException("商品库存不足: " + item.getProductName());
}
}
// 3. 创建订单
Order order = new Order();
order.setOrderNo(generateOrderNo());
order.setUserId(request.getUserId());
order.setTotalAmount(calculateTotal(cartItems));
order.setDeliveryAddress(request.getAddressId());
order.setDeliveryTime(request.getDeliveryTime());
order.setStatus(OrderStatus.UNPAID);
// 4. 保存订单
orderRepository.save(order);
// 5. 创建订单项
for (CartItem item : cartItems) {
OrderItem orderItem = new OrderItem();
orderItem.setOrderId(order.getId());
orderItem.setProductId(item.getProductId());
orderItem.setQuantity(item.getQuantity());
orderItem.setPrice(item.getPrice());
orderItemRepository.save(orderItem);
// 6. 扣减库存
productService.reduceInventory(item.getProductId(), item.getQuantity());
}
// 7. 清空购物车
cartService.clearCart(request.getUserId());
return order;
}
```
3. 支付集成
```java
// 支付服务实现
public class PaymentServiceImpl implements PaymentService {
@Override
public PaymentResult pay(PaymentRequest request) {
// 1. 验证订单状态
Order order = orderRepository.findByOrderNo(request.getOrderNo());
if (order == null || !OrderStatus.UNPAID.equals(order.getStatus())) {
throw new RuntimeException("订单不存在或已支付");
}
// 2. 调用第三方支付接口(示例为支付宝)
AlipayClient alipayClient = new DefaultAlipayClient(...);
AlipayTradePagePayRequest payRequest = new AlipayTradePagePayRequest();
payRequest.setReturnUrl("https://yourdomain.com/pay/return");
payRequest.setNotifyUrl("https://yourdomain.com/pay/notify");
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(order.getOrderNo());
model.setTotalAmount(order.getTotalAmount().toString());
model.setSubject("叮咚买菜订单支付");
payRequest.setBizModel(model);
try {
String form = alipayClient.pageExecute(payRequest).getBody();
return new PaymentResult(true, "支付请求已提交", form);
} catch (AlipayApiException e) {
return new PaymentResult(false, "支付失败: " + e.getMessage(), null);
}
}
// 支付回调处理
@PostMapping("/notify")
public String payNotify(@RequestParam Map params) {
// 1. 验证签名
if (!AlipaySignature.rsaCheckV1(params, ...)) {
return "failure";
}
// 2. 处理支付结果
String outTradeNo = params.get("out_trade_no");
String tradeStatus = params.get("trade_status");
if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
// 更新订单状态为已支付
orderService.updateOrderStatus(outTradeNo, OrderStatus.PAID);
return "success";
}
return "failure";
}
}
```
三、关键技术实现
1. 高并发库存控制
```java
// 使用Redis分布式锁控制库存
public boolean reduceInventoryWithLock(Long productId, int quantity) {
String lockKey = "lock:product:" + productId;
try {
// 尝试获取锁,等待5秒,锁有效期10秒
boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if (!locked) {
throw new RuntimeException("系统繁忙,请稍后再试");
}
// 获取当前库存
String inventoryKey = "inventory:product:" + productId;
Integer currentInventory = Integer.parseInt(redisTemplate.opsForValue().get(inventoryKey));
if (currentInventory < quantity) {
return false;
}
// 扣减库存
redisTemplate.opsForValue().decrement(inventoryKey, quantity);
// 异步更新数据库
asyncUpdateDbInventory(productId, currentInventory - quantity);
return true;
} finally {
// 释放锁
redisTemplate.delete(lockKey);
}
}
```
2. 实时库存展示
```javascript
// 前端轮询库存
function pollInventory(productId) {
const interval = setInterval(async () => {
try {
const response = await fetch(`/api/products/${productId}/inventory`);
const data = await response.json();
if (data.inventory !== undefined) {
updateInventoryDisplay(data.inventory);
if (data.inventory <= 0) {
clearInterval(interval);
showSoldOut();
}
}
} catch (error) {
console.error(获取库存失败:, error);
clearInterval(interval);
}
}, 3000); // 每3秒轮询一次
}
```
3. 订单状态机管理
```java
public enum OrderStatus {
UNPAID("待支付"),
PAID("已支付"),
SHIPPING("配送中"),
COMPLETED("已完成"),
CANCELLED("已取消"),
REFUNDED("已退款");
private String description;
OrderStatus(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
// 状态转换规则
public class OrderStateMachine {
public static OrderStatus nextStatus(OrderStatus current, String action) {
switch (current) {
case UNPAID:
if ("pay".equals(action)) return OrderStatus.PAID;
if ("cancel".equals(action)) return OrderStatus.CANCELLED;
break;
case PAID:
if ("ship".equals(action)) return OrderStatus.SHIPPING;
if ("refund".equals(action)) return OrderStatus.REFUNDED;
break;
case SHIPPING:
if ("receive".equals(action)) return OrderStatus.COMPLETED;
break;
// 其他状态转换...
}
throw new IllegalArgumentException("无效的状态转换");
}
}
```
四、系统优化措施
1. 性能优化:
- 商品缓存:使用Redis缓存热门商品信息
- 数据库分表:订单表按时间分表
- 异步处理:下单后异步发送短信通知
2. 高可用设计:
- 熔断机制:Hystrix/Sentinel防止雪崩
- 限流策略:Nginx限流防止刷单
- 多活架构:同城双活数据中心
3. 安全措施:
- 接口签名验证
- 敏感数据加密
- 防SQL注入/XSS攻击
- 支付风控策略
五、部署方案
1. 容器化部署:
- Docker + Kubernetes集群
- 自动化CI/CD流水线
2. 监控体系:
- Prometheus + Grafana监控
- ELK日志系统
- 业务监控看板
3. 灾备方案:
- 数据库主从复制
- 定期数据备份
- 快速恢复演练
六、测试策略
1. 单元测试:
- JUnit + Mockito测试核心业务逻辑
- 测试覆盖率要求>80%
2. 压力测试:
- JMeter模拟高并发场景
- 逐步加压测试系统瓶颈
3. 全链路测试:
- 模拟用户从浏览到支付完整流程
- 验证各服务间调用正确性
以上方案可根据实际业务需求和技术栈进行调整,核心是要保证系统的高可用性、数据一致性和良好的用户体验。