1. 项目概述
果蔬种植销售服务平台是一个面向现代农业的数字化解决方案,旨在打通从种植到销售的全流程管理。作为一名参与过多个农业信息化项目的开发者,我在实际开发中发现传统农业产销存在三大痛点:种植数据分散、销售渠道单一、供需匹配低效。这个基于SpringBoot+Vue的全栈系统正是为解决这些问题而生。
系统采用微服务架构设计,主要包含四大核心模块:
- 种植管理:通过物联网设备采集温湿度、光照等环境数据
- 库存管理:实现果蔬产品的入库、出库和损耗统计
- 订单系统:处理B2C和B2B两种交易模式
- 物流跟踪:整合第三方物流API实现配送可视化
技术选型上,后端采用SpringBoot 2.7 + MyBatisPlus 3.5,前端使用Vue3 + Element Plus,数据库为MySQL 8.0。这种组合既保证了系统性能,又具有良好的开发者生态。
2. 技术架构解析
2.1 后端技术栈
SpringBoot作为基础框架,我们做了以下关键配置:
java复制@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.farm.mapper")
public class FarmApplication {
public static void main(String[] args) {
SpringApplication.run(FarmApplication.class, args);
}
}
数据库设计遵循农业业务特点,主要表包括:
crop_growth:记录作物生长周期数据environment_data:存储物联网设备上传的环境指标order_master:订单主表包含支付状态字段inventory:库存表设计时特别加入了批次号字段
2.2 前端工程化实践
Vue3项目采用组合式API开发,核心页面结构:
vue复制<template>
<el-container>
<el-aside width="200px">
<FarmMenu />
</el-aside>
<el-main>
<router-view />
</el-main>
</el-container>
</template>
我们通过Vuex管理全局状态,典型场景如用户登录态:
javascript复制const store = new Vuex.Store({
state: {
userInfo: null
},
mutations: {
setUser(state, payload) {
state.userInfo = payload
}
}
})
3. 核心功能实现
3.1 种植环境监控
物联网设备通过MQTT协议上报数据,后端处理逻辑:
java复制@RestController
@RequestMapping("/api/env")
public class EnvController {
@Autowired
private EnvService envService;
@PostMapping("/upload")
public R uploadData(@RequestBody EnvDataDTO dto) {
if(envService.saveData(dto)) {
return R.ok();
}
return R.error("数据保存失败");
}
}
前端使用ECharts实现数据可视化:
javascript复制const initChart = () => {
const chart = echarts.init(dom)
chart.setOption({
xAxis: { type: 'category' },
yAxis: { type: 'value' },
series: [{ data: envData }]
})
}
3.2 订单支付流程
支付状态机设计:
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> CANCELLED: 用户取消
PAID --> SHIPPED: 发货
SHIPPED --> COMPLETED: 确认收货
对应的订单状态变更代码:
java复制public enum OrderStatus {
PENDING(0), PAID(1), SHIPPED(2),
COMPLETED(3), CANCELLED(-1);
private final int code;
// constructor & getter
}
4. 系统安全设计
4.1 认证授权方案
采用JWT+RBAC的混合模式:
- 用户登录获取token
- 后端校验token有效性
- 根据角色权限过滤接口访问
核心拦截器实现:
java复制public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("Authorization");
if(!jwtUtil.validateToken(token)) {
throw new AuthException("无效token");
}
return true;
}
}
4.2 数据安全措施
敏感数据如用户手机号采用AES加密:
java复制public class CryptoUtil {
private static final String KEY = "farm@2023";
public static String encrypt(String data) {
// AES加密实现
}
}
5. 性能优化实践
5.1 缓存策略
使用Redis二级缓存:
- 一级缓存:MyBatis本地缓存
- 二级缓存:Redis集群
- 缓存雪崩防护:随机过期时间
配置示例:
properties复制spring.cache.type=redis
spring.redis.cluster.nodes=192.168.1.101:6379,192.168.1.102:6379
5.2 数据库优化
针对种植记录表的大数据查询:
sql复制CREATE INDEX idx_crop_date ON crop_growth(crop_id, record_date);
分页查询使用MyBatisPlus优化:
java复制Page<CropVO> page = new Page<>(1, 10);
cropService.page(page, wrapper);
6. 测试与部署
6.1 测试策略
采用分层测试方案:
- 单元测试:JUnit5 + Mockito
- 集成测试:TestContainers
- E2E测试:Cypress
典型测试用例:
java复制@Test
void testOrderCreate() {
OrderDTO dto = new OrderDTO();
// 构造测试数据
Result result = orderService.create(dto);
assertEquals(200, result.getCode());
}
6.2 容器化部署
Docker Compose编排文件:
yaml复制version: '3'
services:
app:
image: farm-service:1.0
ports:
- "8080:8080"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: farm123
7. 开发经验总结
在实际开发中,有几个关键点需要特别注意:
-
物联网数据一致性:设备上报频率过高会导致数据库压力,我们最终采用10秒采样+批量写入的策略
-
订单状态同步:支付回调与系统状态更新存在延迟,通过引入Redis分布式锁解决
-
移动端适配:使用vw单位配合媒体查询,确保在农户使用的千元机上也能流畅操作
-
异常处理:农业场景网络条件差,需要特别处理弱网情况下的数据同步
这个项目让我深刻体会到,农业信息化系统开发需要兼顾技术先进性和使用简便性。下一步我们计划加入AI病虫害识别功能,进一步提升系统的实用价值。