温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着人们生活水平的不断提高,食品安全问题日益受到社会各界的广泛关注。近年来,食品安全事件频发,暴露出传统食品供应链在信息透明度、监管效率和责任追溯等方面存在的诸多短板。如何实现食品从生产、加工、流通到销售全链条的精准追溯,成为行业亟待解决的核心问题。
本系统基于 Python 和 Django 框架,构建一套食品安全追溯管理平台,通过统一编码、全流程记录和可视化查询,帮助企业和监管部门快速定位问题环节、及时召回问题产品,从而提升食品安全的整体保障水平。
2. 系统需求分析
2.1 功能需求
- 用户管理:支持企业用户、监管用户和管理员三类角色,提供注册、登录、权限分配等功能。
- 产品管理:对食品品类、批次、规格、保质期等基础信息进行统一维护。
- 溯源信息录入:覆盖生产、加工、仓储、运输、销售等环节的关键数据采集。
- 追溯查询:通过溯源码或产品名称,快速查询食品全生命周期信息。
- 预警与召回:对异常批次自动预警,支持问题产品的召回流程管理。
- 数据统计:提供溯源覆盖率、问题批次分布等统计报表。
2.2 非功能需求
- 安全性:用户密码加密存储,接口权限校验,防止越权访问。
- 可靠性:关键操作记录日志,支持数据定期备份。
- 可扩展性:模块化设计,便于后续接入物联网设备或第三方监管平台。
- 易用性:界面简洁清晰,操作流程符合业务人员使用习惯。
3. 系统架构设计
3.1 技术选型
| 层次 | 技术方案 |
|---|---|
| 前端 | HTML、CSS、JavaScript、Bootstrap |
| 后端框架 | Python 3.8+、Django 3.2 |
| 数据库 | MySQL 5.7 / SQLite(开发环境) |
| 缓存 | Redis(可选,用于验证码和会话管理) |
| 部署 | Nginx + Gunicorn |
3.2 整体架构
系统采用经典的 Django MTV 架构,浏览器通过 HTTP 请求访问视图层,视图调用模型层完成数据读写,模板引擎负责页面渲染。业务逻辑按应用模块划分,包括用户模块、产品模块、溯源模块、预警模块和统计模块,各模块之间通过清晰的接口协作。
flowchart TD A[浏览器客户端] --> B[Nginx 反向代理] B --> C[Gunicorn WSGI 服务] C --> D[Django 应用] D --> E[用户模块] D --> F[产品模块] D --> G[溯源模块] D --> H[预警模块] D --> I[统计模块] E --> J[(MySQL 数据库)] F --> J G --> J H --> J I --> J4. 数据库设计
4.1 核心数据表
| 表名 | 说明 | 主要字段 |
|---|---|---|
| User | 用户表 | username、password、role、company |
| Product | 产品表 | name、category、spec、shelf_life |
| Batch | 批次表 | batch_no、product、produce_date、status |
| TraceNode | 溯源节点表 | batch、node_type、operator、time、location、detail |
| Warning | 预警表 | batch、level、content、create_time、status |
4.2 关键模型示例
from django.db import models class Product(models.Model): name = models.CharField(max_length=100, verbose_name="产品名称") category = models.CharField(max_length=50, verbose_name="产品类别") spec = models.CharField(max_length=50, verbose_name="规格") shelf_life = models.IntegerField(verbose_name="保质期(天)") class Meta: db_table = "product" def __str__(self): return self.name class TraceNode(models.Model): NODE_TYPES = ( ("produce", "生产"), ("process", "加工"), ("storage", "仓储"), ("transport", "运输"), ("sale", "销售"), ) batch = models.ForeignKey("Batch", on_delete=models.CASCADE, verbose_name="所属批次") node_type = models.CharField(max_length=20, choices=NODE_TYPES, verbose_name="环节类型") operator = models.CharField(max_length=50, verbose_name="操作人") time = models.DateTimeField(auto_now_add=True, verbose_name="操作时间") location = models.CharField(max_length=200, verbose_name="操作地点") detail = models.TextField(verbose_name="详细信息") class Meta: db_table = "trace_node" def __str__(self): return f"{self.batch} - {self.get_node_type_display()}"5. 核心功能实现
5.1 用户认证与权限控制
系统基于 Django 内置的认证体系进行扩展,通过自定义用户模型和装饰器实现角色权限控制。管理员可以管理全部数据,企业用户只能维护本企业的产品和批次,监管用户拥有查询和预警处理权限。
from django.contrib.auth.decorators import login_required from django.shortcuts import render @login_required def batch_list(request): """批次列表:企业用户仅查看本企业数据""" if request.user.role == "enterprise": batches = Batch.objects.filter(company=request.user.company) else: batches = Batch.objects.all() return render(request, "trace/batch_list.html", {"batches": batches})5.2 溯源信息录入
溯源信息录入是系统的核心环节。每个批次从生产开始,依次经过加工、仓储、运输和销售等节点,每个节点由操作人员录入关键信息,形成完整的溯源链条。
def add_trace_node(request, batch_id): batch = get_object_or_404(Batch, id=batch_id) if request.method == "POST": form = TraceNodeForm(request.POST) if form.is_valid(): node = form.save(commit=False) node.batch = batch node.save() return redirect("trace_detail", batch_id=batch.id) else: form = TraceNodeForm() return render(request, "trace/add_node.html", {"form": form, "batch": batch})5.3 追溯查询
消费者或监管人员输入溯源码后,系统按时间顺序展示该批次从生产到销售的全部节点信息,并以时间线的形式直观呈现。
def trace_query(request): code = request.GET.get("code", "") if code: try: batch = Batch.objects.get(batch_no=code) nodes = batch.tracenode_set.order_by("time") return render(request, "trace/trace_result.html", {"batch": batch, "nodes": nodes}) except Batch.DoesNotExist: return render(request, "trace/trace_result.html", {"error": "未查询到该溯源码对应的批次"}) return render(request, "trace/trace_query.html")5.4 异常预警与召回
系统对录入的溯源数据进行自动校验,当检测到批次超过保质期、运输温度异常或检测指标不合格等情况时,自动生成预警记录并通知相关责任人,支持一键发起召回流程。
def check_batch_warning(batch): """检查批次是否存在异常,生成预警""" from datetime import date from django.utils import timezone warnings = [] if batch.produce_date and batch.product.shelf_life: expire_date = batch.produce_date + timedelta(days=batch.product.shelf_life) if expire_date < date.today(): warnings.append("该批次已超过保质期") # 其他校验逻辑省略 for content in warnings: Warning.objects.create(batch=batch, level="high", content=content) return warnings6. 系统测试
6.1 测试环境
测试在本地开发环境完成,操作系统为 Windows 10,Python 版本 3.9,Django 版本 3.2,数据库使用 SQLite。测试覆盖用户登录、产品管理、溯源录入、追溯查询和预警处理等核心功能模块。
6.2 测试用例示例
| 编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|
| TC-01 | 用户登录 | 输入正确用户名和密码 | 登录成功并跳转首页 | 通过 |
| TC-02 | 权限控制 | 企业用户访问监管接口 | 提示无权限 | 通过 |
| TC-03 | 溯源录入 | 为批次添加运输节点 | 节点保存成功并展示 | 通过 |
| TC-04 | 追溯查询 | 输入有效溯源码 | 展示完整溯源链路 | 通过 |
| TC-05 | 过期预警 | 录入已过期批次 | 自动生成预警记录 | 通过 |
7. 总结与展望
本文设计并实现了一个基于 Python 和 Django 的食品安全追溯系统,覆盖了用户管理、产品管理、溯源信息录入、追溯查询、异常预警和召回管理等核心功能。系统采用模块化设计,结构清晰,易于扩展,能够满足中小型食品企业和监管部门的基本追溯需求。
在后续的迭代中,可以从以下几个方面继续优化:一是引入区块链技术,增强溯源数据的不可篡改性;二是对接物联网设备,实现温湿度等环境数据的自动采集;三是完善数据分析能力,为监管部门提供更智能的风险预测和决策支持。