这个基于Django框架开发的花卉商城系统,是我在指导大学生毕业设计过程中总结出的一个典型电商类项目案例。系统采用标准的MVC架构,前端使用Vue.js实现响应式布局,后端采用Django REST framework构建API接口,数据库选用MySQL进行数据存储。整个项目从需求分析到最终实现,完整覆盖了电商系统的基本功能模块,包括用户管理、商品展示、购物车、订单处理等核心业务流程。
对于计算机相关专业的毕业生来说,这类电商系统是非常实用的毕业设计选题方向。它不仅能够体现学生对Web全栈开发技术的掌握程度,还能展示其在数据库设计、业务逻辑实现等方面的综合能力。我在指导过程中发现,很多同学在开发这类系统时,往往会遇到架构设计不合理、前后端交互混乱、数据库性能优化不足等问题。这个项目案例正是针对这些常见痛点,提供了一个结构清晰、易于扩展的参考实现。
在技术选型上,我主要考虑了以下几个因素:
实际开发中,我还引入了以下关键组件:
数据库设计是电商系统的核心,我在项目中采用了以下设计原则:
python复制class Flower(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.IntegerField(default=0)
description = models.TextField()
image = models.ImageField(upload_to='flowers/')
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, choices=ORDER_STATUS)
created_at = models.DateTimeField(auto_now_add=True)
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
flower = models.ForeignKey(Flower, on_delete=models.CASCADE)
quantity = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
用户系统采用JWT认证方案,相比传统的Session认证更适应前后端分离架构:
python复制# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',
)
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True
}
# views.py
class UserRegisterView(APIView):
def post(self, request):
serializer = UserRegisterSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
refresh = RefreshToken.for_user(user)
return Response({
'refresh': str(refresh),
'access': str(refresh.access_token),
}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
注意事项:
- 生产环境必须使用HTTPS传输Token
- 合理设置Token过期时间,平衡安全性和用户体验
- 实现Token刷新机制,避免频繁登录
- 前端需要妥善保管Token,建议使用HttpOnly Cookie
商品模块实现了分类展示、分页查询和全文搜索功能:
python复制class FlowerListView(generics.ListAPIView):
serializer_class = FlowerSerializer
filter_backends = [filters.SearchFilter, DjangoFilterBackend]
search_fields = ['name', 'description']
filterset_fields = ['category']
def get_queryset(self):
queryset = Flower.objects.filter(is_active=True)
# 价格区间过滤
min_price = self.request.query_params.get('min_price')
max_price = self.request.query_params.get('max_price')
if min_price:
queryset = queryset.filter(price__gte=min_price)
if max_price:
queryset = queryset.filter(price__lte=max_price)
return queryset
前端采用Vue实现动态过滤:
javascript复制// Vue组件
export default {
data() {
return {
flowers: [],
filters: {
category: null,
minPrice: null,
maxPrice: null,
search: ''
}
}
},
methods: {
async fetchFlowers() {
const params = {
...this.filters,
page: this.pagination.page
}
const response = await axios.get('/api/flowers/', { params })
this.flowers = response.data.results
}
}
}
考虑到性能和用户体验,购物车采用混合存储方案:
python复制class CartView(APIView):
authentication_classes = [JWTAuthentication]
def post(self, request):
user = request.user
flower_id = request.data.get('flower_id')
quantity = int(request.data.get('quantity', 1))
if user.is_authenticated:
# 已登录用户使用Redis存储
cart_key = f'user_cart:{user.id}'
redis_conn.hincrby(cart_key, flower_id, quantity)
else:
# 未登录用户返回客户端存储指令
return Response({
'action': 'store_local',
'flower_id': flower_id,
'quantity': quantity
})
return Response({'status': 'success'})
订单系统采用状态机模式管理订单生命周期:
python复制class OrderViewSet(viewsets.ModelViewSet):
@action(detail=True, methods=['post'])
def pay(self, request, pk=None):
order = self.get_object()
try:
# 调用支付接口
payment_result = PaymentService.process_payment(
order.total_amount,
request.data['payment_method']
)
# 更新订单状态
order.status = 'paid'
order.payment_id = payment_result['id']
order.save()
# 异步处理库存扣减
update_stock.delay(order.id)
return Response({'status': 'payment_success'})
except PaymentError as e:
order.status = 'payment_failed'
order.save()
return Response({'error': str(e)}, status=400)
实战经验:
- 订单创建和支付必须保证事务性,避免超卖
- 支付结果采用异步通知+主动查询双重确认机制
- 重要操作记录详细日志,便于对账和排查问题
- 订单状态变更通过Django信号触发相关业务逻辑
推荐使用Docker Compose进行容器化部署:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn flower_shop.wsgi:application --bind 0.0.0.0:8000
volumes:
- static:/app/static
depends_on:
- redis
- db
environment:
- DEBUG=0
- DATABASE_URL=postgres://postgres:password@db:5432/postgres
- REDIS_URL=redis://redis:6379/0
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
redis:
image: redis:6
celery:
build: .
command: celery -A flower_shop worker -l info
depends_on:
- redis
- db
volumes:
postgres_data:
static:
select_related和prefetch_related减少查询次数ANALYZE和VACUUM维护数据库在指导过程中,我总结了学生们最常遇到的几个技术难点:
Q1:如何实现商品SKU的多属性选择?
A:建议采用以下数据结构:
python复制class Attribute(models.Model):
name = models.CharField(max_length=50) # 如"颜色"、"尺寸"
class AttributeValue(models.Model):
attribute = models.ForeignKey(Attribute, on_delete=models.CASCADE)
value = models.CharField(max_length=50) # 如"红色"、"XL"
class Product(models.Model):
attributes = models.ManyToManyField(AttributeValue, through='ProductVariant')
class ProductVariant(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
attribute_values = models.ManyToManyField(AttributeValue)
sku = models.CharField(max_length=50, unique=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.PositiveIntegerField(default=0)
Q2:支付功能如何模拟实现?
A:可以集成支付宝/微信支付的沙箱环境,或者自己实现模拟接口:
python复制class MockPaymentView(APIView):
def post(self, request):
order_no = request.data.get('order_no')
amount = request.data.get('amount')
# 模拟支付处理延迟
time.sleep(2)
# 随机返回成功或失败
if random.random() > 0.1: # 90%成功率
return Response({
'status': 'success',
'payment_id': f'mock_pay_{uuid.uuid4().hex}',
'paid_amount': amount
})
else:
return Response({
'status': 'failed',
'reason': '模拟支付失败'
}, status=400)
Q3:如何生成毕业设计文档?
A:推荐使用以下工具链:
对于想进一步提升项目复杂度的同学,可以考虑以下扩展方向:
python复制from surprise import Dataset, KNNBasic
def train_recommend_model():
data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()
sim_options = {'name': 'cosine', 'user_based': False}
algo = KNNBasic(sim_options=sim_options)
algo.fit(trainset)
return algo
数据分析看板:使用Django+ECharts展示销售数据
微服务改造:将用户服务、商品服务、订单服务拆分为独立微服务
移动端适配:开发React Native或Flutter版本的移动应用
SEO优化:实现服务端渲染(SSR)和结构化数据标记
这个花卉商城系统作为毕业设计项目,既包含了基础的CRUD操作,也涉及了电商系统的典型业务场景。在实现过程中,学生可以全面锻炼需求分析、系统设计、编码实现和测试部署的能力。我在项目中特意保留了一些常见的"坑",比如并发下单问题、支付状态同步等,让学生在解决问题的过程中获得真正的成长。