水果商城优惠券系统设计:规则、接口、数据库及安全部署全方案
分类:IT频道
时间:2026-03-13 00:15
浏览:8
概述
一、核心业务规则设计 1.优惠券类型定义 -满减券:订单满X元减Y元(如满100减20) -折扣券:订单金额按比例折扣(如8折) -运费券:免除基础运费 -品类券:仅限特定水果品类使用(如进口水果专享) -新人券:仅限首次注册用户使用 2.使用条件规则 ```python
内容
一、核心业务规则设计
1. 优惠券类型定义
- 满减券:订单满X元减Y元(如满100减20)
- 折扣券:订单金额按比例折扣(如8折)
- 运费券:免除基础运费
- 品类券:仅限特定水果品类使用(如进口水果专享)
- 新人券:仅限首次注册用户使用
2. 使用条件规则
```python
class CouponRule:
def __init__(self):
self.min_order_amount = 0 最低消费金额
self.valid_period = (start_time, end_time) 生效时间范围
self.applicable_products = [] 适用商品ID列表(空表示全品类)
self.user_tags = [] 适用用户标签(如"新用户"、"VIP")
self.max_discount = 0 最大折扣金额(防止超折)
```
3. 优先级策略
- 自动匹配最优券:系统自动计算用户所有可用券中优惠力度最大的
- 手动选择:用户可自行选择使用哪张券
- 互斥规则:部分券不可叠加使用(如满减券与折扣券二选一)
二、数据库设计(MySQL示例)
```sql
CREATE TABLE `coupons` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`code` VARCHAR(32) UNIQUE COMMENT 优惠券码,
`type` ENUM(FULL_REDUCTION,DISCOUNT,FREIGHT) COMMENT 类型,
`value` DECIMAL(10,2) COMMENT 优惠值(满减金额/折扣比例),
`min_order_amount` DECIMAL(10,2) DEFAULT 0 COMMENT 最低消费金额,
`start_time` DATETIME NOT NULL COMMENT 生效时间,
`end_time` DATETIME NOT NULL COMMENT 失效时间,
`total_count` INT DEFAULT 1 COMMENT 总发放量,
`used_count` INT DEFAULT 0 COMMENT 已使用量,
`status` TINYINT DEFAULT 1 COMMENT 1-有效 0-失效,
`product_category_ids` VARCHAR(255) COMMENT 适用品类ID列表(JSON),
`user_tag_ids` VARCHAR(255) COMMENT 适用用户标签(JSON)
);
CREATE TABLE `user_coupons` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`user_id` BIGINT NOT NULL COMMENT 用户ID,
`coupon_id` BIGINT NOT NULL COMMENT 优惠券ID,
`get_time` DATETIME NOT NULL COMMENT 领取时间,
`use_time` DATETIME NULL COMMENT 使用时间,
`order_id` BIGINT NULL COMMENT 关联订单ID,
`status` TINYINT DEFAULT 0 COMMENT 0-未使用 1-已使用 2-已过期
);
```
三、核心接口规范(RESTful示例)
1. 领取优惠券
```
POST /api/coupons/claim
Request:
{
"user_id": 123,
"coupon_code": "FRUIT2023"
}
Response:
{
"code": 200,
"data": {
"coupon_id": 456,
"expiry_date": "2023-12-31"
}
}
```
2. 计算订单优惠
```
POST /api/orders/calculate-discount
Request:
{
"user_id": 123,
"cart_items": [
{"product_id": 1, "quantity": 2, "price": 15.5}
],
"selected_coupon_id": 456
}
Response:
{
"original_amount": 31.0,
"discount_amount": 5.0,
"final_amount": 26.0
}
```
3. 使用优惠券下单
```
POST /api/orders/create
Request:
{
"user_id": 123,
"address_id": 789,
"coupon_id": 456,
"payment_method": "ALIPAY"
}
```
四、关键业务逻辑实现(伪代码)
```python
def validate_coupon(user_id, coupon_id, cart_items):
1. 检查优惠券状态
coupon = Coupon.get(coupon_id)
if not coupon or coupon.status != 1:
raise Exception("优惠券无效")
2. 检查用户资格
if not is_user_eligible(user_id, coupon.user_tag_ids):
raise Exception("不满足使用条件")
3. 检查商品适用性
applicable_products = parse_json_list(coupon.product_category_ids)
if applicable_products and not any(
item[product_id] in applicable_products
for item in cart_items
):
raise Exception("部分商品不适用该券")
4. 检查最低消费
total_amount = sum(item[price] * item[quantity] for item in cart_items)
if total_amount < coupon.min_order_amount:
raise Exception(f"需满{coupon.min_order_amount}元使用")
5. 检查有效期
now = datetime.now()
if now < coupon.start_time or now > coupon.end_time:
raise Exception("优惠券已过期")
return calculate_discount(coupon, total_amount)
```
五、安全与性能优化
1. 防刷机制
- 同一用户每分钟最多领取3张券
- 优惠券码生成采用UUID+随机数组合
- 接口调用频率限制(如10次/秒)
2. 分布式锁
```java
// Redis分布式锁示例(Java)
public boolean tryLockCoupon(String couponId) {
String lockKey = "lock:coupon:" + couponId;
return redisTemplate.opsForValue().setIfAbsent(
lockKey,
"1",
10, // 10秒过期
TimeUnit.SECONDS
);
}
```
3. 缓存策略
- 用户可用券列表缓存(Redis Hash)
- 优惠券详情缓存(有效期>1天的长期缓存)
六、部署建议
1. 容器化部署
```yaml
docker-compose.yml示例
services:
coupon-service:
image: fruit-mall/coupon-service:v1.2.0
environment:
- DB_URL=jdbc:mysql://db:3306/coupon_db
- REDIS_HOST=redis
depends_on:
- db
- redis
```
2. 监控指标
- 优惠券领取成功率(Prometheus)
- 优惠核销率(Grafana看板)
- 接口响应时间(ELK日志分析)
七、异常处理方案
| 场景 | 处理方式 |
|------|----------|
| 优惠券已用完 | 返回400错误码,提示"优惠券已领完" |
| 订单金额不足 | 返回400错误码,提示"需满XX元使用" |
| 重复使用 | 返回409冲突码,提示"该券已使用" |
| 系统繁忙 | 返回503错误码,启用熔断机制 |
该方案通过清晰的规则定义、完善的接口设计和安全措施,可支持水果商城日百万级优惠券发放与核销场景。实际部署时建议结合具体技术栈(如Spring Cloud/Django/Node.js)进行适配调整。
评论