1. 项目概述
这个基于SpringBoot的绿色农副产品网上销售及溯源信息管理系统,是我去年指导的一个本科毕业设计项目。系统实现了从农产品生产到销售的全程数字化管理,特别针对当下消费者最关心的食品安全溯源问题提供了完整的解决方案。
系统采用SpringBoot+Vue前后端分离架构,后端使用MySQL存储产品信息和溯源数据。整个项目最核心的创新点在于将传统的电商功能与农产品溯源深度整合,消费者不仅能在线购买绿色农副产品,还能查看产品的完整"生命周期"——从种植、施肥、采收、检测到运输的全流程信息。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型分析
选择SpringBoot作为后端框架主要基于以下几个考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大简化了项目搭建过程
- 微服务友好:便于后期扩展为分布式架构
- 生态丰富:与MyBatis、Redis等常用组件集成简单
数据库选用MySQL 8.0,主要因为:
- 对JSON数据类型的良好支持,适合存储结构化的溯源信息
- 事务处理能力强,保证订单和库存数据的一致性
- 社区活跃,遇到问题容易找到解决方案
前端采用Vue.js+ElementUI组合,主要优势在于:
- 组件化开发效率高
- 数据绑定机制简化了复杂表单的实现
- ElementUI提供了丰富的现成组件,特别适合管理后台开发
2.2 核心功能模块
系统主要分为四大模块:
-
用户端功能
- 商品浏览与搜索
- 在线购买与支付
- 溯源信息查询
- 评价与反馈
-
商家管理后台
- 商品信息管理
- 订单处理
- 库存管理
- 销售统计分析
-
溯源信息管理
- 生产记录录入
- 检测报告上传
- 物流信息更新
- 区块链存证(扩展功能)
-
系统管理
- 用户权限管理
- 系统参数配置
- 操作日志审计
- 数据备份恢复
3. 数据库设计关键点
3.1 核心表结构
sql复制-- 商品表
CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`category_id` int NOT NULL,
`price` decimal(10,2) NOT NULL,
`stock` int NOT NULL DEFAULT '0',
`description` text,
`status` tinyint NOT NULL DEFAULT '1',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 溯源信息表
CREATE TABLE `trace_info` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_id` bigint NOT NULL,
`farm_id` int NOT NULL,
`plant_date` date NOT NULL,
`harvest_date` date NOT NULL,
`fertilizer_info` json DEFAULT NULL,
`pesticide_info` json DEFAULT NULL,
`test_report_url` varchar(255) DEFAULT NULL,
`transport_info` json DEFAULT NULL,
`blockchain_hash` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 数据关系设计
系统采用适度规范化的数据库设计:
- 核心业务表(如订单、商品)采用第三范式,减少冗余
- 溯源信息使用JSON字段存储非结构化数据,平衡查询效率与灵活性
- 建立适当的索引,特别是高频查询字段(product_id, user_id等)
- 对溯源信息表采用分区设计,按产品ID范围分区,提高大数据量下的查询性能
4. 核心功能实现
4.1 商品溯源功能实现
java复制@RestController
@RequestMapping("/api/trace")
public class TraceController {
@Autowired
private TraceService traceService;
@GetMapping("/{productId}")
public Result<TraceInfoVO> getTraceInfo(@PathVariable Long productId) {
TraceInfoVO traceInfo = traceService.getTraceInfoByProduct(productId);
return Result.success(traceInfo);
}
@PostMapping
@PreAuthorize("hasRole('FARMER')")
public Result<Void> addTraceInfo(@RequestBody TraceInfoDTO dto) {
traceService.addTraceInfo(dto);
return Result.success();
}
}
@Service
public class TraceServiceImpl implements TraceService {
@Autowired
private TraceInfoMapper traceInfoMapper;
@Override
public TraceInfoVO getTraceInfoByProduct(Long productId) {
TraceInfo traceInfo = traceInfoMapper.selectByProductId(productId);
if (traceInfo == null) {
throw new BusinessException("未找到该商品的溯源信息");
}
// 转换VO对象
TraceInfoVO vo = new TraceInfoVO();
BeanUtils.copyProperties(traceInfo, vo);
// 解析JSON字段
vo.setFertilizerInfo(JsonUtils.parseObject(
traceInfo.getFertilizerInfo(), FertilizerInfo.class));
vo.setPesticideInfo(JsonUtils.parseObject(
traceInfo.getPesticideInfo(), PesticideInfo.class));
vo.setTransportInfo(JsonUtils.parseObject(
traceInfo.getTransportInfo(), TransportInfo.class));
return vo;
}
}
4.2 订单支付流程实现
支付流程采用了状态机模式来管理订单状态变迁:
java复制public enum OrderStatus {
UNPAID(1, "待支付"),
PAID(2, "已支付"),
SHIPPED(3, "已发货"),
COMPLETED(4, "已完成"),
CANCELLED(5, "已取消"),
REFUNDED(6, "已退款");
// 省略构造函数和getter方法
}
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Transactional
public void processPayment(Long orderId, PaymentDTO payment) {
Order order = orderMapper.selectById(orderId);
if (order == null) {
throw new BusinessException("订单不存在");
}
if (order.getStatus() != OrderStatus.UNPAID.getCode()) {
throw new BusinessException("订单状态异常");
}
// 验证支付金额
if (payment.getAmount().compareTo(order.getTotalAmount()) != 0) {
throw new BusinessException("支付金额不符");
}
// 更新订单状态
order.setStatus(OrderStatus.PAID.getCode());
order.setPaymentTime(new Date());
orderMapper.updateById(order);
// 记录支付流水
savePaymentRecord(order, payment);
// 扣减库存
reduceStock(order);
}
}
5. 系统安全设计
5.1 认证与授权
系统采用JWT进行身份认证,结合Spring Security实现基于角色的访问控制:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/farmer/**").hasRole("FARMER")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
}
5.2 数据安全措施
-
敏感数据加密:
- 用户密码使用BCrypt加密存储
- 支付信息等敏感数据采用AES加密后存储
-
接口防刷:
- 关键接口(如支付、下单)添加限流措施
- 使用Redis实现分布式令牌桶限流
java复制@Aspect
@Component
public class RateLimitAspect {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Around("@annotation(rateLimit)")
public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
String key = buildRateLimitKey(joinPoint, rateLimit);
long now = System.currentTimeMillis();
// 使用Redis实现令牌桶算法
// 省略具体实现...
if (allowRequest) {
return joinPoint.proceed();
} else {
throw new BusinessException("操作过于频繁,请稍后再试");
}
}
}
6. 部署与性能优化
6.1 系统部署方案
推荐采用Docker Compose进行容器化部署:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: agri_trace
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:6.2
ports:
- "6379:6379"
volumes:
- redis_data:/data
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/agri_trace
SPRING_REDIS_HOST: redis
volumes:
mysql_data:
redis_data:
6.2 性能优化实践
-
缓存策略:
- 商品详情使用Redis缓存,设置30分钟过期时间
- 热点数据(如首页商品)使用多级缓存策略
-
数据库优化:
- 对溯源信息表按产品ID范围分区
- 为高频查询字段添加适当索引
- 使用连接池控制数据库连接数
-
前端优化:
- 使用CDN加速静态资源加载
- 实现图片懒加载和按需加载
- 对API响应数据进行压缩
7. 项目开发经验总结
在开发这个系统的过程中,积累了一些值得分享的经验:
-
JSON字段的使用:
- 对于结构可能变化的溯源信息,使用JSON字段比设计多个关联表更灵活
- MySQL 8.0对JSON类型的支持已经相当完善,提供了丰富的JSON函数
- 注意为JSON中的查询字段创建虚拟列并建立索引
-
事务处理要点:
- 订单创建、支付等关键操作必须放在事务中
- 注意事务的传播行为和隔离级别设置
- 避免在事务中进行远程调用等耗时操作
-
异常处理实践:
- 定义统一的异常处理机制
- 业务异常与系统异常分开处理
- 为前端提供友好的错误提示信息
-
接口设计原则:
- 遵循RESTful风格
- 接口版本控制从设计初期就要考虑
- 为移动端设计专用的精简接口
这个项目完整实现了绿色农副产品从生产到销售的全流程数字化管理,特别是将溯源信息与电商功能深度整合的设计,在实际应用中获得了不错的效果。系统采用的主流技术栈也使项目具有较好的可维护性和扩展性。
