在本节中,我们将介绍如何通过restful api将hyperledgefabric网络与web应用程序集成,并使用react.js作为前端。本教程中构建的web应用程序仅是保单持有者应用程序。
应用执行
在继续下面操作步骤时,请按照第一节内容进行搭建后,再继续以下操作。
在insurance_application文件夹中,运行以下命令以创建保单持有人web应用程序的框架:
npx create-react-app policyholder_app
cd policyholder_app
打开src/app.js并删除函数app返回中的代码,只需添加hello world作为占位符,这样app.js文件现在看起来如下
import react from ‘react’;
import ‘。/app.css’;
function app() {
return (
《p》hello world《/p》
);
}
export default app;
用以下内容替换src / app.css中的代码:
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: arial, helvetica, sans-serif;
line-height: 1.4;
background: #5b5b5b;
font-family: monospace;
font-size: 150%
}
a {
color: #333;
text-decoration: none;
font-family: monospace;
}
.container {
padding: 0 1rem;
}
.btn {
display: inline-block;
border: none;
background: #555;
color: #fff;
padding: 7px 20px;
cursor: pointer;
}
.btn:hover {
background: #666;
}
react应用程序的默认端口号是3000,因此需要更改它以使其不与rest api端口冲突。要执行此操作,请将package.json的scripts部分更改为以下内容以创建端口3001:
“scripts”: {
“start”: “port=3001 react-scripts start”,
“build”: “react-scripts build”,
“test”: “react-scripts test”,
“eject”: “react-scripts eject”
},
此外,我们需要在文件的底部添加一个代理,该代理将连接到hyperledger composer network,因此只需在结束大括号之前添加以下行:
“proxy”: “http://localhost:3000/”
在此文件夹中创建以下新文件夹src/components和以下新文件header.js。这将为我们的应用程序创建一个简单的标题,其中包含指向主页的链接:
import react, { component } from ‘react’
import { link } from ‘react-router-dom’;
class header extends component {
render() {
return (
《header style={headerstyle}》
《h1 style={titlestyle}》policyholder blockchain insurance《/h1》
《link style={linkstyle} to=“/”》home《/link》
《/header》
)
}
}
const headerstyle = {
background: ‘#333’,
color: ‘#fff’,
textalign: ‘right’,
padding: ‘10px’
}
const linkstyle = {
color: ‘#fff’,
textdecoration: ‘none’
}
const titlestyle = {
textalign: ‘left’
}
export default header;
现在修改app.js,以便导入:
import { browserrouter as router, route } from ‘react-router-dom’;
import header from ‘。/components/header’
它实现了组件header.js,如下所示:
《router》
《header/》
《/router》
app.js现在看起来应该是这样的:
import react from ‘react’;
import { browserrouter as router, route } from ‘react-router-dom’;
import ‘。/app.css’;
import header from ‘。/components/header’
function app() {
return (
《router》
《header/》
《/router》
);
}
export default app;
您可能需要安装react-router-dom:
npm install --save react-router-dom
此外,您可能还需要安装react-responsive-modal:
npm install react-responsive-modal --save
现在运行应用程序以通过从policyholder_app文件夹运行以下命令来测试所有工作正常
npm start
如果一切正常,应用程序应如下所示:
创建一个与blockchain restful api连接的函数。使用以下代码创建src / connection.js:
function search(query, cb) {
return new promise( (resolve,reject) =》 {
return fetch(`api/${query}`, {
accept: “application/json”
})
.then(parsejson)
.then(data =》 resolve(data));
})
}
function create(type, data){
return new promise((resolve, reject) =》 {
return fetch(`api/${type}`, {
headers: {
‘accept’: ‘application/json’,
‘content-type’: ‘application/json’
},
method: ‘post’,
body: json.stringify(data)
})
.then(parsejson)
.then(() =》 resolve())
})
}
function parsejson(response) {
return response.json();
}
const connection = { search, create };
export default connection;
在components文件夹中创建一个类组件homepage.js. 这将显示主页上的所有组件:
import react, { component } from ‘react’
class homepage extends component {
render() {
return (
《div》
《/div》);
}
}
//proptypes
homepage.proptypes = {
}
export default homepage
要导入用户资产并在主页上显示它们,需要另一个类组件。创建一个类组件usersassets.js并包含以下代码:
import react, { component } from ‘react’
import proptypes from ‘prop-types’;
import userassetsitems from ‘。/userassetsitems’
class userassets extends component {
render() {
return (
《div》
{this.props.assets.map((asset) =》 (
《userassetsitems key={asset.id} asset={asset}/》
))}
《/div》
)}
}
//proptypes
userassets.proptypes = {
assets: proptypes.array.isrequired
}
export default userassets
这将需要以props数组的形式传递资产。要显示资源,请使用map循环遍历数组,并将项目传递给名为userassetsitems.js的类组件。
创建单独处理资产的类组件userassetsitems.js。这只是创建一张具有资产类型和价值的卡片。请注意,我已经在这里完成了内联样式,但如果您更喜欢使用css,则可以使用css执行此操作。
import react, { component } from ‘react’
import proptypes from ‘prop-types’;
class userassetsitems extends component {
render() {
let assetstyle = {
card: {
display: ‘inline-block’,
background: ‘#333’,
width: ‘350px’,
height: ‘160px’,
textalign: ‘left’,
padding: ‘20px’,
margin: ‘20px’,
border: ‘5px solid #333’,
color: ‘white’
}
}
return (
《div style = { assetstyle.card }》
《p》description: {this.props.asset.assettype}《/p》
《p》 value: {this.props.asset.value}《/p》
《/div》
)
}
}
//proptypes
userassetsitems.proptypes = {
asset: proptypes.object.isrequired
}
export default userassetsitems
通过在文件顶部添加以下行,将userassetsitems导入到userassets
import userassetsitems from ‘。/userassetsitems’
将userassets导入主页并更新主页代码,如下所示。这只是显示用户资产并为其设置样式。现在主页还要求将资产数组作为prop传递,以便将其传递给userassets.js
import react, { component } from ‘react’
import userassets from ‘。/userassets’
import proptypes from ‘prop-types’;
class homepage extends component {
render() {
let style = {
userassetsstyle: {
position: ‘relative’,
top: ‘10px’,
width: ‘58%’,
borderright: ‘1px solid black’,
}
}
return (
《div》
《div style = { style.userassetsstyle }》
《userassets assets = { this.props.assets } /》
《/div》
《/div》);
}
}
//proptypes
homepage.proptypes = {
assets: proptypes.array.isrequired
}
export default homepage
回到app.js中,添加一个状态,以便包括用户的名称和一个空的资产数组,如下所示:
state = {
name: “joe”,
assets: []
}
该名称将用作硬编码值,因为该网站尚未登录。
通过在文件顶部添加以下行,将connection.js导入app.js。
import connection from ‘。/connection’
为了能够获取用户资产,需要在执行此操作的区块链网络中创建查询。因此,在文件夹risk-analysis-tutorial中,将以下行添加到将返回用户资产的queries.qry:
query selectassetbypolicyholder {
description: “select an asset based on the owner”
statement:
select org.acme.riskanalysis.privateasset
where (policyholder == _$policyholder)
}
现在将package.json更新到版本4并重新部署您的网络:
composer archive create --sourcetype dir --sourcename 。 -a risk-analysis-tutorial@0.0.4.bna
composer network install --card peeradmin@hlfv1 --archivefile risk-analysis-tutorial@0.0.4.bna
composer network upgrade -c peeradmin@hlfv1 -n risk-analysis-tutorial -v 0.0.4
运行composer rest服务器
composer-rest-server -c admin@risk-analysis-tutorial -n never -u true -w true
向app.js添加一个函数以从区块链网络中检索用户资产,如下所示:
getassets = () =》 {
// search for the users assets
connection.search(‘queries/selectassetbypolicyholder?policyholder=resource%3aorg.acme.riskanalysis.policyholder%23’ + this.state.name)
.then(data =》 {
//store the assets in the assets array
this.setstate({
assets: data
})
// retrieve the user object from the state
let user = this.state.user
// add the number of assets to the object
user.numassets = this.state.assets.length
// update the state
this.setstate({
user
})
let assets = this.state.assets
for (let i = 0; i 《 assets.length; i++) {
// set insurance status
if (assets[i].insurancecompany == null) {
assets[i].insured = false
}
else {
assets[i].insured = true
}
}
// update the state
this.setstate({
assets: assets
})
})
}
通过将以下行添加到文件顶部,将主页导入app.js
import homepage from ‘。/components/homepage’
既然我们有了这些资产,就可以将它们传递到我们的主页,所以在app.js中的路由器中添加以下行,将这些资产作为props传递。
《route exact path={“/”} render={props =》 (
《react.fragment》
《h1》my assets《/h1》
《homepage assets={this.state.assets} /》
《/react.fragment》
)}
/》
您的完整app.js文件现在应该如下所示:componentwillmount():
import react, { component } from ‘react’;
import { browserrouter as router, route } from ‘react-router-dom’;
import ‘。/app.css’;
import header from ‘。/components/header’
import connection from ‘。/connection’
import homepage from ‘。/components/homepage’
class app extends component {
state = {
name: “joe”,
assets: []
}
componentwillmount() {
this.getassets()
}
getassets = () =》 {
// search for the users assets
connection.search(‘queries/selectassetbypolicyholder?policyholder=resource%3aorg.acme.riskanalysis.policyholder%23’ + this.state.name)
.then(data =》 {
//store the assets in the assets array
this.setstate({
assets: data
})
// retrieve the user object from the state
let user = this.state.user
// add the number of assets to the object
user.numassets = this.state.assets.length
// update the state
this.setstate({
user
})
let assets = this.state.assets
for (let i = 0; i 《 assets.length; i++) {
// set insurance status
if (assets[i].insurancecompany == null) {
assets[i].insured = false
}
else {
assets[i].insured = true
}
}
// update the state
this.setstate({
assets: assets
})
})
}
render() {
return (
《router》
《header /》
《route exact path={“/”} render={props =》 (
《react.fragment》
《h1》my assets《/h1》
《homepage assets={this.state.assets} /》
《/react.fragment》
)}
/》
《/router》
);
}
}
export default app;
如果一切正常,您应该在web应用程序中看到以下内容。 注意此处显示的资产是本教程第1部分中创建的资产。
为了可以添加新资产,我们需要app.js中的一个函数来实现这一点,所以在app.js中创建addasset函数:
addasset = (assettype, value, durationinmonths) =》 {
// create the data object
const data = {
“$class”: “org.acme.riskanalysis.createnewasset”,
“policyholder”: “org.acme.riskanalysis.policyholder#” + this.state.name,
“assettype”: assettype,
“value”: number(value),
“durationinmonths”: number(durationinmonths)
}
// send this data to the hyperledger network
connection.create(‘createnewasset’, data)
.then((err) =》 {
if (err) {
console.log(err)
}
// get the new asset
this.getassets()
})
}
5个激光、超声波测距方案设计
检具三维扫描仪+3D打印做产品质量检测
家庭影院套装的视频端口
总投资288亿元,长电、艾为等12个项目在上海临港集中开工
ARM架构服务器芯片发展的困难,中国或有助于ARM打破Intel的垄断地位
如何使用HyperledgeFabric网络react.js来构建Web应用程序
苹果的自研5G,又得再等等了
射频标签(RFID)的静电控制解决方案
关于RE和RSE的区别
电路分析方法的合理选择
基于网络冗余技术的DCS控制系统的设计
苹果13手机什么时候上市多少钱
智能手机Type-C接口的多种使用功能
不再低调:公开矿物绝缘电缆优势
用于GPS/GLONASS应用的单芯片硅双极接收器
华邦推出内置32位ARM7TDMI内核的通用型单芯片
介绍PLC和触摸屏在国家体育场鸟巢中应用设计
FS68003无线充电IC
凌壹科技EC-SKYUT-6CD8嵌入式主板分析
ALXE10B 边缘计算产品满足多种类型工业传感器采集和设备交互需求