1. 项目背景与核心价值
作为一个长期混迹在电商开发领域的Python工程师,我最近用Django框架完整搭建了一个日用品商城的全栈系统。这个项目从需求分析到上线部署历时三个月,期间踩过不少坑,也积累了很多实战经验。不同于简单的Demo项目,这个系统包含了商品SPU/SKU管理、分布式购物车、订单状态机等完整的电商功能模块。
选择Django作为后端框架主要基于三个考量:首先,Django自带的ORM能极大简化数据库操作,这对需要频繁处理商品库存变动的场景非常友好;其次,Django Rest Framework(DRF)可以快速构建出符合RESTful规范的API接口,方便与Vue.js前端对接;最后,Django Admin后台开箱即用的特性,能让运营人员快速上手商品管理。
2. 技术架构设计
2.1 整体技术栈选型
后端采用Python 3.8 + Django 3.2的组合,这个版本组合经过长期生产环境验证,在稳定性和性能之间取得了良好平衡。数据库选用MySQL 5.7,主要看中其事务处理能力和对复杂查询的优化。前端使用Vue 2.6 + Element UI构建管理后台,移动端则采用Vant UI组件库。
特别说明版本选择的原因:
- 避开Python 3.9初期版本与某些Django插件的兼容性问题
- MySQL 5.7比8.0版本更节省服务器资源
- Vue 2.x生态系统比3.x更成熟稳定
2.2 系统分层架构
采用经典的三层架构设计:
code复制表示层(Vue.js)
↓
业务逻辑层(Django Views + Services)
↓
数据访问层(Django ORM)
关键设计决策:
- 使用Django的MTV模式替代传统MVC,模板层由Vue接管
- 业务逻辑抽离到单独的services.py文件,保持views.py精简
- 数据库访问全部通过ORM实现,避免原生SQL注入风险
3. 核心模块实现
3.1 用户认证系统
采用JWT+Session的混合认证方案:
python复制# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
用户模型扩展要点:
python复制from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
mobile = models.CharField(max_length=11, unique=True)
avatar = models.ImageField(upload_to='avatars/')
# 密码加密使用Django默认的PBKDF2算法
重要提示:务必重写AbstractUser而不是AbstractBaseUser,除非你需要完全自定义认证流程。我们曾因选错基类导致权限系统需要重构。
3.2 商品管理系统
3.2.1 数据模型设计
采用SPU+SKU模式:
python复制class Product(models.Model): # SPU
name = models.CharField(max_length=100)
desc = models.TextField()
category = models.ForeignKey(Category, on_delete=models.PROTECT)
class ProductSpec(models.Model): # SKU
product = models.ForeignKey(Product, on_delete=models.CASCADE)
spec = models.CharField(max_length=50) # 如"500ml/瓶"
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.PositiveIntegerField(default=0)
库存管理关键点:
- 使用Django的F()表达式避免并发超卖
- 建立库存变更日志表用于对账
- 设置库存预警阈值(通过信号量触发)
3.3 购物车系统
3.3.1 数据结构设计
python复制class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class CartItem(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
product_spec = models.ForeignKey(ProductSpec, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1)
性能优化技巧:
- 使用select_related预加载外键
- 为user和product_spec字段添加联合索引
- 采用Redis缓存热门商品信息
3.4 订单系统
3.4.1 状态机实现
python复制from django_fsm import FSMField, transition
class Order(models.Model):
status = FSMField(default='created')
@transition(field=status, source='created', target='paid')
def pay(self):
pass
@transition(field=status, source='paid', target='shipped')
def ship(self):
pass
支付集成要点:
- 支付宝接口使用RSA2签名方式
- 微信支付需要配置商户证书
- 必须实现异步通知验签逻辑
4. 部署实战
4.1 生产环境配置
推荐服务器规格:
- 2核4G云服务器(日PV<1万)
- Ubuntu 20.04 LTS
- Nginx + Gunicorn方案
关键配置示例:
bash复制# gunicorn.conf.py
workers = 2 * cpu_count() + 1
worker_class = 'gevent'
keepalive = 60
4.2 性能优化方案
-
数据库优化:
- 为所有外键添加索引
- 配置合理的连接池大小
- 启用查询缓存
-
前端优化:
- 使用Webpack分包加载
- 配置合理的HTTP缓存头
- 启用Gzip压缩
5. 踩坑实录
5.1 并发问题解决
库存扣减的正确姿势:
python复制from django.db.models import F
def deduct_stock(product_spec_id, quantity):
ProductSpec.objects.filter(
id=product_spec_id,
stock__gte=quantity
).update(stock=F('stock') - quantity)
5.2 支付对账流程
必须实现的保障措施:
- 每日定时对账任务
- 异常订单人工干预接口
- 支付状态补偿查询机制
5.3 安全防护
关键安全配置:
python复制# settings.py
SECURE_HSTS_SECONDS = 31536000
SECURE_CONTENT_TYPE_NOSNIFF = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
6. 扩展建议
-
营销系统扩展:
- 优惠券模块
- 拼团功能
- 秒杀系统
-
数据分析扩展:
- 用户行为埋点
- 商品销量预测
- 智能推荐系统
-
微服务改造:
- 商品服务独立部署
- 订单服务拆分
- 引入消息队列解耦
这个项目让我深刻体会到,电商系统最难的不是技术实现,而是对业务场景的深入理解。比如退货流程中的"仅退款不退货"场景,就需要特殊处理商品库存状态。建议开发前先画出完整的业务状态流转图,可以避免后期大量返工。