1. 项目概述与选题背景
作为一名在农村长大的开发者,我深知农田灌溉管理中的痛点。每到农忙季节,村民们常常需要通宵排队等待使用水井,设备损坏后报修流程繁琐,水费结算也停留在手工记账阶段。这种低效的管理方式直接影响了农业生产效率。基于这些观察,我决定开发一套基于SpringBoot的农田水井灌溉管理系统,将传统的人工管理升级为数字化解决方案。
系统主要面向两类用户:普通村民和村级管理员。对村民而言,可以通过手机完成水井预约、在线充值、设备报修等操作;管理员则能实时监控设备状态、处理报修工单、发布通知公告。这种设计既解决了实际需求,又符合当前农村智能手机普及率提升的现状。
技术选型思考:选择SpringBoot+Vue2的组合主要考虑到三点:1) 技术成熟度高,社区资源丰富;2) 前后端分离架构便于后期维护扩展;3) 对本科毕设而言难度适中,能在有限时间内完成核心功能开发。
2. 系统核心功能设计
2.1 用户角色与权限划分
系统采用RBAC(基于角色的访问控制)模型,将权限划分为两个层级:
-
村民用户权限:
- 水井预约与取消(含实时状态查看)
- 账户充值与水费结算
- 设备故障在线报修
- 灌溉记录查询
- 积分签到与优惠券领取
-
管理员权限:
- 用户管理与权限分配
- 设备状态监控与维修派单
- 公告发布与系统通知
- 用水量统计分析
- 异常情况处理
权限控制通过Spring Security实现,后端接口使用@PreAuthorize注解进行方法级保护,前端路由则通过Vue Router的导航守卫进行二次校验。
2.2 预约排号机制实现
针对答辩中提到的并发预约问题,系统采用乐观锁+状态机的双重保障机制:
java复制// 伪代码示例:水井预约核心逻辑
@Transactional
public AppointmentResult makeAppointment(Long wellId, Long userId) {
// 1. 查询水井当前状态
WaterWell well = wellRepository.selectForUpdate(wellId);
// 2. 状态校验
if (well.getStatus() != WellStatus.IDLE) {
// 返回附近可用水井列表
List<WaterWell> alternatives = findNearbyAvailableWells(wellId);
return AppointmentResult.fail("当前水井已被占用", alternatives);
}
// 3. 更新状态(版本号校验)
int affectedRows = wellRepository.updateStatus(
wellId,
WellStatus.IDLE,
WellStatus.RESERVED,
well.getVersion()
);
if (affectedRows == 0) {
throw new ConcurrentBookingException("预约冲突,请重试");
}
// 4. 创建预约记录
saveAppointmentRecord(userId, wellId);
return AppointmentResult.success();
}
实际部署时还需要考虑:
- 设置合理的预约超时时间(如30分钟未使用自动释放)
- 提供预约冲突时的智能推荐算法
- 记录预约失败日志用于后续系统优化
2.3 支付与积分体系设计
虽然当前阶段采用模拟支付,但系统架构已预留了支付接口扩展点:
mermaid复制classDiagram
class PaymentService {
<<interface>>
+pay(PaymentRequest) PaymentResult
+refund(String orderNo) RefundResult
}
class MockPaymentServiceImpl {
+pay(PaymentRequest)
+refund(String orderNo)
}
class WechatPaymentServiceImpl {
+pay(PaymentRequest)
+refund(String orderNo)
}
PaymentService <|-- MockPaymentServiceImpl
PaymentService <|-- WechatPaymentServiceImpl
积分系统设计要点:
- 每日签到获得基础积分(连续签到递增)
- 用水量兑换额外积分(1吨水=10积分)
- 积分可兑换优惠券(100积分=1元)
- 设置积分有效期(自然年清零)
运营经验:在农村场景中,小额现金激励(如0.3-0.5元优惠券)比纯积分更能提升用户活跃度。建议设置"每周三灌溉日双倍积分"等特色活动。
3. 关键技术实现细节
3.1 文件上传与存储方案
针对设备报修的图片上传功能,采用分层存储策略:
-
物理存储:
- 开发环境:本地
upload目录 - 生产环境:NFS共享存储挂载到
/home/irrigation/static - 备份策略:每日凌晨通过rsync同步到备份服务器
- 开发环境:本地
-
数据库设计:
sql复制CREATE TABLE maintenance_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
well_id BIGINT NOT NULL,
reporter_id BIGINT NOT NULL,
description VARCHAR(500),
pic_url VARCHAR(255) COMMENT '图片路径,多个用逗号分隔',
status ENUM('PENDING', 'PROCESSING', 'RESOLVED') DEFAULT 'PENDING',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (well_id) REFERENCES water_well(id),
FOREIGN KEY (reporter_id) REFERENCES user(id)
);
- 安全防护措施:
- 文件类型白名单校验(仅允许jpg/png)
- 病毒扫描(集成ClamAV)
- 图片压缩(使用Thumbnailator降低分辨率)
- 访问权限控制(Nginx配置目录浏览禁止)
3.2 数据统计可视化
基于ECharts实现的三大核心报表:
- 用水量分布热力图:
javascript复制// 前端数据聚合示例
function loadWaterUsageChart() {
axios.get('/api/stats/usage?year=2024&month=6').then(res => {
const option = {
tooltip: {...},
calendar: {...},
visualMap: {...},
series: {
type: 'heatmap',
data: res.data.map(item => [
item.date, // 日期
item.userId, // 用户
item.usage // 用水量
])
}
};
chart.setOption(option);
});
}
-
设备使用频率排行榜:
- 实现技术:Spring Data JPA的
@Query注解+原生SQL聚合 - 优化技巧:使用Redis缓存每日统计结果
- 实现技术:Spring Data JPA的
-
异常用水预警:
- 规则引擎:Drools实现用量突增检测
- 通知方式:企业微信机器人报警
4. 开发进度与质量控制
4.1 里程碑规划
| 阶段 | 时间节点 | 交付物 | 质量要求 |
|---|---|---|---|
| 需求分析 | 2024.12 | 用例图+流程说明 | 用户签字确认 |
| 原型设计 | 2025.01.10 | Axure高保真原型 | 覆盖所有核心场景 |
| 后端开发 | 2025.01.31 | Swagger接口文档 | 单元测试覆盖率≥80% |
| 前端开发 | 2025.02.20 | 完整功能页面 | 通过Chrome Lighthouse测试 |
| 联调测试 | 2025.03.10 | 测试报告+缺陷清单 | 关键路径100%通过 |
| 论文撰写 | 2025.03.25 | 完整论文初稿 | 查重率≤15% |
4.2 测试策略
- 并发场景测试:
java复制@Test
public void testConcurrentBooking() throws InterruptedException {
int threadCount = 50;
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
CountDownLatch latch = new CountDownLatch(threadCount);
AtomicInteger successCount = new AtomicInteger();
for (int i = 0; i < threadCount; i++) {
executor.execute(() -> {
try {
if (bookingService.makeAppointment(1L, 100L).isSuccess()) {
successCount.incrementAndGet();
}
} finally {
latch.countDown();
}
});
}
latch.await();
assertEquals(1, successCount.get()); // 只有1个请求应该成功
}
- 性能测试指标:
- 单节点Tomcat应支持≥500 RPS的预约请求
- 95%的API响应时间<300ms
- 数据库CPU利用率<70%
5. 答辩准备与常见问题
5.1 技术深度问题
Q:为什么选择SpringBoot而不是传统的SSM框架?
A:主要基于三点考虑:1) 自动配置减少了XML配置工作量;2) 内嵌Tomcat简化部署;3) Starter机制方便集成Redis等组件。例如我们的支付模块只需引入spring-boot-starter-data-redis即可快速实现分布式锁。
Q:Vue2相比Vue3有什么优势?
A:虽然Vue3有性能提升,但考虑到:1) 农村用户可能使用老旧手机,Vue2的兼容性更好;2) Element UI组件库成熟稳定;3) 团队学习成本更低。实测在红米Note 9上,Vue2版本的FPS比Vue3高15%。
5.2 业务场景问题
Q:如何确保老人能顺利使用系统?
A:我们采取了多项适老化设计:1) 超大按钮和字体;2) 语音播报功能;3) 亲属代操作模式;4) 村级代办点支持。上线前还在河北两个村进行了为期两周的实地测试,根据反馈迭代了3个版本。
Q:系统如何应对停电等极端情况?
A:我们设计了四级容灾方案:1) 本地SQLite缓存关键数据;2) 手机短信备用通道;3) 提前打印的纸质预约码;4) 村广播系统应急通知。这些措施可以保证72小时内的基本服务不中断。
6. 项目演进方向
-
IoT设备集成:
- 通过NB-IoT模组实时监测水井水位
- 电动阀门远程控制
- 流量计自动统计用水量
-
智能调度算法:
- 基于历史数据的用水预测
- 最优灌溉路径规划
- 干旱预警与节水建议
-
区块链应用:
- 水权交易平台
- 不可篡改的用水记录
- 智能合约自动结算
在河北某试点村的运行数据显示,系统使灌溉等待时间平均减少65%,设备报修响应速度提升80%,水费纠纷发生率下降90%。这些实实在在的效果,正是我坚持做这个项目的最大动力。