1. 项目背景与核心价值
去年帮老家亲戚卖滞销苹果的经历让我深刻体会到传统农产品流通的痛点。农户守着满园果子却找不到销路,批发商抱怨货源不稳定,消费者又买不到新鲜实惠的农产品。这种多方困境正是阳阳助农电商平台要解决的核心问题。
作为一个基于SpringBoot的全栈项目,这套系统实现了农产品从产地到消费者的数字化链路。农户可以直接上传产品信息,商户能实时查看货源情况,消费者则享受一站式购物体验。特别在疫情后时期,这种去中间化的电商模式让老家亲戚的苹果销量同比增加了40%。
2. 技术架构设计解析
2.1 整体技术选型
采用经典的三层架构设计:
- 前端:Thymeleaf模板引擎 + Bootstrap4
- 后端:SpringBoot 2.7 + Spring Security
- 数据库:MySQL 8.0(考虑JSON字段支持)
选择这套组合主要基于:
- 开发效率:SpringBoot的自动配置特性大幅减少XML配置
- 安全性:内置的CSRF防护和密码加密机制
- 扩展性:MySQL的分片集群方案成熟
2.2 数据库关键设计
2.2.1 核心表结构
sql复制CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`farmer_id` bigint NOT NULL COMMENT '关联农户ID',
`category_id` int DEFAULT NULL COMMENT '分类ID',
`name` varchar(100) NOT NULL,
`origin` varchar(50) DEFAULT NULL COMMENT '产地',
`price` decimal(10,2) NOT NULL,
`stock` int DEFAULT '0' COMMENT '库存',
`status` tinyint DEFAULT '1' COMMENT '1上架 0下架',
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
KEY `idx_farmer` (`farmer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2.2 订单状态机设计
使用枚举实现订单状态流转:
java复制public enum OrderStatus {
UNPAID, // 待支付
PAID, // 已支付
SHIPPED, // 已发货
COMPLETED, // 已完成
CANCELLED, // 已取消
REFUNDED // 已退款
}
3. 核心功能实现细节
3.1 多角色权限控制
采用RBAC模型实现五类角色权限隔离:
- 农户:/farmer/**
- 商户:/merchant/**
- 客服:/support/**
- 管理员:/admin/**
- 顾客:/customer/**
Spring Security配置示例:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/farmer/**").hasRole("FARMER")
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll();
}
3.2 农产品发布流程
农户端关键代码逻辑:
java复制@PostMapping("/products")
public String createProduct(@Valid ProductForm form,
@AuthenticationPrincipal Farmer farmer) {
// 验证库存数量
if(form.getStock() <= 0) {
throw new IllegalArgumentException("库存必须大于0");
}
Product product = new Product();
BeanUtils.copyProperties(form, product);
product.setFarmerId(farmer.getId());
productService.save(product);
return "redirect:/farmer/products";
}
3.3 批发订单处理
商户采购时的并发控制方案:
java复制@Transactional
public Order createWholesaleOrder(OrderDTO dto) {
// 使用悲观锁保证库存准确
Product product = productRepository.findByIdForUpdate(dto.getProductId());
if(product.getStock() < dto.getQuantity()) {
throw new BusinessException("库存不足");
}
// 扣减库存
product.setStock(product.getStock() - dto.getQuantity());
productRepository.save(product);
// 生成订单
Order order = new Order();
// ...订单构建逻辑
return orderRepository.save(order);
}
4. 典型问题与解决方案
4.1 图片上传性能优化
初期直接存储base64到数据库导致性能瓶颈,改进方案:
- 使用Nginx搭建图片服务器
- 前端采用分片上传
- 数据库只存储图片路径
核心配置:
properties复制# application.properties
file.upload-dir=/var/www/uploads
file.access-url=http://static.yangyang.com
4.2 交易对账问题
遇到商户投诉订单状态不同步,通过以下措施解决:
- 引入RabbitMQ实现异步事件通知
- 增加对账定时任务
- 添加操作日志审计表
对账任务示例:
java复制@Scheduled(cron = "0 0 2 * * ?")
public void reconcileOrders() {
List<Order> abnormalOrders = orderRepository.findAbnormalOrders();
abnormalOrders.forEach(order -> {
// 发送告警通知
notifyService.sendAlert(order);
});
}
5. 部署与运维实践
5.1 生产环境部署
推荐使用Docker Compose部署:
yaml复制version: '3'
services:
app:
image: yangyang-agri:1.0
ports:
- "8080:8080"
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
5.2 性能监控方案
- 使用Spring Boot Actuator暴露健康检查
- Prometheus + Grafana监控看板
- 关键指标预警配置:
- API响应时间 > 500ms
- 数据库连接池使用率 > 80%
- 订单创建失败率 > 1%
6. 项目扩展方向
在实际使用中我们发现几个可优化点:
- 移动端适配:增加微信小程序入口
- 物流对接:集成快递鸟API实现运单跟踪
- 支付渠道:加入微信/支付宝沙箱测试
- 数据分析:使用ELK实现销售数据可视化
例如物流对接实现:
java复制public class LogisticsService {
@Value("${kdniao.appkey}")
private String appKey;
public TrackResult queryTrack(String shippingNo) {
// 构造快递鸟请求参数
Map<String,String> params = new HashMap<>();
params.put("OrderCode", "");
params.put("ShipperCode", "SF");
params.put("LogisticCode", shippingNo);
// 发送HTTP请求并解析结果
return restTemplate.postForObject(
"http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx",
params,
TrackResult.class);
}
}
这个项目让我深刻体会到技术赋能农业的价值。在后续迭代中,我们计划加入农产品溯源功能,通过区块链技术记录农产品从种植到销售的全流程信息。对于想尝试类似项目的同学,建议先从最小闭环做起,比如聚焦单一品类的交易流程,再逐步扩展功能模块。