葡萄酒溯源系统(Wine Traceability System)
系统概述
葡萄酒溯源系统是一个基于Hyperledger Fabric区块链技术的完整供应链追溯解决方案。该系统通过区块链技术确保葡萄酒从种植、生产、物流到销售的整个生命周期数据的不可篡改性和可追溯性,为消费者提供真实可靠的产品信息。
核心特性
- 区块链不可篡改性:所有生产环节数据存储在Fabric区块链上
- 多角色权限管理:支持生产者、物流商、零售商等不同角色
- 完整生命周期追踪:从葡萄种植到最终销售的全程记录
- 数据透明化:消费者可通过产品ID查询完整的生产历史
- 智能合约自动化:基于Hyperledger Fabric的智能合约确保业务流程
系统架构
技术栈
前端:
├── Vue.js 3 + Element Plus UI
├── Vite 构建工具
├── Axios HTTP客户端
└── Vue Router + Vuex状态管理
后端:
├── Go语言 + Gin Web框架
├── JWT身份认证
├── SQLite本地数据库
└── Hyperledger Fabric SDK
区块链:
├── Hyperledger Fabric 2.x
├── Go语言智能合约
├── CouchDB状态数据库
└── Raft共识机制
系统架构图
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (Vue.js 3) │
├─────────────────────────────────────────────────────────────┤
│ 用户界面 │ 产品管理 │ 数据录入 │ 历史查询 │ 权限控制 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ API网关层 (Gin) │
├─────────────────────────────────────────────────────────────┤
│ 身份认证 │ 角色授权 │ 数据验证 │ 错误处理 │ CORS处理 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 业务逻辑层 (Go) │
├─────────────────────────────────────────────────────────────┤
│ 用户管理 │ 产品生命周期 │ 区块链交互 │ 数据转换 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Hyperledger Fabric区块链网络 │
├─────────────────────────────────────────────────────────────┤
│ 智能合约 │ 状态数据库 │ 共识机制 │ 成员管理 │ 通道管理 │
└─────────────────────────────────────────────────────────────┘
数据库模型
用户数据模型(SQLite)
sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
role TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
区块链数据模型(Hyperledger Fabric)
葡萄酒主数据结构
go
type Wine struct {
ID string `json:"id"` // 产品唯一ID
Name string `json:"name"` // 葡萄酒名称
Description string `json:"description"` // 产品描述
ProducerID string `json:"producerId"` // 酒庄ID
Vintage string `json:"vintage"` // 年份
Type string `json:"type"` // 类型(红/白/起泡等)
Region string `json:"region"` // 产区
BatchNumber string `json:"batchNumber"` // 批次号
Status string `json:"status"` // 当前状态
PlantingData Planting `json:"plantingData"` // 种植数据
HarvestData Harvest `json:"harvestData"` // 采摘数据
FermentData Ferment `json:"fermentData"` // 酿造数据
AgingData Aging `json:"agingData"` // 陈酿数据
BottlingData Bottling `json:"bottlingData"` // 装瓶数据
LogisticsData []Logistics `json:"logisticsData"` // 物流数据
RetailData Retail `json:"retailData"` // 零售数据
CreatedTxID string `json:"createdTxId"` // 创建交易ID
}
种植数据结构
go
type Planting struct {
Vineyard string `json:"vineyard"` // 葡萄园名称
Location string `json:"location"` // 种植地点
GrapeVariety []string `json:"grapeVariety"` // 葡萄品种数组
PlantingDate string `json:"plantingDate"` // 种植日期
SoilType string `json:"soilType"` // 土壤类型
Irrigation string `json:"irrigation"` // 灌溉方式
Certifications []string `json:"certifications"` // 认证信息
Climate string `json:"climate"` // 气候条件
AdditionalInfo string `json:"additionalInfo"` // 额外信息
TxID string `json:"txId"` // 交易ID
Timestamp string `json:"timestamp"` // 时间戳
}
系统角色
1. 生产者(PRODUCER)
权限范围:
- 创建新的葡萄酒产品
- 录入种植数据(葡萄园信息、品种、土壤等)
- 录入采摘数据(采摘日期、天气、糖度等)
- 录入酿造数据(发酵方法、酵母类型、温度等)
- 录入陈酿数据(橡木桶类型、陈酿时长等)
- 录入装瓶数据(瓶型、封口类型、批次等)
2. 物流服务商(LOGISTICS)
权限范围:
- 录入物流运输数据
- 记录运输过程中的温湿度监控
- 跟踪货物位置和状态
3. 零售商(RETAILER)
权限范围:
- 接收葡萄酒产品
- 进行质量检查
- 录入销售数据
4. 消费者(CONSUMER)
权限范围:
- 查询葡萄酒完整历史
- 验证产品真实性
- 查看所有生产环节数据
业务流程
1. 用户注册与登录流程
用户注册 → 角色选择 → 数据验证 → 密码加密 → 数据库存储
↓
用户登录 → 身份验证 → JWT令牌生成 → 角色权限分配 → 系统访问
2. 葡萄酒生命周期流程
1. 产品创建 → 生产者创建新葡萄酒产品
↓
2. 种植阶段 → 录入葡萄园、品种、土壤等数据
↓
3. 采摘阶段 → 记录采摘日期、天气、质量指标
↓
4. 酿造阶段 → 记录发酵参数、酵母类型、温度控制
↓
5. 陈酿阶段 → 记录橡木桶信息、陈酿时长、环境条件
↓
6. 装瓶阶段 → 记录瓶型、封口、质量检查
↓
7. 物流阶段 → 运输温湿度监控、位置跟踪
↓
8. 零售阶段 → 接收确认、质量检查、销售记录
↓
9. 消费者查询 → 完整历史追溯、真实性验证
3. 区块链数据存储流程
前端数据录入 → API验证 → 智能合约调用 → Fabric网络共识 → 区块链存储
↓
数据查询请求 → 智能合约查询 → 状态数据库检索 → 数据返回 → 前端展示
关键代码
1. JWT身份认证中间件
go
// JWT认证中间件 - App.go#L197-235
func authMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"})
c.Abort()
return
}
parts := strings.Split(authHeader, " ")
if len(parts) != 2 || parts[0] != "Bearer" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header format must be Bearer {token}"})
c.Abort()
return
}
tokenString := parts[1]
claims := &JWTClaims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if err != nil || !token.Valid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
c.Abort()
return
}
c.Set("username", claims.Username)
c.Set("role", claims.Role)
c.Set("user_id", claims.UserID)
c.Next()
}
}
2. 角色权限控制中间件
go
// 角色检查中间件 - App.go#L237-264
func roleCheck(allowedRoles ...string) gin.HandlerFunc {
return func(c *gin.Context) {
role, exists := c.Get("role")
if !exists {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
c.Abort()
return
}
userRole := role.(string)
allowed := false
for _, r := range allowedRoles {
if r == userRole {
allowed = true
break
}
}
if !allowed {
c.JSON(http.StatusForbidden, gin.H{"error": "Forbidden: insufficient permissions"})
c.Abort()
return
}
c.Next()
}
}
3. 区块链智能合约 - 创建葡萄酒
go
// 创建新葡萄酒产品 - smartcontract.go#L155-199
func (s *WineTraceChaincode) CreateWine(ctx contractapi.TransactionContextInterface,
id, name, description, producerId, vintage, wineType, region, batchNumber string) error {
exists, err := s.WineExists(ctx, id)
if err != nil {
return err
}
if exists {
return fmt.Errorf("wine with ID %s already exists", id)
}
txID := ctx.GetStub().GetTxID()
wine := Wine{
ID: id,
Name: name,
Description: description,
ProducerID: producerId,
Vintage: vintage,
Type: wineType,
Region: region,
BatchNumber: batchNumber,
Status: StatusCreated,
LogisticsData: []Logistics{},
CreatedTxID: txID,
PlantingData: Planting{
GrapeVariety: []string{},
Certifications: []string{},
},
FermentData: Ferment{
Additives: []string{},
},
}
wineJSON, err := json.Marshal(wine)
if err != nil {
return fmt.Errorf("failed to marshal wine: %v", err)
}
return ctx.GetStub().PutState(id, wineJSON)
}
4. 前端API请求封装
javascript
// 前端HTTP请求封装 - request.js
const service = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 15000
})
// 请求拦截器
service.interceptors.request.use(
config => {
const token = store.getters['auth/token']
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}
return config
},
error => {
console.error('Request error:', error)
return Promise.reject(error)
}
)
// 响应拦截器 - 统一错误处理
service.interceptors.response.use(
response => {
return response.data
},
error => {
if (!error.response) {
ElMessage.error('网络错误,请检查您的连接')
return Promise.reject(error)
}
const { status, data } = error.response
switch (status) {
case 401:
ElMessage.error('登录已过期,请重新登录')
store.dispatch('auth/logout')
router.push('/login')
break
case 404:
ElMessage.error('请求的资源不存在')
break
case 500:
ElMessage.error('服务器错误,请稍后再试')
break
default:
ElMessage.error(data.error || '请求失败')
}
return Promise.reject(error)
}
)
5. 状态管理 - Vuex Store
javascript
// 认证状态管理 - auth.js
const state = {
token: localStorage.getItem('token') || '',
user: JSON.parse(localStorage.getItem('user')) || null,
role: localStorage.getItem('role') || ''
}
const mutations = {
SET_TOKEN(state, token) {
state.token = token
localStorage.setItem('token', token)
},
SET_USER(state, user) {
state.user = user
localStorage.setItem('user', JSON.stringify(user))
},
SET_ROLE(state, role) {
state.role = role
localStorage.setItem('role', role)
},
LOGOUT(state) {
state.token = ''
state.user = null
state.role = ''
localStorage.removeItem('token')
localStorage.removeItem('user')
localStorage.removeItem('role')
}
}
const actions = {
login({ commit }, credentials) {
return new Promise((resolve, reject) => {
login(credentials).then(response => {
commit('SET_TOKEN', response.token)
commit('SET_USER', response.user)
commit('SET_ROLE', response.user.role)
resolve(response)
}).catch(error => {
reject(error)
})
})
},
logout({ commit }) {
commit('LOGOUT')
}
}
页面展示
系统首页



用户注册

用户登录

控制台

创建葡萄酒






我的葡萄酒

葡萄酒运输管理

添加物流信息

运输中葡萄酒

待接收葡萄酒



质量检查

销售葡萄酒

信息查询








葡萄酒查询

完整溯源历史
