1. 项目概述
这个基于Django的产品订单管理系统是我在毕业设计中完成的一个完整Web应用项目。作为一个面向中小企业的订单管理解决方案,它实现了从产品展示、订单处理到库存管理的全流程数字化管理。
在传统企业中,订单管理往往依赖于纸质文档和人工操作,容易出现数据错误、效率低下等问题。通过这个系统,企业可以:
- 实现产品信息的在线展示和更新
- 简化客户下单流程
- 实时跟踪订单状态
- 管理库存信息
- 分析销售数据
系统采用Python+Django+MySQL的技术栈,充分发挥了Django框架"开箱即用"的优势,大大缩短了开发周期。我在项目中主要负责系统架构设计、数据库建模、核心功能实现和测试部署等全流程工作。
2. 技术选型与架构设计
2.1 技术栈选择
选择Django作为主要框架主要基于以下几个考虑:
- 开发效率:Django自带admin后台、ORM、模板引擎等组件,可以快速构建功能完善的Web应用
- 安全性:Django内置CSRF防护、XSS防护、SQL注入防护等安全机制
- 扩展性:清晰的MVC架构和模块化设计,便于功能扩展
- 社区支持:丰富的第三方包和活跃的开发者社区
数据库选用MySQL主要因为:
- 成熟稳定,社区版免费
- 良好的性能表现
- 与Django ORM完美集成
2.2 系统架构设计
系统采用经典的三层架构:
code复制表示层(Presentation Layer)
↓
业务逻辑层(Business Logic Layer)
↓
数据访问层(Data Access Layer)
2.2.1 表示层
负责用户界面展示和交互,包括:
- 前端页面(HTML/CSS/JavaScript)
- 模板渲染(Django Template)
- 表单处理
- 静态资源管理
2.2.2 业务逻辑层
处理核心业务规则和流程,包括:
- 用户认证与授权
- 订单处理流程
- 库存管理逻辑
- 支付处理
- 数据分析
2.2.3 数据访问层
负责数据持久化和访问,包括:
- Django ORM
- 数据库连接池
- 缓存机制
- 数据校验
3. 数据库设计
3.1 核心数据模型
系统主要包含以下几类核心数据实体:
-
用户模型:
- 客户用户
- 企业用户
- 管理员
-
产品模型:
- 产品分类
- 产品信息
- 产品图片
-
订单模型:
- 订单基本信息
- 订单明细
- 订单状态
-
库存模型:
- 入库记录
- 库存变动
- 库存预警
3.2 关键表结构设计
3.2.1 用户表(users_user)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| username | CharField | 用户名 |
| password | CharField | 密码(加密存储) |
| EmailField | 电子邮箱 | |
| phone | CharField | 手机号 |
| user_type | CharField | 用户类型(client/enterprise/admin) |
| is_active | Boolean | 是否激活 |
| created_at | DateTime | 创建时间 |
3.2.2 产品表(products_product)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| code | CharField | 产品编码 |
| name | CharField | 产品名称 |
| category | ForeignKey | 产品分类 |
| price | Decimal | 单价 |
| stock | Integer | 库存数量 |
| description | TextField | 产品描述 |
| images | ImageField | 产品图片 |
| status | CharField | 状态(上架/下架) |
| created_by | ForeignKey | 创建人 |
| created_at | DateTime | 创建时间 |
3.2.3 订单表(orders_order)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| order_no | CharField | 订单编号 |
| customer | ForeignKey | 客户 |
| total_amount | Decimal | 订单总额 |
| status | CharField | 订单状态 |
| payment_method | CharField | 支付方式 |
| shipping_address | TextField | 收货地址 |
| created_at | DateTime | 创建时间 |
| updated_at | DateTime | 更新时间 |
4. 核心功能实现
4.1 用户认证模块
采用Django内置的认证系统,并进行了以下扩展:
python复制# 自定义用户模型
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
USER_TYPE_CHOICES = (
('client', '客户用户'),
('enterprise', '企业用户'),
('admin', '管理员'),
)
user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES)
phone = models.CharField(max_length=20)
company = models.CharField(max_length=100, blank=True)
def __str__(self):
return self.username
# 自定义认证后端
from django.contrib.auth.backends import ModelBackend
class CustomAuthBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except User.DoesNotExist:
return None
关键实现点:
- 支持用户名/邮箱登录
- 密码加密存储
- 基于角色的权限控制
- 会话管理
4.2 产品管理模块
python复制class Product(models.Model):
STATUS_CHOICES = (
('published', '已上架'),
('unpublished', '未上架'),
('out_of_stock', '缺货'),
)
code = models.CharField(max_length=50, unique=True)
name = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.PROTECT)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.PositiveIntegerField(default=0)
description = models.TextField(blank=True)
images = models.ImageField(upload_to='products/')
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='unpublished')
created_by = models.ForeignKey(User, on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return f"{self.name} ({self.code})"
def save(self, *args, **kwargs):
# 自动更新状态
if self.stock <= 0:
self.status = 'out_of_stock'
elif self.status == 'out_of_stock' and self.stock > 0:
self.status = 'published'
super().save(*args, **kwargs)
功能特点:
- 产品分类管理
- 多图片支持
- 自动库存状态更新
- 富文本描述
4.3 订单处理模块
python复制class Order(models.Model):
STATUS_CHOICES = (
('pending', '待支付'),
('paid', '已支付'),
('shipped', '已发货'),
('completed', '已完成'),
('cancelled', '已取消'),
)
PAYMENT_METHODS = (
('wechat', '微信支付'),
('alipay', '支付宝'),
('bank', '银行转账'),
)
order_no = models.CharField(max_length=50, unique=True)
customer = models.ForeignKey(User, on_delete=models.PROTECT, related_name='orders')
total_amount = models.DecimalField(max_digits=12, decimal_places=2)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
payment_method = models.CharField(max_length=20, choices=PAYMENT_METHODS, blank=True)
shipping_address = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return f"Order #{self.order_no}"
def save(self, *args, **kwargs):
if not self.order_no:
# 生成订单号: 日期+随机数
self.order_no = f"{timezone.now().strftime('%Y%m%d')}{random.randint(1000, 9999)}"
super().save(*args, **kwargs)
@property
def items(self):
return self.order_items.all()
def calculate_total(self):
return sum(item.subtotal for item in self.items.all())
def can_cancel(self):
return self.status in ['pending', 'paid']
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='order_items')
product = models.ForeignKey(Product, on_delete=models.PROTECT)
quantity = models.PositiveIntegerField(default=1)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
unique_together = ['order', 'product']
@property
def subtotal(self):
return self.quantity * self.price
核心流程:
- 购物车→生成订单→支付→发货→完成
- 订单状态机管理
- 库存自动扣减
- 订单号生成规则
5. 系统部署与优化
5.1 生产环境部署
采用Nginx + Gunicorn + Django的经典部署方案:
- Nginx:作为反向代理和静态文件服务器
- Gunicorn:作为WSGI应用服务器
- Supervisor:进程管理
- MySQL:生产数据库
- Redis:缓存和会话存储
部署步骤:
bash复制# 安装依赖
sudo apt-get update
sudo apt-get install nginx python3-pip python3-dev libmysqlclient-dev
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装Python依赖
pip install -r requirements.txt
# 配置Gunicorn
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
# Nginx配置
sudo nano /etc/nginx/sites-available/myproject
# 启用配置
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
# 使用Supervisor管理进程
sudo apt-get install supervisor
sudo nano /etc/supervisor/conf.d/myproject.conf
sudo supervisorctl reread
sudo supervisorctl update
5.2 性能优化措施
-
数据库优化:
- 添加适当的索引
- 使用select_related/prefetch_related减少查询次数
- 分页查询大数据集
-
缓存策略:
- 使用Redis缓存热门数据
- 实现模板片段缓存
- 缓存API响应
-
前端优化:
- 静态文件CDN加速
- 图片懒加载
- 异步加载非关键资源
-
代码层面优化:
- 使用Django Debug Toolbar分析性能瓶颈
- 批量操作代替循环单个处理
- 异步处理耗时任务(Celery)
6. 开发经验与心得
6.1 开发过程中的挑战
- 订单并发控制:
- 问题:高并发下可能出现超卖
- 解决方案:使用select_for_update()实现行级锁
python复制from django.db import transaction
@transaction.atomic
def create_order(items):
# 锁定产品记录
products = Product.objects.select_for_update().filter(
id__in=[item['product_id'] for item in items]
)
# 检查库存并扣减
for product in products:
item = next(i for i in items if i['product_id'] == product.id)
if product.stock < item['quantity']:
raise ValueError(f"产品 {product.name} 库存不足")
product.stock -= item['quantity']
product.save()
# 创建订单...
- 支付接口集成:
- 问题:不同支付平台接口差异大
- 解决方案:抽象支付网关接口
python复制from abc import ABC, abstractmethod
class PaymentGateway(ABC):
@abstractmethod
def create_payment(self, order, **kwargs):
pass
@abstractmethod
def verify_payment(self, payment_id):
pass
class WechatPayment(PaymentGateway):
def create_payment(self, order, **kwargs):
# 微信支付实现
pass
def verify_payment(self, payment_id):
# 微信支付验证
pass
class AlipayPayment(PaymentGateway):
def create_payment(self, order, **kwargs):
# 支付宝实现
pass
def verify_payment(self, payment_id):
# 支付宝验证
pass
6.2 值得分享的开发技巧
- Django Admin定制:
- 通过继承ModelAdmin类实现强大的后台定制
- 添加自定义action和过滤器
python复制@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ('order_no', 'customer', 'total_amount', 'status', 'created_at')
list_filter = ('status', 'payment_method', 'created_at')
search_fields = ('order_no', 'customer__username')
actions = ['export_orders']
def export_orders(self, request, queryset):
# 导出订单逻辑
pass
export_orders.short_description = "导出选中订单"
- DRF API设计:
- 使用Django REST Framework构建清晰的API
- 合理的权限控制和序列化设计
python复制from rest_framework import viewsets, permissions
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.filter(status='published')
serializer_class = ProductSerializer
def get_permissions(self):
if self.action in ['create', 'update', 'destroy']:
return [permissions.IsAdminUser()]
return [permissions.IsAuthenticatedOrReadOnly()]
class OrderViewSet(viewsets.ModelViewSet):
serializer_class = OrderSerializer
def get_queryset(self):
if self.request.user.is_staff:
return Order.objects.all()
return self.request.user.orders.all()
def perform_create(self, serializer):
serializer.save(customer=self.request.user)
- 测试策略:
- 单元测试覆盖核心业务逻辑
- 集成测试验证模块交互
- 使用Factory Boy创建测试数据
python复制from django.test import TestCase
from factory import Faker
from factory.django import DjangoModelFactory
class ProductFactory(DjangoModelFactory):
class Meta:
model = Product
name = Faker('word')
price = Faker('pydecimal', left_digits=3, right_digits=2, positive=True)
stock = Faker('random_int', min=0, max=100)
class OrderTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user(username='test', password='test')
self.product = ProductFactory(stock=10)
def test_order_creation(self):
self.client.login(username='test', password='test')
response = self.client.post('/api/orders/', {
'items': [{
'product_id': self.product.id,
'quantity': 2
}],
'shipping_address': 'Test Address'
})
self.assertEqual(response.status_code, 201)
self.product.refresh_from_db()
self.assertEqual(self.product.stock, 8)
7. 项目总结与展望
通过这个毕业设计项目,我完整实践了一个Web应用从需求分析到部署上线的全流程。系统实现了预期的所有核心功能,并在性能和安全方面达到了生产环境的要求。
技术收获:
- 深入掌握了Django框架的核心机制
- 实践了RESTful API设计原则
- 学习了数据库优化技巧
- 掌握了生产环境部署技能
未来改进方向:
- 引入Elasticsearch实现商品搜索
- 增加数据分析看板
- 实现微服务架构拆分
- 加入消息通知系统
- 开发移动端应用
这个项目不仅让我巩固了理论知识,更重要的是培养了解决实际问题的能力。在开发过程中遇到的每一个挑战都成为了宝贵的学习机会。