新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于Vue3和ECharts的智慧农业监控大屏实战解析

发布时间:2026/9/9 0:05:45来源:尧图网络
基于Vue3和ECharts的智慧农业监控大屏实战解析
简介面向具备一定前端基础、需要快速落地数据可视化项目的开发者这是一份 Vue3 ECharts 智慧农业监控模板实例聚合了完整工程源码、开发文档、素材与开发过程视频能帮助理解监控大屏的布局设计、数据渲染与图表联动思路。压缩包为 rar 格式约 44.75MB共 12463 个文件以 js、ts、mjs 脚本、scss/css 样式、map 源映射、vue 组件和 json 配置为主另含 md 说明文档、png/webp 图片素材及 mp4 视频资料整体目录结构清晰便于按模块检索对照。已有 4442 人学习下载热度较高。内容覆盖 vue-echarts 报表搭建、高德地图展示、菜单布局整理、全屏切换与退出等功能同时附带源码、开发文档及操作录屏可支撑从零开始还原整个智慧农业监控大屏的开发过程工程基于 HBuilderX 开发适合前端开发者与数据可视化初学者借鉴复用也适合用于智慧农业看板相关的毕设或企业演示。 做智慧农业监控大屏这个实例我前后磨了小两周中间推倒重来了一次。最初一版方案布局看起来挺唬人可真接了实际数据就露馅各种问题往外冒。这篇文章把完整实现过程复盘一遍从设计思路到核心模块代码再到我踩过的坑一次性讲透。不管你是刚接触Vue和ECharts的新手还是准备在公司项目里落地大屏的老手这套东西应该都能给你省下不少时间。1. 整体设计思路与方案选型1.1 项目定位拆解大屏到底在监控什么智慧农业这个场景很典型覆盖种植环境监测、设备远程控制、产量统计分析、告警预警几大块。在设计大屏之前先把业务场景切清楚才不会做出花架子。我这版实例围绕一个假设的蔬菜种植基地来设计展示维度包括环境监测空气温湿度、土壤墒情、光照强度、二氧化碳浓度这是大棚种植最核心的指标设备状态灌溉阀门、风机、卷帘、补光灯的实时运行状况告警信息温湿度越限、设备故障、土壤缺水等异常事件滚动播报区域分布不同种植区的地图标记和产量对比历史趋势关键指标在24小时内的大致走向明确了这些维度接着选型就有了方向。ECharts的可视化能力完全够用Vue负责组件化开发和状态管理两者配合是当前做数据大屏很成熟的组合。1.2 技术栈版本选择为什么用这套组合技术栈上我用了Vue 3加Vite加ECharts 5的组合。Vue 3的Composition API在写复杂图表逻辑时明显比Options API更顺手逻辑可以按功能聚合不用分散在data、methods、watch各个角落里。ECharts版本用的5.3.0以上官方包拆得更细可以按需引入压缩后体积比全量引入小不少。对于大屏这种场景首屏加载速度是一个绕不开的指标。// 按需引入示例 import * as echarts from echarts/core import { GaugeChart, BarChart, LineChart, PieChart, MapChart } from echarts/charts import { GridComponent, TooltipComponent, LegendComponent, VisualMapComponent } from echarts/components import { CanvasRenderer } from echarts/renderersVite用来做构建和本地开发调试。大屏项目在开发阶段会频繁调样式、改布局Vite的热更新速度比webpack体感快很多。如果你还在用webpack那一套这类纯前端界面项目换到Vite基本是降维打击。1.3 布局策略124栅格自适应方案监控大屏和普通后台页面的最大区别在于——它是固定设计稿自适应缩放的思路而不是传统的流式布局。我的做法是先按照1920×1080的标准分辨率做设计稿然后用一个Scale容器包裹所有内容通过监听浏览器窗口的resize事件动态计算缩放比例。这种方式能保证不同分辨率下大屏的视觉比例始终和设计稿一致。template div classscreen-wrapper refscreenRef div classscreen-content :stylescaleStyle !-- 大屏内容区域固定1920x1080 -- /div /div /template script setup import { ref, reactive, onMounted, onBeforeUnmount } from vue const screenRef ref(null) const scaleStyle reactive({ transform: scale(1), transformOrigin: left top, width: 1920px, height: 1080px }) function handleResize() { const wrapper screenRef.value const scaleX wrapper.clientWidth / 1920 const scaleY wrapper.clientHeight / 1080 const scale Math.min(scaleX, scaleY) scaleStyle.transform scale(${scale}) } onMounted(() { handleResize() window.addEventListener(resize, handleResize) }) onBeforeUnmount(() { window.removeEventListener(resize, handleResize) }) /script24栅格的设计逻辑是头部区域占一行24列下面主体区域拆成三列——左侧7列放环境监测和设备状态、中间10列放地图和核心指标、右侧7列放告警信息和趋势图。这个比例是我实测下来比较舒服的中间主视觉区域宽度够展示农业地图两侧的信息又不会被压缩得看不清楚。2. 核心模块实现与关键技术解析2.1 环境监测模块仪表盘加数据卡片组合环境监测是我优先做的模块核心指标包括空气温湿度、土壤湿度、光照强度、二氧化碳浓度。这里用了两种图表组合**仪表盘Gauge**用于展示单一核心指标比如土壤湿度。用了渐变色的进度环指针用细长样式数值保留一位小数超出合理区间阈值时指针会变色。const gaugeOption { series: [{ type: gauge, min: 0, max: 100, splitNumber: 10, radius: 90%, progress: { show: true, width: 18, itemStyle: { color: { type: linear, x: 0, y: 0, x2: 1, y2: 0, colorStops: [ { offset: 0, color: #36D1DC }, { offset: 1, color: #5B86E5 } ] } } }, pointer: { length: 60%, width: 4, itemStyle: { color: auto } }, detail: { valueAnimation: true, formatter: {value}%, fontSize: 20 }, data: [{ value: soilHumidity.value, name: 土壤湿度 }] }] }数据卡片用于展示温湿度等四项常规指标每张卡片带mini趋势小图Sparkline直观看出最近12个小时的变化。这种卡片趋势的组合看起来简单实际拆开是两个部分上面用CSS写数值和单位下面挂一个极简的ECharts折线图。2.2 设备状态模块开关量可视化设备状态这块我用的是LED指示灯的交互方式。每个设备前头放一个发光圆点绿色表示正常运行橙色表示待机红色表示告警或故障灰色表示离线。点击设备卡片可以打开右侧的控制抽屉模拟远程开关设备。// 设备状态映射 const deviceStatusMap { running: { color: #00ff88, label: 运行中 }, standby: { color: #ffaa00, label: 待机 }, warning: { color: #ff3344, label: 告警 }, offline: { color: #666666, label: 离线 } }这个模块的核心亮点在于数据驱动UI。状态变化不直接操作DOM而是修改Vue的响应式数据界面自动更新。这在真实项目里对应的是WebSocket推送或者定时轮询后端接口把后端返回的设备状态更新进大屏。2.3 农业地图用中国地图展示区域种植分布地图模块是整个大屏的视觉焦点也是花费时间最久的部分。这里用ECharts的Map Chart加载了中国地图的GeoJSON数据配合scatter系列做种植区域的标记和数量展示。热搜词里提到的3D地图、立体效果这个实例里体感最明显的处理方式是地图底色用深色系区域边界线用高亮描边配合visualMap的渐变映射让不同区域产生视觉上的立体纵深感。import chinaJson from ../assets/china.json echarts.registerMap(china, chinaJson) const mapOption { tooltip: { trigger: item, formatter: (params) ${params.name}br/种植面积${params.value || 0} 亩 }, visualMap: { min: 0, max: 100, left: 20, bottom: 20, text: [高, 低], inRange: { color: [#0b2a3a, #0f4c5c, #1a7a6b, #35c46e] } }, series: [ { type: map, map: china, roam: true, label: { show: false }, itemStyle: { areaColor: #0e3b4d, borderColor: #20d6c8, borderWidth: 0.8 }, emphasis: { itemStyle: { areaColor: #36b8a0, shadowColor: rgba(54, 184, 160, 0.6), shadowBlur: 20 } } } ] }地图标记点使用scatterEffect效果实现数据点扩散动画让核心种植基地在地图上活起来。实际项目中如果你有具体位置的经纬度坐标把数据换成真实坐标即可展示逻辑完全复用。2.4 趋势分析与告警滚动折线图加列表联动折线图展示温湿度24小时变化趋势。要点是自定义了两个y轴温度在左轴单位°C湿度在右轴单位%用不同的颜色区分。加上平滑曲线和面积渐变填充让趋势变化更直观。告警滚动这块不是图表是一个CSS控制的列表自动滚动区域。通过定时器控制滚动容器的scrollTop实现无限循环滚动效果。每条告警记录包括时间、等级标签紧急/重要/一般和告警详情。// 告警滚动逻辑 function startScrolling() { scrollTimer setInterval(() { const container alarmListRef.value if (!container) return container.scrollTop 1 if (container.scrollTop container.scrollHeight - container.clientHeight) { container.scrollTop 0 } }, 30) }首尾无缝衔接的处理是把列表数据复制一遍拼在后面滚动到底部时直接跳回0。这个方案简单可靠比什么虚拟列表在这场景下划算得多。3. 完整实操过程与代码实现3.1 项目初始化和依赖安装先完成项目的初始化。用Vite创建Vue 3项目这个步骤有一行命令就够了npm create vitelatest smart-agriculture-screen -- --template vue进入项目目录安装核心依赖npm install echarts --save如果你还想用一天内省事的方案比如直接引入完整的ECharts包也可以就是体积大一点。我最后还是选择了按需引入核心代码里用到的图表类型都引入了代码示例见上文。按需引入之后再用Vite的构建优化最终打包体积能控制在合理范围内。3.2 图表封装避免重复造轮子的组件化方案大屏里图表数量多如果每个图表都写一遍option和初始化逻辑代码会膨胀得很严重。我把图表封装成一个通用组件BaseChart.vue接收option参数内部负责初始化、监听变化和自动resize。template div refchartRef classbase-chart/div /template script setup import { ref, onMounted, onBeforeUnmount, watch, nextTick } from vue const props defineProps({ option: { type: Object, required: true } }) const chartRef ref(null) let chartInstance null function renderChart() { if (!chartInstance chartRef.value) { chartInstance echarts.init(chartRef.value) } chartInstance.setOption(props.option) } function handleResize() { chartInstance chartInstance.resize() } onMounted(() { nextTick(renderChart) window.addEventListener(resize, handleResize) }) onBeforeUnmount(() { window.removeEventListener(resize, handleResize) chartInstance chartInstance.dispose() }) watch(() props.option, () { renderChart() }, { deep: true }) /script这样在父组件里只需要维护每个图表的option数据变化了自动更新省去了大量重复的初始化代码。3.3 数据模拟与定时刷新机制真实项目里大屏数据来源于后端接口。这版示例为了演示方便用Mock方式模拟数据并添加了定时器每5秒随机更新一次环境监测数据。// 模拟数据 function mockEnvironmentData() { return { temperature: (Math.random() * 8 20).toFixed(1), humidity: (Math.random() * 20 50).toFixed(1), soilMoisture: (Math.random() * 15 55).toFixed(1), light: Math.round(Math.random() * 20000 15000), co2: Math.round(Math.random() * 200 350) } } // 定时更新 let timer null function startDataPolling() { timer setInterval(() { environmentData.value mockEnvironmentData() deviceStatus.value mockDeviceStatus() // 更新对应的图表option updateGaugeOption() updateTrendOption() }, 5000) }轮询间隔根据实际业务来定。大棚环境数据变化相对缓慢5秒到30秒的间隔都可以但设备状态建议缩短到3秒以内物联网项目里设备状态又比较频繁。注意定时器在组件卸载时一定要清理否则会出现内存泄漏这是老生常谈但很容易犯的错。3.4 大屏整体样式与主题配色大屏风格我定的主题是深色科技蓝绿。背景用了多层CSS渐变叠加营造出深邃的视觉层次感。.screen-wrapper { background: linear-gradient(135deg, #031925 0%, #0a2e3d 50%, #063347 100%); position: relative; overflow: hidden; } .screen-wrapper::before { content: ; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(ellipse at 20% 50%, rgba(0, 180, 255, 0.05) 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, rgba(0, 255, 180, 0.05) 0%, transparent 50%); }顶部标题栏用科技感强烈的字体配合光条装饰。左侧和右侧的模块面板均使用半透明毛玻璃风格加细边框和右上角折角装饰整体风格统一不杂乱。4. 常见问题与排查技巧实录4.1 ECharts图表不渲染或显示空白这个排查频率相当高原因一般是以下几种容器没有高度。ECharts初始化时容器高度为0会直接不渲染或只显示一个点。检查父元素有没有设置固定高度特别是放在flex布局里时容器被压缩、又被scale缩放隐藏了真实尺寸。解决办法是给图表容器设置显式的高度例如height: 300px或者用min-height兜底。option数据格式错误。比如series.data的数组层级不对、传入null值。引入数据时先console.log打印一下option传给ECharts前长什么样。这个习惯能避免大量玄学问题。图表初始化时机太早。在Vue的onMounted里初始化一定要确保DOM已挂载用nextTick或者setTimeout 0。以前我吃过亏onMounted直接拿一个还没渲染完成的DOM去init结果图表死活出不来。4.2 大屏缩放后图表模糊或错位缩放方案用的Scale做transform缩放后图表偶尔会模糊。原因主要是ECharts在缩放前完成了渲染在缩放后没有调用resize重新绘制。解决思路是在主容器的resize事件里同时调用每个图表实例的resize()方法。如果图表很多可以给BaseChart组件内部自行监听resize这样就全局统一了。另外一个容易忽视的地方当transform: scale()发生之后点击事件的坐标会有偏移。如果想做地图点击下钻、设备点击控制这类交互建议不要依赖ECharts原生的坐标计算或者基于页面缩放比例做坐标换算。4.3 地图GeoJSON加载失败或省份不显示地图不显示的排查路径确认echarts.registerMap(china, chinaJson)在初始化之前执行了检查GeoJSON里面有没有对应的省、市、区的name字段建议查看数据的features[0].properties确认name字段是否存在。如果字段是拼音或英文需要做字段映射。map series里的map值必须和registerMap的第一个参数保持一致写错了地图就白注册了。热搜词里面提到的9段图变10段图其实就是visualMap的splitNumber参数。默认9段可能是数据分布不均你想调整成10段只需要把splitNumber改成10同时设置合适的min和max范围即可。4.4 Vue 3中echarts图表的销毁与重建泄漏问题使用v-if切换大屏页面时如果图表没有正确销毁多次切换会导致内存持续上涨严重的直接把浏览器卡死。这是因为ECharts实例没有被释放事件监听器残留了。正确的做法是组件卸载前调用chart.dispose()并把实例引用置为null。如果你的图表是动态创建的就在动态组件内部的onBeforeUnmount中把该做的清理全部做完。5. 后续扩展与个人实操心得这版实例做成之后有的朋友问能不能往里面加视频监控流。ECharts本身不支持视频但Vue可以。你可以在大屏的某个模块里嵌video标签指向后端推流的地址。搜索热词里提到vue播放m3u8这个需要在Vue里引入hls.js来解析播放基本原理是在mounted时实例化Hls对象监听MEDIA_ATTACHED事件后调用播放方法。这个完全可以作为智慧农业大屏中视频监控模块的补充功能和我们的图表数据展示形成双通道信息互补。还有问3D地图的热搜词里echarts-gl做3D地图是现实存在的需求。智农场景里如果想展示地形地势或地块立体分布可以引入echarts-gl的map3d系列。不过要注意echarts-gl和ECharts 5的版本兼容性没那么省心建议先新建分支单独验证确认稳定了再合到主项目里。这次踩的最大的坑还是在布局自适应上。第一版我偷懒想用百分比的流式布局结果在1366×768的工控机上全挤成一坨在4K大屏上又拉伸变形。后来统一改成1920×1080固定设计稿加Scale缩放一套代码通吃所有分辨率。如果你的项目横跨不同分辨率且涉及交互建议多验证几轮缩放后局部点击区域的精确性可以用缩放比例做换算处理。说着说着就有些长了最后留一个提示吧ECharts的配置项埋得很深非官方文档上很多示例不能照抄照着抄了也难免属性名是旧版本的。遇到图表效果不符预期时最快的排查办法是打开ECharts官方示例的编辑器把代码粘进去跑一遍然后一个属性一个属性地删很容易定位哪个配置影响了效果。这套方法比瞎试快得多。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

智慧交通大屏前端源码解析:技术选型、适配与性能优化 2026/9/9 0:44:48

智慧交通大屏前端源码解析:技术选型、适配与性能优化

简介:面向智慧交通场景的可视化大屏前端源码包,主要为需要快速搭建交通实时监控大屏的前端工程师、数据可视化开发者与产品经理提供可直接复用的工程参考。压缩包内共包含两千个文件,以图片素材、JS脚本、CSS样式和HTML页面为核心&#xff0c…

阅读更多 →
三维B样条曲线拟合的工程实践:节点向量、控制点与权重设计 2026/9/9 0:44:48

三维B样条曲线拟合的工程实践:节点向量、控制点与权重设计

简介:本资源是一套面向机械设计、土木工程及计算机图形学领域初学者与工程师的三维B样条曲线拟合Matlab实现方案,解决工程实践中对离散三维数据点进行平滑、可控、局部可调曲线建模的核心需求。压缩包共2个文件(1个MATLAB脚本test.m 1个数据…

阅读更多 →
遥控App链路健康监测与智能重连实战指南 2026/9/9 0:44:48

遥控App链路健康监测与智能重连实战指南

1. 遥控器App链路中断不是“断了就断了”,而是有迹可循的信号衰减过程 很多人一看到遥控器App突然失灵,第一反应是“又连不上了”,然后下意识点开WiFi列表、重启App、甚至重启手机——这就像发烧了只吃退烧药,却没查体温变化曲线。…

阅读更多 →
低内存STM32上的SM2国密算法实现与优化 2026/9/9 0:44:48

低内存STM32上的SM2国密算法实现与优化

简介:面向低内存STM32单片机的国密SM2算法实现源码包,适合嵌入式与信息安全开发者在资源受限平台上集成国产密码算法。该源码以STM32F10x等低RAM/Flash环境为设计目标,重点解决SM2椭圆曲线公钥算法在资源受限MCU上的运行效率与内存占用问题。…

阅读更多 →
CPU流水线设计实战:Verilog实现插入气泡、重定向与多级嵌套中断 2026/9/9 0:44:48

CPU流水线设计实战:Verilog实现插入气泡、重定向与多级嵌套中断

简介:华中科技大学计算机组成原理课程设计项目,完整实现基于Verilog的CPU流水线,涵盖流水线分段、插入气泡、重定向及多级嵌套中断等核心机制,体现出对处理器数据通路与控制逻辑的深入理解,适合计算机专业学生、硬件设…

阅读更多 →
单总线协议与MY18E20温度传感器MicroPython驱动实战 2026/9/9 0:41:48

单总线协议与MY18E20温度传感器MicroPython驱动实战

搞嵌入式或者玩ESP32、RP2040这些开发板的朋友,对温度采集肯定不陌生。市面上便宜好用的数字温度传感器里,DS18B20那个生态最有名,而MY18E20就是国产兼容方案里用得非常多的一颗芯片:封装、命令、时序都和DS18B20高度兼容&#xf…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞