id
:商品唯一标识(主键)name
:商品名称price
:商品价格description
:商品描述original_stock
:初始库存数量current_stock
:当前库存数量limit_per_user
:每位用户限购数量id
:活动唯一标识(主键)product_id
:关联商品的 ID(外键)start_time
:活动开始时间end_time
:活动结束时间total_limit
:活动总限量sold_count
:已销售数量id
:记录唯一标识(主键)user_id
:购买用户的 ID(外键)product_id
:购买商品的 ID(外键)purchase_time
:购买时间from django.db import models
from django.contrib.auth.models import User
import datetime
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
original_stock = models.PositiveIntegerField()
current_stock = models.PositiveIntegerField()
limit_per_user = models.PositiveIntegerField()
def __str__(self):
return self.name
class FlashSale(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
total_limit = models.PositiveIntegerField()
sold_count = models.PositiveIntegerField(default = 0)
def is_active(self):
now = datetime.datetime.now()
return self.start_time <= now <= self.end_time
def __str__(self):
return f"{self.product.name} - {self.start_time} to {self.end_time}"
class UserPurchase(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
purchase_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.user.username} bought {self.product.name}"
from django.shortcuts import render, redirect
from.models import Product, FlashSale, UserPurchase
from django.contrib.auth.decorators import login_required
from django.utils import timezone
@login_required
def flash_sale_list(request):
active_sales = FlashSale.objects.filter(is_active=True)
return render(request, 'flash_sale_list.html', {'active_sales': active_sales})
@login_required
def product_detail(request, product_id):
product = Product.objects.get(id=product_id)
flash_sale = FlashSale.objects.filter(product=product, is_active=True).first()
if flash_sale:
remaining_time = flash_sale.end_time - timezone.now()
remaining_stock = flash_sale.product.current_stock
return render(request, 'product_detail.html', {
'product': product,
'flash_sale': flash_sale,
'remaining_time': remaining_time,
'remaining_stock': remaining_stock
})
else:
return redirect('flash_sale_list')
@login_required
def purchase_product(request, product_id):
product = Product.objects.get(id=product_id)
flash_sale = FlashSale.objects.filter(product=product, is_active=True).first()
if flash_sale:
user_purchases = UserPurchase.objects.filter(user=request.user, product=product).count()
if user_purchases >= product.limit_per_user:
return render(request, 'purchase_error.html', {'message': 'You have reached the purchase limit.'})
if flash_sale.sold_count >= flash_sale.total_limit or product.current_stock <= 0:
return render(request, 'purchase_error.html', {'message': 'Product out of stock.'})
# 处理购买逻辑
UserPurchase.objects.create(user=request.user, product=product)
product.current_stock -= 1
flash_sale.sold_count += 1
product.save()
flash_sale.save()
return redirect('product_detail', product_id=product_id)
else:
return redirect('flash_sale_list')
Flash Sale List
Flash Sale Products
{% for sale in active_sales %}
{{ sale.product.name }}
Price: {{ sale.product.price }}
Remaining Time: {{ sale.end_time|timeuntil }}
Remaining Stock: {{ sale.product.current_stock }}
View Details
{% endfor %}
Product
模型用于存储商品的基本信息,包括名称、价格、描述、初始库存、当前库存和限购数量。FlashSale
模型关联商品,记录限时活动的开始时间、结束时间、总限量和已销售数量,并提供一个方法 is_active
来判断活动是否正在进行。UserPurchase
模型记录用户购买商品的信息,包括用户和购买的商品以及购买时间。flash_sale_list
视图获取所有正在进行的限时活动商品,并渲染列表页面。product_detail
视图获取特定商品的详细信息,以及关联的限时活动信息,并计算剩余时间和剩余库存,渲染商品详情页面。purchase_product
视图处理用户购买逻辑,验证用户购买资格,更新库存和销售记录,然后重定向到商品详情页面。flash_sale_list.html
模板遍历所有正在进行的限时活动商品,并展示商品名称、价格、剩余时间和剩余库存,提供查看详情的链接。
transaction.atomic
装饰器。例如:from django.db import transaction
@login_required
@transaction.atomic
def purchase_product(request, product_id):
# 购买逻辑代码不变
pass
django - cron
库来设置定时任务。首先安装该库:pip install django - cron
cron.py
文件:from django_cron import CronJobBase, Schedule
from.models import FlashSale
class EndFlashSales(CronJobBase):
RUN_EVERY_MINS = 1 # 每分钟检查一次
schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
code = 'app.end_flash_sales'
def do(self):
now = timezone.now()
active_sales = FlashSale.objects.filter(end_time__lte=now, is_active=True)
for sale in active_sales:
sale.is_active = False
sale.save()
# 处理剩余库存逻辑
product = sale.product
product.current_stock += (sale.total_limit - sale.sold_count)
product.save()
settings.py
中注册定时任务:CRON_CLASSES = [
'app.cron.EndFlashSales',
]
fetch
API 或其他前端框架(如 Vue.js、React)的相关功能来实现。以原生 JavaScript fetch
为例:
Product Detail
from django.http import JsonResponse
def product_info(request, product_id):
product = Product.objects.get(id=product_id)
flash_sale = FlashSale.objects.filter(product=product, is_active=True).first()
if flash_sale:
remaining_time = (flash_sale.end_time - timezone.now()).total_seconds()
remaining_stock = flash_sale.product.current_stock
data = {
'product_name': product.name,
'product_price': str(product.price),
'remaining_time': remaining_time,
'remaining_stock': remaining_stock,
'success': True
}
else:
data = {
'success': False,
'message': 'Product is not in an active flash sale'
}
return JsonResponse(data)
以上设计和代码示例涵盖了电商商城 APP 限时限量购模块的核心功能,从数据库设计、后端逻辑处理到前端界面展示与交互。在实际开发中,还需要考虑安全性(如防止恶意攻击、用户认证与授权)、性能优化(如缓存机制)以及与其他模块(如订单系统、支付系统)的集成等方面。通过不断完善和优化,可以打造一个稳定、高效且用户体验良好的限时限量购功能模块 。
同时,不同的项目可能有不同的技术栈和业务需求,例如可能使用不同的后端语言(如 Java、Node.js)或前端框架(如 Vue.js、React Native),上述方案需要根据实际情况进行相应的调整和扩展。例如,如果使用 Java + Spring Boot 作为后端,数据库设计可以使用 JPA 实体类来映射数据库表,后端逻辑通过 Controller 层、Service 层和 Repository 层来实现;前端使用 Vue.js 的话,可以通过组件化开发、Vuex 管理状态以及 Axios 进行 HTTP 请求来实现与后端的数据交互。总之,关键是要理解限时限量购模块的核心逻辑,并灵活运用技术来实现项目的具体需求。