1. 项目概述与背景
超市进销存管理系统是现代零售业不可或缺的核心工具。作为一名长期从事零售信息化建设的开发者,我见过太多小型超市还在使用纸质台账或简单的Excel表格来管理商品进出,经常出现库存不准、补货不及时、账目混乱等问题。这次我们用Python+Django打造的这个系统,正是为了解决这些痛点。
Python作为当前最流行的脚本语言之一,凭借其简洁的语法和丰富的生态库,特别适合快速开发中小型管理系统。Django框架自带Admin后台、ORM映射和模板引擎,能大幅降低开发难度。而MySQL作为成熟的关系型数据库,既能保证数据安全又完全免费,是初创企业的理想选择。
这个系统主要面向中小型超市经营者,帮助他们实现:
- 商品信息的数字化管理
- 进货、销售、库存的实时跟踪
- 经营数据的可视化分析
- 多用户分权限协作
提示:虽然系统采用B/S架构,但通过响应式设计也能在手机端良好运行,满足移动办公需求。
2. 技术选型与架构设计
2.1 后端技术栈解析
选择Python 3.8作为基础运行环境,主要考虑因素包括:
- 语法简洁开发效率高(相比Java等静态语言)
- 丰富的第三方库(如Pandas可用于数据分析)
- 跨平台特性(Windows/Linux服务器都能部署)
Django框架采用MTV模式:
- Models:定义数据结构和业务逻辑
- Templates:负责页面展示
- Views:处理请求和响应
python复制# 典型模型定义示例
class Product(models.Model):
barcode = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.PROTECT)
purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
selling_price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.IntegerField(default=0)
alert_stock = models.IntegerField(default=10)
2.2 数据库设计要点
MySQL表结构设计遵循第三范式,核心表包括:
| 表名 | 主要字段 | 说明 |
|---|---|---|
| product | id, barcode, name, category_id | 商品主表 |
| category | id, name, parent_id | 商品分类 |
| supplier | id, name, contact, address | 供应商信息 |
| purchase | id, supplier_id, total_amount | 进货单 |
| purchase_item | id, purchase_id, product_id, quantity | 进货明细 |
| sale | id, member_id, total_amount | 销售单 |
| sale_item | id, sale_id, product_id, quantity | 销售明细 |
| inventory | id, product_id, quantity | 实时库存 |
注意:所有金额字段统一使用DECIMAL类型,避免浮点数精度问题
2.3 前端技术实现
采用Bootstrap 5 + jQuery的组合方案:
- 响应式布局适配不同设备
- 内置表单验证减少后端压力
- 使用DataTables插件实现分页和搜索
关键前端代码结构:
html复制<!-- 商品列表页示例 -->
<div class="table-responsive">
<table id="product-table" class="table table-striped">
<thead>
<tr>
<th>条形码</th>
<th>商品名称</th>
<th>库存</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for product in products %}
<tr>
<td>{{ product.barcode }}</td>
<td>{{ product.name }}</td>
<td class="{% if product.stock < product.alert_stock %}text-danger{% endif %}">
{{ product.stock }}
</td>
<td>
<button class="btn btn-sm btn-outline-primary">编辑</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
3. 核心功能实现
3.1 商品管理模块
商品信息管理采用CRUD标准操作:
- 新增商品时自动生成唯一条形码(规则:类别码+日期+序列号)
- 支持批量导入Excel数据
- 实现商品图片上传功能(使用Pillow处理缩略图)
库存预警机制实现逻辑:
python复制# signals.py 库存变化信号处理
@receiver(post_save, sender=Inventory)
def check_stock_alert(sender, instance, **kwargs):
if instance.quantity < instance.product.alert_stock:
alert = StockAlert.objects.get_or_create(
product=instance.product,
defaults={'current_stock': instance.quantity}
)
if not alert[1]: # 已存在则更新
alert[0].current_stock = instance.quantity
alert[0].save()
3.2 进货管理流程
标准进货流程包含以下步骤:
- 选择供应商(自动带出历史采购价)
- 扫码或搜索添加商品
- 输入进货数量和单价(自动计算金额)
- 提交审核(不同权限分级审批)
- 入库操作(更新库存)
采购单状态机设计:
mermaid复制stateDiagram
[*] --> 草稿
草稿 --> 已提交: 提交
已提交 --> 已审核: 经理审核
已审核 --> 已入库: 仓库确认
已提交 --> 已拒绝: 审核不通过
已拒绝 --> 草稿: 重新编辑
3.3 销售与收银系统
销售模块关键特性:
- 支持会员价/普通价切换
- 快捷键快速输入数量
- 挂单/取单功能
- 多种支付方式(现金、微信、支付宝)
销售逻辑代码片段:
python复制def create_sale(request):
cart = request.session.get('cart', {})
if not cart:
return JsonResponse({'status': 'error', 'msg': '购物车为空'})
with transaction.atomic():
sale = Sale.objects.create(
user=request.user,
total_amount=sum(item['amount'] for item in cart.values())
)
for product_id, item in cart.items():
product = Product.objects.select_for_update().get(pk=product_id)
if product.stock < item['quantity']:
raise ValueError(f"{product.name}库存不足")
SaleItem.objects.create(
sale=sale,
product=product,
quantity=item['quantity'],
price=item['price']
)
product.stock -= item['quantity']
product.save()
request.session['cart'] = {}
return JsonResponse({'status': 'success', 'sale_id': sale.id})
4. 系统部署与优化
4.1 生产环境部署方案
推荐部署架构:
- Nginx:反向代理和静态文件服务
- Gunicorn:WSGI应用服务器
- Supervisor:进程监控
- MySQL:主从复制保证数据安全
部署步骤示例:
bash复制# 安装依赖
pip install -r requirements.txt
# 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 收集静态文件
python manage.py collectstatic
# 启动Gunicorn
gunicorn --workers 4 --bind unix:/tmp/gunicorn.sock inventory.wsgi:application
4.2 性能优化技巧
-
数据库优化:
- 为常用查询字段添加索引
- 使用select_related/prefetch_related减少查询次数
- 分表处理历史数据
-
缓存策略:
- Redis缓存热点数据
- 使用Django的cache_page装饰器缓存静态页面
-
前端优化:
- 启用Gzip压缩
- 使用CDN分发静态资源
- 延迟加载非关键图片
5. 常见问题与解决方案
5.1 开发阶段问题
问题1:Django Admin界面汉化不全
解决方法:
python复制# settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
问题2:MySQL连接超时
解决方法:
python复制# settings.py
DATABASES = {
'OPTIONS': {
'connect_timeout': 5,
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
5.2 运营维护问题
问题:库存不同步
排查步骤:
- 检查是否有未完成的进货单
- 验证触发器是否正常工作
- 查看系统日志寻找异常操作
- 执行库存校对脚本
校对脚本示例:
python复制def check_inventory():
discrepancies = []
for product in Product.objects.all():
db_stock = product.stock
calc_stock = (PurchaseItem.objects.filter(product=product)
.aggregate(Sum('quantity'))['quantity__sum'] or 0) - \
(SaleItem.objects.filter(product=product)
.aggregate(Sum('quantity'))['quantity__sum'] or 0)
if db_stock != calc_stock:
discrepancies.append({
'product': product.name,
'db_stock': db_stock,
'calc_stock': calc_stock
})
return discrepancies
6. 项目扩展方向
在实际使用过程中,我发现系统还可以进一步扩展:
- 移动端应用:开发React Native应用,支持手机扫码盘点
- 智能补货预测:基于历史销售数据训练时间序列模型
- 供应商门户:让供应商自主查看商品销售情况
- 多门店支持:增加门店管理模块,支持连锁经营
一个特别实用的改进是增加"临期商品"预警功能,通过扫描商品保质期信息,提前预警即将过期的商品,这个功能在生鲜品类管理中特别有用。实现代码片段:
python复制# models.py
class Product(models.Model):
...
production_date = models.DateField(null=True)
shelf_life = models.IntegerField(help_text="保质期(天)")
# utils.py
def get_expiring_products(days=7):
threshold = timezone.now().date() + timedelta(days=days)
return Product.objects.filter(
production_date__isnull=False
).annotate(
expiry_date=F('production_date') + F('shelf_life') * timedelta(days=1)
).filter(
expiry_date__lte=threshold
)