基于SpringBoot3+Vue3的油莎豆种植管理系统

这个系统是做给油莎豆种植场景的:种植户录档案、报数据,农技员给指导,管理员统筹区域和知识库。技术上用 SpringBoot 3.3 + Vue 3 做前后端分离,推荐模块接的是 Weka 的随机森林。下面把从选题到落地的过程复盘一遍,背景、选型、模块设计、测试都写到了。

一、选题背景

油莎豆这东西,接到题目之前我完全没听过。

查了才知道它名字不少:油莎草、铁荸荠、地下核桃、洋地栗,说的都是同一个东西------莎草科的草本植物,吃的部分长在地下,是块茎不是种子。我第一次看到"地下核桃"这个叫法,还以为是核桃的某个品种,翻了半天资料才确认是两码事。

它的特点说白了就俩字:耐折腾。耐旱、耐涝、耐瘠薄,沙地盐碱地都能活,种下去管理粗放,杆叶还能喂牲口。块茎含油率大概 20%~30%,能榨油,也能直接煮着吃、酿酒、做饲料。国内六十年代引种过一轮,后来因为食用油料供给的问题又被翻出来推广,内蒙古、新疆、河北、山东这些地方现在都有种植。

但"能种"和"种得好"是两件事。

查资料的过程中我记下几个比较典型的场景:种植户大多凭经验,啥时候下种、施多少肥、啥时候收,靠的是上一季的记忆和邻里之间互相打听;农技员一个人管好几个乡镇,根本跑不过来,只能靠电话和微信群零散应付;收完之后产量多少、哪个品种表现好、哪块地掉了产,这些数据基本都没留下来,第二年还是从头摸。

细想下来,信息断在三个地方:地块和种植过程没绑定、技术指导没留痕、产量数据没沉淀。这三件事恰好都是信息系统该干的活。

也有人会问,市面上没有现成的吗?我专门搜过一圈"种植管理系统",找到的东西大致两类:一类是农产品商城,把油莎豆做成商品挂上去卖,本质是电商,跟"怎么种"一点关系没有;另一类是论文里的框架图,模块画得挺齐,但没有一块地、一份档案是真数据。真正围绕种植过程做的------档案、地块、产量预估、农技指导------几乎没有能直接参考的。

所以这个系统最后收敛成四件事:把地块和种植过程绑起来,把农技指导的过程留痕,把产量数据沉淀下来做横向对比,把知识整理成能查的库。后面讲技术选型和模块设计,基本都是围着这四件事转的。

二、技术选型

整个项目用到的技术如下:

|--------------|--------|----------|
| 技术 | 版本 | 用途 |
| JDK | 17 | 运行环境 |
| Spring Boot | 3.3.0 | 后端框架 |
| MyBatis-Plus | 3.5.5 | ORM 持久层 |
| MySQL | 8.0 | 数据库 |
| Vue | 3.5.13 | 前端框架 |
| Element Plus | 2.11.3 | UI 组件库 |
| Vue Router | 4.5.1 | 前端路由 |
| Axios | 1.9.0 | HTTP 请求 |
| Weka | 3.8.5 | 随机森林推荐模型 |

三、系统功能一览

这个系统包含前台种植户模块、后台模块(管理员、农技员)三部分,具体功能如下:

1. 前台种植户模块

  • 基础功能模块:系统首页、农技员介绍、知识库、公告资讯、论坛交流、站内咨询(与农技员在线沟通);
  • 个人中心功能:修改密码、个人信息维护、我的地块、种植档案管理(含档案完善、产量预测)、种植指导查看、我的收藏。

2. 后台管理员模块

  • 全流程管理功能:系统首页、种植户管理、农技员管理、区域管理、地块管理、种植档案管理、种植指导管理、产量预测管理、知识库管理、档案完善管理、使用报告管理、公告资讯管理、论坛交流管理、系统管理(智能AI、轮播图管理)、个人中心。

3. 后台农技员模块

  • 业务功能:系统首页、种植档案管理、种植指导管理、产量预测管理、档案完善管理、个人中心。

该系统聚焦农业种植服务场景:种植户在前台自助填报档案、获取知识和指导,农技员在后台执行指导业务,管理员统筹区域地块与知识资源,实现种植过程的数据化、规范化管理,提升农技服务效率。

四、项目截图

五、亮点模块:Weka 随机森林做混合推荐

这个项目里我自己最满意的模块是推荐部分。没有用毕设烂大街的"基于用户的协同过滤+自己手写相似度",而是接了 Weka:

复制代码
// 推荐工厂:支持两种协同过滤 + 随机森林模型混合
@Component
public class RecommendAlgorithmFactory {
    // 用户-物品矩阵推荐(用协)
    private static final Map<Long, Map<Long, Double>> userItemMatrix
            = new ConcurrentHashMap<>();
    // 物品-用户矩阵推荐(物协)
    private static final Map<Long, Map<Long, Double>> itemUserMatrix
            = new ConcurrentHashMap<>();
​
    // Weka RandomForest 训练模型,持久化到 models/ 目录,带缓存
}

设计思路是三层:先构建用户-物品矩阵做协同过滤,再用 Weka 的 RandomForest 训练分类模型,最后混合推荐 ------冷启动阶段靠协同过滤兜底,数据量上来之后机器学习模型的权重逐渐加大。模型持久化到 algorithm/recommend/models/ 目录,加了 ConcurrentHashMap 缓存避免每次请求都重新加载。

六、系统功能测试

按黑盒方式把主流程过了一遍:

|----|-----------|----------------|-----------|----|
| 序号 | 测试功能 | 操作 | 预期 | 结果 |
| 1 | 种植档案录入 | 填写地块、作物、生长周期信息 | 保存成功,列表可见 | 通过 |
| 2 | 区域与地块管理 | 新增区域并下挂地块 | 两级层级展示正确 | 通过 |
| 3 | 产量预测填报 | 录入预测数据 | 保存并可查看详情 | 通过 |
| 4 | 农技指导与站内聊天 | 农技员发指导,种植户提问 | 消息收发正常 | 通过 |
| 5 | 知识库与论坛 | 发帖并收藏 | 收藏列表实时更新 | 通过 |
| 6 | 个性化推荐 | 登录后进推荐页 | 返回混合推荐结果 | 通过 |

再补一组边界用例,验证录入的校验逻辑:

|----|------|--------------|--------------|----|
| 序号 | 测试功能 | 操作 | 预期 | 结果 |
| 1 | 档案录入 | 必填项地块留空提交 | 提示地块必填,不入库 | 通过 |
| 2 | 区域管理 | 新增重名区域 | 提示区域已存在 | 通过 |
| 3 | 用户登录 | 密码错误 | 提示账号或密码错误 | 通过 |
| 4 | 用户登录 | 普通用户选管理员角色登录 | 角色校验拦截 | 通过 |
| 5 | 知识库 | 删除已被收藏的帖子 | 级联校验,不允许直接删除 | 通过 |

七、写在最后

这个项目给我最大的收获是想清楚了一件事:农业信息化的难点不在技术,在数据从哪来。系统里档案填报的完整率是整个平台价值的地基,而让种植户愿意填、填得对,比写一个随机森林难多了------这个问题的答案在产品交互里,不在代码里。

后面会继续写这个系列的其他项目,下一篇讲图书馆座位预约系统的优化,核心是预约超卖问题怎么用原子扣减解决。感兴趣的可以关注。

相关推荐
小码哥_常7 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮9 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
代码山河9 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行9 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设10 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者10 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
她说可以呀10 小时前
Vue插槽
前端·javascript·vue.js
qq_4480111610 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
zzu123zsw11 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp