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

6-7 宠物领养开发及相关代码

6-7 宠物领养开发及相关代码(react+区块链实战)


来到ant-design
https://ant.design/index-cn

https://ant.design/components/layout-cn/
来到布局
在这里插入图片描述

选择一个简单的布局即可
在这里插入图片描述

会显示出所有的相关界面的代码

在这里插入图片描述

根据对应界面的代码在我们的react项目woniu-pet-shop中的App.js中进行更改

如下
在这里插入图片描述
在这里插入图片描述

刷新页面的效果如下
页面的基本雏形如下

在这里插入图片描述

要做宠物的领养,就要将宠物的数组拿出来
在前面下载的petshop改名为truffle中放在了react项目下的src下的petsjson

在这里插入图片描述

这是宠物的术语名字图片

在区块链中写图片非常昂贵,大部分情况下在区块链中写id或者一些出生时间关键数据

将宠物的json直接引入

在这里插入图片描述

然后在项目中的render中的content直接引入
Pets类似数组,在init初始化时就有加一下东西

在这里插入图片描述

在这里插入图片描述

将truffle下的src下的狗的图片复制出来
在这里插入图片描述

放在react项目下的public下的images中

在这里插入图片描述

使用ant中的栅格系统,使用页面整个横向布局

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以将前面引入的Jason数组渲染出来
在这里插入图片描述

在这里插入图片描述

所有宠物名打印出来了
在这里插入图片描述

接下来将其图片也打印出来

在这里插入图片描述

在App.css中加入图片的宽度使其看起

在这里插入图片描述

现在好看多了
在这里插入图片描述

总共16个宠物,看起来和谐多了

重点低下逻辑,显示名字后要有领养按钮,不一定存在的,如刚才第一个,第2个已经领养过了,应显示已被领养
在这里插入图片描述

//判断当前宠物是否被领养(是否当前的领养地址为初始地址)isActive(i){return this.state.adopters[i] == this.initAddress}

若未被领养,显示领养的按钮,若已领养就显示被领养的字样

在这里插入图片描述
在这里插入图片描述

基本功能已经完成再加入按钮的事件即可,以及加入class center使其居中,type样式为蓝色的

如下
在这里插入图片描述

在css中加入居中的样式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心就是如何编写智能合约,测试合约,如何web端和智能合约交互

App.js所有代码如下

import React from 'react'
import Web3 from 'web3'
import TruffleContract from 'truffle-contract'
import AdoptionJson from './truffle/build/contracts/Adoption.json'	//引入前面智能合约编译好得到的json文件
import { Button } from 'antd'
import { Layout, Menu, Breadcrumb } from 'antd'
import { Row, Col } from 'antd'
import './App.css'
import pets from "./truffle/src/pets.json"const { Header, Content, Footer } = Layout;//1.链接合约
//2.执行一下合约内部函数
//3.添加ant.design ui库支持
//4.完成项目
class App extends React.Component{constructor(props){super(props)this.web3 = nullthis.Adoption = nullthis.initAddress = '0x'+'0'.repeat(40)	//判断地址是否为初始值this.init()this.state = {//所有领养者的数据adopters:[]//name:'woniu'}}async init(){//如果网页中的web3不是undefined//if(typeof window.web3 != 'undefined'){//	this.web3Provider = window.web3.currentProvider;	//metamask内置了web3的实例,实际可以手动链接//}else{//	alert('please install metamask')//}//this.web3 = new Web3(this.web3Provider)		//将我们的this.web3Provider装载进来//this.initAdoption()/* 新版的方式 *///var web3Provider;if (window.ethereum) {this.web3Provider = window.ethereum;try {// 请求用户授权await window.ethereum.enable();} catch (error) {// 用户不授权时console.error("User denied account access")}} else if (window.web3) {   // 老版 MetaMask Legacy dapp browsers...this.web3Provider = window.web3.currentProvider;} else {this.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');}this.web3 = new Web3(this.web3Provider);//web3js就是你需要的web3实例this.web3.eth.getAccounts(function (error, result) {if (!error)console.log(result)//授权成功后result能正常获取到账号了//this.account = result});//this.account =result//this.account =accountthis.initAdoption()}initAdoption(){this.Adoption = TruffleContract(AdoptionJson)	//使用TruffleContract传入编译后的合约,然后创建实例,可以调用合约内部函数this.Adoption.setProvider(this.web3Provider)	//设置来源,链接合约return this.markAdopted()}//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//this.markAdopted(){//部署链接一下//	const adoptionInstance = this.Adoption.deployed().then()	//}async markAdopted(){//部署链接一下//await同步方式获取异步数据const adoptionInstance = await this.Adoption.deployed()	//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//调用合约内部函数getAdoptersconst adopters = await adoptionInstance.getAdopters.call()this.setState({adopters})			//此时得到所有领养者的信息,方便后续的渲染renderconsole.log(adopters)}async adopt(petId){//const account = window.web3.eth.defaultAccount		//获取metamask中默认的账户// 授权获取账户const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });const myAccount = accounts[0];	//获取当前metamask的地址const adoptionInstance = await this.Adoption.deployed()		//再次进行部署await adoptionInstance.adopt(petId,{from:myAccount})	//调用adopt只传递唯一一个参数,以及来源之前获取的地址,进行写入函数this.markAdopted()}//判断当前宠物是否被领养(是否当前的领养地址为初始地址)isActive(i){return this.state.adopters[i] == this.initAddress}//此处进行界面的渲染render(){return (//布局	//设置间距40//每个方块Col,以行24个,6,相当于每行4个宠物<Layout className="layout"><Header></Header><Content style={{ padding: '20px 50px' }}><Row gutter={40}>		{pets.map((v,i)=>{return (<Col span='6' key={i}><img src={v.picture} alt=""/><div className = "center"><p className="name">{v.name}</p>{this.isActive(i)?<Button type='primary' onClick={()=>this.adopt(i)}>领养</Button>:<span>被领养</span>}</div></Col>)})}</Row></Content><Footer style={{ textAlign: 'center' }}>build by woniu ©2018</Footer></Layout>)//onclick点击事件,调用领养函数//return <Button type='primary' onClick={()=>this.adopt(2)}>领养第二个</Button>//hello,{this.state.name}}
}export default AppApp.css 所有代码如下
@import '~antd/dist/antd.css';img{width:100%;
}.center{text-align:center;margin:20px;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flowable(一个开源的工作流和业务流程管理引擎)中与事件相关的一些核心概念
  • 老年生活照护实训室:让养老护理更个性化
  • vue解决页面放大图片模糊的问题
  • protobuf repeated C++怎样赋值?
  • CMD,Powershell,Xshell的区别与联系
  • 【Nuxt3】vue3+tailwindcss+vuetify引入自定义字体样式
  • 防火墙综合实验之NAT和智能选路
  • oracle 23ai新的后台进程bgnn介绍
  • AJAX知识点(详解)
  • 【ROS2】中级:tf2-编写监听器(Python)
  • 昇思25天学习打卡营第14天 | ShuffleNet图像分类
  • react获取访问过的路由历史记录
  • 强制升级最新系统,微软全面淘汰Win10和部分11用户
  • 香橙派AIpro部署YOLOv5:探索强悍开发板的高效目标检测能力
  • 一键优雅为Ubuntu20.04服务器挂载新磁盘
  • [笔记] php常见简单功能及函数
  • Babel配置的不完全指南
  • ESLint简单操作
  • Java 多线程编程之:notify 和 wait 用法
  • mysql_config not found
  • opencv python Meanshift 和 Camshift
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python socket服务器端、客户端传送信息
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 好的网址,关于.net 4.0 ,vs 2010
  • 面试遇到的一些题
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​MySQL主从复制一致性检测
  • ​ubuntu下安装kvm虚拟机
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #{}和${}的区别是什么 -- java面试
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (12)Hive调优——count distinct去重优化
  • (16)Reactor的测试——响应式Spring的道法术器
  • (3) cmake编译多个cpp文件
  • (SpringBoot)第七章:SpringBoot日志文件
  • (补)B+树一些思想
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)hibernate配置管理
  • (二十三)Flask之高频面试点
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)为什么要选择C++
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .net FrameWork简介,数组,枚举
  • .net mvc 获取url中controller和action
  • .NET 材料检测系统崩溃分析
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布