Java 如何防止一个用户抢了所有商品

问题背景

在电商平台上,当一个热门商品限量发售时,可能会出现某个用户通过多个账号或其他方式抢购所有商品的情况。这种行为不公平,会导致其他用户无法购买到心仪的商品。为了防止一个用户抢购所有商品,我们可以采取一些措施来限制用户的购买数量。

解决方案

1. 用户购买数量限制

我们可以在商品详情页面和购买页面设置一个购买数量的输入框,限制用户购买的数量。用户不能购买超过限制数量的商品。这样可以确保每个用户只能购买一定数量的商品,而不能一次性购买所有商品。

代码示例

前端页面代码如下:

<label for="quantity">购买数量:</label>
<input type="number" id="quantity" name="quantity" min="1" max="5" value="1">

后端验证代码如下:

int quantity = Integer.parseInt(request.getParameter("quantity"));
int maxQuantity = 5; // 设置最大购买数量为5
if (quantity <= 0 || quantity > maxQuantity) {
    // 购买数量超出范围,提示用户重新输入
    // 返回错误信息或者跳转到错误页面
}

2. 用户购买频率限制

为了防止用户通过多次购买来抢购所有商品,我们可以设置一个购买频率限制。例如,我们可以限制用户在一定时间内只能购买一次商品。

代码示例
// 在用户购买完成后,记录购买时间
long currentTime = System.currentTimeMillis();
long lastPurchaseTime = getLastPurchaseTime(userId); // 获取用户上次购买时间
long interval = currentTime - lastPurchaseTime; // 计算距离上次购买的时间间隔
long purchaseInterval = 24 * 60 * 60 * 1000; // 设置购买间隔为24小时

if (interval < purchaseInterval) {
    // 距离上次购买时间间隔太短,不能购买
    // 返回错误信息或者跳转到错误页面
} else {
    // 购买商品
    // 更新用户购买时间
    updateLastPurchaseTime(userId, currentTime);
}

3. 添加购物车和库存校验

为了防止用户抢购所有商品,我们可以引入购物车的概念。用户将商品添加到购物车后,库存不会立即减少。只有当用户确认购买时,才会检查库存是否足够,并减少相应数量的库存。

代码示例
// 商品添加到购物车
public void addToCart(User user, Product product, int quantity) {
    Cart cart = user.getCart();
    cart.addItem(product, quantity);
}

// 购物车结算
public void checkout(User user) {
    Cart cart = user.getCart();
    Map<Product, Integer> items = cart.getItems();

    // 校验库存是否足够
    for (Map.Entry<Product, Integer> entry : items.entrySet()) {
        Product product = entry.getKey();
        int quantity = entry.getValue();

        if (product.getStock() < quantity) {
            // 库存不足,提示用户重新选择数量或者删除购物车中的商品
            // 返回错误信息或者跳转到错误页面
        }
    }

    // 扣减库存
    for (Map.Entry<Product, Integer> entry : items.entrySet()) {
        Product product = entry.getKey();
        int quantity = entry.getValue();
        product.decreaseStock(quantity);
    }

    // 清空购物车
    cart.clear();
}

甘特图

gantt
    dateFormat  YYYY-MM-DD
    title 防止用户抢购所有商品流程

    section 限制购买数量
    商品详情页面       :a1, 2022-12-01, 30d
    购买页面输入数量   :a2, after a1, 20d
    验证购买数量       :a3, after a2, 10d

    section 限制购买频率
    购买完成后记录时间 :b1, 2022-12-01, 30d