一、项目背景与痛点
生鲜门店、果蔬便利店、小型农贸商户日常经营中,多采用手工记账、Excel台账管理进销数据,生鲜商品保质期短、损耗率高,传统管理模式弊端突出:
- 人工记账效率低、数据易错:入库、销售手写登记,盘点耗时巨大,数量、成本核算经常出错;
- 无库存自动预警机制:生鲜临期、缺货无法自动提醒,缺货丢单、临期变质损耗严重;
- 采购与销售数据割裂:采购成本、售价无统一归集,无法精准核算单品毛利、门店总利润;
- 供应商信息零散:供货商联系方式、历史供货价无系统化存档,比价、对账繁琐;
- 缺少经营数据看板:无法按日/月统计销量、热销品类、亏损商品,经营决策缺少数据支撑。
针对生鲜行业经营痛点,基于Python+Django4.2搭建轻量化生鲜进销存系统,实现供应商管理、采购入库、库存管控、前台销售、临期预警、经营统计全流程闭环,区别往期考试、图书、天气、日志、访客、网盘、OAuth登录、聊天室等所有项目,新增商贸进销存赛道。
二、核心目标与定位
核心目标 :实现供应商建档→商品分类→采购入库→库存实时更新→前台开单销售→库存扣减→临期预警→损耗登记→毛利统计全链路数字化,替换手工台账,管控生鲜损耗、精准核算经营利润。
项目定位:中小型生鲜实体店专用进销存,原生Django MVT架构,无需前后端分离;划分管理员、采购员、收银员三类权限,各司其职;适配社区果蔬店、农贸小摊、生鲜便利店落地使用。
设计理念:采购销售全链路留痕、库存动态管控、临期自动预警、经营数据量化,降低生鲜损耗、提升门店经营管控能力。
三、整体技术方案
3.1 系统架构概览
本系统采用分层架构设计,各模块间数据流清晰,职责明确。整体架构如下图所示:
#mermaid-svg-DjlKpX0HjiB1qxqO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DjlKpX0HjiB1qxqO .error-icon{fill:#552222;}#mermaid-svg-DjlKpX0HjiB1qxqO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DjlKpX0HjiB1qxqO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DjlKpX0HjiB1qxqO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DjlKpX0HjiB1qxqO .marker.cross{stroke:#333333;}#mermaid-svg-DjlKpX0HjiB1qxqO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DjlKpX0HjiB1qxqO p{margin:0;}#mermaid-svg-DjlKpX0HjiB1qxqO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster-label text{fill:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster-label span{color:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster-label span p{background-color:transparent;}#mermaid-svg-DjlKpX0HjiB1qxqO .label text,#mermaid-svg-DjlKpX0HjiB1qxqO span{fill:#333;color:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO .node rect,#mermaid-svg-DjlKpX0HjiB1qxqO .node circle,#mermaid-svg-DjlKpX0HjiB1qxqO .node ellipse,#mermaid-svg-DjlKpX0HjiB1qxqO .node polygon,#mermaid-svg-DjlKpX0HjiB1qxqO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DjlKpX0HjiB1qxqO .rough-node .label text,#mermaid-svg-DjlKpX0HjiB1qxqO .node .label text,#mermaid-svg-DjlKpX0HjiB1qxqO .image-shape .label,#mermaid-svg-DjlKpX0HjiB1qxqO .icon-shape .label{text-anchor:middle;}#mermaid-svg-DjlKpX0HjiB1qxqO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DjlKpX0HjiB1qxqO .rough-node .label,#mermaid-svg-DjlKpX0HjiB1qxqO .node .label,#mermaid-svg-DjlKpX0HjiB1qxqO .image-shape .label,#mermaid-svg-DjlKpX0HjiB1qxqO .icon-shape .label{text-align:center;}#mermaid-svg-DjlKpX0HjiB1qxqO .node.clickable{cursor:pointer;}#mermaid-svg-DjlKpX0HjiB1qxqO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DjlKpX0HjiB1qxqO .arrowheadPath{fill:#333333;}#mermaid-svg-DjlKpX0HjiB1qxqO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DjlKpX0HjiB1qxqO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DjlKpX0HjiB1qxqO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjlKpX0HjiB1qxqO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DjlKpX0HjiB1qxqO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjlKpX0HjiB1qxqO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster text{fill:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO .cluster span{color:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DjlKpX0HjiB1qxqO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DjlKpX0HjiB1qxqO rect.text{fill:none;stroke-width:0;}#mermaid-svg-DjlKpX0HjiB1qxqO .icon-shape,#mermaid-svg-DjlKpX0HjiB1qxqO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjlKpX0HjiB1qxqO .icon-shape p,#mermaid-svg-DjlKpX0HjiB1qxqO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DjlKpX0HjiB1qxqO .icon-shape .label rect,#mermaid-svg-DjlKpX0HjiB1qxqO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjlKpX0HjiB1qxqO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DjlKpX0HjiB1qxqO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DjlKpX0HjiB1qxqO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础支撑层
核心业务层
前台业务层
前台销售开单模块
选择商品、录入数量、生成销售单据
损耗报备录入模块
变质商品登记扣减库存
采购入库管理模块
录入采购单、关联供应商、批量入库
库存变动管理模块
出入库自动增减库存
临期预警管理模块
系统自动筛选临期生鲜
供应商信息管理模块
供货商信息、历史报价管理
经营统计看板模块
销量/成本/毛利数据汇总
3.2 数据流转说明
-
正向业务流(商品流转):
- 采购入库 → 库存增加 → 前台销售 → 库存减少
- 系统自动追踪每个商品的入库时间、保质期、当前库存量
-
逆向业务流(异常处理):
- 损耗登记 → 库存扣减 → 数据统计
- 临期预警 → 促销处理 → 减少损失
-
数据统计流:
- 所有业务操作 → 数据聚合 → 经营看板
- 实时计算成本、毛利、周转率等关键指标
3.3 技术栈详解
后端框架
- Python 3.11:主开发语言,性能优异,生态丰富
- Django 4.2:全功能Web框架,提供ORM、Admin、认证等核心组件
- MySQL 8.0:关系型数据库,存储结构化业务数据
核心算法
- 日期计算算法 :基于
datetime模块,实现商品保质期自动判定- 临期预警(保质期剩余≤30%)
- 过期自动下架(保质期已过)
- 聚合查询引擎 :Django ORM聚合运算
- 实时计算单品毛利:
售价 - 成本价 - 统计品类销售额、成本、毛利率
- 供应商供货质量分析
- 实时计算单品毛利:
前端与可视化
- Django模板引擎:服务端渲染,快速开发
- ECharts 5.0 :数据可视化库
- 销售额趋势图(折线图)
- 品类占比分析(饼图)
- 库存健康度(仪表盘)
安全与权限
- 自定义中间件 :基于岗位的权限控制
- 收银员:仅限销售、查询功能
- 采购员:采购、供应商管理
- 管理员:全功能访问+数据统计
- 数据隔离:门店级数据隔离,保障多门店部署安全
3.4 关键技术特性
- 实时库存同步:任何出入库操作立即更新库存,避免超卖
- 智能预警机制:基于保质期的多级预警(临期、即将过期、已过期)
- 毛利自动计算:销售时自动关联采购成本,实时计算毛利
- 供应商评估:基于供货质量、价格、时效的多维度评估
- 数据驱动决策:经营看板提供实时数据支持,辅助管理决策
3.5 部署架构
生产环境部署方案:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Nginx反向代理 │───▶│ Gunicorn应用服务器│───▶│ MySQL数据库 │
│ (负载均衡+SSL) │ │ (Django应用) │ │ (主从复制) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 静态文件CDN │ │ Redis缓存 │ │ 备份服务器 │
│ (JS/CSS/图片) │ │ (Session/热点数据)│ │ (每日自动备份) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
该方案支持单店部署,也支持多门店连锁模式,通过数据库分店标识实现数据隔离与集中管理。
四、核心能力模块详解
1、供应商信息管理模块
- 供应商档案录入:名称、联系方式、主营品类、合作状态;
- 历史采购报价留存,同商品多供货商比价;
- 停用/启用供应商状态管控,筛选活跃合作商家;
- 关联对应采购单据,一键查询该供应商全部供货记录。
2、商品分类与档案模块
- 多级分类:叶菜、瓜果、肉禽、干货等生鲜分类;
- 单品录入:采购成本、销售定价、保质期天数、规格;
- 批量导入商品,支持Excel批量建档;
- 区分生鲜短保/干货长保品类,差异化预警规则。
3、采购入库管理模块(核心)
- 绑定供应商生成采购单据,自动记录采购单价、采购数量;
- 入库提交后系统自动增加对应库存;
- 采购单永久存档,支持按日期/供应商检索对账;
- 同商品多次采购自动更新平均成本价。
4、前台销售开单模块
- 勾选商品、填写售卖数量,自动核算应收金额;
- 开单完成实时扣减库存,生成销售流水;
- 支持单品打折、整单优惠,自动记录实际收款;
- 当日销售单据一键检索、重打小票。
5、库存与临期预警模块
- 实时动态库存:入库加、销售/损耗减;
- 缺货预警:库存低于安全线自动标记;
- 临期预警:根据保质期自动筛选即将过期生鲜;
- 过期商品禁止前台销售,只能做损耗登记。
6、生鲜损耗登记模块
- 变质、磕碰生鲜录入损耗单,系统自动扣减库存;
- 按月统计各类商品损耗率,优化采购量;
- 损耗数据计入成本,保证毛利核算精准。
7、经营数据统计模块
- 日/月总销售额、采购总成本、整体毛利自动计算;
- 热销商品排行、滞销商品统计;
- 各品类营收占比图表展示;
- 损耗成本单独统计,直观查看生鲜亏损数据。
五、创新价值与亮点
- 生鲜专属临期预警:针对果蔬短保特性做时间管控,从源头减少变质损耗;
- 自动成本毛利核算:摒弃人工算账,系统根据采购、销售数据自动算利润;
- 全单据溯源采购/销售/损耗全单据存档,对账高效;
- 多角色权限拆分收银员不能改采购价,采购员无法销售开单,数据安全;
- 轻量化部署小门店低成本落地,替代昂贵商用进销存软件。
六、应用前景与落地场景
- 社区果蔬生鲜小店日常进销存管控;
- 农贸市场个体户进销台账管理;
- 校园生鲜便利店经营统计;
- 毕设/简历优质商贸类实战项目。
七、完整代码结构示例
python
django-fresh-stock/
├── manage.py
├── fresh_project/
│ ├── settings.py
│ ├── urls.py
│ └── middleware.py
├── apps/
│ ├── supplier/ # 供应商管理
│ ├── goods/ # 商品分类&档案
│ ├── purchase/ # 采购入库
│ ├── sale/ # 前台销售开单
│ ├── stock_warn/ # 库存临期预警
│ ├── loss_record/ # 损耗登记
│ └── data_stat/ # 经营统计
├── core/
│ ├── date_tool.py # 临期时间计算
│ ├── profit_calc.py # 毛利核算工具
│ └── stat_data.py # 统计封装
├── static/
├── templates/
└── requirements.txt
示例1:商品、采购单核心模型
python
from django.db import models
# 商品分类
class Category(models.Model):
name = models.CharField(max=30, verbose="分类名称")
create_time = models.DateTimeField(auto_now_add=True)
# 商品档案
class Goods(models.Model):
name = models.CharField(max=50, verbose="商品名称")
category = models.ForeignKey(Category,on_delete=models.CASCADE)
cost_price = models.DecimalField(max_digits=6,decimal_places=2,verbose="采购成本")
sale_price = models.DecimalField(max_digits=6,decimal_places=2,verbose="售价")
shelf_day = models.IntegerField(verbose="保质期天数")
safe_stock = models.IntegerField(default=5,verbose="安全库存")
stock = models.IntegerField(default=0,verbose="当前库存")
# 采购单据
class PurchaseOrder(models.Model):
order_no = models.CharField(max=32,unique=True,verbose="采购单号")
supplier = models.ForeignKey('supplier.Supplier',on_delete=models.CASCADE)
total_cost = models.DecimalField(max_digits=9,decimal_places=2)
create_time = models.DateTimeField(auto_now_add=True)
示例2:临期计算工具 core/date_tool.py
python
from datetime import datetime,timedelta
class DateCheck:
@classmethod
def get_warn_day(cls,limit=3):
"""获取3天内临期截止日期"""
return datetime.now() + timedelta(days=limit)
@classmethod
def is_expire(cls,produce_day,shelf):
"""判断是否过期"""
deadline = produce_day + timedelta(days=shelf)
return datetime.now() > deadline
示例3 单品毛利计算工具 core/profit_calc.py
python
class ProfitCalc:
@classmethod
def calc_single_profit(sale_num,sale_price,cost_price):
"""单品毛利=销量*(售价-进价)"""
return round((sale_price-cost_price)*sale_num,2)
八、总结与展望
本篇聚焦生鲜商贸进销存全新赛道,和历史在线考试、图书管理、天气、日志、网盘、聊天室、访客系统、OAuth登录等全部项目无业务重合,主打库存管控+临期算法+毛利自动化核算,贴合实体门店真实业务。项目完整覆盖采购、销售、损耗、预警、统计全链路,商用落地属性强,后端ORM聚合、时间算法都是求职高频技术点。
后续迭代:
- 接入小票打印机自动打印销售单据;
- 新增会员储值、会员折扣功能;
- 批量导出月度经营Excel报表。