尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python+Vue3农业管理系统开发实战

Python+Vue3农业管理系统开发实战 1. 项目概述Python农场投入品农产品商城发票运营管理系统Vue3是一个面向现代农业企业的综合性管理平台。系统采用前后端分离架构后端使用Python开发业务逻辑和数据处理层前端采用Vue3框架构建用户界面主要服务于农业生产资料(投入品)的采购、销售、库存管理以及发票开具等核心业务流程。这个系统特别适合中小型农业企业或农业合作社使用能够有效解决传统农业经营中常见的几个痛点农资采购和销售记录混乱库存管理不精准导致浪费发票开具效率低下经营数据分析困难2. 系统架构设计2.1 技术栈选型后端技术栈语言Python 3.8Web框架Django REST Framework数据库PostgreSQL缓存Redis异步任务Celery报表生成ReportLab选择PythonDjango的组合主要基于以下考虑Django自带强大的ORM能快速构建数据模型DRF框架提供了完善的REST API支持Python生态中有丰富的农业相关数据处理库开发效率高适合快速迭代前端技术栈框架Vue 3 Composition APIUI组件库Element Plus图表库ECharts状态管理Pinia路由Vue RouterVue3的选择理由更小的打包体积适合网络条件较差的农村地区Composition API使代码组织更清晰更好的TypeScript支持性能优化明显响应速度更快2.2 系统模块划分系统主要分为以下核心模块用户认证与权限管理多角色权限控制(管理员、采购员、销售员、财务等)JWT身份验证操作日志记录产品管理农产品分类管理农资产品信息维护批次管理(生产日期、保质期等)采购管理供应商管理采购订单创建与审批采购入库处理销售管理客户信息管理销售订单处理价格策略管理库存管理实时库存监控库存预警库存调拨发票管理发票开具发票冲红发票统计报表分析销售统计分析库存周转分析利润分析3. 核心功能实现3.1 农产品批次管理农产品与普通商品最大的区别在于需要严格的批次管理。我们设计了以下数据模型class AgriculturalProduct(models.Model): name models.CharField(max_length100) category models.ForeignKey(Category, on_deletemodels.PROTECT) specification models.CharField(max_length50) unit models.CharField(max_length10) purchase_price models.DecimalField(max_digits10, decimal_places2) selling_price models.DecimalField(max_digits10, decimal_places2) minimum_stock models.IntegerField(default0) is_active models.BooleanField(defaultTrue) class ProductBatch(models.Model): product models.ForeignKey(AgriculturalProduct, on_deletemodels.CASCADE) batch_number models.CharField(max_length50) production_date models.DateField() expiry_date models.DateField() initial_quantity models.IntegerField() remaining_quantity models.IntegerField() storage_condition models.CharField(max_length50) quality_status models.CharField(max_length20, choicesQUALITY_CHOICES)关键实现要点每个产品可以有多个批次系统会自动计算剩余数量临近保质期会自动预警支持按批次查询库存3.2 智能采购建议基于历史销售数据和当前库存情况系统可以提供智能采购建议def generate_purchase_recommendation(): # 获取所有活跃产品 products AgriculturalProduct.objects.filter(is_activeTrue) recommendations [] for product in products: # 计算过去30天平均销量 avg_sales calculate_average_sales(product.id, days30) # 获取当前库存总量(所有批次之和) current_stock ProductBatch.objects.filter( productproduct ).aggregate(Sum(remaining_quantity))[remaining_quantity__sum] or 0 # 计算安全库存(7天销量) safety_stock avg_sales * 7 # 如果当前库存低于安全库存生成采购建议 if current_stock safety_stock: recommended_quantity safety_stock - current_stock recommendations.append({ product: product, recommended_quantity: recommended_quantity, current_stock: current_stock, safety_stock: safety_stock }) return recommendations3.3 发票管理实现发票管理是系统的核心功能之一我们实现了以下特性发票数据模型设计class Invoice(models.Model): INVOICE_TYPES ( (normal, 普通发票), (special, 增值税专用发票), (electronic, 电子发票) ) invoice_number models.CharField(max_length50, uniqueTrue) invoice_type models.CharField(max_length20, choicesINVOICE_TYPES) order models.ForeignKey(Order, on_deletemodels.PROTECT) customer models.ForeignKey(Customer, on_deletemodels.PROTECT) issue_date models.DateField(auto_now_addTrue) amount models.DecimalField(max_digits12, decimal_places2) tax_amount models.DecimalField(max_digits12, decimal_places2) total_amount models.DecimalField(max_digits12, decimal_places2) status models.CharField(max_length20, defaultissued) created_by models.ForeignKey(User, on_deletemodels.PROTECT) created_at models.DateTimeField(auto_now_addTrue)发票PDF生成使用ReportLab库生成符合税务要求的发票PDFfrom reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas def generate_invoice_pdf(invoice): buffer BytesIO() p canvas.Canvas(buffer, pagesizeA4) # 设置字体 p.setFont(Helvetica-Bold, 16) # 绘制发票标题 p.drawString(100, 800, f{invoice.get_invoice_type_display()}) # 绘制发票基本信息 p.setFont(Helvetica, 12) p.drawString(100, 770, f发票号码: {invoice.invoice_number}) p.drawString(300, 770, f开票日期: {invoice.issue_date.strftime(%Y-%m-%d)}) # 绘制客户信息 p.drawString(100, 740, f客户名称: {invoice.customer.name}) p.drawString(100, 720, f纳税人识别号: {invoice.customer.tax_id or 无}) # 绘制商品明细表格 y_position 680 p.line(100, y_position, 500, y_position) # 表头 p.drawString(100, y_position-20, 商品名称) p.drawString(200, y_position-20, 规格) p.drawString(300, y_position-20, 数量) p.drawString(400, y_position-20, 金额) # 表格内容 for item in invoice.order.items.all(): y_position - 20 p.drawString(100, y_position, item.product.name) p.drawString(200, y_position, item.product.specification) p.drawString(300, y_position, str(item.quantity)) p.drawString(400, y_position, str(item.total_price)) # 绘制合计金额 y_position - 40 p.drawString(350, y_position, f合计金额: ¥{invoice.total_amount}) p.showPage() p.save() buffer.seek(0) return buffer4. 前端关键实现4.1 Vue3组合式API应用使用Vue3的组合式API组织代码提高可维护性// 产品列表组件 script setup import { ref, onMounted } from vue import { useProductStore } from /stores/product const productStore useProductStore() const products ref([]) const loading ref(false) const searchQuery ref() const fetchProducts async () { loading.value true try { await productStore.fetchProducts({ search: searchQuery.value }) products.value productStore.products } finally { loading.value false } } onMounted(() { fetchProducts() }) /script4.2 实时库存看板使用ECharts实现可视化的库存看板const initStockChart () { const chartDom document.getElementById(stock-chart) const myChart echarts.init(chartDom) const option { title: { text: 库存状况, left: center }, tooltip: { trigger: item }, legend: { orient: vertical, left: left }, series: [ { name: 库存占比, type: pie, radius: 50%, data: [ { value: 35, name: 种子 }, { value: 25, name: 肥料 }, { value: 20, name: 农药 }, { value: 10, name: 工具 }, { value: 10, name: 其他 } ], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.5) } } } ] } myChart.setOption(option) window.addEventListener(resize, myChart.resize) }5. 系统部署方案5.1 后端部署推荐使用Docker容器化部署# Dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV PYTHONUNBUFFERED1 ENV DJANGO_SETTINGS_MODULEcore.settings.production RUN python manage.py collectstatic --noinput CMD [gunicorn, --bind, 0.0.0.0:8000, core.wsgi:application]使用docker-compose编排服务version: 3.8 services: web: build: . ports: - 8000:8000 env_file: - .env depends_on: - redis - db db: image: postgres:13 volumes: - postgres_data:/var/lib/postgresql/data/ env_file: - .env redis: image: redis:6 ports: - 6379:6379 celery: build: . command: celery -A core worker -l INFO env_file: - .env depends_on: - redis - db volumes: postgres_data:5.2 前端部署使用Nginx部署静态资源server { listen 80; server_name yourdomain.com; location / { root /var/www/html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /static/ { alias /var/www/static/; } }6. 实际应用中的经验分享6.1 农产品批次管理的注意事项保质期计算不同农产品的保质期计算方式不同有些按天计算有些按月计算需要在系统中灵活配置。库存扣减策略建议采用FIFO(先进先出)策略自动优先出库较早批次的产品。批次合并同一生产日期的相同产品如果存储条件相同可以考虑批次合并减少管理复杂度。6.2 发票管理的常见问题发票冲红流程系统需要严格记录冲红原因和审批流程确保符合税务要求。发票号码连续性系统应自动检查发票号码的连续性防止跳号或重复。发票作废处理作废发票必须保留完整记录不能物理删除。6.3 性能优化建议库存查询优化对频繁访问的库存数据添加Redis缓存设置合理的过期时间。报表预生成将复杂的统计报表设置为定时任务在非高峰时段预生成。前端懒加载对大型数据表格实现分页和虚拟滚动提高页面响应速度。7. 系统扩展方向移动端适配开发微信小程序或APP版本方便田间地头操作。物联网集成接入温湿度传感器等IoT设备实现仓储环境监控。供应链金融对接银行系统提供基于真实交易数据的融资服务。区块链溯源利用区块链技术实现农产品全生命周期追溯。这个系统在实际农业生产经营中已经证明了其价值通过数字化管理显著提高了运营效率减少了人为错误为农业企业提供了可靠的数据支持。随着功能的不断完善它将成为现代农业经营管理的重要工具。
返回列表