大一网安生花了2周,做了一个“土壤墒情+天气对比”系统,踩过的坑比写的代码还多

共 2085字,需浏览 5分钟

 ·

2026-07-19 15:44

先交代一下背景:我在学校的一个项目组里,今年要做一个“土壤墒情与天气对比分析系统”。简单说就是:采集土壤传感器数据(温度、湿度、电导率、pH、氮磷钾),再结合本地天气数据(大气温度、降水量),展示最近14天的每日平均值对比,用图表和表格显示。


我之前学过JavaWeb,但完整做一个小系统还是第一次。从项目初始化到跑通初版,前后约2周。今天把初版提交了,趁热打铁写一篇复盘——不是炫耀,是想把踩过的坑和学习过程记录下来。


---


一、项目是怎么一步步做出来的?


阶段1:数据库设计 & 项目初始化

我基于之前写的“登录系统”扩展,建了两个表:soil_data(土壤数据,每小时一条)、weather_data(天气数据,每小时一条)。用Spring Boot + JPA + MySQL,这个组合挺熟,但一开始就被JDK版本坑了。


阶段2:后端核心功能

需要写接口返回最近14天每日平均值,还要补全缺失的日期(比如某天没数据也要显示0)。我写了原生SQL查询每日均值,然后在Service层用Java补齐日期。同时写了一个定时任务(每小时)模拟生成土壤数据——因为没有真实传感器,先用模拟数据顶住。


阶段3:天气数据导入

导师给了一个Excel(天气与降水量数据.xlsx),我用EasyExcel导入,结果报错:多工作表不支持。折腾半天,最后改用Navicat手动执行SQL插入。后来队友教我一招:先把Excel转成CSV再导入,速度快很多。


阶段4:前端整合 & 联调

前端同学给了初始模板,我把它整合成dashboard.html,放到static目录下。然后写JavaScript调用我的/api/compare和/api/today接口,用ECharts画折线图(温度对比)和双轴图(湿度+降水)。第一次调通看到图表出来时,那10秒钟真的想喊出来。


阶段5:测试 & 文档

手动插了14天测试数据,验证接口返回JSON。然后写技术方案文档、录演示视频、打包提交。


---


二、踩过的坑(以及怎么爬出来的)


坑1:JDK版本不兼容

我本地装的JDK 25,结果Lombok和Spring Boot 3.2.5不兼容,一启动就报ExceptionInInitializerError。查了半小时才发现是JDK版本太高,换成JDK 17才正常。教训:不要用最新的JDK做生产项目,稳定版才是王道。


坑2:Spring Security拦截API

配置了/api/compare,访问却返回“无权限”。因为SecurityConfig默认拦截所有请求,需要显式放行.requestMatchers("/api/**").permitAll()。同理,dashboard.html也被拦截,放行静态资源路径后解决。


坑3:数据库唯一键冲突

插入测试数据时提示Duplicate entry '2026-04-20 00:00:00'。因为我之前插入过重复日期的数据。解决方法:先删除重复数据,再重新插入。以后设计表时要考虑好唯一约束。


坑4:前端图表不显示

控制台报跨域错误,我写了CorsConfig但还是没用。后来发现前端调用的是localhost:8080/api/compare,我后端用localhost:8080没问题,但前端代码里写了绝对路径,导致跨域。统一改成相对路径后解决。


坑5:Modbus串口没实现

因为没有真实传感器,定时任务只能模拟随机数据。这算是一个妥协,但也让我学会了用@Scheduled写定时任务。


---


三、这个项目给我带来了什么?


1. 把“学过”变成“会做”

之前看视频学Spring Boot,感觉都懂。真正动手时才发现:配置跨域、处理日期、补全缺失数据、前端联调……每一个小点都可能是拦路虎。做完这个项目,我才敢说“会用Spring Boot”。

2. 调试能力被动提升

遇到报错,不再像以前那样慌张。能根据日志定位到大概位置,然后去搜解决方案。这个过程很痛苦,但每解决一个bug,能力就涨一点。

3. 为简历和自媒体提供了素材

我已经把这个项目的开发过程写成文章发在知乎(就是这篇),还把代码推到了GitHub。面试时,我可以直接让面试官去看我的项目仓库。

4. 获得了继续迭代的信心

现在系统只是初版,后期可以接入真实Modbus传感器、调用和风天气API、增加地图可视化。每加一个功能,都是对我能力的扩展。


---


四、如果你也准备做类似的项目,几点建议


· 版本统一:JDK、Spring Boot、依赖库的版本要匹配,先跑通最简单的demo再扩展。

· 接口先写死返回值:前端依赖接口才能联调,可以先写一个mock接口返回假数据,让前端先动起来。

· 数据库设计时留好唯一约束:否则后面插入重复数据会很烦。

· 学会用Git:每次大改动前commit一下,错了可以回滚。

· 不要怕问:我遇到Excel导入问题时,问学长才知道可以用CSV。多问能省大量时间。


---


最后

这个项目远没有结束,但能跑通初版,已经是对我这两个星期努力最好的肯定。接下来我还会继续完善它,同时把过程中的收获写成更多文章。


浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报