简介:这是一套面向高校计算机专业学生与Java/Vue全栈初学者的毕业设计级实战项目,聚焦农业数字化场景,实现番茄种植水肥一体化管理的前后端分离系统。资源适用于课程设计、工程实训及初期项目立项,帮助学习者掌握Spring Boot后端开发、Vue.js前端构建及MySQL数据建模等核心技能。压缩包共676个文件,含150个Java后端业务逻辑文件、103个Vue组件与页面、70个JS交互脚本、57张JPG操作图示及52张PNG图标资源,辅以SQL建表语句、YML配置、BAT一键部署脚本(build.bat/run.bat/install.bat)及Eclipse/IDEA兼容的工程配置文件,整体大小34.31MB。已有86人下载学习,项目经完整调试可直接运行,结构清晰、模块解耦,包含用户管理、设备监控、灌溉策略配置、施肥记录查询等典型业务模块,具备良好二次开发基础与教学示范价值。
1. 番茄种植的浇水施肥,为什么需要一套管理系统
做农业信息化这几年,我跑过不少番茄种植基地,从几亩的日光温室到上百亩的连栋大棚都有。大家问得最多的问题出奇一致:水肥到底怎么管才能又省人工又提产量?
传统做法大家心里都有数。技术员凭经验定个大致方案,工人拿着水管子逐棚浇,施肥全看老把式的手感,今天多明天少,没人能说清楚这一茬到底用了多少水、多少肥。遇到连阴天、温度骤变,水肥调控更是全靠感觉,番茄裂果、脐腐病、徒长这些问题,十有六七都出在水肥管理不合理上。
水肥一体化这个概念提了很多年,核心就一句话:把灌溉和施肥拧成一股绳,按需供给、精准控制。但真落到系统层面,很多种植基地还是靠手动开关阀门、人工配肥,所谓“一体化”名不副实。真正要跑起来,至少需要三块东西同时到位:一是能按作物生长周期设定水肥方案的业务逻辑,二是能控制电磁阀、水泵、施肥机的硬件执行层,三是能实时监控、随时调整的软件管理平台。
这里说的番茄种植水肥一体化管理系统,正是基于SpringBoot和Vue搭建的软件管理平台。后端用SpringBoot负责业务逻辑、数据处理和设备控制指令下发,前端用Vue做可视化操作界面,管理人员在手机上或电脑上就能看到土壤墒情、空气温湿度、EC值、pH值这些关键数据,远程启动灌溉、调整施肥配方,整个过程有记录、可追溯、能分析。对于想要从“靠经验”转向“靠数据”的种植基地来说,这套系统解决的就是从方案制定到执行落地的全流程管理问题。
这篇博文我会从系统设计的角度完整拆解这个项目:为什么这么选型、数据库怎么设计、水肥配方逻辑怎么落地、前端监控大屏怎么做、部署联调时踩过哪些坑。不管是准备做农业物联网相关毕业设计的学生,还是想在基地里落地智慧灌溉的技术人员,这篇内容应该都能给你一些可以直接参考的东西。
2. 先用业务视角拆需求:番茄种植到底需要管理哪些东西
2.1 番茄不同生长阶段的水肥需求差异
很多人一上来就谈技术选型、写代码,结果做出来的系统看着功能齐全,种番茄的技术员却用不顺手。核心原因就是没有先把业务吃透。
番茄的生长周期可以分成苗期、开花坐果期、果实膨大期和采收期四个阶段,每个阶段对水分和养分的需求差异非常大。苗期要控水控氮防止徒长,开花坐果期要保证磷钾供应促进花芽分化,膨果期对钾肥的需求达到峰值,同时要保持土壤水分相对稳定,水分忽大忽小极易导致裂果。这些农艺知识不是拍脑袋想的,而是系统设计水肥配方的底层依据。
2.2 系统需要覆盖的六大核心业务模块
搞清楚业务需求之后,整个系统要管的事情也就清晰了,大致可以拆成六个模块:
- 种植基地与地块管理:管理多个大棚或地块的基础信息、面积、种植品种、定植日期,这是所有数据归属的基础。
- 设备管理:管理电磁阀、水泵、施肥机、传感器等硬件设备,记录设备状态、在线情况、开关记录。
- 环境监测:实时采集空气温湿度、土壤水分、土壤温度、EC值、pH值等数据,并支持历史数据查询和曲线展示。
- 水肥计划管理:按番茄生长阶段配置灌溉策略和施肥配方,设定执行时间、时长、EC/pH目标值,这是整个系统的业务核心。
- 执行控制:手动或自动执行灌溉施肥任务,控制水泵、电磁阀、施肥泵的启停,并记录执行日志。
- 数据统计分析:统计用水量、用肥量、执行次数,生成产量与投入产出分析报表。
2.3 从“能用”到“好用”的隐性需求
除了上面这些明面上的功能模块,真正让系统在基地里能长期用下去,还有几个隐性需求容易被忽略:
- 权限要分角色:基地老板看总览报表,技术员配水肥方案,操作工人只管执行和报警处理,不同角色看到的界面和能操作的功能应该不一样。
- 操作要能追溯:谁在什么时间改了什么配方、执行了什么灌溉任务,都要有日志记录,出了问题能倒查。
- 异常要能报警:土壤水分过低、EC值异常偏高、设备离线,这些情况要第一时间推送给相关人员,不能等作物出问题了才发现。
- 网络不通时要能兜底:基地网络环境不比写字楼,系统要支持离线缓存和断网重连机制,不能让网络抖动导致灌溉任务中断。
把这些需求和农艺逻辑梳理清楚,再回头去做技术方案,整个系统的骨架就非常明确了。SpringBoot负责把上面这些业务流程串起来,Vue负责把这些数据变成人能看懂、能操作的界面,两者通过RESTful API通信,这也是目前农业管理系统最主流的技术组合。
3. 技术选型不是越新越好:SpringBoot + Vue这套组合的底气在哪里
3.1 前后端分离架构为什么适合农业管理系统
农业管理系统有个特点:使用场景分散、网络环境复杂、需求变化频繁。基地管理人员可能在办公室用大屏看数据,也可能在大棚里用手机临时启动一次灌溉。这时候前后端分离架构的优势就很明显了——后端只负责提供稳定的API服务,前端不管是Web页面、平板还是以后要做的微信小程序,都可以复用同一套接口,不需要为每个终端单独开发后端逻辑。
而且前后端分离之后,前后端团队可以并行开发。后端按业务模块出接口文档,前端同时按页面原型开发界面,最后联调对接。对于这种工期紧、需求方自己都不完全清楚要什么的项目来说,这种灵活性非常重要。
3.2 后端为什么选SpringBoot
SpringBoot在Java系项目里基本是事实标准了,选它的理由很实在:
- 起步快:内嵌Tomcat、自动配置、starter机制,不用像传统SSM那样折腾一堆XML配置。一个基础的CRUD后端,从建项目到接口跑通,熟练的话半小时内搞定。
- 生态成熟:MyBatis-Plus操作数据库、Spring Security做权限控制、Quartz做定时任务、WebSocket推实时数据,这些在SpringBoot里都有非常成熟的整合方案,社区资料多,踩坑也少。
- 适合业务复杂的系统:水肥管理涉及配方、计划、执行、告警、统计等多种业务逻辑,Java的强类型特性和工程化能力让代码结构更清晰、更易维护,后期人员交接也更容易。
- 招人容易:这个现实因素也得考虑,Java/SpringBoot的开发者供给量最大,后续维护和二次开发不用担心找不到人。
3.3 前端为什么选Vue
前端框架里Vue和React各有拥趸,对于这类管理系统,我更倾向于Vue,原因也很直接:
- 上手门槛低:Vue的模板语法非常接近HTML,农业信息化团队的开发者很多不是科班前端出身,Vue的学习曲线比React平缓很多。
- Element Plus组件库成熟:管理系统的页面翻来覆去就是表格、表单、弹窗、树形控件、日期选择器这些,Element Plus把这些都封装好了,开发效率非常高。
- 生态足够用:Vue Router管路由、Pinia管状态、ECharts做图表、Axios发请求,这套组合拳足够覆盖农业管理系统的所有前端需求。
- 可视化大屏有现成方案:番茄种植管理一大亮点是数据可视化,Vue搭配ECharts做监控大屏的方案非常成熟,网上有大量现成的图表组件可以直接借鉴。
3.4 数据库和中间件选型
数据库这块,MySQL依然是中小型管理系统最稳妥的选择。水肥管理系统每天产生的环境监测数据量不小,但单机MySQL配合合理的数据分区和定期归档,跑几年都没有问题。如果要进一步优化,可以把历史数据迁移到ClickHouse这类列式数据库做分析,但初期不用搞这么重。
物联网设备接入这块需要单独考虑。传感器数据上传、控制指令下发,如果用HTTP轮询,实时性差且对设备端不友好。更标准的做法是引入MQTT协议,用EMQX这类轻量级消息中间件做设备接入层,SpringBoot通过MQTT客户端订阅传感器主题、发布控制指令,系统架构会更合理,扩展性和稳定性都有保障。不过对于简化版的课程设计或小型基地项目,用HTTP接口模拟设备数据也能跑通,主要是看项目定位和预算。
4. 后端SpringBoot核心设计:数据库建模与接口规划
4.1 数据库核心表结构设计
数据库设计是系统的基础,水肥管理系统的表结构可以按“基础信息、设备感知、业务执行、数据积累”四个层面来设计。
基础信息层有四张核心表:用户表(sys_user)存储账号、密码(BCrypt加密)、角色、所属基地;角色表(sys_role)和菜单权限表(sys_menu)支撑基于RBAC的权限管理;基地地块表(base_plot)则记录地块名称、面积、种植品种、定植日期等,所有业务数据都通过plot_id关联到具体地块。
设备感知层包括设备表(iot_device)和传感器数据表(iot_sensor_data)。设备表记录设备编号、类型(电磁阀/水泵/施肥机/传感器)、安装位置、在线状态;传感器数据表专门存土壤湿度、土壤温度、空气温湿度、EC值、pH值等监测数据,数据量会快速增长,建议按天分区,并建立(device_id, create_time)联合索引。
业务执行层是系统最核心的部分,包括水肥配方表(fert_formula)、灌溉计划表(irrig_plan)、执行记录表(irrig_log)和报警记录表(alert_record)。水肥配方表设计时要注意把配方内容和执行参数分开——配方内容指氮磷钾比例、EC值、pH值这些农艺参数,执行参数指灌溉时长、施肥量、执行时间,两部分分开存储,后续调整互不影响。
数据积累层主要是产量记录表(harvest_record)和统计分析表(stat_daily_summary),用于记录每次采收的产量、当月水肥投入,为后续生成投入产出分析报表提供基础数据。
4.2 接口设计遵循RESTful规范,按业务模块划分
接口设计不需要花哨,遵循RESTful规范、按业务模块清晰划分就够了。核心接口大致包括:
- 认证模块:POST /api/auth/login(登录获取JWT Token)、GET /api/auth/info(获取当前用户信息和权限)
- 地块管理:GET /api/plots(地块列表)、POST /api/plots(新增地块)、PUT /api/plots/{id}(修改地块)
- 设备管理:GET /api/devices、POST /api/devices/{id}/control(下发控制指令)、GET /api/devices/{id}/status(获取设备状态)
- 环境监测:GET /api/monitor/current(获取实时环境数据)、GET /api/monitor/history(查询历史数据曲线)
- 水肥计划:GET /api/formulas(配方列表)、POST /api/formulas(新增配方)、POST /api/plans(创建灌溉计划)、PUT /api/plans/{id}/toggle(启停计划)
- 统计分析:GET /api/stats/water-usage(用水量统计)、GET /api/stats/fertilizer-usage(用肥量统计)、GET /api/stats/yield(产量统计)
接口返回结果建议统一封装,定义一个Result类,包含code、message、data三个字段。有人喜欢用RESTful风格把code也放在HTTP状态码里,但实际使用中发现,无论正常返回还是业务异常都返回200,然后用业务code区分,前端处理起来会更省事,Axios拦截器解析更统一。
4.3 关键技术实现:定时任务、WebSocket实时推送与阈值告警
环境监测数据要做到主动推送,让前端页面实时刷新而不用用户手动刷新,这个功能用的方案是WebSocket。前端建立连接后,后端每5秒从传感器数据表读取最新数据,推送到前端页面更新显示。这个方案虽然简单,但支撑几十个地块的实时监控完全够用。
阈值告警逻辑是另一个关键点。系统预设土壤湿度上下限、EC值安全范围等参数,对每一条新增的传感器数据进行判断。比如番茄膨果期土壤湿度低于25%或高于70%都触发告警。告警信息通过WebSocket实时推送给在线用户,同时写入数据库。对于更重要的告警,可以接入短信或微信公众号模板消息,进一步触达相关责任人。这里不建议把所有逻辑都放在设备端做判断,云端统一配置、统一判定,才能保证规则调整的灵活性。
5. 水肥配方的业务核心:EC值、pH值与生长周期模型
5.1 看懂EC值和pH值这两个关键指标
理解水肥系统的核心逻辑,绕不开两个指标:EC值和pH值。
EC值(电导率)反映营养液中可溶性盐离子的总浓度,通俗讲就是“肥水浓度”。EC值太低说明养分不足,番茄容易营养不良、长势弱、果实小;太高说明肥料过量,会烧根、抑制水分吸收,叶片边缘焦枯。不同生长阶段番茄对EC值的需求不同,苗期大约在1.2-1.5 mS/cm左右,开花坐果期可以到1.8-2.2,膨果期是需肥高峰期,EC值可以提到2.2-2.8。
pH值就是酸碱度,影响根系对养分的吸收效率。大多数养分在pH 5.5-6.5之间溶解度最高,这个范围是番茄根系吸收养分的“最佳窗口期”。pH值如果偏碱,铁、锰、锌这些微量元素容易被固定,植物吸收不到,叶子发黄;偏酸则影响钙、镁的吸收,容易诱发脐腐病。
5.2 配方模型如何落到数据库和代码里
理解了EC值和pH值,配方的数据结构就很清晰了。设计思路是:配方主表存作物的生长阶段、目标EC值、目标pH值、灌溉时长等核心参数,配方详情表存具体的肥料配比,包括氮磷钾比例、微量元素添加量、每次施肥量等。
实际施肥的时候,系统怎么保证EC值稳定在目标范围?核心思路是比例施肥法。先配置好母液A(主要含硝酸钙)和母液B(主要含磷酸盐、硫酸盐等),施肥时通过注肥泵按固定比例把母液注入灌溉管道,再通过EC/pH传感器实时监测混合后的肥液浓度,形成闭环反馈。EC值偏低就加大注肥比例,pH值偏高就注入酸液调整。这种动态调节逻辑在系统里用定时任务执行,每30秒检查一次监测数据,如果不达标就调整注肥泵的比例参数。
当然,农业现场情况复杂,不同基地的肥料类型、水源条件差异很大。系统的配方参数要支持灵活配置,而不是写死在代码里。这样技术员可以根据自己基地的实际情况调整配方参数,系统才有实用价值。
5.3 生长周期模型驱动自动执行
配方的核心不只是EC/pH参数,更重要的是必须绑定生长周期。系统按照番茄生长阶段建立了四个基础配方模板:苗期、开花坐果期、果实膨大期、采收期。每个模板都附着对应的EC/pH区间、灌溉频率、单次灌溉时长。
假设某地块定植日期是3月10日,系统根据番茄从定植到各生长阶段的平均时长自动估算,比如定植后25天进入开花坐果期、55天进入膨果期,到了对应日期自动切换配方。支持按品种和季节微调是必要的,不同番茄品种的生长周期有差异,春天和秋天的温差也会影响生长速度,所以除了自动估算,还要允许技术员手动调整生长阶段切换的日期。
这套设计本质上就是在系统里建立了一个可配置的作物生长模型,把农艺专家的经验固化成规则。管理番茄的技术员不需要懂代码,只需要在界面上选选品种、填填定植日期、微调一下阶段切换时间,系统就能自动匹配一套相对合理的水肥执行方案。
6. 前端Vue可视化:从监控大屏到日常操作台
6.1 项目结构与开发环境搭建
前端部分我采用的方案是Vue 3 + Vite + Pinia + Vue Router + Element Plus + ECharts。开发环境搭建有几个点需要特别注意,都是实际踩过的坑:
- Node.js版本要注意,Vite 4以上建议用Node 16.18+或18+,版本太老会直接报错。
- npm install的时候容易卡住,建议提前配置淘宝镜像,速度能快好几倍。
- 建议用pnpm代替npm,安装速度快、磁盘占用小,团队协作时依赖版本更统一。
- 代码规范建议在项目初始化时就配上ESLint + Prettier,等代码量大了再补会很痛苦。
6.2 路由与权限设计
前端路由设计配合后端动态权限,实现“不同角色看到不同菜单”的效果。路由分成两部分:静态路由(登录页、404页等)所有人可见,动态路由根据后端返回的菜单权限,用router.addRoute动态添加。
页面结构上按功能模块划分,大屏监控页面是展示的核心,用大号图表轮播展示各地块实时环境数据,2分钟无操作自动切换页面,适合挂在基地办公室的电视屏幕上。日常操作台集成了设备控制、计划配置等高频操作,支持移动端访问,技术员在棚里也能临时操作。
6.3 设备控制核心:实时状态刷新与指令下发
设备控制涉及两个关键问题:实时状态刷新和指令下发。状态刷新用轮询,每3秒请求一次设备状态接口,比WebSocket方案简单稳定且不容易断连。指令下发采用“先下发、后确认”模式:先调控制接口,后端返回指令发起成功,然后前端继续轮询设备状态,确认设备状态发生改变才算执行成功,这样避免用户点了按钮却不知道到底执行了没有。
6.4 环境可视化与视频监控接入
ECharts在可视化这里发挥了主要作用。土壤湿度用一个面积折线图展示24小时变化趋势,空气温湿度用双Y轴图表(左侧温度,右侧湿度),EC值和pH值做成仪表盘,直观看到当前值是否在健康区间。大屏整体配色建议用深色底、亮色图表,在农业现场强光环境和长期显示场景下体验更友好。
视频监控是另一个实用功能。现在大棚里装摄像头的越来越多,前端播放视频流的技术方案也比较成熟。海康、大华这些厂商摄像头输出的RTSP流,浏览器不能直接播放,需要先在服务器端转成HLS流(m3u8格式),前端用video.js或hls.js来播放。Vue项目里推荐用hls.js,轻量且兼容性更好。这个功能对日常管理很有用,管理员可以在办公室直接看到大棚里的实际情况,和传感器数据相互印证。
6.5 高频组件封装提高开发效率
页面开发过程中有些组件使用频率特别高,建议封装成公共组件。设备状态灯可以显示在多个页面,封装成独立组件后任何地方直接复用;地块选择器在报表、计划、监控等多个页面都要用,封装成下拉树组件;图表卡片统一封装容器组件,管理标题、加载状态、刷新按钮的公共逻辑。这些组件看起来琐碎,但在实际开发中能节省大量时间,页面风格也更统一。
7. 从开发到部署:前后端联调与现场实施的真实情况
7.1 本地联调的五个高频问题
前后端联调是问题暴露最集中的阶段,遇到最多的五个问题基本一致:
- 跨域问题。前端页面在localhost:5173,后端接口在localhost:8080,浏览器拦截跨域请求。解决方案是在后端配置CORS允许跨域,开发环境也可以配置Vite代理转发,推荐两种方案同时明确做。
- 接口字段命名不一致。Java后端习惯用驼峰命名(plotName),前端JavaScript习惯用小驼峰但容易写错(plotname或plot_name)。解决方式是要求后端接口文档严格遵循驼峰规范,前端统一用axios拦截器处理,不各自为政。
- 时间格式不一致。Java后端返回的时间格式是“2024-05-20 14:30:00”,前端显示时可能变成“2024/05/20 14:30:00”或带时区偏移。统一在后端配置全局时间格式化,解决格式不一致问题。
- Long类型精度丢失。数据库自增主键是Long类型,Java序列化成JSON时,超过JavaScript安全整数范围的数值在浏览器端会丢失精度。解决方案是让ID字段序列化时转成字符串。这个问题很多人一开始根本意识不到,等到数据量大了、ID位数变长才暴露。
- 本地联调数据库不通。这个问题最常见也最不起眼,项目里数据库配置从一台电脑复制到另一台电脑时,账号密码没改、IP地址不对、时区设置不对,SpringBoot启动就会报错。
7.2 服务器部署流程
正式上线部署,我习惯用宝塔面板加Docker的混合方案。后端用Docker部署SpringBoot应用,Dockerfile基于openjdk:8或17镜像,然后把后端jar包和MySQL配置好。前端用Nginx部署,把dist目录放到Nginx指定目录,再配置反向代理,把前端的/api请求转发到后端服务的8080端口,同时配置Gzip压缩和缓存策略,让页面打开速度更快。HTTPS证书建议部署后尽快配置,现在浏览器对HTTP的限制越来越多,且农业数据传输也需要加密保护。
7.3 现场实施的几个重要经验
如果这套系统要在真实基地落地,有几个现场经验是纯开发环境里学不到的:
- 网络要提前勘察。大棚里的4G/5G信号覆盖往往不理想,温室大棚的钢结构还会屏蔽信号。要提前确定网络方案,选择工业级4G路由器加天线,或者拉光纤进棚。
- 设备控制柜要注意防水防尘。大棚浇灌环境湿度非常大,变频柜级别以上的防护一定要做到位。控制柜内部要装漏电保护和防雷模块,这些安全配置不能省。
- 传感器采集位置要合理布置。土壤湿度传感器不要埋在滴头正下方,那是水分最集中的点,不代表整个根区的平均值。建议埋在滴头旁边10-15厘米处、根系分布最集中的区域。
- 数据异常要设置有效性校验。传感器探头接触不良、泡水损坏,数据会出现长时间不变或跳变到离谱值,系统要做数据有效性校验,异常数据标记或者直接丢弃,避免影响自动控制逻辑。
7.4 自动化控制不能盲目迷信:手动兜底必须保留
最后必须说清楚一件事:任何自动化系统都替代不了现场巡检,自动化控制必须保留手动兜底能力。系统里所有自动控制功能都搭配了一个手动模式,当大棚里正在作业、设备检修、或者极端天气需要特殊处理时,直接切换到手动控制。我在系统里也留了“一键停用自动控制”的入口,点击后自动灌溉全部暂停并推送通知给所有管理员。农业场景存在太多不确定性,系统做得再智能也毕竟是辅助工具,现场人员的判断永远要放在第一位。
8. 运行数据说话:系统上线后的实际效果与后续扩展方向
8.1 实际应用数据参考
这套系统的实际应用效果可以参考一些公开的行业数据。水肥一体化技术应用成熟的基地,节水节肥效果通常能达到30%以上,番茄产量提升10%-20%,同时能有效降低裂果率和脐腐病发生率。当然,具体效果受种植品种、气候条件、原有管理水平等多种因素影响。这套系统的真正价值在于,把原本靠经验的操作变成大家都能执行的标准流程,把每次决策的数据完整记录下来,可以复盘、可以追溯、可以不断优化。
8.2 低成本方案:先跑起来再迭代
如果是课程设计或小型基地预算有限,可以考虑做减配版本:Vue前端只做一个监控大屏加基础操作台,后端用SpringBoot实现核心模块,传感器数据先用模拟接口生成,在跑通业务流程后再接入真实硬件。这样项目周期可以压缩到两周左右,核心的框架搭建和数据流转逻辑都具备,后续要扩展设备接入和精细化控制也方便。
8.3 后续扩展的三个方向
系统上线运行后,可以考虑在三个方向持续演进。第一个方向是接入更多设备类型,包括气象站、虫情测报灯、智能摄像头,形成更全面的环境感知网络。第二个方向是引入作物生长模型和产量预测算法,基于积累的环境数据、水肥执行数据和产量数据,用机器学习方法找出最适合特定地块的水肥策略。第三个方向是开发小程序端,让基地老板在微信里就能收到报警通知、查看经营报表,不用专门装App,推广成本更低。
我个人的经验是,这类系统不要追求一步到位,先把最核心的“按计划灌溉施肥”和“实时监控告警”跑稳,让用的人真正觉得省事了,后续扩展自然就有需求牵引,做出来的功能才会被真正用起来,而不是变成摆设。
本文还有配套的精品资源,点击获取