一、促销活动时间设置核心功能 1.灵活的时间范围设置 -支持设置活动开始/结束日期时间(精确到分钟) -支持按周循环(如每周五10:00-22:00) -支持按月特定日期(如每月1日、15日) 2.多维度时间控制 -全局促销时间(适用于全站活动) -分类专属时间(如进口
一、促销活动时间设置核心功能
1. 灵活的时间范围设置
- 支持设置活动开始/结束日期时间(精确到分钟)
- 支持按周循环(如每周五10:00-22:00)
- 支持按月特定日期(如每月1日、15日)
2. 多维度时间控制
- 全局促销时间(适用于全站活动)
- 分类专属时间(如进口水果专区限时折扣)
- 商品级别时间(单个商品独立促销时段)
3. 特殊时段设置
- 闪购/秒杀时段(如每天10:00、14:00、20:00三个时段)
- 早鸟优惠(营业前2小时专属折扣)
- 夜场特惠(20:00后加赠礼品)
二、万象源码部署实现方案
1. 数据库设计优化
```sql
CREATE TABLE promotion_rules (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
promo_type ENUM(discount,coupon,gift) NOT NULL,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
week_days SET(1,2,3,4,5,6,7) COMMENT 按周循环的星期,
month_days VARCHAR(50) COMMENT 按月循环的日期,
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE promotion_items (
id INT AUTO_INCREMENT PRIMARY KEY,
promo_id INT NOT NULL,
item_type ENUM(category,product) NOT NULL,
item_id INT NOT NULL,
discount_rate DECIMAL(5,2) COMMENT 折扣率,
special_price DECIMAL(10,2) COMMENT 特价,
time_slots JSON COMMENT JSON格式存储特殊时段规则,
FOREIGN KEY (promo_id) REFERENCES promotion_rules(id)
);
```
2. 后端逻辑实现(PHP示例)
```php
class PromotionController {
// 检查商品是否在促销期内
public function checkPromotion($productId, $currentTime) {
$activePromotions = $this->getActivePromotions($currentTime);
foreach ($activePromotions as $promo) {
// 检查全局时间
if ($this->isInTimeRange($currentTime, $promo[start_time], $promo[end_time])) {
// 检查商品特定规则
$itemRules = $this->getProductPromoRules($productId, $promo[id]);
if (!empty($itemRules)) {
foreach ($itemRules as $rule) {
if ($this->matchesTimeSlot($currentTime, $rule[time_slots])) {
return $rule;
}
}
}
}
}
return false;
}
private function matchesTimeSlot($currentTime, $timeSlots) {
// 实现复杂时段匹配逻辑
// 支持多时段、跨天时段等
}
}
```
3. 前端时间选择组件
```javascript
// 使用Vue.js实现时间范围选择器
Vue.component(promo-time-selector, {
template: `
开始日期:
结束日期:
每周重复: {{day.label}}
`,
data() {
return {
startDate: null,
endDate: null,
startTime: 00:00,
endTime: 23:59,
weeklyEnabled: false,
selectedDays: [],
days: [
{value: 1, label: 周一},
// ...其他星期
]
}
}
});
```
三、精准控制实现技术
1. 服务器时间同步
- 使用NTP服务确保服务器时间精准
- 前端通过API获取服务器时间作为基准
2. 缓存策略优化
```php
// 使用Redis缓存促销状态,设置TTL为1分钟
public function getPromoStatus($promoId) {
$cacheKey = "promo_status_".$promoId;
$status = $this->redis->get($cacheKey);
if (!$status) {
$status = $this->calculatePromoStatus($promoId);
$this->redis->setex($cacheKey, 60, $status);
}
return $status;
}
```
3. 定时任务处理
- 设置Cron作业每分钟检查即将开始/结束的促销
- 提前5分钟预热相关数据
4. 高并发场景优化
- 促销开始前10分钟启用读写分离
- 使用队列处理促销相关的订单计算
四、部署实施步骤
1. 源码部署准备
- 确认PHP版本≥7.4,MySQL≥5.7
- 配置OPcache加速
- 设置PHP时间时区为服务器所在地
2. 数据库优化
```sql
-- 为促销时间字段添加索引
ALTER TABLE promotions ADD INDEX idx_time_range (start_time, end_time);
ALTER TABLE promotion_items ADD INDEX idx_promo_id (promo_id);
```
3. Nginx配置建议
```
location /promo-api {
proxy_cache promo_cache;
proxy_cache_valid 200 1m;
proxy_pass http://backend;
}
```
4. 监控与告警
- 设置促销活动状态监控仪表盘
- 配置当促销未按时启动/结束时的告警
- 实时监控促销相关API的响应时间
五、测试验证要点
1. 时间边界测试
- 促销开始前1分钟访问(应显示倒计时)
- 精确到秒的启动/结束测试
- 跨日促销测试(如23:59-00:01)
2. 并发场景测试
- 模拟促销开始时刻的高并发访问
- 测试缓存穿透情况下的系统表现
3. 时区相关测试
- 验证不同时区用户的显示时间
- 测试夏令时切换时的显示准确性
通过以上方案,水果商城系统可以实现促销活动的毫秒级精准控制,确保促销活动按时启动/结束,同时保障系统在高并发情况下的稳定性。