1. 项目背景与意义茶叶作为中国传统饮品其品质与产地、工艺紧密相关。然而传统茶叶市场存在信息不透明、产地造假、品质难以追溯等问题严重损害了消费者权益与行业信誉。“人生如茶”茶叶溯源系统旨在利用现代信息技术构建一个从茶园到茶杯的全程数字化追溯体系。项目意义保障消费者权益消费者通过扫描二维码即可获取茶叶的完整“身份档案”包括产地、采摘时间、加工工艺、检测报告等实现放心消费。提升品牌价值为诚信茶企提供可信的溯源背书打击假冒伪劣塑造高端、可信的品牌形象。优化产业管理帮助茶农和茶企实现生产过程的数字化管理优化供应链提升效率。推动行业标准化通过溯源数据积累为茶叶品质分级、标准制定提供数据支撑。2. 技术栈选型本系统采用前后端分离的微服务架构核心后端基于Spring Boot构建。后端技术栈核心框架Spring Boot 3.x安全框架Spring Security JWT数据持久层Spring Data JPA (Hibernate) / MyBatis-Plus数据库MySQL 8.0 (主业务数据)Redis 7.x (缓存、会话)消息队列RabbitMQ (用于异步处理溯源数据上报、日志)搜索引擎Elasticsearch (用于溯源信息的快速检索与聚合分析)对象存储MinIO / 阿里云OSS (存储茶叶图片、检测报告等文件)API文档SpringDoc OpenAPI 3 (Swagger UI)部署与监控Docker, Nginx, Spring Boot Admin, Prometheus Grafana前端技术栈管理后台Vue 3 Element Plus消费者小程序微信小程序 (Uni-app框架)二维码生成基于Zxing库生成唯一追溯二维码区块链增强可选为追求数据不可篡改可将关键溯源哈希值如批次号、检测报告哈希存入联盟链如FISCO BCOS或利用蚂蚁链等BaaS服务。3. 系统核心功能模块设计3.1 基地管理模块茶园信息登记地理位置、土壤气候数据、认证信息。茶树品种与种植批次管理。农事活动记录施肥、除草、采摘。3.2 加工与仓储模块加工流程节点记录萎凋、杀青、揉捻、干燥等。加工环境数据温度、湿度与负责人记录。批次入库、出库管理库存状态跟踪。3.3 质检与包装模块质检报告上传与管理农残、重金属、感官评审。包装信息绑定生成唯一追溯码关联批次、包装时间、产线。3.4 溯源查询模块核心消费者端扫码查询展示可视化溯源链条地图轨迹、时间轴。后台溯源数据全景视图异常流转预警。3.5 系统管理模块多角色权限管理超级管理员、茶企管理员、基地员工、质检员、消费者。操作日志审计。数据字典与系统配置。4. 数据库核心表设计-- 茶园基地表 CREATE TABLE tea_plantation ( id bigint PRIMARY KEY AUTO_INCREMENT, name varchar(100) NOT NULL COMMENT 茶园名称, location varchar(255) COMMENT 详细地址, geo_coordinates point COMMENT 地理坐标, certification varchar(500) COMMENT 认证信息, create_time datetime DEFAULT CURRENT_TIMESTAMP ); -- 茶叶批次表核心追溯单元 CREATE TABLE tea_batch ( id bigint PRIMARY KEY AUTO_INCREMENT, batch_no varchar(50) UNIQUE NOT NULL COMMENT 批次号如 LSRC-20240820-001, plantation_id bigint NOT NULL COMMENT 所属茶园, tea_variety varchar(50) COMMENT 茶叶品种, picking_date date COMMENT 采摘日期, initial_weight decimal(10,2) COMMENT 毛茶重量(kg), status tinyint DEFAULT 1 COMMENT 批次状态(1:种植中 2:采摘完成 3:加工中 4:已质检 5:已包装), create_time datetime DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (plantation_id) REFERENCES tea_plantation(id) ); -- 加工节点记录表 CREATE TABLE processing_record ( id bigint PRIMARY KEY AUTO_INCREMENT, batch_id bigint NOT NULL, node_type varchar(20) NOT NULL COMMENT 节点类型:WITHERING, KILL_GREEN, ROLLING, DRYING等, node_name varchar(50) NOT NULL COMMENT 节点名称, start_time datetime, end_time datetime, operator varchar(50) COMMENT 操作员, environment_data json COMMENT 环境数据JSON如{temperature: 25, humidity: 60}, remark text, FOREIGN KEY (batch_id) REFERENCES tea_batch(id) ); -- 质检报告表 CREATE TABLE quality_inspection ( id bigint PRIMARY KEY AUTO_INCREMENT, batch_id bigint NOT NULL, inspection_date date NOT NULL, inspector varchar(50), pesticide_residue varchar(10) COMMENT 农残检测结果, heavy_metal varchar(10) COMMENT 重金属检测结果, sensory_score decimal(3,1) COMMENT 感官评分, report_file_url varchar(500) COMMENT 报告文件地址, is_passed tinyint(1) DEFAULT 1, FOREIGN KEY (batch_id) REFERENCES tea_batch(id) ); -- 追溯码表一物一码 CREATE TABLE trace_code ( id bigint PRIMARY KEY AUTO_INCREMENT, code varchar(64) UNIQUE NOT NULL COMMENT 加密追溯码对应二维码内容, batch_id bigint NOT NULL COMMENT 关联批次, package_date datetime COMMENT 包装日期, production_line varchar(50) COMMENT 产线编号, qr_code_url varchar(500) COMMENT 二维码图片地址, scan_count int DEFAULT 0 COMMENT 被扫码查询次数, create_time datetime DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (batch_id) REFERENCES tea_batch(id) );5. 核心代码实现示例5.1 批次状态机与溯源链生成服务package com.lifetea.trace.service; import com.lifetea.trace.entity.TeaBatch; import com.lifetea.trace.entity.ProcessingRecord; import com.lifetea.trace.entity.QualityInspection; import com.lifetea.trace.entity.TraceCode; import com.lifetea.trace.repository.*; import com.lifetea.trace.vo.TraceChainVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; Service RequiredArgsConstructor public class TraceService { private final TeaBatchRepository batchRepository; private final ProcessingRecordRepository processRepository; private final QualityInspectionRepository inspectionRepository; private final TraceCodeRepository codeRepository; /** 根据追溯码查询完整的溯源链条 */ public TraceChainVO getFullTraceChain(String traceCode) { TraceCode code codeRepository.findByCode(traceCode) .orElseThrow(() - new RuntimeException(追溯码不存在)); TeaBatch batch batchRepository.findById(code.getBatchId()) .orElseThrow(() - new RuntimeException(批次信息不存在)); // 1. 获取基地信息 TeaPlantation plantation batch.getPlantation(); // 2. 获取所有加工节点记录按时间排序 Listlt;ProcessingRecordgt; processes processRepository .findByBatchIdOrderByStartTimeAsc(batch.getId()); // 3. 获取质检报告 QualityInspection inspection inspectionRepository .findByBatchId(batch.getId()).orElse(null); // 4. 构建VO return TraceChainVO.builder() .batchNo(batch.getBatchNo()) .plantationName(plantation.getName()) .plantationLocation(plantation.getLocation()) .teaVariety(batch.getTeaVariety()) .pickingDate(batch.getPickingDate()) .processRecords(processes.stream() .map(this::convertToProcessVO) .collect(Collectors.toList())) .inspection(inspection ! null ? convertToInspectionVO(inspection) : null) .packageDate(code.getPackageDate()) .productionLine(code.getProductionLine()) .totalScanCount(code.getScanCount()) .build(); } /** 批次状态推进例如从“加工中” - “已质检” */ Transactional public void advanceBatchStatus(Long batchId, Integer targetStatus) { TeaBatch batch batchRepository.findById(batchId) .orElseThrow(() - new RuntimeException(批次不存在)); // 简单的状态校验可根据业务复杂化 if (targetStatus lt; batch.getStatus()) { throw new RuntimeException(状态无法回退或重复设置); } batch.setStatus(targetStatus); batchRepository.save(batch); // 可在此处发送MQ消息通知下游系统状态更新 } // ... 其他转换方法省略 }5.2 二维码生成与查询接口package com.lifetea.trace.controller; import com.google.zxing.BarcodeFormat; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.lifetea.trace.service.TraceService; import com.lifetea.trace.vo.TraceChainVO; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.Base64; RestController RequestMapping(/api/trace) RequiredArgsConstructor public class TraceController { private final TraceService traceService; Operation(summary 根据追溯码查询完整溯源信息) GetMapping(/chain/{code}) public TraceChainVO getTraceChain(PathVariable String code) { // 记录扫码次数1 (异步处理) // asyncService.incrementScanCount(code); return traceService.getFullTraceChain(code); } Operation(summary 生成批次追溯二维码(PNG Base64)) GetMapping(value /qrcode/{batchId}, produces MediaType.IMAGE_PNG_VALUE) public String generateQRCode(PathVariable Long batchId) throws Exception { // 1. 生成唯一追溯码实际业务中需加密 String traceCode LT_ batchId _ System.currentTimeMillis(); // 2. 保存到 trace_code 表略 // 3. 生成二维码图片 String content https://trace.lifetea.com/query?code traceCode; // 查询链接 QRCodeWriter qrCodeWriter new QRCodeWriter(); BitMatrix bitMatrix qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300); BufferedImage image MatrixToImageWriter.toBufferedImage(bitMatrix); ByteArrayOutputStream baos new ByteArrayOutputStream(); ImageIO.write(image, PNG, baos); String base64QRCode Base64.getEncoder().encodeToString(baos.toByteArray()); return data:image/png;base64, base64QRCode; } }6. 总结与展望本文介绍了基于Spring Boot的“人生如茶”茶叶溯源系统的整体设计与核心技术实现。系统通过整合物联网数据采集、二维码标识、区块链存证可选等技术构建了贯穿茶叶全生命周期的可信追溯体系。未来可扩展方向物联网集成接入温湿度传感器、摄像头自动记录加工环境数据。大数据分析基于历史溯源数据分析品质与工艺、产地之间的关联赋能生产优化。供应链金融基于可信的溯源数据为茶企提供供应链金融服务。C端体验升级开发AR扫描功能展示茶园实景、制茶工艺视频等沉浸式体验。该系统不仅适用于茶叶行业其架构与核心模块批次管理、状态追踪、一物一码经过适当改造亦可应用于白酒、中药材、高端农产品等其他需要深度溯源的领域。