基于Spring Boot的“人生如茶”茶叶溯源系统设计与实现
2026/8/20 9:27:15 网站建设 项目流程

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. 获取所有加工节点记录,按时间排序 List<ProcessingRecord> 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 <= 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扫描功能,展示茶园实景、制茶工艺视频等沉浸式体验。

该系统不仅适用于茶叶行业,其架构与核心模块(批次管理、状态追踪、一物一码)经过适当改造,亦可应用于白酒、中药材、高端农产品等其他需要深度溯源的领域。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询