资讯详情

SpringBoot+Vue智能农田管理系统开发实战:从架构设计到部署答辩

📅 2026/10/10 6:54:53 | 华诺云谱 👁 阅读
SpringBoot+Vue智能农田管理系统开发实战:从架构设计到部署答辩
作为一个被毕业设计折腾过两轮的人我拿到这种“基于springbootvue的XX管理系统”第一反应从来不是先写代码而是先想清楚这个题目怎么在有限时间里稳稳落地还能在答辩时讲出亮点。这次要拆的智能农田管理系统说是毕业设计其实把前后端分离、数据采集、定时任务、WebSocket推送、视频流播放、可视化大屏这些常见考点全包了一遍如果你正在找这类系统的完整思路或者已经建了空项目但不知道下一步怎么填内容这篇可以直接当你的“施工参考”。这套系统做出来之后能演示的完整链路大概是农田里的传感器定时上报温湿度、光照、土壤墒情后端接收后判断是否超过阈值超了就记录告警并推送消息提醒前端页面实时展示数据折线图和大屏看板管理员还能远程控制灌溉、风机等设备顺带把农田视频监控用m3u8流在网页里播出来。适合做毕业设计、课程设计也适合后端想补一补“SpringBoot Vue MySQL全栈”的练手。我尽量把版本选择、核心代码结构、数据库设计、常见坑都讲透照着搭一套能跑通的东西并不难。1. 整体设计思路与模块拆解1.1 智能农田管理系统的核心业务场景先别急着写登录注册想清楚“这套系统到底管什么”才是关键。智能农田管理拆开看其实就三件事监测、控制、分析。监测是指农田里的空气温湿度、土壤湿度、光照强度、土壤PH值、二氧化碳浓度等环境数据通过传感器采集后上报到系统控制是指系统根据环境数据远程操作灌溉阀门、风机、卷帘、补光灯等设备分析则是把积累的数据变成图表让农户能看出趋势比如这一周土壤湿度持续走低就说明需要加大灌溉频次。围绕这三件事系统的用户角色就不需要设计得太复杂。我建议只保留两类角色系统管理员和农技操作员。管理员管用户、设备档案、阈值参数农技员看数据、收告警、操作设备。角色多了权限模型、菜单动态配置、接口鉴权全都要跟着复杂毕业设计没必要自己给自己加码能讲清楚RBAC基于角色的访问控制的基本思路就够了。也就是说业务模块大致可以拆成五块用户登录与权限、农田与设备管理、环境数据采集、告警与联动控制、统计报表与可视化。后面所有代码、表结构、接口设计全部围绕这五块展开就不会出现“功能很多但串不起来”的问题。1.2 为什么选SpringBoot加Vue这对组合选型不是看哪个语言酷而是看哪个组合能让你快速拿到结果同时答辩时有话可说。SpringBoot加Vue前后端分离在毕业设计里是绝对的“主流配置”导师认可度高网上资料极其充足哪怕遇到问题也容易搜到解决方案。后端选SpringBoot的核心理由是自动配置让工程搭起来非常快一个空的Web工程只需要引入spring-boot-starter-web写一个Controller就能跑起来。再配合MyBatis-Plus操作数据库CRUD代码量能减少一大半这对时间紧张的毕设阶段特别友好。前端选Vue是因为组件化开发思路清晰配合Element Plus组件库表格、表单、弹窗、下拉菜单这些后台管理界面常用的东西都有现成组件不需要自己手写HTML和CSS调到怀疑人生。再加上Vite做开发服务器热更新速度快改完代码浏览器马上生效调试体验比老式jsp工程舒服太多。这里要提醒一句前后端分离不等于“两个项目随便放”它的逻辑是后端只提供JSON接口前端通过axios调用接口渲染页面两边通过约定的接口文档对接。所以你写代码时一定要先把接口路径和数据格式约定清楚比如统一返回结构为{code: 200, message: 成功, data: {...}}后面联调才不慌。1.3 数据库设计先画好表再写代码很多新手喜欢写一行代码建一张表结果改来改去把自己绕晕。我的习惯是先花半天把ER图实体关系图画清楚表结构定了代码写起来就是按部就班。智能农田系统的核心表我建议至少要包含这几张sys_user用户表存用户名、密码BCrypt加密、角色、手机号、创建时间。farm_land农田表记录地块名称、面积、地理位置、所属用户。sensor_device传感器设备表记录设备编号、设备名称、类型温度/湿度/光照等、安装地块、状态在线/离线。sensor_data传感器采集数据表这是数据量最大的一张表字段包括设备ID、数据类型、数值、采集时间。control_device控制设备表比如灌溉阀门、风机、卷帘记录设备名称、类型、状态、控制方式手动/自动。alarm_record告警记录表记录触发告警的设备、阈值类型、实际值、触发时间、处理状态。crop_log农事操作记录表记录施肥、打药、播种等农事活动便于后期追溯。设计数据表时最需要注意的是传感器数据表一定要给采集时间字段建索引因为后面查趋势图、查历史记录都是按时间范围过滤的。没有索引的话数据量上百条可能无所谓一旦积累了上万条数据查询会明显变慢答辩时导师问“数据量大了怎么优化”这正好是一个可以答上来的点。2. 开发环境准备与项目初始化2.1 版本选型SpringBoot和Vue的“性格”版本选型是这套系统里最容易踩坑的地方尤其是SpringBoot。现在网上教程很多直接给你SpringBoot 3.x但是3.x从javax包迁移到了jakarta包很多老教程的代码直接复制过来会报Cannot resolve symbol javax。作为毕业设计我强烈建议选SpringBoot 2.7.x系列搭配JDK 8或者JDK 11稳定、教程多、兼容性强。等以后真有必要再用3.x也不迟。前端方面Vue 2和Vue 3都能做但既然是从零开始我建议直接上Vue3加Element Plus。Vue3的组合式API写起来更简洁而且ECharts、hls.js这些库都在持续更新对Vue3支持更好。不过要注意Element Plus只支持Vue3如果你选了Vue2就得用Element UI两者组件的导入方式完全不同别弄混了。Node.js版本也不要随便装最新的Vite对Node版本有一定要求太老或太新都可能报错。我的建议是用Node 16.18.x或Node 18长期支持版配合npm 8以上Vite 4基本没问题。装Node的时候顺手把npm源设为国内镜像不然npm install卡在一个包上半天下不下来心态直接崩。2.2 数据库初始化与SpringBoot连接配置数据库用MySQL 5.7或8.0都可以。拿到题目的第一件事不是建表而是先把数据库实例建好字符集选utf8mb4排序规则选utf8mb4_general_ci。utf8mb4可以正常存表情符号和生僻字比老旧的utf8更稳。在SpringBoot的application.yml里数据库连接配置是长这样的server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/smart_farm?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 123456 redis: host: localhost port: 6379这里最容易被坑的是serverTimezone。如果你的MySQL和系统时区不一致不配置它可能会报The server time zone value йʱ is unrecognized这种乱码错误其实就是时区问题。直接指定Asia/Shanghai最省事。useSSLfalse也是必要的本地开发用不上SSL加密不关掉可能出现警告甚至握手失败。数据库表初始化我建议直接把建表SQL整理成一个init.sql文件课程设计文档里也要留一份。别直接用Navicat可视化建表然后不管了SQL文件本身也是交付文档的一部分评委问到数据库设计时拿出SQL文件讲每个字段的含义比现场打开客户端操作有说服力得多。2.3 Java工程与Vue工程的项目结构规划工程建议拆成两个目录smart-farm-backend和smart-farm-frontend。后端包名用com.example.smartfarm下面按controller、service、mapper、entity、config、common、dto分层。这样做的好处是职责清晰写代码的时候知道去哪里找什么也方便写文档时画系统架构图。前端我用Vite创建工程命令是npm create vite4 smart-farm-frontend -- --template vue创建完成后安装依赖并启动cd smart-farm-frontend npm install npm run dev前端目录结构上src/views放页面组件src/router放路由配置src/api放接口请求模块src/utils放axios封装和工具函数。最好一上来就把这个架子搭好不然后面页面多了全堆在App.vue里改一个地方崩三处。3. 后端核心功能实现与关键代码3.1 登录鉴权JWT加拦截器不用SpringSecurity也能讲清楚登录这块的常规方案有Spring Security和JWT加拦截器两种。Spring Security是安全框架的“全家桶”功能强大但配置繁琐过滤器链、认证管理器、密码加密器一整套概念新手很容易绕晕。所以在这个项目里我更推荐JWT加拦截器代码量少逻辑直观答辩时也特别好解释。JWTJSON Web Token的思路就是用户登录成功后后端生成一个加密的token字符串返回给前端前端每次请求都带上这个token后端拦截器校验token是否合法。它的核心价值在于无状态多台服务器部署时不需要共享SessionToken本身带着用户标识和过期时间前端拿到后存到localStorage或sessionStorage里。实现思路大概是登录接口验证用户名和密码通过后用jjwt工具包生成Token放到Redis里记录有效会话同时返回给前端。拦截器继承HandlerInterceptor在preHandle里校验请求头中的Authorization解析出用户ID后放到ThreadLocal或Request参数中。用Redis存Token的好处是注销时可以主动删除实现“客户端退出登录后Token立即失效”比纯JWT更严谨答辩时可以把这个设计说出来作为加分点。3.2 传感器数据接收与入库传感器数据上报接口是系统的心脏。不管你是用实际硬件通过4G模块上报还是用模拟脚本造数据后端接收数据的接口逻辑都是一样的。一个通用的上报接口设计如下RestController RequestMapping(/api/sensor) public class SensorDataController { Resource private SensorDataService sensorDataService; PostMapping(/data) public Result receiveData(RequestBody SensorDataDTO dto) { // 1. 校验设备是否存在设备是否在线 // 2. 保存传感器数据到 sensor_data 表 // 3. 检查该数据是否超过阈值超过则生成告警记录 return Result.success(); } }这里有个细节要注意上报接口的吞吐量和普通CRUD接口不一样。传感器可能每隔几分钟就上报一批数据高峰期请求量不小所以接口要尽量精简逻辑不要做太多耗时操作比如把写告警日志、推送消息这些放到同一个事务里可以但不要在循环里反复查询数据库。我参考了网上常见的实现习惯先把数据原样保存再做阈值判断。告警判断放到数据落库之后异步执行避免采集接口被告警逻辑拖慢。实现方式可以先用Async注解配合自定义线程池或用ApplicationEvent发布消息立即返回。对于毕业设计来说Async就够用了写法简单面试被问也能聊上几句。3.3 阈值告警与自动控制联动智能农田系统最值钱的功能不是“看数据”而是“数据异常时能自动响应”。我设计的逻辑是这样的系统为每类传感器维护一个阈值区间比如空气温度的正常范围是10到35摄氏度。数据进来后如果超出区间就生成一条告警记录然后根据该设备关联的控制策略自动下发控制指令。联动控制的落点可以做成两种模式手动模式和自动模式。手动模式就是用户在页面上点击“打开灌溉阀门”后端调用控制设备接口给硬件下发指令自动模式则是当土壤湿度低于阈值时系统自动发送“开启灌溉”指令并在control_log里记录一条自动操作日志。这样就把“感知、决策、执行”串成了闭环。为了在没有真实硬件的情况下演示联动效果我建议加一个Scheduled定时任务每10分钟生成一组模拟的传感器数据走一遍数据接收、阈值判断、联动控制的完整流程。这样你答辩时现场演示大屏不需要真的拿一个温度传感器插在电脑上也能看到数据在动、告警在弹、控制记录在变化。定时任务示例Component public class SensorSimulator { Scheduled(fixedRate 60000) public void generateData() { // 随机生成温度和湿度封装DTO调用数据上报Service // 数据上报Service内部自动触发阈值判断和联动控制 } }3.4 统计报表接口让前端有图可绘ECharts在前端画折线图、饼图本身不产生数据数据全靠后端接口给。所以统计模块的后端接口设计要围绕“维度清晰”来做。我做了三个核心统计接口GET /api/statistics/trend?deviceId1hours24返回最近24小时的温度/湿度趋势按小时聚合平均值给前端画折线图。GET /api/statistics/land-status统计每块农田的在线设备数、离线设备数、今日告警数给大屏的地块状态卡片用。GET /api/statistics/alarm-type按告警类型分组统计比如温度告警、湿度告警、光照告警分别有多少条用于饼图展示。写SQL时注意一下趋势图的数据直接查明细返回几十个点也行但如果数据量大就要用到时间聚合函数比如DATE_FORMAT(create_time, %Y-%m-%d %H:00)按小时分组。MyBatis-Plus里写自定义SQL也不复杂直接用Select注解或者XML文件都行。统计查询SQL写的规范与否是答辩评委会比较关注的技术点。4. 前端核心页面与可视化实现4.1 Vue路由、状态管理与会话保持前端工程初始化之后第一步要搞定的就是路由和请求封装。路由用Vue Router配置好在登录后能跳转的页面首页大屏、数据监测、设备管理、告警中心、农事记录、系统设置。这里推荐在main.js里注册全局路由守卫判断用户是否登录没有token就强制跳转到/login。axios封装是我反复强调不要偷懒的地方。统一创建一个http.js文件实例化axios设置基础URL为/api然后加请求拦截器和响应拦截器。请求拦截器从localStorage取出Token放到Authorization头里响应拦截器统一处理后端返回的结构如果code字段不是200就用Element Plus的ElMessage弹出错误提示。如果后端返回401说明Token过期了直接清除本地登录状态跳到登录页。import axios from axios import { ElMessage } from element-plus const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }) request.interceptors.response.use( response { const res response.data if (res.code ! 200) { ElMessage.error(res.message) return Promise.reject(new Error(res.message)) } return res.data }, error { ElMessage.error(服务器开小差了请稍后重试) return Promise.reject(error) } ) export default request特别提醒axios的baseURL我推荐配置成/api然后在Vite的devServer配置里加代理把请求转发到http://localhost:8080。这样前后端联调时没有跨域问题将来部署到生产环境用Nginx做反向代理前端和后端也共用一个域名省掉一大堆跨域配置的麻烦。4.2 大屏可视化与实时刷新大屏页面是答辩时最能出效果的一页但也是最容易做“虚”的。很多同学放一堆图表数据却是写死的静态数据评委一眼就能看出来。真正的做法是接入后端统计接口并用定时器定时刷新。折线图用ECharts的line类型x轴是时间y轴是温度或湿度值数据由后端返回。地块状态用几个数字卡片展示总农田数、在线设备、今日告警、今日控制次数。为了让大屏有“实时感”我没用WebSocket做全量推送而是简单地每隔30秒重新拉一次趋势接口和统计接口配合setInterval调用数据就会自动变化。这种做法代码简单、效果稳定完全够演示。如果后面想升级可以再引入WebSocket让告警一产生就直接弹到页面上我建议把WebSocket留到告警中心做大屏用轮询就够了。4.3 农田视频监控m3u8流媒体播放现在智能农田系统普遍会加一个视频监控模块需求是把部署在农田的摄像头画面放到网页里。摄像头厂商的私有协议比如海康的RTSP浏览器是不能直接播放的需要先转成HTTP可播放的协议。HLS协议是当前兼容性较好、实践最多的方案它的播放文件就是.m3u8切片索引文件。前端播放方案我推荐使用hls.js配合video标签或者在Vue中封装一个播放器组件。核心思路是这样# 后端服务器上用FFmpeg把摄像头的RTSP流转成HLS切片 ffmpeg -i rtsp://192.168.1.64:554/Streaming/Channels/101 \ -c:v copy -c:a aac -hls_time 4 -hls_list_size 6 \ -f hls /data/video/sensor01/sensor01.m3u8前端拿到http://服务器地址/video/sensor01/sensor01.m3u8这个地址后用hls.js创建播放实例import Hls from hls.js if (Hls.isSupported()) { const hls new Hls() hls.loadSource(http://服务器地址/video/sensor01/sensor01.m3u8) hls.attachMedia(videoElement) }这里要记住视频流的地址不能写死在前端代码里应该由后端提供一个GET /api/video/list接口返回摄像头设备的ID、名称、在线状态、m3u8播放地址前端根据设备列表动态播放。部署时m3u8文件属于静态资源要么放在SpringBoot的静态目录要么交给Nginx统一管理推荐后者。4.4 设备控制页面与操作日志设备控制页面其实就是一张设备列表每一行显示设备名称、安装地块、类型、当前状态以及“开”和“关”两个操作按钮。点击按钮后调用控制接口后端控制接口先去检查设备在线状态再向硬件下发指令同时写入control_log操作日志。这里的交互要处理两个细节一是按钮点击后要加载状态防止用户重复提交二是操作结果要弹窗反馈。硬件真实执行可能有一两秒延迟所以接口不要设计成“同步等硬件返回结果”而是“指令下发成功就返回成功硬件执行结果后面再上报更新状态”。用异步上报的方式前端体验更顺畅系统设计上也更接近真实物联网平台。5. 高频踩坑实录与排查技巧5.1 npm install卡死、依赖冲突怎么处理前端环境问题是新手的重灾区。npm install装到一半卡住最常见的原因就是网络慢换成npm config set registry https://registry.npmmirror.com后重试基本能解决。其次是node_modules缓存损坏出现各种诡异报错时我一般直接删掉node_modules和package-lock.json再重新安装比自己苦思冥想找那一个错误包快得多。还遇到过一个问题装完依赖后提示failed to load tsconfig vue/tsconfig/tsconfig.web.json: tsconfig not found。这种情况通常是npm把vue/tsconfig这个包安装失败或者版本不匹配导致的。解决方法是手动执行npm install vue/tsconfig0.4.0 -D然后检查tsconfig.json里的引用路径是否写的是vue/tsconfig/tsconfig.web.json如果不对就改成vue/tsconfig/tsconfig.json这个问题就能绕过去。5.2 SpringBoot启动失败排查清单后端启动失败大概有四类原因我用一个表格记录一下症状原因解决办法启动日志报Failed to configure a DataSource数据源配置找不到检查application.yml里的datasource配置有没有写错端口/库名/账号密码报Access denied for user rootlocalhostMySQL账号密码错误或权限不足用Navicat以root登录确认密码检查MySQL用户权限报时区错误数据库连接串没配serverTimezone在url后加serverTimezoneAsia/Shanghai报Port 8080 was already in use端口被占用netstat -ano查进程换端口或杀掉占用进程还有一个我在实践里遇到的隐蔽问题如果SpringBoot版本是2.7.x使用spring-boot-maven-plugin打包时可能会因为插件版本不匹配报RepackageMojo相关错误。直接把插件版本号改成和你当前SpringBoot版本一致就解决了别用教程里拷过来的旧插件版本。5.3 前后端联调跨域和404问题跨域问题在后端也有对应的处理方式。我前端已经用/api加代理解决了大部分跨域但万一你直接把前端地址http://localhost:5173请求后端http://localhost:8080还是会遇到CORS错误。稳妥起见在后端加一个WebMvcConfigurer配置类允许跨域请求Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }还有那种“前端页面能打开但一刷新就404”的情况这是前端路由的history模式导致的。生产环境用Nginx部署Vue项目时需要在Nginx配置里加一条try_files $uri $uri/ /index.html;把不存在的路径重写到index.html由前端路由接管。5.4 视频监控m3u8拉流卡顿或黑屏视频监控模块最容易翻车问题主要体现在几个地方一是FFmpeg转流命令太消耗CPU如果服务器性能不够建议用-c:v copy直接复制视频流避免重新编码二是m3u8切片地址如果放在/data/video/目录下忘了做静态资源映射前端拿到地址会404需要在SpringBoot里配置静态资源路径或者直接用Nginx的location /video/ { alias /data/video/; }映射出去三是HLS切片列表长度设置太长导致延迟高设置-hls_list_size 3只保留最近三四个切片延迟能控制在15秒以内。在答辩演示时视频画面延迟越小效果越真实。5.5 数据库同步与备份这部分关于数据库同步我想说的是如果将来要部署到两台服务器或者本机和云上各跑一套数据库同步是个绕不开的话题。MySQL主从复制是比较常用的方案主库负责写从库负责读两边通过binlog日志同步数据。毕业设计阶段虽然不一定真要搭主从但你要知道数据备份的思路用mysqldump定期导出一份SQL文件防止数据库误删或服务器出问题。实操中我习惯把备份写成脚本每天凌晨跑一次保留最近7天的备份文件这个习惯一直保持到现在。6. 交付清单、部署运行与答辩准备6.1 源码、数据库脚本、文档该怎么整理毕设验收时评委打开你的项目文件夹第一眼看到的就是目录结构。所以交付的材料一定要分类清晰。我建议这样组织smart_farm_system/ ├── backend/ │ ├── src/ # 后端源码 │ └── pom.xml ├── frontend/ │ ├── src/ # 前端源码 │ └── package.json ├── database/ │ └── init.sql # 建库建表SQL ├── docs/ │ ├── 需求分析.md │ ├── 数据库设计.md │ └── 接口文档.md └── README.md # 项目说明包含启动步骤数据库脚本放进database目录后最好在init.sql文件顶部加几行注释说明MySQL版本、数据库字符集、执行顺序免得别人拿到脚本不知道怎么跑。源码里不要放target、node_modules这些生成目录既占体积也显得不专业。6.2 宝塔面板与Docker部署实战如果想把系统部署到服务器上演示答辩宝塔面板加Docker是个性价比很高的方案。SpringBoot后端打成jar包编写一个DockerfileFROM openjdk:8-jre COPY smart-farm-backend.jar /app/app.jar WORKDIR /app CMD [java, -jar, app.jar, --spring.profiles.activeprod]前端构建出dist目录用Nginx镜像托管再用docker-compose把MySQL、后端、前端三个容器编排起来version: 3 services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - ./data/mysql:/var/lib/mysql backend: build: ./backend depends_on: - mysql ports: - 8080:8080 nginx: image: nginx:1.24 ports: - 80:80 volumes: - ./dist:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/conf.d/default.conf部署环节说实话比较耗时环境变量、端口映射、镜像源都可能出问题我建议提前一周开始部署别拖到答辩前两天。如果导师没说必须服务器部署本地跑通加录屏演示也是一个稳妥选择。6.3 答辩讲解与文档编写要点最后聊几句答辩。评委看你的毕业设计不只是看功能能不能跑更关注你“为什么要这么做”和“怎么做的”。比如问到“为什么用JWT不用Session”你要能说清楚分布式无状态和扩展性。问到“数据量大了怎么办”要能答出分页查询、索引优化、定时归档历史数据。这些事情你在开发过程中其实都做了只是需要把这些经验提炼成几句话。文档部分需求分析要写清楚“项目背景”“功能性需求”“非功能性需求”数据库设计文档要把ER图、每张表的字段说明、索引设计都列出来接口文档推荐用Swagger自动生成自己手写容易漏接口而且Swagger可以直接给前端同学对接用。这些都是实际项目中交付的重要组成部分认真写对能力提升也很有帮助。我个人在实际操作里的体会是这套系统最大的价值不是“农田”这两个字而是背后那条“设备产生数据、数据驱动告警、告警联动控制”的链路把它理清楚就算让你换个场景做智慧大棚、智慧养殖你也能快速套用。最后再分享一个小技巧做系统前先用Excel把每个模块的页面清单和接口清单列一遍前端要写哪几页后端要写哪几个接口一目了然。这个习惯我后来上班了也一直在用它比想象中更能避免你写到一半发现漏了功能、回头大改。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑