当前位置: 首页 > news >正文

区块链食品溯源案例实现(二)

引言

        随着前端界面的完成,我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求,调用智能合约的方法获取食品溯源信息,并将结果返回给前端。

通过前后端的整合,我们可以构建一个食品溯源系统,为用户提供便捷、安全的食品查询服务。

目录

引言

后端代码实现

安装依赖

首先,确保已经安装了Node.js和npm。然后,在项目根目录下执行以下命令安装依赖:

创建后端服务器

在项目根目录下创建一个名为server.js的文件,并编写以下代码:

配置环境变量

在项目根目录下创建一个名为.env的文件,并添加以下环境变量:

启动后端服务器

在项目根目录下执行以下命令启动后端服务器

修改前端代码中的请求地址

启动前端项目并测试

在前端项目根目录下执行以下命令启动前端项目:

总结



后端代码实现

  • 在本文中,我们将使用Node.js和Express框架来编写后端代码。同时,我们继续使用Web3.js库与区块链网络进行交互。
安装依赖
  • 首先,确保已经安装了Node.js和npm。然后,在项目根目录下执行以下命令安装依赖:
npm install express body-parser web3 dotenv

  • 其中,express用于构建Web服务器,body-parser用于解析前端发送的请求体,web3用于与区块链网络进行交互,dotenv用于加载环境变量。
  • 创建后端服务器
  • 在项目根目录下创建一个名为server.js的文件,并编写以下代码:
require('dotenv').config();  
const express = require('express');  
const bodyParser = require('body-parser');  
const Web3 = require('web3');  const app = express();  
app.use(bodyParser.json());  // 初始化Web3对象  
const web3 = new Web3(Web3.givenProvider || process.env.BLOCKCHAIN_PROVIDER);  // 连接到区块链网络(这里以本地开发环境为例)  
const contractAddress = process.env.CONTRACT_ADDRESS;  
const abi = JSON.parse(process.env.CONTRACT_ABI);  
const foodTraceabilityContract = new web3.eth.Contract(abi, contractAddress);  // 定义路由处理函数  
app.get('/food/:id', async (req, res) => {  try {  const foodId = req.params.id;  const foodInfo = await foodTraceabilityContract.methods.getFoodInfo(foodId).call();  res.json(foodInfo);  } catch (error) {  console.error(error);  res.status(500).json({ message: 'Error fetching food info' });  }  
});  // 启动服务器  
const port = process.env.PORT || 3001;  
app.listen(port, () => {  console.log(`Server is running on port ${port}`);  
});

  • 在上面的代码中,我们首先使用dotenv加载环境变量,这些环境变量包括区块链网络的提供商地址、智能合约的地址和ABI等。
  • 然后,我们创建了一个Express应用,并使用了body-parser中间件来解析请求体。接下来,我们初始化了Web3对象,并连接到区块链网络。
  • 最后,我们定义了一个路由处理函数/food/:id,用于处理前端发送的食品信息查询请求。
  • 在该函数中,我们根据请求中的食品ID调用智能合约的getFoodInfo方法获取食品信息,并将结果以JSON格式返回给前端。

配置环境变量

  • 在项目根目录下创建一个名为.env的文件,并添加以下环境变量:
BLOCKCHAIN_PROVIDER=YOUR_BLOCKCHAIN_PROVIDER  
CONTRACT_ADDRESS=YOUR_CONTRACT_ADDRESS  
CONTRACT_ABI=YOUR_CONTRACT_ABI


  • YOUR_BLOCKCHAIN_PROVIDER替换为你的区块链网络提供商地址(例如,本地开发环境的HTTP提供商地址),YOUR_CONTRACT_ADDRESS替换为你的智能合约地址,YOUR_CONTRACT_ABI替换为你的智能合约ABI的JSON字符串。
  • 启动后端服务器
  • 在项目根目录下执行以下命令启动后端服务器
node server.js

服务器将在指定的端口(默认为3001)上启动,并等待前端发送请求。

  • 现在,我们已经完成了前后端的编写和配置。
  • 接下来,我们需要将前端与后端进行整合,并进行测试。
修改前端代码中的请求地址
  • 在前端代码中,我们需要将请求地址修改为后端服务器提供的地址。
  • 打开src/FoodTraceability.js文件,找到发送请求的部分,将请求地址修改为后端服务器的地址和端口。例如:
// 修改请求地址为后端服务器的地址和端口  
fetch(`http://localhost:3001/food/${foodId}`)  .then(response => response.json())  .then(data => {  // 处理后端返回的食品信息数据  console.log(data);  // 更新UI等操作...  })  .catch(error => {  console.error('Error fetching food info:', error);  });

确保将http://localhost:3001/food/${foodId}中的localhost:3001替换为你实际服务器的地址.

  • 启动前端项目并测试
  • 在前端项目根目录下执行以下命令启动前端项目:
npm start

  • 前端项目将在指定的端口上启动(默认为3000)。打开浏览器,访问前端项目的地址,并进行食品信息查询操作。如果一切正常,你应该能够看到后端返回的食品信息,并在前端界面上展示出来。

总结

        通过本文的介绍,我们实现了基于区块链的食品溯源系统的后端代码,并与前端进行了整合。后端负责处理前端发送的请求,调用智能合约获取食品溯源信息,并将结果返回给前端。前后端的协同工作使得用户可以通过前端界面方便地查询食品的生产信息、流通信息等。

相关文章:

区块链食品溯源案例实现(二)

引言 随着前端界面的完成,我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求,调用智能合约的方法获取食品溯源信息,并将结果返回给前端。 通过前后端的整合,我们可以构建一个食品溯源系统&#xf…...

RabbitMQ(简单模式)

2种远程服务调用 1openFeign: 优点:能拿到被调用的微服务返回的数据,系统系耦度高,系统稳定。 缺点:同步调用,如果有很多服务需要被调用,耗时长。 MQ,消息队列,RabbitMQ是消息we…...

ES集群部署的注意事项

文章目录 引言I ES集群部署前期工作II 部署ES2.1 配置安全组2.2 创建ES用户和组2.3 下载安装ES2.4 修改内存相关配置III es集群添加用户安全认证功能3.1 生成 elastic-certificates.p123.2 创建 Elasticsearch 集群密码3.2 设置kibana的 elasticsearch帐号角色和密码3.3 logsta…...

Etcd 基本入门

1:什么是 Etcd ? Etcd 是 CoreOS 团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,Etcd基于 Go 语言实现。 名字由来,它源于两个方面,…...

PPT没保存怎么恢复?3个方法(更新版)!

“我刚做完一个PPT,正准备保存的时候电脑没电自动关机了,打开电脑后才发现我的PPT没保存。这可怎么办?还有机会恢复吗?” 在日常办公和学习中,PowerPoint是制作演示文稿的重要工具。我们会在各种场景下使用它。但有时候…...

DBeaver修改sql语句保存位置

1、dbeaver通过工作空间方式来管理Script的sql脚本以及数据库连接。 工作空间,其实也就是一个文件夹 默认保存路径查看: 文件--> 切换工作空间 --> 其他 sql脚本的保存位置默认在工作空间下的 \General\Scripts 文件夹中。 2、 3、点击浏览&#…...

LabVIEW2024中文版软件安装包、工具包、安装教程下载

下载链接:LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2024安装图文教程》 1、解压后,双击install.exe安装 2、选中“我接受上述许可协议”,点击下一步 3、点击下一步,安装NI Package …...

对AOP的理解

目录 一、为何需要AOP?1、从实际需求出发2、现有的技术能解决吗?3、AOP可以解决 二、如何实现AOP?1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional(通过AOP实现事务管理)2.…...

C 指针数组

C 指针数组是一个数组,其中的每个元素都是指向某种数据类型的指针。 指针数组存储了一组指针,每个指针可以指向不同的数据对象。 指针数组通常用于处理多个数据对象,例如字符串数组或其他复杂数据结构的数组。 让我们来看一个实例&#xf…...

算法系列--动态规划--背包问题(1)--01背包详解

💕"趁着年轻,做一些比较cool的事情"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–背包问题(1)–01背包详解 大家好,今天为大家带来的是算法系列--动态规划--背包问题(1)--01背包详解 一.什么是背包问题 背包问题…...

【KB】通过Karabiner-Elements实现 optionTAB与 commandTAB 对调/映射 win 的 altTAB 习惯

学习Karabiner-Elements的第一个 demo,因为推荐的例子中过多参数,这是一个简化版。 需求:对调 optionTAB与 commandTAB,然后安装 altTAB 软件,恢复win切换任务的使用习惯。 {"description": "Change ta…...

nvm node包管理工具

下载地址:版本 1.1.9 CoreyButler/NVM-Windows (github.com) 使用nvm -v 检查安装是否成功。 常用命令 # 安装nodjs版本 nvm install 10.16.3nvm install 14.15.4# 切换,使用nodejs nvm use 10.16.3 ## nvm use 报错,1).使用管理员打开…...

程序员如何兼职赚小钱?

程序员由于有技术和手艺其实兼职赚钱的路子还是挺多的,只要你有足够的时间。 1. 做外包 这是比较传统的方式,甲方在一些众包平台上发布开发任务,你可以抢这个任务,但是价格都比较便宜。 任务比较多的平台: 猪八戒、一品威客、开…...

奥比中光深度相机(一):环境配置

文章目录 奥比中光深度相机(一):环境配置简介电脑环境SDK配置步骤安装环境依赖填写路径,点击Configure选择Visual studio点击Generate完成基于Python的SDK配置方法一:使用Cmake直接打开方法二:通过源文件打…...

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…...

Transformer的前世今生 day10(Transformer编码器

前情提要 ResNet(残差网络) 由于我们加更多层,更复杂的模型并不总会改进精度,可能会让模型与真实值越来越远,如下: 我们想要实现,加上一个层把并不会让模型变复杂,即没有它也没关系…...

【c++模板】泛型编程(你真的懂模版特化、分离编译和非类型参数吗)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今日主菜:模板 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在…...

力扣1----10(更新)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按…...

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…...

什么是RabbitMQ的死信队列

RabbitMQ的死信队列(Dead Letter Queue,简称DLQ)是一种用于处理消息失败或无法路由的消息的机制。它允许将无法被正常消费的消息重新路由到另一个队列,以便稍后进行进一步处理、分析或排查问题。 当消息对立里面的消息出现以下几…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...