基于SpringBoot+Vue的智慧菜园管理系统开发实战
发布时间:2026/8/31 11:20:16 作者:尧图编辑部 阅读量:1,286

简介本资源是一套面向计算机专业本科生的毕业设计级智慧农业管理系统实战项目聚焦城市居民菜园租赁、种植服务与农产品交易等真实场景助力学生快速完成毕业论文与答辩。资源包含完整的前后端工程后端基于Spring Boot291个Java文件35个XML配置前端采用Vue 3框架98个Vue组件76个JS逻辑8个SCSS样式辅以MySQL数据库脚本2个SQL文件及详细部署文档含package.bat、run-web.bat等一键脚本和.env.development环境配置。全包共649个文件体积仅2.3MB结构清晰、模块解耦涵盖系统管理、用户权限、菜园/菜种信息维护、农事服务预约与在线租赁购买等核心业务。已有31人学习下载开箱即可运行特别适合需要完整可演示系统、规范分层代码结构及标准化部署流程的毕设开发者。 搞这个智慧菜园管理系统起因其实特别简单——家里老人有几块菜地天气一热就担心干旱出门办事心里也总惦记着。我在想能不能做一个Web系统把菜园的土壤湿度、温度、光照这些数据都收到一个平台上远程看一眼就能知道该不该浇水甚至直接远程把灌溉阀门打开。后来这个事越做越大从最初一个简单的传感器数据上报接口一步步加上了用户体系、设备管理、历史曲线、自动灌溉策略这些模块最终就形成了一个完整的“基于SpringBootVue智慧菜园管理系统”。这篇文章我想把完整的落地过程拆开揉碎从技术选型、数据库设计到前后端编码、最终部署到服务器一条线说清楚。不论你是还在上课的在校学生需要做课程设计或者毕业设计参考还是刚入行的后端开发想了解一个完整全栈项目的结构和部署链路这套系统都非常适合拿来对照学习。它麻雀虽小、五脏俱全覆盖了一个典型业务系统从0到1的百分之八九十的核心问题权限怎么控制、实时数据怎么推给前端、定时任务怎么设计、前后端分离的项目到底怎么部署。整个过程我会尽量按照“先想清楚为什么——再动手做——最后复盘踩过的坑”来展开不堆概念全部是实际落地时的真实选择你看完可以直接照着一套思路去复刻也可以把里面的模块替换成你自己的业务场景比如把它改成鱼塘监控、养殖场环境监测核心逻辑是相同的。1. 项目启动前必须想清楚的三件事1.1 这个系统到底要解决什么问题很多人在做这一类管理系统时容易犯一个方向性错误上来就画功能列表用户管理、设备管理、数据管理、订单管理什么都往上加最后做出来就是一个大杂烩答辩或者演示的时候根本没什么亮点。智慧菜园管理系统要解决的核心问题只有一个减少人的低效介入用数据辅助决策。老人种菜什么时候该浇水、该浇多少靠的是经验和直觉而系统要做的就是把这些经验量化。土壤湿度低于某个阈值就提醒甚至自动打开灌溉阀门空气温度过高就启动风扇或者遮阳帘。整套系统的价值锚点是把“看天吃饭”变成“看数据吃饭”。围绕这个问题核心功能模块其实就四大块环境数据采集与展示通过传感器或模拟数据采集温度、湿度、光照强度、土壤湿度等。设备远程控制手动或自动控制灌溉阀门、风扇、遮阳帘等执行设备。用户与权限管理区分管理员、普通用户不同角色看到不同操作粒度。历史数据记录与曲线分析让用户看到环境变化的趋势辅助后续的种植决策。把这几件事做好系统就已经非常有说服力了。其他花哨功能比如社区分享、商城购买跟“智慧菜园”的核心价值关系不大在这个阶段最好是留着不做控制住项目范围才能控制住工程质量。1.2 为什么采用前后端分离而不是模板引擎我在调研这个项目的时候查了挺多网上的参考大量方案用的还是SpringBoot Thymeleaf这类服务端渲染模式页面和服务端耦合在一起。这种方案对于简单场景问题不大但既然系统中包含大量的实时数据展示、轮询刷新图表、开关控制这类交互需求采用前后端分离明显更合适。前后端分离的核心优势在于前端只负责消费数据、渲染视图后端只负责提供API和业务逻辑两者通过JSON进行通信。开发时可以让Vue的调试服务器和后端各跑各的端口启用跨域配置之后互不干扰部署时再由Nginx统一转发把静态页面和API聚合到同一个入口。这套系统的“智慧”体现在数据驱动前面的动态交互组件非常多使用Vue来做数据绑定和状态管理比服务端模板要灵活一个量级。所以技术栈定为SpringBoot Vue不是一个随大流的决定而是根据项目功能特点自然推导出来的选择。2. 技术选型为什么这么定从数据流动的视角看2.1 后端SpringBoot是“稳”的代名词后端选Java SpringBoot首先是生态成熟。Spring Boot本身把Spring家族的配置简化了很多起步依赖、自动配置、内嵌Tomcat这三大特性让一个Web项目从创建到能跑起来只需要几分钟。而且在国内社区里SpringBoot的资料多到看不完遇到问题几乎都能查到现成答案。在这个项目里SpringBoot承担的任务主要有四块提供RESTful接口接收传感器数据上报供前端页面拉取数据。用Spring Data JPA或MyBatis操作MySQL数据库持久化设备、用户、数据记录。用Spring Security JWT做用户认证和接口权限控制。用Spring Schedule写定时任务实现自动灌溉策略扫描。2.2 前端Vue的响应式机制跟监控场景天然契合Vue的响应式机制是它区别于纯JavaScript操作DOM最大的优势。以菜园监控大屏为例页面需要每5秒刷新一次最新环境数据如果是用原生JS你得手动找到对应的DOM元素再逐条更新数值或样式而在Vue里只需要把数据变量绑定到页面上请求拿到新数据后直接把data里的值覆盖掉页面上的所有绑定位置自动同步更新整个逻辑简洁太多了。Vue搭配Element UI组件库像设备开关、表格、对话框、表单验证这些通用的界面元素都能通过组件直接复用开发效率提升非常明显。图表部分用ECharts折线图展示昼夜温湿度变化一眼就能看出环境趋势。2.3 数据库MySQL依然是小团队单机的省心之选虽然现在国内有不少人在谈国产数据库、分布式数据库但说实话对于一个智慧菜园管理系统这类中小规模应用MySQL单实例完全够用。原因很简单数据量级一天就算100台设备每台每分钟上报一条数据一天也才14万条左右一个月400多万条。这个量级放在MySQL上只要索引建对了查询性能根本不用太担心。另外一个加分项是MySQL运维成本低。开发环境本地装一个实例生产环境用Docker起一个容器数据卷挂载好备份也就是一条mysqldump命令。后面如果数据量真的大到单表扛不住了再考虑分表或换大数据组件也不迟没必要一开始就把架构做得太重。2.4 整体架构怎么串起来从数据流动的角度看整个系统结构非常清晰[传感器设备 / 模拟数据脚本] ↓ HTTP上报 [SpringBoot 后端服务 :8080] ↓ JSON API [Vue 前端工程 :5173(开发) / Nginx静态文件(生产)] ↓ 读取 [MySQL 数据库 :3306] [部署时Nginx监听80端口将 /api 反向代理到后端服务]传感器硬件在真实环境中可能通过ESP8266/树莓派采集数据但如果没有硬件环境我们可以写一个Python脚本或者用Postman定时模拟上报数据系统的核心逻辑完全可以用模拟数据来验证。这样即使你没有接触过嵌入式开发也不影响整条链路的联调。3. 数据库设计是一切的底座从菜地抽象出数据模型3.1 先梳理实体关系再写建表语句很多同学做数据库设计时喜欢直接开写SQL建了表再说后面发现关联关系对不上又重新删表、改字段非常浪费时间。我的习惯是先在脑子和草稿纸上把实体关系理清楚。智慧菜园管理系统涉及到的主要实体有这些用户user系统使用者包含管理员和普通用户。菜地/区域garden一个系统可以管理多个菜园片区每个菜园有自己的名称和位置描述。传感器设备sensor部署在菜园里的环境采集设备每个设备属于某个菜园。环境数据environment_data传感器上报的实时数据记录这是数据量最大的表。执行设备device阀门、风扇、遮阳帘等可控设备。控制记录control_log手动或自动下发控制指令的记录。自动化策略automation_rule用户配置的触发规则例如“土壤湿度低于30%时自动开阀”。实体关系上一个用户可以对应多个菜园一个菜园有多个传感器和多个执行设备一个传感器持续产生多条环境数据。这是一个典型的1对N关系建模的时候直接通过外键字段关联即可。3.2 核心表结构设计我挑选几张核心表把关键字段和设计意图写出来。user用户表字段名类型说明idbigint主键自增usernamevarchar(50)登录名唯一索引passwordvarchar(255)存储加密后的密码nicknamevarchar(50)昵称rolevarchar(20)admin / usercreated_atdatetime创建时间密码字段这里存的是BCrypt加密后的密文千万不要明文存储这是常规合规底线。garden菜园表字段名类型说明idbigint主键user_idbigint所属用户IDnamevarchar(100)菜园名称locationvarchar(200)位置描述areadecimal(10,2)面积平方米created_atdatetime创建时间sensor传感器表字段名类型说明idbigint主键garden_idbigint所属菜园IDsensor_codevarchar(50)设备编号比如 S001sensor_namevarchar(50)传感器名称sensor_typevarchar(20)类型温度/湿度/土壤湿度/光照statustinyint在线状态0离线 1在线environment_data环境数据表字段名类型说明idbigint主键sensor_idbigint传感器IDdata_valuedecimal(10,2)采集值collect_timedatetime采集时间这张表就是业务分析报表的数据来源。查询最多的是“某个时间范围内某传感器的平均值、最大值、最小值”所以索引设计为(sensor_id, collect_time)的联合索引能覆盖绝大多数统计查询。device执行设备表字段名类型说明idbigint主键garden_idbigint所属菜园IDdevice_codevarchar(50)设备编号device_namevarchar(50)设备名称device_typevarchar(20)阀门/风扇/遮阳帘statustinyint当前开关状态0关 1开modetinyint控制模式0手动 1自动automation_rule自动化规则表字段名类型说明idbigint主键garden_idbigint所属菜园IDsensor_typevarchar(20)监控的数据类型operatorvarchar(10)比较符小于/大于thresholddecimal(10,2)阈值device_idbigint触发的设备IDactiontinyint动作0关闭 1开启enabledtinyint是否启用规则这种规则表的设计属于“可配置化”的通用模型用户不用改代码就能新增一条自动灌溉规则灵活性和实用价值都会高很多。3.3 数据量增长后的处理思路环境数据表是增长最快的表单表查询一段时间后可能会有压力。后期的优化思路有两个方向按天或者按月进行分区让历史数据查询只扫描对应分区。写定时任务定期把30天前的明细数据归档到environment_data_history表。这两个操作在系统上线初期可以不做但设计表结构时要保证分区能加上别等到上百万数据了才考虑。4. 后端编码落地从构建骨架到业务接口4.1 项目初始化的两三次踩坑创建SpringBoot项目时我最开始图省事直接用IDEA内置的Spring Initializr选择3.x版本结果后面踩了不少坑一些老版本的依赖比如mybatis-plus和springdoc兼容性在3.2版本上出了问题WARN日志刷屏还偶发启动失败。后来我统一改用了SpringBoot 2.7.18这是2.x的最终版本稳定性和兼容性都经过了长时间验证。配套的JDK用1.8或者11MyBatis-Plus用3.5.3MySQL驱动用8.0.33这些组合在一起非常顺手。在pom.xml中引入的核心依赖大概长这样dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependency4.2 项目目录结构后端代码的组织我按照常见的分层架构来拆包清晰且好维护com.smart.garden ├── controller # 接口层接收HTTP请求 ├── service # 业务逻辑层 ├── mapper # 数据访问层 ├── entity # 数据库实体类 ├── dto # 数据传输对象 ├── config # 配置类跨域、安全、定时任务 ├── common # 统一返回结果、异常处理 └── scheduler # 定时任务4.3 统一返回结果与全局异常处理前后端分离通信最忌讳的就是每个接口返回的数据格式不一样。我在项目里定义了一个统一的返回结构Data public class ResultT { private Integer code; // 200成功500失败 private String message; // 提示信息 private T data; // 数据 }在Controller里只需要一行return Result.success(data);配合RestControllerAdvice做全局异常处理异常时自动返回统一格式的错误信息。这样做的好处是前端的Axios拦截器只需要统一判断code字段就能决定是走业务逻辑还是弹错误提示不需要每个接口单独处理。4.4 核心接口设计这里列一下重要的接口基本就是系统的核心API面。用户模块POST /api/user/login 登录传入账号密码返回JWT token。POST /api/user/register 注册GET /api/user/info 获取当前登录用户信息菜园与设备模块GET /api/garden/list 查询当前用户下所有菜园POST /api/garden 新增菜园GET /api/device/list?gardenIdxx 查询菜园下的设备列表POST /api/device/control 控制设备开关参数为deviceId和action环境数据模块POST /api/sensor/data/report 接收传感器数据上报GET /api/sensor/data/latest?deviceIdxx 获取某传感器最新一条数据GET /api/sensor/data/history?sensorIdxxstartTimexxendTimexx 获取历史数据用图表展示其中设备控制接口是最核心的这里不只是数据库里改status就行还要考虑接口安全性。用JWT认证拦截之后用户只能控制自己菜园下的设备。同时在控制执行后写一条control_log记录方便审计。4.5 传感器数据上报接口的幂等性设计硬件上报数据时由于网络不稳定很可能会重复上报同一条数据。如果不去重会导致历史曲线出现多个相同的点统计结果也不准确。我的处理方案是在环境数据表中增加一个唯一键由sensor_id collect_time拼接作为唯一索引上报时如果重复则更新数值而不是新增这样既保证了数据不会重复增长也给了硬件断线重传的容错空间。ALTER TABLE environment_data ADD UNIQUE KEY uk_sensor_time (sensor_id, collect_time);上报接口的业务逻辑加上INSERT ... ON DUPLICATE KEY UPDATE或者先查再插都可以。4.6 定时任务自动灌溉策略怎么实现自动灌溉是“智慧”二字的重点体现。思路其实非常简单直接程序每隔一分钟扫描一次全部启用的自动化规则检查当前最新的传感器数据是否触发阈值条件如果满足就调用设备控制逻辑开启设备同时写入控制日志。用SpringBoot自带的Scheduled注解即可实现Component Slf4j public class AutomationScheduler { Autowired private AutomationRuleService ruleService; Scheduled(cron 0 0/1 * * * ?) public void scanRules() { ListAutomationRule rules ruleService.listEnabledRules(); for (AutomationRule rule : rules) { ruleService.executeRule(rule); } } }这里的难点在于避免重复触发比如土壤湿度低于30%开阀那阀门已经开了湿度上升之前可能一直在阈值以下如果每分钟都会被触发一次设备就会被重复打开很多次。需要在executeRule里加一层判断当设备已经是目标状态时就不再下发控制指令。4.7 JWT认证与权限控制用户登录成功后后端生成一个JWT token返回给前端后续前端每次请求都在Header中带上这个token。后端用一个拦截器统一解析token校验通过后把用户信息放入请求上下文。具体实现我做了两个注解AuthRequired需要登录才能访问AdminOnly只有管理员能访问拦截器里通过HandlerMethod拿到方法上的注解再对token进行校验。这种“注解式权限控制”写起来不啰嗦也特别直观。有人会问为什么不用Spring Security那套默认的完整配置因为默认的Security配置在学习成本上偏高拦截规则和配置项非常多对于这种中小项目直接基于拦截器配合JWT来实现已经足够安全、可控。当然如果把参数校验和密码加密也算进去安全防护的覆盖面是能过关的。5. 前端实战Vue3 Element Plus 构建管理界面5.1 前端工程搭建前端我选择了Vue 3 Vite Element Plus Pinia Vue Router Axios这套组合。Vite比Webpack的冷启动速度快太多开发体验好很多。创建工程npm create vitelatest smart-garden-web cd smart-garden-web npm install npm install element-plus element-plus/icons-vue axios vue-router pinia echarts5.2 前端项目目录设计src ├── api # 接口请求封装 │ ├── user.js │ ├── garden.js │ └── sensor.js ├── assets # 静态资源 ├── components # 公共组件 ├── router # 路由配置 ├── store # Pinia状态管理 ├── views # 页面 │ ├── Login.vue │ ├── Dashboard.vue # 监控大屏 │ ├── GardenManage.vue # 菜园管理 │ ├── DeviceManage.vue # 设备控制 │ └── HistoryChart.vue # 历史曲线 └── utils └── request.js # Axios封装5.3 Axios拦截器统一处理token和错误码前端所有接口请求我都封装到一个request.js工具里。Axios请求拦截器负责把token塞进请求头响应拦截器负责统一处理业务错误码和HTTP异常遇到401时自动跳转到登录页。import axios from axios import { ElMessage } from element-plus import router from /router const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${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 { if (error.response?.status 401) { router.push(/login) } ElMessage.error(error.message || 请求失败) return Promise.reject(error) } ) export default request这里在开发环境的baseURL用的是/api然后通过Vite的proxy把请求转发到后端的8080端口避免了跨域问题。部署到生产环境时同样是/api前缀由Nginx转发到后端这里的前缀约定千万别改乱。5.4 监控大屏的数据刷新机制Dashboard页面是这套系统的门面上面展示了多个菜园的实时温度、湿度、土壤湿度和光照数据。我的实现方式是组合使用两种刷新策略首次加载后立即请求一次数据。使用setInterval每5秒请求一次数据。由于是定时轮询所以要做好组件销毁时清理定时器的工作避免页面切换到其他路由后定时器还在跑造成不必要的请求污染。script setup import { ref, onMounted, onUnmounted } from vue import { getLatestData } from /api/sensor const sensorData ref([]) let timer null const fetchData async () { const res await getLatestData() sensorData.value res } onMounted(() { fetchData() timer setInterval(fetchData, 5000) }) onUnmounted(() { if (timer) clearInterval(timer) }) /script如果后续接入了WebSocket或SSE就可以把轮询替换成长连接推送实时性更好服务端压力也更小。但对项目初版来说5秒轮询的实现方式完全够用。5.5 ECharts历史曲线怎么做历史曲线页面是最能展现“智慧”价值的地方。我使用ECharts来画折线图展示一天内温度、湿度的变化趋势。从后端拉取历史数据之后把数据按时间排序再分别提取时间和数值两个数组作为ECharts的xAxis和series数据传入即可。需要注意时间格式化别只给后端返回的ISO字符串否则x轴标签显示很难看。import * as echarts from echarts const chart echarts.init(document.getElementById(chart)) chart.setOption({ tooltip: { trigger: axis }, xAxis: { type: category, data: timeList }, yAxis: { type: value }, series: [{ name: 温度, type: line, smooth: true, data: valueList }] })响应式容器大小变化后记得调用chart.resize()否则图表会变形。5.6 设备控制面板的交互细节设备控制面板上一个设备一个卡片显示设备名称、类型、状态、控制模式。手动控制模式下用户点击开关按钮前端调用设备控制接口后后端返回最新的设备状态前端再刷新页面状态。这里的交互有一个小坑两个用户在同一时间内操作同一个设备时后面那个人可能会拿到过期状态。比如用户A开了阀门用户B页面上还是“关”他点了一下“开”后端判断当前状态和目标状态相同就拒绝操作并且返回当前真实状态。这一个“状态校验放后端”的设计避免了很多并发控制的问题。6. 部署上线从本地到服务器的最后一公里6.1 部署方案概览部署方式最开始我直接在后端服务器上用java -jar跑了一个jar包前端直接打dist包然后扔给Nginx。整套方案灵活、可控、成本低也更适合中小型项目。一共就三个环节后端打包为可执行jar包部署在服务器的8080端口。前端npm run build生成dist静态文件交给Nginx托管。Nginx把/api开头的请求反向代理到后端。6.2 后端环境准备与打包细节服务器是Linux建议装一个JDK 8或JDK 11、MySQL 8.0、Nginx。打包前记得把application.yml里的数据库连接地址改成服务器地址账号密码也改成生产环境的。项目根目录执行mvn clean package -DskipTests打包完成后在target目录下生成smart-garden-0.0.1-SNAPSHOT.jar然后上传到服务器。启动命令加一个nohup防止进程被关闭nohup java -jar smart-garden-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod app.log 21 这里为了区分环境我建了application-dev.yml和application-prod.yml不同环境只改配置不改代码。6.3 数据库脚本执行打包之前先把数据库准备好。在MySQL中执行项目里的sql/init.sql它会自动创建数据库、数据表并写入初始管理员账号。执行命令mysql -u root -p init.sql生产环境建议单独创建一个专用账号不要直接用root连接最小权限原则在这里同样适用。6.4 前端打包与Nginx配置前端打包前需要确认接口代理配置。由于生产环境是直接把dist部署到Nginx开发时的Vite代理不再生效所以需要在Nginx里配一条反向代理规则把前端发起的/api请求转发到后端的8080端口。nginx.conf关键配置server { listen 80; server_name your-domain.com; # 前端静态文件 location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } # 后端接口反向代理 location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }前端构建npm run build生成的dist目录整个上传到/usr/share/nginx/html下面。注意try_files $uri $uri/ /index.html;这一行它的作用是把路由的“刷新404”问题解决掉vue-router的history模式必须要有这行配置否则刷新页面就崩。6.5 部署后的验证全部部署完成后按顺序验证浏览器访问http://服务器IP/能看到登录页面。登录admin账号验证用户模块正常。用Postman或脚本上报一条模拟传感器数据然后在监控大屏上看到数值刷新。切换设备手动控制开关验证控制记录日志是否有更新。配置一条自动灌溉规则把阈值调到当前数据的反方向等定时任务扫描看设备是否被自动触发。如果这些步骤都通过就说明整条链路已经完全跑通了。7. 我踩过的坑和优化建议7.1 跨域问题开发阶段Vue默认在5173端口后端在8080端口直接访问会发生跨域。最省事的方案是开发时用Vite的server.proxy配置而不是在后端写CrossOrigin注解。CrossOrigin虽然也能解但只是前端开发调试时方便生产环境中用Nginx反代时还要再处理一遍容易混乱配置不统一就是事故温床。7.2 Vue路由刷新404这个问题前面Nginx配置已经提到了凡是用了Vue Router的history模式部署到Nginx必须保留try_files配置。如果不加用户在某个路由页面按F5刷新Nginx找不到对应的磁盘路径就会返回404。7.3 数据库连接时区问题数据库连接串后面一定要加serverTimezoneAsia/Shanghai否则MySQL 8.0默认的UTC时区会让时间所有记录都偏差8小时。这个坑在部署之后查看曲线图时特别容易暴露一开始我没注意图表里的温度曲线时间轴整体偏移排查了半天才发现是时区配置的问题。7.4 定时任务在集群环境下的重复执行如果系统部署了多台后端实例做负载均衡Scheduled默认会在每台实例上各执行一次自动灌溉会有重复触发风险。解决办法包括用一个数据库分布式锁或者把定时调度抽出来单独部署一个调度服务。单机部署就不用考虑这些问题但如果后续扩展要提前知道这个坑。7.5 功能优先后可以怎么扩展这个系统跑通之后可以扩展的方向非常多接入MQTT协议让物联网设备通过消息队列推送数据代替HTTP主动上报。接入WebSocket把实时数据从5秒轮询升级为服务端主动推送。引入告警通知湿度低于阈值时用短信/邮件推送给用户。接入大模型根据菜园历史数据生成种植建议文书这个方向这两年很热。7.6 关于版本号的选择最后特别说一下SpringBoot版本。我吃了版本太新的亏之后更推荐大家采用稳定版本了。如果你是在校学生或者项目时间紧张直接用2.7.x系列把重点放在业务逻辑上不要花大量时间跟依赖兼容性问题纠缠。等哪天需要用到JDK 21的新特性或者虚拟线程什么的了再考虑升级到Spring Boot 3.x也不迟。整套系统的设计和实现过程最大的感悟是很多同学们做大项目时容易一上来就撸代码结果越做越乱。真正能拿得出手的智慧菜园管理系统一定是从需求边界、数据模型、接口设计一路想明白之后代码反而是水到渠成的事。你看完如果照着这个思路自己过一遍把里面的字段名改成自己习惯的把业务场景替换成你所在的地方需要的问题相比直接拿别人的代码改一改收获和最终的完成度都会高很多。项目本身不难难的是从头到尾把每一环都做好。希望这篇实操记录能帮你少走一些我走过的弯路。本文还有配套的精品资源点击获取