随着食品安全问题日益受到社会关注,农产品溯源技术成为保障食品质量安全的关键手段。农产品全链条溯源管理平台基于成熟的SSM框架构建,通过信息化技术实现农产品从生产到消费的全过程透明化管理。
技术架构设计
系统采用标准的三层架构模式,通过Spring框架实现依赖注入和面向切面编程,SpringMVC处理Web层请求分发,MyBatis作为数据持久层框架。这种分层架构确保了系统的高内聚低耦合特性。
<!-- Spring核心配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/traceability"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
数据库核心表结构设计
农产品信息表采用规范化设计,确保数据完整性和查询效率:
CREATE TABLE agricultural_product (
product_id VARCHAR(32) PRIMARY KEY COMMENT '产品唯一标识',
product_name VARCHAR(100) NOT NULL COMMENT '产品名称',
batch_number VARCHAR(50) NOT NULL COMMENT '批次号',
production_date DATE COMMENT '生产日期',
origin_place VARCHAR(200) COMMENT '产地信息',
enterprise_id VARCHAR(32) COMMENT '生产企业ID',
qr_code_url VARCHAR(500) COMMENT '二维码地址',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_batch_number (batch_number),
INDEX idx_enterprise_id (enterprise_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
溯源记录表设计支持完整的时间轴追溯:
CREATE TABLE traceability_record (
record_id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id VARCHAR(32) NOT NULL,
trace_type ENUM('PLANTING', 'PROCESSING', 'TRANSPORT', 'SALE') COMMENT '溯源环节类型',
operator_id VARCHAR(32) COMMENT '操作人员',
operation_detail TEXT COMMENT '操作详情',
operation_time DATETIME COMMENT '操作时间',
location VARCHAR(200) COMMENT '地理位置',
attachment_url VARCHAR(500) COMMENT '附件地址',
FOREIGN KEY (product_id) REFERENCES agricultural_product(product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
核心业务功能实现
1. 农产品信息管理模块
农产品CRUD操作采用RESTful风格设计,支持批量操作和数据校验:
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
@PostMapping("/add")
@ResponseBody
public Result addProduct(@Valid @RequestBody ProductDTO productDTO) {
try {
String productId = productService.addProduct(productDTO);
return Result.success("添加成功", productId);
} catch (BusinessException e) {
return Result.error(e.getMessage());
}
}
@GetMapping("/detail/{productId}")
public String getProductDetail(@PathVariable String productId, Model model) {
ProductVO productVO = productService.getProductDetail(productId);
model.addAttribute("product", productVO);
return "product/detail";
}
}

2. 溯源二维码生成与查询
系统为每个农产品批次生成唯一二维码,消费者通过扫码获取完整溯源信息:
@Service
public class QRCodeServiceImpl implements QRCodeService {
private static final String QR_CODE_BASE_URL = "https://traceability.com/qr/";
@Override
public String generateQRCode(String productId) {
try {
String content = QR_CODE_BASE_URL + productId;
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300);
String filePath = "/qr-codes/" + productId + ".png";
File qrFile = new File(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", qrFile.toPath());
return filePath;
} catch (Exception e) {
throw new RuntimeException("二维码生成失败", e);
}
}
@Override
public TraceabilityResult queryTraceability(String productId) {
List<TraceabilityRecord> records = traceabilityMapper.selectByProductId(productId);
ProductInfo product = productMapper.selectById(productId);
return TraceabilityResult.builder()
.productInfo(product)
.traceabilityRecords(records)
.build();
}
}

3. 多角色权限管理系统
系统支持超级管理员、企业用户和消费者三种角色,通过拦截器实现权限控制:
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("currentUser");
if (user == null) {
response.sendRedirect("/login");
return false;
}
// 检查角色权限
String requestURI = request.getRequestURI();
if (!hasPermission(user.getRole(), requestURI)) {
response.sendError(403, "权限不足");
return false;
}
return true;
}
private boolean hasPermission(UserRole role, String uri) {
// 权限验证逻辑
return permissionService.checkPermission(role, uri);
}
}
实体模型设计
系统采用领域驱动设计思想,核心实体关系清晰:
@Entity
@Table(name = "agricultural_enterprise")
public class Enterprise {
@Id
private String enterpriseId;
private String enterpriseName;
private String licenseNumber;
private String contactPerson;
private String contactPhone;
private String address;
@OneToMany(mappedBy = "enterprise")
private List<Product> products;
@OneToMany(mappedBy = "enterprise")
private List<EnterpriseUser> users;
}
@Entity
@Table(name = "traceability_record")
public class TraceabilityRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long recordId;
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
private TraceType traceType;
private String operatorId;
private String operationDetail;
private LocalDateTime operationTime;
private String location;
}
数据持久层实现
MyBatis映射文件配置复杂的关联查询:
<!-- 溯源记录关联查询 -->
<select id="selectTraceabilityWithDetails" resultMap="traceabilityResultMap">
SELECT tr.*, p.product_name, p.batch_number, e.enterprise_name
FROM traceability_record tr
LEFT JOIN agricultural_product p ON tr.product_id = p.product_id
LEFT JOIN agricultural_enterprise e ON p.enterprise_id = e.enterprise_id
WHERE tr.product_id = #{productId}
ORDER BY tr.operation_time DESC
</select>
<resultMap id="traceabilityResultMap" type="TraceabilityVO">
<id property="recordId" column="record_id"/>
<result property="traceType" column="trace_type"/>
<result property="operationDetail" column="operation_detail"/>
<result property="operationTime" column="operation_time"/>
<association property="product" javaType="Product">
<id property="productId" column="product_id"/>
<result property="productName" column="product_name"/>
<result property="batchNumber" column="batch_number"/>
</association>
</resultMap>

事务管理与数据一致性
系统使用Spring声明式事务管理确保数据操作的一致性:
@Service
@Transactional
public class TraceabilityServiceImpl implements TraceabilityService {
@Autowired
private TraceabilityRecordMapper recordMapper;
@Autowired
private ProductMapper productMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void addTraceabilityRecord(TraceabilityRecord record) {
// 验证产品存在性
Product product = productMapper.selectById(record.getProductId());
if (product == null) {
throw new BusinessException("产品不存在");
}
// 添加溯源记录
recordMapper.insert(record);
// 更新产品最新溯源时间
product.setLastTraceTime(new Date());
productMapper.update(product);
}
}
系统性能优化策略
- 数据库查询优化:对常用查询字段建立复合索引,使用连接查询替代子查询
- 缓存策略:采用Redis缓存热点数据和二维码信息
- 异步处理:使用消息队列处理二维码生成等耗时操作
- 分页查询:大数据量查询采用分页加载机制
@Service
public class ProductQueryServiceImpl implements ProductQueryService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String PRODUCT_CACHE_KEY = "product:detail:";
@Override
public ProductVO getProductWithCache(String productId) {
String cacheKey = PRODUCT_CACHE_KEY + productId;
ProductVO product = (ProductVO) redisTemplate.opsForValue().get(cacheKey);
if (product == null) {
product = productMapper.selectDetailById(productId);
if (product != null) {
redisTemplate.opsForValue().set(cacheKey, product, Duration.ofHours(1));
}
}
return product;
}
}

未来功能扩展方向
- 区块链技术集成:将溯源数据上链,确保数据的不可篡改性
- 物联网设备对接:接入温湿度传感器等设备,自动采集环境数据
- 大数据分析:基于历史数据构建产品质量预测模型
- 移动端应用:开发专门的移动APP,方便现场数据采集
- 供应链金融:基于溯源数据为中小企业提供供应链金融服务
// 区块链集成示例代码
@Service
public class BlockchainService {
public String uploadToBlockchain(TraceabilityData data) {
// 调用区块链接口上传数据
BlockchainClient client = new BlockchainClient();
String transactionHash = client.uploadData(data);
// 记录交易哈希
data.setBlockchainTxHash(transactionHash);
dataMapper.update(data);
return transactionHash;
}
}
该农产品溯源平台通过系统化的技术架构设计和精细化的功能实现,为农产品质量安全提供了可靠的技术保障。系统具有良好的扩展性和维护性,为后续功能升级奠定了坚实基础。