Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)

一、项目背景与痛点

生鲜门店、果蔬便利店、小型农贸商户日常经营中,多采用手工记账、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 数据流转说明

  1. 正向业务流(商品流转):

    • 采购入库 → 库存增加 → 前台销售 → 库存减少
    • 系统自动追踪每个商品的入库时间、保质期、当前库存量
  2. 逆向业务流(异常处理):

    • 损耗登记 → 库存扣减 → 数据统计
    • 临期预警 → 促销处理 → 减少损失
  3. 数据统计流

    • 所有业务操作 → 数据聚合 → 经营看板
    • 实时计算成本、毛利、周转率等关键指标

3.3 技术栈详解

后端框架
  • Python 3.11:主开发语言,性能优异,生态丰富
  • Django 4.2:全功能Web框架,提供ORM、Admin、认证等核心组件
  • MySQL 8.0:关系型数据库,存储结构化业务数据
核心算法
  • 日期计算算法 :基于datetime模块,实现商品保质期自动判定
    • 临期预警(保质期剩余≤30%)
    • 过期自动下架(保质期已过)
  • 聚合查询引擎 :Django ORM聚合运算
    • 实时计算单品毛利:售价 - 成本价
    • 统计品类销售额、成本、毛利率
    • 供应商供货质量分析
前端与可视化
  • Django模板引擎:服务端渲染,快速开发
  • ECharts 5.0 :数据可视化库
    • 销售额趋势图(折线图)
    • 品类占比分析(饼图)
    • 库存健康度(仪表盘)
安全与权限
  • 自定义中间件 :基于岗位的权限控制
    • 收银员:仅限销售、查询功能
    • 采购员:采购、供应商管理
    • 管理员:全功能访问+数据统计
  • 数据隔离:门店级数据隔离,保障多门店部署安全

3.4 关键技术特性

  1. 实时库存同步:任何出入库操作立即更新库存,避免超卖
  2. 智能预警机制:基于保质期的多级预警(临期、即将过期、已过期)
  3. 毛利自动计算:销售时自动关联采购成本,实时计算毛利
  4. 供应商评估:基于供货质量、价格、时效的多维度评估
  5. 数据驱动决策:经营看板提供实时数据支持,辅助管理决策

3.5 部署架构

复制代码
生产环境部署方案:
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   Nginx反向代理  │───▶│   Gunicorn应用服务器│───▶│   MySQL数据库   │
│   (负载均衡+SSL) │    │   (Django应用)    │    │   (主从复制)    │
└─────────────────┘    └─────────────────┘    └─────────────────┘
         │                        │                        │
         ▼                        ▼                        ▼
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   静态文件CDN    │    │   Redis缓存     │    │   备份服务器    │
│   (JS/CSS/图片)  │    │   (Session/热点数据)│    │   (每日自动备份) │
└─────────────────┘    └─────────────────┘    └─────────────────┘

该方案支持单店部署,也支持多门店连锁模式,通过数据库分店标识实现数据隔离与集中管理。

四、核心能力模块详解

1、供应商信息管理模块

  1. 供应商档案录入:名称、联系方式、主营品类、合作状态;
  2. 历史采购报价留存,同商品多供货商比价;
  3. 停用/启用供应商状态管控,筛选活跃合作商家;
  4. 关联对应采购单据,一键查询该供应商全部供货记录。

2、商品分类与档案模块

  1. 多级分类:叶菜、瓜果、肉禽、干货等生鲜分类;
  2. 单品录入:采购成本、销售定价、保质期天数、规格;
  3. 批量导入商品,支持Excel批量建档;
  4. 区分生鲜短保/干货长保品类,差异化预警规则。

3、采购入库管理模块(核心)

  1. 绑定供应商生成采购单据,自动记录采购单价、采购数量;
  2. 入库提交后系统自动增加对应库存;
  3. 采购单永久存档,支持按日期/供应商检索对账;
  4. 同商品多次采购自动更新平均成本价。

4、前台销售开单模块

  1. 勾选商品、填写售卖数量,自动核算应收金额;
  2. 开单完成实时扣减库存,生成销售流水;
  3. 支持单品打折、整单优惠,自动记录实际收款;
  4. 当日销售单据一键检索、重打小票。

5、库存与临期预警模块

  1. 实时动态库存:入库加、销售/损耗减;
  2. 缺货预警:库存低于安全线自动标记;
  3. 临期预警:根据保质期自动筛选即将过期生鲜;
  4. 过期商品禁止前台销售,只能做损耗登记。

6、生鲜损耗登记模块

  1. 变质、磕碰生鲜录入损耗单,系统自动扣减库存;
  2. 按月统计各类商品损耗率,优化采购量;
  3. 损耗数据计入成本,保证毛利核算精准。

7、经营数据统计模块

  1. 日/月总销售额、采购总成本、整体毛利自动计算;
  2. 热销商品排行、滞销商品统计;
  3. 各品类营收占比图表展示;
  4. 损耗成本单独统计,直观查看生鲜亏损数据。

五、创新价值与亮点

  1. 生鲜专属临期预警:针对果蔬短保特性做时间管控,从源头减少变质损耗;
  2. 自动成本毛利核算:摒弃人工算账,系统根据采购、销售数据自动算利润;
  3. 全单据溯源采购/销售/损耗全单据存档,对账高效;
  4. 多角色权限拆分收银员不能改采购价,采购员无法销售开单,数据安全;
  5. 轻量化部署小门店低成本落地,替代昂贵商用进销存软件。

六、应用前景与落地场景

  1. 社区果蔬生鲜小店日常进销存管控;
  2. 农贸市场个体户进销台账管理;
  3. 校园生鲜便利店经营统计;
  4. 毕设/简历优质商贸类实战项目。

七、完整代码结构示例

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聚合、时间算法都是求职高频技术点。

后续迭代

  1. 接入小票打印机自动打印销售单据;
  2. 新增会员储值、会员折扣功能;
  3. 批量导出月度经营Excel报表。
相关推荐
知识分享小能手1 小时前
数据预处理入门学习教程,从入门到精通, 实战演练——数据分析师岗位分析知识点详解(8)
python·学习·信息可视化
yuhuofei20211 小时前
【Python入门】Python中的集合set
python
Demon1_Coder1 小时前
Day4-微服务-Seata默认事务
java·数据库·微服务
我是大猴子1 小时前
Redis为什么不适合做持久化和DB的区别在哪里
数据库·redis·缓存
mN9B2uk171 小时前
数据库锁总结
数据库·oracle
大雨淅淅1 小时前
【机器人】ROS2 机械臂控制(MoveIt2)从入门到实战
人工智能·python·神经网络·学习·算法·机器学习·机器人
闪电悠米1 小时前
黑马点评-秒杀优化-04_lua_and_db_fallback
服务器·开发语言·网络·数据库·缓存·junit·lua
Jun6261 小时前
QT(5)-第三方日志系统
开发语言·数据库·qt
骄马之死2 小时前
Redis 核心知识点总结
数据库·redis·缓存