news 2026/9/4 4:36:11

基于SpringBoot+Vue的智慧农业物联网平台全栈开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于SpringBoot+Vue的智慧农业物联网平台全栈开发实战

简介:本资源是一套完整的智慧农业物联网平台全栈实现方案,面向计算机、电子信息、农业工程等专业本科生及毕设开发者,聚焦农业环境监测、设备远程控制与数据可视化等典型物联网应用场景。压缩包含427个文件,总大小8.44MB,涵盖81个Java后端服务模块(Spring Boot架构)、80个Vue前端组件(含Element Plus UI)、78个CSS样式文件、47个JS交互逻辑及1个SQL数据库脚本,支撑从传感器数据接入、API接口开发到Web管理界面的完整闭环。已有1221人学习下载,适合作为课程设计、期末大作业或毕业设计参考,提供可直接运行的工程结构、清晰的模块划分(如GPRS通信驱动SHT1x.cpp/sim800c.cpp、前端日期选择器transfer.css等)以及基础配置说明,便于理解物联网平台分层设计思想并在此基础上拓展功能。

1. 项目概述:一个拿来即用的智慧农业物联网全栈解决方案

最近在整理硬盘时,翻到了一个几年前参与过的“智慧农业物联网平台”项目源码包。这个名为“智慧农业物联网平台-后端+前端源码+数据库.zip”的压缩包,可以说是一个相当完整的全栈项目“大礼包”。对于想快速了解或入门农业物联网、企业级前后端开发的朋友来说,这无疑是一个极佳的参考案例。它不仅仅是一堆代码,更是一个包含了业务逻辑、设备交互、数据可视化和系统管理的微型产品原型。

这个平台的核心目标,是将传统的农业生产管理过程数字化、智能化。想象一下,一个大型的现代化农场或温室:管理者不再需要亲自跑到每个大棚去查看温度、湿度,也不需要凭经验猜测何时该浇水施肥。通过部署在田间的各种传感器(如温湿度、光照、土壤pH值),数据被实时采集并上传到这个平台。平台后端负责处理这些海量的设备数据,进行聚合、分析和告警判断;前端则提供一个清晰直观的仪表盘,让农场主在电脑或手机上就能“一眼掌握”全局,甚至可以远程控制灌溉阀门、补光灯等执行设备。它解决的是农业生产中“看不见、管不着、反应慢”的痛点,适合农业科技公司、大型农场、农业科研院所的技术人员,以及希望从零构建物联网应用的全栈开发者学习和借鉴。

从技术栈来看,结合网络热词中频繁出现的“ruoyi框架后端”、“springboot vue前后端分离”,可以合理推断,这个项目极有可能采用了国内Java领域非常流行的Spring Boot + Vue.js前后端分离架构,并使用若依(RuoYi)这类快速开发框架作为基础。后端会处理设备通信协议(如MQTT)、业务逻辑、数据持久化;前端基于Vue构建管理后台;数据库则存储设备元数据、传感数据流、用户信息等。接下来,我们就一层层拆解这个“宝藏”项目,看看它到底是如何运作的,以及我们在复现或借鉴时需要注意哪些关键点。

2. 技术架构与核心组件选型解析

拿到一个全栈项目,第一步不是直接运行代码,而是先理解它的技术架构和组件选型。这就像看一张建筑蓝图,明白了整体结构和承重墙在哪里,后续的装修和改造才能得心应手。

2.1 后端技术栈深度剖析

后端是整个平台的大脑和中枢神经系统。根据“ruoyi框架后端”、“springboot”等热词,我们可以确定其核心是基于Java的Spring Boot框架。若依(RuoYi)是一个基于Spring Boot的权限管理系统框架,它集成了用户管理、角色权限、菜单管理、部门管理等后台系统通用功能。采用它作为起点,项目团队可以极大地节省基础模块的开发时间,直接聚焦于智慧农业特有的业务逻辑。

核心框架与依赖:

  • Spring Boot 2.x:提供了项目的自动配置、快速启动能力。你需要检查pom.xml文件来确定具体的版本。
  • Spring Security 或 Shiro:用于实现系统的认证(登录)和授权(权限控制)。若依框架通常集成其中之一。
  • MyBatis-Plus:这是一个强大的MyBatis增强工具,热词中的“数据库增删改查”操作,绝大部分会通过它提供的通用Mapper、条件构造器等便捷功能来实现,能减少大量重复的SQL编写工作。
  • Redis:作为缓存数据库,很可能用于存储用户会话(Session)、频繁访问的静态数据(如设备类型字典)、或实时数据的临时缓存,以减轻主数据库压力并提升响应速度。

物联网通信核心 - MQTT:这是智慧农业物联网平台区别于普通管理系统的关键。设备(传感器、控制器)与云平台之间通常采用MQTT协议进行通信,这是一种轻量级的、基于发布/订阅模式的消息协议,非常适合低带宽、高延迟或不稳定的网络环境(如农田的无线网络)。

  • 项目中会集成一个MQTT的Java客户端库,例如Eclipse Paho。后端服务会作为一个MQTT客户端,订阅(Subscribe)所有设备上报数据的主题(Topic),同时也会向控制主题发布(Publish)指令。
  • 你需要一个MQTT消息代理服务器,如EMQXMosquitto。在本地开发时,你需要单独部署一个。源码中一般只包含客户端连接配置,代理服务器需要自己搭建。

数据库选型:热词中提到了“oracle数据库”、“达梦数据库”、“若依兼容高斯数据库”,这暗示了项目可能设计为支持多数据库。但作为学习和开发,最常用的还是:

  • MySQL 8.0:极大概率是主数据库。用于存储结构化数据:用户表、设备信息表、传感器数据记录表、告警规则表、操作日志表等。
  • 源码中的数据库脚本(sql文件夹)是第一步需要执行的,它创建了所有的表结构和初始数据。

注意:若依框架的数据库脚本通常会包含其基础模块的表。智慧农业相关的业务表(如iot_device,iot_sensor_data,iot_alert_log)需要你仔细查看脚本,理解表与表之间的关联关系(外键),这对后续的业务开发至关重要。

2.2 前端技术栈与工程结构

前端是平台的脸面,负责数据可视化与用户交互。热词“vue前后端分离”指明了方向。

  • Vue 2.x / 3.x:查看package.json确定Vue核心版本。目前主流是Vue 3 + Composition API,但若依早期版本多基于Vue 2。
  • Element UI / Plus:这是基于Vue的桌面端组件库,项目中的表格、表单、弹窗、导航菜单等几乎都来自它。Element UI (for Vue 2) 或 Element Plus (for Vue 3)。
  • ECharts:智慧农业平台离不开数据图表。ECharts是百度开源的可视化库,用于在仪表盘中绘制温度变化曲线图、湿度分布柱状图、地图上显示设备位置等。
  • Axios:用于向后端RESTful API发送HTTP请求,获取数据或提交指令。
  • Vue Router:管理前端路由,实现单页面应用(SPA)的页面跳转。
  • Vuex / Pinia:状态管理库,用于跨组件共享数据,如用户登录状态、全局配置等。

前端工程通常结构清晰:src/views目录下是各个页面组件(如Dashboard.vue仪表盘,DeviceList.vue设备管理),src/api文件夹下封装了所有对后端接口的调用,src/components下是自定义的公共组件(比如一个显示实时数据卡片组件)。

2.3 数据库设计核心思想

数据库设计是业务的基石。智慧农业物联网的数据库设计有几个核心特点:

  1. 设备资产化:有一张核心的设备表,记录每一个传感器或控制器的唯一编号(SN)、名称、类型、所属区域、安装位置、在线状态、最后心跳时间等。设备与传感器可能是一对一或一对多的关系。
  2. 时序数据存储:传感器产生的温度、湿度等数据是典型的时间序列数据——数据量巨大、按时间顺序写入、极少更新、频繁按时间范围查询。对于简单的项目,可以直接用一张传感数据表存储,包含device_id,sensor_type,value,timestamp等字段。但对于海量数据,需要考虑分表(按时间,如按月)或使用专门的时序数据库(如 InfluxDB、TDengine),不过在这个入门级项目中,MySQL分表是更常见的做法。
  3. 告警与事件日志:需要告警规则表(定义什么条件下触发告警,如温度>35℃)和告警日志表(记录每次告警触发的时间、设备、数值、处理状态)。此外,用户的所有操作(开/关设备、修改参数)都应记录在操作日志表中,满足审计需求。
  4. 地理信息:如果涉及设备在地图上的标注,设备表中可能包含latitude(纬度)和longitude(经度)字段。

理解这些表结构,是你能二次开发或修复bug的前提。务必花时间用数据库工具(如Navicat、DBeaver,或热词中提到的“dbx数据库工具”)连接上数据库,直观地查看表关系和样例数据。

3. 项目快速启动与部署实操指南

有了理论认知,接下来我们动手让这个平台在本地“跑起来”。这个过程会遇到大部分初学者都会踩的坑,我会结合经验详细说明。

3.1 后端服务本地启动

  1. 环境准备:

    • JDK 8/11/17:根据pom.xml中的java.version确定。建议使用JDK 11,这是一个长期支持版本,兼容性较好。安装后配置JAVA_HOME环境变量。
    • Maven 3.6+:用于管理项目依赖和构建。安装后配置环境变量,在终端输入mvn -v验证。
    • MySQL 5.7/8.0:安装并启动MySQL服务。记住root密码。
    • Redis:从官网下载并启动Redis服务。默认端口6379。
    • MQTT Broker:下载EMQX(推荐,功能强大)或Mosquitto(轻量)。解压后,根据官方文档启动服务。EMQX默认管理端口是18083,MQTT端口是1883。
  2. 数据库初始化:

    • 使用MySQL客户端(命令行或图形化工具)创建一个新的数据库,例如smart_agriculture
    • 找到项目中的SQL脚本文件(通常位于sql/目录下,可能有多个文件,按顺序执行)。先执行创建表结构的脚本(如ry_xxxx.sql和业务表脚本),再执行初始化数据的脚本(如ry_xxxx_data.sql)。
  3. 配置文件修改:这是最关键的一步,90%的启动失败都源于此。找到后端项目的配置文件,通常是application.ymlapplication-dev.yml(开发环境配置)。

    • 数据库连接:修改spring.datasource下的url,username,password,指向你刚创建的数据库。
    • Redis配置:修改spring.redis下的host,port,password(如果有)。
    • MQTT配置:找到MQTT客户端的配置项(可能是一个自定义的配置类或@ConfigurationProperties前缀的配置),修改brokerUrl(如tcp://localhost:1883)、clientIdusernamepassword(如果Broker设置了认证)。
  4. 编译与启动:

    • 在项目根目录(包含pom.xml的目录)打开终端。
    • 运行mvn clean compile进行编译。首次运行会下载大量依赖,需要耐心等待。
    • 编译成功后,找到主启动类(通常是有@SpringBootApplication注解的类,如RuoYiApplicationSmartAgriApplication)。
    • 你可以直接在你的IDE(IntelliJ IDEA或Eclipse)中运行这个主类,或者在终端使用mvn spring-boot:run命令启动。
    • 观察控制台日志,如果没有报错,并看到类似 “Started ... in X seconds” 的日志,且Tomcat端口(默认8080)启动成功,说明后端服务已就绪。

实操心得:启动时如果报“端口被占用”错误,可以使用netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Mac/Linux) 找到占用进程并结束它。如果报数据库连接错误,首先检查MySQL服务是否真的在运行,其次检查用户名密码,最后检查数据库名是否拼写正确。MQTT连接失败,首先检查EMQX/Mosquitto服务是否启动,其次用MQTT客户端工具(如 MQTTX)测试Broker是否可连接。

3.2 前端项目本地运行

  1. 环境准备:

    • Node.js:建议安装LTS版本(如18.x)。安装后自带npm包管理器。
    • 检查依赖:在前端项目根目录(包含package.json的目录)打开终端,运行npm installcnpm install(如果你使用了淘宝镜像)。这个命令会根据package.json安装所有依赖包到node_modules目录。
  2. 配置后端API地址:

    • 前端需要知道后端服务在哪里。配置文件通常位于src/config/或根目录下的.env.development文件。
    • 找到配置后端基础URL的地方,例如VUE_APP_BASE_API = 'http://localhost:8080',确保这个地址和端口与正在运行的后端服务一致。
  3. 启动开发服务器:

    • 在终端运行npm run devnpm run serve(具体命令看package.json中的scripts)。
    • 如果成功,终端会输出本地访问地址,通常是http://localhost:80http://localhost:8081。用浏览器打开这个地址。
    • 你应该能看到登录界面。使用数据库初始化脚本中提供的默认账号(通常是admin/admin123)进行登录。

3.3 前后端联调与首个接口测试

登录成功后,你进入的很可能是一个包含仪表盘、系统管理、设备监控等菜单的管理后台。

  1. 验证基础功能:

    • 点击各个菜单,查看页面是否能正常加载。
    • 打开浏览器的开发者工具(F12),切换到Network(网络)选项卡。当你点击页面或切换菜单时,会看到前端向后端发起的API请求。观察这些请求的URL、方法和响应状态。状态码为200表示成功,4xx/5xx表示错误。
  2. 模拟设备数据上报(关键测试):平台的核心是处理物联网数据。后端启动后,它已经在监听MQTT主题。我们需要模拟一个设备上报数据。

    • 使用MQTTX工具,新建一个连接,连接到本地的MQTT Broker(localhost:1883)。
    • 根据后端代码中定义的设备上报主题规则(例如iot/device/{deviceId}/data),发布(Publish)一条JSON格式的模拟消息:
      { "deviceId": "SN001", "timestamp": 1715000000000, "sensors": [ {"type": "temperature", "value": 25.6}, {"type": "humidity", "value": 65.2} ] }
    • 在后端服务的控制台日志中,你应该能看到成功接收到MQTT消息并处理的日志。
    • 刷新前端设备数据页面或仪表盘,查看是否有这条新数据展示出来。这完成了从“设备”->“后端”->“数据库”->“前端”的完整数据流闭环测试。

4. 核心业务模块与代码解读

平台跑起来后,我们来深入代码,看看几个核心业务模块是如何实现的。

4.1 设备管理与通信模块

这是物联网平台的基石。在后端代码中,你可能会找到以下关键部分:

  • 设备注册与鉴权:当一个新设备首次上线时,如何验证其合法性?常见做法是在设备出厂时烧录一个唯一密钥(或证书)。设备连接MQTT时,使用设备编号(SN)和基于密钥生成的Token作为用户名密码。后端有一个设备认证服务,会拦截MQTT连接请求,验证其凭证,并维护一个在线设备列表(通常放在Redis中,键如iot:device:online:{deviceId})。
  • 数据接收与解析:在Spring Boot中,会有一个@Component类实现MqttCallback接口,在messageArrived方法中处理收到的消息。这里会进行:
    1. 主题校验:判断主题是否符合规范。
    2. 数据解析:将JSON格式的payload解析成Java对象(DTO)。
    3. 数据校验:检查数值范围、设备状态等。
    4. 异步处理:为了不阻塞MQTT消息线程,解析后的数据通常会放入一个内存队列(如Disruptor)或直接提交给一个线程池,由另一个服务进行后续的数据持久化告警判断
  • 指令下发:前端用户点击“打开水泵”按钮,这个操作如何传到设备?后端会提供一个REST API(如POST /api/iot/device/{id}/control)。API接收到请求后,会构造一条控制指令(也是JSON格式),通过MQTT客户端发布到设备订阅的特定指令主题(如iot/device/{deviceId}/command)。设备端一直在监听这个主题,收到指令后执行相应动作,并可能回复一个执行结果。

4.2 数据持久化与查询优化

传感器数据源源不断,如何高效存储和查询?

  • 批量插入:在数据持久化服务中,绝对不应该对每一条数据都执行一次INSERT INTO操作。MyBatis-Plus提供了saveBatch方法,可以将多条数据组合在一个事务中插入,极大提升效率。通常会设置一个缓冲区,当数据积累到一定数量(如100条)或超过一定时间(如5秒)时,才批量写入数据库。
  • 数据库分表:application.yml中,你可能会看到关于分表策略的配置。例如,数据表可能按月分表,命名为iot_sensor_data_202405iot_sensor_data_202406。这需要ORM框架(如MyBatis)支持动态表名,或者在SQL中通过逻辑判断。分表能有效控制单表数据量,提升查询性能。
  • 查询接口设计:前端图表需要查询某个设备过去24小时的数据。对应的后端API设计需要考虑:
    • 时间范围参数:startTime,endTime
    • 设备筛选参数:deviceId
    • 聚合查询:对于图表,直接返回原始数据点可能太多。后端可以使用SQL的AVG(),MAX(),MIN()函数,按小时或按分钟进行聚合,返回聚合后的数据,减少网络传输量和前端渲染压力。例如:SELECT HOUR(create_time) as hour, AVG(value) as avg_temp FROM ... WHERE ... GROUP BY HOUR(create_time)

4.3 告警引擎与通知模块

智能的核心在于预警。告警模块通常是一个独立的服务或组件。

  1. 规则定义:在数据库中,alert_rule表可能包含字段:rule_name(规则名)、device_id(适用设备)、sensor_type(传感器类型)、condition(条件,如>,<,=)、threshold(阈值)、severity(严重程度)、enabled(是否启用)。
  2. 实时判断:在数据持久化之前或之后,告警服务会介入。它从Redis或内存中加载所有启用的规则,将刚接收到的数据与相关规则进行匹配。如果sensor_typetemperature的数据value大于规则中设定的threshold,则触发告警。
  3. 告警触发与消警:
    • 触发:创建一条告警记录(alert_log),状态为“未处理”。同时,触发通知动作。
    • 通知方式:可以通过集成短信网关(如阿里云短信)、邮件服务器(Spring Mail)、消息推送(如微信公众号模板消息、钉钉机器人Webhook)等方式通知管理员。代码中会有对应的通知服务类。
    • 消警:当数据恢复正常(如温度低于阈值)后,系统应能自动将告警状态更新为“已恢复”,并可能发送一条恢复通知。这需要记录告警的持续状态,避免重复触发。
  4. 告警防抖:这是一个重要的实践经验。如果传感器数据在阈值附近波动,可能会在短时间内触发上百条告警。需要在逻辑中加入防抖:例如,同一个设备、同一条规则,在10分钟内只触发一次告警,除非告警状态从未处理变为已恢复后再触发。

5. 常见问题排查与性能优化实战

在实际部署和运行中,你一定会遇到各种问题。这里记录一些典型场景和解决思路。

5.1 启动与运行期常见错误

问题现象可能原因排查步骤与解决方案
后端启动时报BeanCreationException1. 数据库连接失败。
2. Redis连接失败。
3. 依赖注入冲突。
1. 检查application.yml中数据库配置,用客户端工具测试连接。
2. 检查Redis服务是否运行,防火墙是否开放端口。
3. 查看完整堆栈信息,定位到具体是哪个Bean创建失败,检查相关类的注解(如@Component,@Service)是否有重复或循环依赖。
前端编译时报Module not found1. 依赖未安装。
2. 引入的组件路径错误。
1. 删除node_modules文件夹和package-lock.json,重新运行npm install
2. 检查报错信息中提到的具体模块,确认在package.jsondependencies中是否存在,版本是否正确。
前端能登录,但所有页面数据为空,控制台报404或5001. 后端API地址配置错误。
2. 后端服务未启动或接口路径不匹配。
3. 用户token失效或权限不足。
1. 检查浏览器Network请求的URL,确认是否指向正确的后端地址和端口。
2. 在后端控制台查看是否有对应请求的日志,检查接口的@RequestMapping路径。
3. 检查登录是否成功,返回的token是否被正确存储在本地(如localStorage),并在后续请求的Header(Authorization)中携带。
MQTT设备数据上报后,前端不显示1. MQTT消息未成功接收。
2. 数据解析或持久化出错。
3. 前端查询逻辑或轮询间隔问题。
1. 在后端控制台搜索MQTT相关日志,确认messageArrived方法是否被调用。
2. 查看数据持久化服务的日志,检查是否有SQL异常。
3. 检查前端请求设备数据的接口是否被正常调用,返回的数据结构是否符合前端预期。
系统运行一段时间后变慢1. 数据库连接池耗尽。
2. 未优化的慢查询SQL。
3. JVM内存溢出或频繁GC。
4. Redis内存占满。
1. 监控数据库连接数,调整连接池配置(如HikariCP的maximumPoolSize)。
2. 开启MySQL慢查询日志,分析并优化耗时长的SQL,特别是涉及大数据量表且没有索引的查询。
3. 使用jstatjmap或VisualVM监控JVM内存和GC情况。
4. 检查Redis的info memory,设置合理的淘汰策略(maxmemory-policy),或排查是否有大Key。

5.2 性能优化与安全加固建议

当项目从Demo走向生产环境时,以下优化至关重要:

1. 应用性能优化:

  • API响应缓存:对于不经常变化的数据,如设备类型字典、区域列表,可以使用Spring Cache注解(如@Cacheable)配合Redis进行缓存,减少数据库查询。
  • 数据库索引优化:传感数据表的查询条件字段上建立索引是必须的。通常需要对device_idsensor_typecreate_time建立复合索引。例如:INDEX idx_device_time (device_id, create_time)。但索引不是越多越好,会影响写入速度。
  • 前端资源优化:
    • 使用npm run build对Vue项目进行生产环境构建,生成的文件经过压缩和混淆。
    • 配置Nginx对静态资源(JS、CSS、图片)开启Gzip压缩和浏览器缓存。
    • 对于复杂的图表页面,考虑使用虚拟滚动或分页加载数据,避免一次性渲染上万条数据点。

2. 安全加固:

  • 接口防护:确保所有业务API(除了登录接口)都受到Spring Security或Shiro的权限拦截。使用@PreAuthorize注解进行方法级细粒度控制。
  • SQL注入防御:坚持使用MyBatis-Plus的条件构造器或#{}参数绑定,绝对禁止在代码中拼接SQL字符串。
  • XSS防护:后端在接收可能包含HTML的内容时,进行转义或过滤。Vue本身对数据绑定有基本的XSS防护,但仍需警惕v-html指令的使用。
  • MQTT安全:
    • 在生产环境,MQTT Broker必须开启用户名密码认证,甚至使用TLS/SSL加密通信。
    • 做好主题权限管理(ACL),防止设备订阅或发布到非授权的主题。
    • 设备端密码不要硬编码,应使用动态令牌或证书认证。

3. 部署升级:

  • 容器化:强烈建议使用Docker和Docker Compose来部署整个应用栈(后端、前端、MySQL、Redis、EMQX)。这能保证环境一致性,简化部署流程。你可以为每个服务编写Dockerfile,并用一个docker-compose.yml文件定义它们之间的关系。
  • 配置分离:将数据库密码、Redis密码、MQTT密钥等敏感信息从代码中剥离,使用环境变量或配置中心(如Nacos、Apollo)管理。Spring Boot可以通过@Value("${}")@ConfigurationProperties注入环境变量。

这个“智慧农业物联网平台”源码包,是一个绝佳的学习范本。它麻雀虽小,五脏俱全,涵盖了从设备接入、数据处理、业务逻辑到可视化展示的全链路。通过拆解它,你不仅能学会如何整合Spring Boot、Vue、MQTT这些技术,更能理解一个真实物联网项目的架构思想和设计模式。在实际操作中,多关注日志,善用调试工具,从数据流的角度去跟踪整个系统的运行,你会收获更多。最后,别忘了根据你的实际业务需求,对这个平台进行定制和扩展,这才是学习开源项目的最终目的。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 4:35:59

沉浸式洗摩托车全流程:从精洗工位到预约工单管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 4:35:25

基于Python与Playwright的京东库存监控与自动下单桌面应用开发实践

简介&#xff1a;这是一套面向个人学习者的京东商品库存监控与自动下单系统源码&#xff0c;适用于希望掌握电商自动化脚本开发、跨平台GUI应用实践及微信消息集成的Python初学者与进阶开发者。系统提供命令行&#xff08;Shell&#xff09;与图形界面&#xff08;GUI&#xff…

作者头像 李华
网站建设 2026/9/4 4:34:49

闲置单反改造AI自动抓拍机:Python+YOLO+相机联机实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 4:34:48

用Python和OpenCV实现音游谱面JSON可视化预览

做音游谱面调校时&#xff0c;最容易出现的问题不是“谱面写不出来”&#xff0c;而是“写出来之后看不到”。谱面在编辑器里是一串串数字&#xff0c;在数据文件里是 JSON 对象或二进制字段&#xff0c;只有把它渲染成一个随时间推进的画面&#xff0c;才能判断键位布局、密度…

作者头像 李华
网站建设 2026/9/4 4:34:43

SQL Server 2008与金蝶KIS专业版部署实战:从安装避坑到运维优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华