基于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')
  }
}

页面展示

系统首页



用户注册

用户登录

控制台

创建葡萄酒




我的葡萄酒

葡萄酒运输管理

添加物流信息

运输中葡萄酒

待接收葡萄酒



质量检查

销售葡萄酒

信息查询








葡萄酒查询

完整溯源历史

相关推荐
杨云龙UP19 分钟前
Oracle ASM磁盘组空间分配与冗余理解
linux·运维·数据库·sql·oracle
互成41 分钟前
加密系统哪款最好用?2026年五款加密系统深度对比测评
运维·网络·安全
minji...42 分钟前
Linux 库制作与原理(三)深入动静态链接原理
linux·运维·服务器·c++
CDN3601 小时前
游戏服稳定运行:360CDN SDK 游戏盾实测体验
运维·游戏·网络安全
bukeyiwanshui1 小时前
Linux实践
linux·运维·服务器
守望时空332 小时前
使用NetworkManager替换当前网络管理器
linux·运维
MinterFusion2 小时前
如何在开放麒麟(openKylin)下安装FTP服务器(v0.1.0)
运维·服务器·网络·vsftpd·开放麒麟·明德融创·openkylin
xlq223222 小时前
30.进程池IPC
linux·运维·服务器
nuomigege2 小时前
beagleboneblack刷入官方IOT镜像后无法运行nodered问题的处理
linux·运维·服务器
huaxiu53 小时前
ubuntu下应用打不开
linux·运维·ubuntu