超市销售管理系统作为零售行业的核心业务支撑平台,其信息化程度直接影响运营效率与管理水平。传统超市普遍存在以下痛点:销售数据分散在各收银终端,难以实时汇总分析;库存状态依赖人工盘点,响应滞后;经营决策缺乏数据支撑,多凭经验判断。针对这些问题,我们基于Python+Django框架开发了一套完整的超市销售管理系统,重点强化了数据可视化模块,帮助管理者从海量业务数据中快速提取关键信息。
本系统采用B/S架构设计,具有以下核心优势:
技术选型方面,我们采用Django作为后端框架,主要基于以下考虑:
系统采用典型的三层架构设计:
code复制[前端展示层]
├─ Django模板引擎 (数据渲染)
├─ Bootstrap 5 (响应式UI)
└─ ECharts 5 (数据可视化)
[业务逻辑层]
├─ Django框架 (URL路由/视图处理)
├─ Django ORM (数据库交互)
└─ Django Auth (权限控制)
[数据存储层]
├─ MySQL 8.0 (关系型数据)
└─ Redis (缓存/会话管理)
python复制# models.py 主要模型定义
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)
safety_stock = models.IntegerField(default=10)
current_stock = models.IntegerField(default=0)
expiry_date = models.DateField(null=True, blank=True)
class SaleRecord(models.Model):
transaction_no = models.CharField(max_length=20, unique=True)
cashier = models.ForeignKey(User, on_delete=models.PROTECT)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
payment_method = models.CharField(max_length=20)
create_time = models.DateTimeField(auto_now_add=True)
class SaleDetail(models.Model):
sale_record = models.ForeignKey(SaleRecord, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
quantity = models.IntegerField()
unit_price = models.DecimalField(max_digits=10, decimal_places=2)
discount = models.DecimalField(max_digits=5, decimal_places=2, default=1.0)
索引策略:
查询优化:
分表设计:
在Django中集成ECharts需要解决两个关键问题:
python复制# views.py
def sales_trend_api(request):
days = int(request.GET.get('days', 7))
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
data = SaleRecord.objects.filter(
create_time__range=(start_date, end_date)
).annotate(
date=TruncDate('create_time')
).values('date').annotate(
total=Sum('total_amount'),
count=Count('id')
).order_by('date')
return JsonResponse(list(data), safe=False)
javascript复制// sales_trend.js
function initChart() {
const chart = echarts.init(document.getElementById('trend-chart'));
fetch('/api/sales/trend?days=30')
.then(res => res.json())
.then(data => {
const option = {
tooltip: { trigger: 'axis' },
xAxis: {
type: 'category',
data: data.map(item => item.date)
},
yAxis: { type: 'value' },
series: [{
data: data.map(item => item.total),
type: 'line',
smooth: true,
areaStyle: {}
}]
};
chart.setOption(option);
});
window.addEventListener('resize', chart.resize);
}
系统预设四种角色及其权限边界:
| 角色 | 权限范围 | 特殊限制 |
|---|---|---|
| 收银员 | 销售录入、退货处理 | 无法查看成本价 |
| 店长 | 商品管理、库存调整 | 无法修改系统参数 |
| 区域经理 | 多店数据查看、报表导出 | 仅限管辖门店 |
| 系统管理员 | 全部功能 | 无限制 |
python复制# decorators.py
def role_required(*roles):
def decorator(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if not request.user.groups.filter(name__in=roles).exists():
raise PermissionDenied
return view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
# views.py
@role_required('店长', '系统管理员')
def inventory_adjust(request):
# 库存调整逻辑
html复制{% if perms.sales.change_salerecord %}
<button class="btn-edit">修改订单</button>
{% endif %}
python复制# permissions.py
class IsStoreManager(BasePermission):
def has_permission(self, request, view):
return request.user.groups.filter(name='店长').exists()
推荐使用以下技术栈:
典型docker-compose.yml配置:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn supermarket.wsgi:application --bind 0.0.0.0:8000
volumes:
- static:/code/static
depends_on:
- redis
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: supermarket
redis:
image: redis:alpine
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- static:/code/static
volumes:
static:
数据库层面:
缓存策略:
前端优化:
在开发过程中,我们积累了以下关键经验:
Django ORM使用技巧:
ECharts性能优化:
权限设计建议:
典型问题解决方案:
这个项目从技术选型到最终落地,让我深刻体会到Django框架在快速开发企业级应用时的优势,特别是在以下场景:
对于希望学习Django全栈开发的同学,建议从官方教程入手,重点掌握MTV设计模式、ORM高级用法和类视图体系,这些都是构建复杂应用的基础。