---
一、优惠券功能核心规则
1. 优惠券类型
- 满减券:订单满X元减Y元(如满100减20)
- 折扣券:按比例折扣(如8折,最高减50元)
- 无门槛券:直接抵扣金额(如立减10元)
- 品类券:仅限指定水果品类使用(如进口水果专用)
- 新人券:首次注册用户专享
2. 使用限制
- 有效期:设置起止时间(如7天/30天)
- 适用范围:全店通用或指定商品/分类
- 叠加规则:
- 同类型券不可叠加(如两张满减券)
- 跨类型券可叠加(如满减券+运费券)
- 最低消费:需满足最低订单金额(如满50元可用)
- 用户限制:每人限领X张,每日限用Y张
3. 发放方式
- 主动领取:用户从活动页或弹窗领取
- 系统发放:注册/下单后自动发放至账户
- 分享裂变:邀请好友注册后双方获券
二、万象源码部署规则
1. 环境准备
- 服务器要求:
- Linux/CentOS 7+ 或 Windows Server 2016+
- 2核4G内存以上(根据并发量调整)
- 50GB+磁盘空间(含数据库和日志)
- 软件依赖:
- Nginx/Apache + PHP 7.4+
- MySQL 5.7+ 或 MariaDB 10.3+
- Redis(用于缓存和会话管理)
- Composer(PHP依赖管理工具)
2. 部署步骤
步骤1:源码上传
```bash
通过SFTP上传源码至/var/www/fruit_mall
chmod -R 755 /var/www/fruit_mall
```
步骤2:配置环境
```bash
安装PHP扩展
yum install php-mysqlnd php-redis php-gd
配置Nginx虚拟主机
server {
listen 80;
server_name mall.fruit.com;
root /var/www/fruit_mall/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
```
步骤3:数据库配置
```sql
-- 导入初始SQL(含优惠券表结构)
CREATE DATABASE fruit_mall CHARACTER SET utf8mb4;
SOURCE /path/to/fruit_mall.sql;
```
步骤4:应用配置
```php
// 修改.env文件
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=fruit_mall
REDIS_HOST=127.0.0.1
```
步骤5:安装依赖
```bash
cd /var/www/fruit_mall
composer install --no-dev
php artisan key:generate
php artisan migrate --seed
```
3. 关键配置项
- 优惠券表结构:
```sql
CREATE TABLE `coupons` (
`id` INT AUTO_INCREMENT,
`code` VARCHAR(32) UNIQUE,
`type` ENUM(full_reduce,discount,no_threshold),
`value` DECIMAL(10,2),
`min_order` DECIMAL(10,2),
`start_time` DATETIME,
`end_time` DATETIME,
`status` TINYINT DEFAULT 1,
PRIMARY KEY (`id`)
);
```
- Redis缓存键:
```
coupon_user:{user_id} 用户可用券列表
coupon_code:{code} 券码验证
```
三、业务逻辑实现示例(PHP)
1. 优惠券核销
```php
public function useCoupon($userId, $couponCode, $orderAmount) {
// 验证券码
$coupon = Redis::get("coupon_code:{$couponCode}");
if (!$coupon) {
throw new Exception("券码无效");
}
// 检查用户是否已领取
$userCoupons = Redis::sMembers("coupon_user:{$userId}");
if (!in_array($couponCode, $userCoupons)) {
throw new Exception("用户无此券");
}
// 业务规则校验
$couponData = json_decode($coupon, true);
if ($orderAmount < $couponData[min_order]) {
throw new Exception("未满足最低消费");
}
// 计算折扣
$discount = 0;
switch ($couponData[type]) {
case full_reduce:
$discount = min($orderAmount, $couponData[value]);
break;
case discount:
$discount = $orderAmount * (1 - $couponData[value]);
break;
}
return [
success => true,
discount => $discount,
final_amount => $orderAmount - $discount
];
}
```
2. 定时任务(清理过期券)
```bash
crontab -e
0 0 * * * php /var/www/fruit_mall/artisan coupon:expire
```
```php
// app/Console/Commands/CouponExpire.php
public function handle() {
$expired = Coupon::where(end_time, <, now())
->where(status, 1)
->update([status => 0]);
Log::info("过期 {$expired} 张优惠券");
}
```
四、安全与性能优化
1. 防刷机制:
- 同一IP每小时领取限制
- 券码生成使用随机字符串+时间戳混合
2. 数据库优化:
- 优惠券表按`end_time`字段建立索引
- 热点数据缓存至Redis(如用户可用券列表)
3. 接口防护:
- 优惠券核销接口添加签名验证
- 限流中间件(如每秒10次请求)
五、常见问题处理
1. 券码泄露:
- 解决方案:券码与用户ID绑定,核销时双重验证
2. 并发超卖:
- 解决方案:使用Redis原子操作扣减库存
```php
Redis::watch(coupon_stock:.$couponId);
$stock = Redis::get(coupon_stock:.$couponId);
if ($stock > 0) {
Redis::multi();
Redis::decr(coupon_stock:.$couponId);
Redis::exec();
}
```
3. 数据一致性:
- 解决方案:使用数据库事务处理订单与优惠券状态更新
---
通过以上规则设计,可实现水果商城优惠券系统的稳定运行,同时保证万象源码部署的高效性和可维护性。建议配合日志监控(如ELK)和压力测试(如JMeter)进一步验证系统承载能力。