基于hyperledger fabric的葡萄酒溯源系统

葡萄酒溯源系统(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')
  }
}

页面展示

系统首页



用户注册

用户登录

控制台

创建葡萄酒




我的葡萄酒

葡萄酒运输管理

添加物流信息

运输中葡萄酒

待接收葡萄酒



质量检查

销售葡萄酒

信息查询








葡萄酒查询

完整溯源历史

相关推荐
小李独爱秋2 小时前
计算机网络经典问题透视:电子邮件的安全协议PGP主要都包含哪些措施?
运维·服务器·网络·网络协议·计算机网络·安全
小李独爱秋2 小时前
计算机网络经典问题透视:互联网的网络层安全协议族IPsec都包含哪些主要协议?
运维·服务器·开发语言·网络协议·计算机网络·安全
牛奔2 小时前
Docker Compose 解决服务间 DNS 解析失败问题
运维·docker·容器
OpsEye2 小时前
监控 100 问(三):监控告警触发后如何快速定位与解决问题
运维·网络·it运维·it·监控·监控系统
线束线缆组件品替网2 小时前
Conxall 防水线缆在户外工控中的布线实践
运维·人工智能·汽车·电脑·材料工程·智能电视
济6173 小时前
linux(第十四期)--官方 SDK 移植实验-- Ubuntu20.04
linux·运维·服务器
范纹杉想快点毕业3 小时前
欧几里得算法与扩展欧几里得算法,C语言编程实现(零基础全解析)
运维·c语言·单片机·嵌入式硬件·算法
小猪佩奇TONY3 小时前
Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
linux·运维·学习
杰克崔3 小时前
kprobe及kretprobe的基于例子来调试分析其原理
linux·运维·服务器·车载系统