基于SSM框架的农产品溯源管理系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-183 浏览

文章摘要

本系统基于SSM(Spring+SpringMVC+MyBatis)框架构建,旨在为农产品供应链提供一套完整的溯源与数据管理解决方案。其核心业务价值在于解决农产品从生产、加工、流通到销售全链条的信息不透明、来源难追溯等痛点。通过为每一批次农产品赋予唯一标识码,系统能够记录并展示其产地环境、施肥用药、...

随着食品安全问题日益受到社会关注,农产品溯源技术成为保障食品质量安全的关键手段。农产品全链条溯源管理平台基于成熟的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);
    }
}

系统性能优化策略

  1. 数据库查询优化:对常用查询字段建立复合索引,使用连接查询替代子查询
  2. 缓存策略:采用Redis缓存热点数据和二维码信息
  3. 异步处理:使用消息队列处理二维码生成等耗时操作
  4. 分页查询:大数据量查询采用分页加载机制
@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;
    }
}

企业管理系统界面

未来功能扩展方向

  1. 区块链技术集成:将溯源数据上链,确保数据的不可篡改性
  2. 物联网设备对接:接入温湿度传感器等设备,自动采集环境数据
  3. 大数据分析:基于历史数据构建产品质量预测模型
  4. 移动端应用:开发专门的移动APP,方便现场数据采集
  5. 供应链金融:基于溯源数据为中小企业提供供应链金融服务
// 区块链集成示例代码
@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;
    }
}

该农产品溯源平台通过系统化的技术架构设计和精细化的功能实现,为农产品质量安全提供了可靠的技术保障。系统具有良好的扩展性和维护性,为后续功能升级奠定了坚实基础。

本文关键词
SSM框架农产品溯源管理系统源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章