1. 项目背景与核心需求
在电商和零售行业高速发展的今天,商品库存管理已成为企业运营的核心环节。作为一名计算机专业的毕业生,选择开发一个基于Django的商品库存管理系统作为毕业设计,既符合当前技术趋势,又能体现实际工程能力。
这个系统需要解决几个关键问题:
- 实时跟踪商品进出库状态
- 预警库存不足或积压情况
- 提供多维度的库存数据分析
- 支持多角色协同操作(管理员、采购员、销售员等)
Django框架的选择非常明智——它自带强大的Admin后台、完善的ORM系统以及清晰的MVC架构,特别适合快速开发这类数据密集型的业务系统。我在实际电商项目中多次使用Django开发库存模块,其内置的模型迁移机制能极大简化数据库结构调整的过程。
2. 系统架构设计
2.1 技术栈选型
基础框架:
- Django 3.2 LTS(长期支持版本更稳定)
- Python 3.8+(兼容性好且性能均衡)
数据库:
- MySQL 5.7/8.0(推荐使用InnoDB引擎)
- 或PostgreSQL(如需更复杂查询)
前端:
- Bootstrap 5 + jQuery(快速构建响应式界面)
- Chart.js(用于数据可视化)
部署方案:
- Nginx + Gunicorn(生产环境标准配置)
- 或Docker容器化部署(更易迁移)
2.2 核心数据模型
商品基础模型设计示例(models.py):
python复制class Product(models.Model):
SKU = models.CharField(max_length=50, unique=True) # 商品唯一编码
name = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
selling_price = models.DecimalField(max_digits=10, decimal_places=2)
minimum_stock = models.PositiveIntegerField(default=10) # 库存预警阈值
description = models.TextField(blank=True)
image = models.ImageField(upload_to='products/', null=True)
class Inventory(models.Model):
product = models.OneToOneField(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=0)
last_updated = models.DateTimeField(auto_now=True)
@property
def status(self):
if self.quantity == 0:
return "out_of_stock"
elif self.quantity <= self.product.minimum_stock:
return "low_stock"
return "in_stock"
3. 关键功能实现
3.1 库存变动流水记录
所有库存变更都应记录完整操作日志:
python复制class InventoryTransaction(models.Model):
TRANSACTION_TYPES = (
('purchase', '采购入库'),
('sale', '销售出库'),
('adjustment', '库存调整'),
('return', '客户退货')
)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
transaction_type = models.CharField(max_length=20, choices=TRANSACTION_TYPES)
quantity = models.IntegerField() # 正数表示入库,负数表示出库
reference = models.CharField(max_length=100) # 关联单据号
operator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def save(self, *args, **kwargs):
# 自动更新库存总量
inventory = Inventory.objects.get(product=self.product)
inventory.quantity += self.quantity
inventory.save()
super().save(*args, **kwargs)
3.2 库存预警功能
通过Django Signals实现低库存自动提醒:
python复制from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail
@receiver(post_save, sender=Inventory)
def check_stock_level(sender, instance, **kwargs):
if instance.status == "low_stock":
subject = f'库存预警:{instance.product.name}'
message = f'''商品 {instance.product.SKU} 当前库存 {instance.quantity},
已低于最小库存阈值 {instance.product.minimum_stock}'''
send_mail(
subject,
message,
'system@example.com',
['manager@example.com'],
fail_silently=True
)
4. 高级功能实现
4.1 库存盘点差异分析
开发周期盘点功能时,需要处理实际库存与系统记录的差异:
python复制def stock_taking(product_id, actual_qty):
inventory = Inventory.objects.get(product_id=product_id)
discrepancy = actual_qty - inventory.quantity
if discrepancy != 0:
InventoryTransaction.objects.create(
product_id=product_id,
transaction_type='adjustment',
quantity=discrepancy,
reference=f'STOCK_TAKING_{datetime.now().strftime("%Y%m%d")}',
operator=request.user
)
return {
'previous_qty': inventory.quantity,
'actual_qty': actual_qty,
'discrepancy': discrepancy
}
4.2 销售预测与补货建议
基于简单移动平均法的预测实现:
python复制from django.db.models import Sum
from datetime import timedelta
def calculate_replenishment(product_id):
product = Product.objects.get(pk=product_id)
# 计算过去30天销量
thirty_days_ago = timezone.now() - timedelta(days=30)
sales = InventoryTransaction.objects.filter(
product=product,
transaction_type='sale',
created_at__gte=thirty_days_ago
).aggregate(total_sales=Sum('quantity'))['total_sales'] or 0
avg_daily_sales = abs(sales) / 30
lead_time = 7 # 假设补货周期为7天
safety_stock = avg_daily_sales * lead_time * 1.2 # 20%安全余量
recommended_order = max(
0,
(avg_daily_sales * (lead_time + 7)) - product.inventory.quantity + safety_stock
)
return {
'daily_sales': round(avg_daily_sales, 2),
'current_stock': product.inventory.quantity,
'recommended_order': round(recommended_order)
}
5. 系统优化技巧
5.1 库存查询性能优化
对于高频访问的库存查询接口,添加缓存层:
python复制from django.core.cache import cache
def get_inventory(product_id):
cache_key = f'inventory_{product_id}'
data = cache.get(cache_key)
if not data:
inventory = Inventory.objects.select_related('product').get(product_id=product_id)
data = {
'quantity': inventory.quantity,
'status': inventory.status,
'product_name': inventory.product.name
}
cache.set(cache_key, data, timeout=300) # 缓存5分钟
return data
5.2 并发库存更新处理
使用select_for_update解决并发修改问题:
python复制from django.db import transaction
@transaction.atomic
def update_inventory(product_id, delta):
inventory = Inventory.objects.select_for_update().get(product_id=product_id)
inventory.quantity += delta
if inventory.quantity < 0:
raise ValueError("库存不足")
inventory.save()
return inventory.quantity
6. 毕业设计扩展建议
6.1 增加条形码支持
使用python-barcode库生成商品条码:
python复制import barcode
from barcode.writer import ImageWriter
def generate_barcode(product_sku):
code = barcode.get('code128', product_sku, writer=ImageWriter())
filename = f'{product_sku}'
fullname = code.save(f'media/barcodes/{filename}')
return fullname
6.2 开发REST API接口
使用Django REST Framework构建移动端接口:
python复制from rest_framework import serializers, viewsets
class InventorySerializer(serializers.ModelSerializer):
product_name = serializers.CharField(source='product.name')
class Meta:
model = Inventory
fields = ['id', 'product_name', 'quantity', 'status']
class InventoryViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Inventory.objects.select_related('product').all()
serializer_class = InventorySerializer
7. 项目部署方案
7.1 宝塔面板部署流程
- 安装Python项目管理器
- 新建Django项目,选择Python版本(建议3.8+)
- 配置项目路径指向manage.py所在目录
- 添加Nginx反向代理,示例配置:
nginx复制location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
- 配置静态文件收集和Gunicorn启动
7.2 数据库迁移注意事项
生产环境迁移时特别注意:
bash复制# 导出开发环境数据
python manage.py dumpdata --exclude=contenttypes --exclude=auth.permission > datadump.json
# 生产环境导入前先执行
python manage.py migrate
python manage.py loaddata datadump.json
8. 毕业设计答辩要点
-
技术选型依据:
- Django的Admin后台可快速搭建管理系统原型
- ORM层简化了数据库操作
- 内置的用户认证系统直接可用
-
系统亮点展示:
- 实时库存预警机制
- 完整的操作审计日志
- 数据可视化报表
-
性能优化措施:
- 高频查询的缓存处理
- 并发更新的锁机制
- 数据库索引优化
-
扩展性设计:
- 清晰的API接口设计
- 模块化的功能组件
- 配置与代码分离
我在实际部署这类系统时发现,很多同学会忽略操作日志的重要性。建议在答辩时重点展示你的InventoryTransaction设计,这能体现你对数据完整性的考虑。另外,库存预测算法不一定要非常复杂,但需要能清晰说明你的计算逻辑和业务假设。
