一、核心功能设计
1. 活动时间模型
```python
class PromotionActivity(models.Model):
name = models.CharField(max_length=100)
start_time = models.DateTimeField() 精确到秒
end_time = models.DateTimeField()
status = models.IntegerField(choices=[(0,未开始),(1,进行中),(2,已结束)])
priority = models.IntegerField(default=0) 多活动叠加时的优先级
其他字段:折扣规则、适用商品等
```
2. 时间验证中间件
```python
class PromotionMiddleware:
def process_request(self, request):
now = timezone.now()
active_promotions = PromotionActivity.objects.filter(
start_time__lte=now,
end_time__gte=now
).order_by(-priority)
request.active_promotions = active_promotions
可在此处设置缓存(如Redis)
```
二、源码部署关键点(万象环境)
1. 数据库优化
- 为`start_time`和`end_time`字段添加索引:
```sql
CREATE INDEX idx_promotion_time ON promotion_activity(start_time, end_time);
```
- 使用数据库时区设置(推荐UTC存储,前端转换)
2. 定时任务配置
```python
celery beat任务示例
@app.on_after_configure.connect
def setup_periodic_tasks(sender, kwargs):
sender.add_periodic_task(
60.0, 每分钟检查
update_promotion_status.s(),
name=更新促销状态
)
@shared_task
def update_promotion_status():
now = timezone.now()
PromotionActivity.objects.filter(
end_time__lt=now
).update(status=2)
PromotionActivity.objects.filter(
start_time__lte=now,
end_time__gte=now
).update(status=1)
```
3. 缓存策略
```python
使用Redis缓存当前活动
def get_current_promotions():
cache_key = current_promotions
promotions = cache.get(cache_key)
if not promotions:
now = timezone.now()
promotions = list(PromotionActivity.objects.filter(
start_time__lte=now,
end_time__gte=now
).values())
cache.set(cache_key, promotions, timeout=300) 5分钟缓存
return promotions
```
三、前端交互实现
1. 倒计时组件
```javascript
// Vue示例
剩余时间:{{ countdown }}
<script>
export default {
data() {
return {
promotion: null,
timer: null
}
},
computed: {
isAvailable() {
const now = new Date();
return now >= new Date(this.promotion.start_time)
&& now <= new Date(this.promotion.end_time);
},
countdown() {
// 实现倒计时逻辑
}
},
mounted() {
this.fetchPromotion();
this.timer = setInterval(this.fetchPromotion, 60000); // 每分钟刷新
},
beforeDestroy() {
clearInterval(this.timer);
}
}
```
四、精准控制技术方案
1. 服务器时间同步
- 部署NTP服务保证服务器时间准确
- 前端获取服务器时间API:
```python
Django视图示例
def server_time(request):
return JsonResponse({time: timezone.now().isoformat()})
```
2. 时区处理
```python
设置Django时区
TIME_ZONE = Asia/Shanghai
USE_TZ = True 数据库存储UTC时间
```
3. 并发控制
- 使用数据库事务保证活动状态变更的原子性
- 分布式锁防止超卖(如Redis锁)
五、测试用例设计
1. 边界值测试
- 活动开始前1秒(应不可用)
- 精确到秒的活动开始/结束时间
- 跨日活动(如23:59:59-次日00:00:01)
2. 性能测试
- 模拟10万用户同时访问促销页面
- 检查数据库查询效率(使用EXPLAIN分析)
六、部署注意事项
1. 万象环境配置
- 确保云服务器时间同步服务正常
- 配置负载均衡器的会话保持(如需)
2. 监控告警
- 监控促销活动状态变更日志
- 设置活动结束前1小时的告警
3. 回滚方案
- 准备快速修改活动时间的后台入口
- 数据库备份策略(活动开始前)
七、扩展功能建议
1. 智能推荐:根据用户历史购买记录推荐促销商品
2. 社交分享:设置分享得优惠券的裂变活动
3. 库存预警:当促销商品库存低于阈值时自动调整促销策略
通过以上方案,可实现水果商城促销活动的毫秒级精准控制,同时保证系统在高并发场景下的稳定性。实际部署时建议先在测试环境进行全链路压测,特别关注活动开始/结束时刻的系统表现。