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

news2024/11/15 8:08:58

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 = null
		this.Adoption = null
		this.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 =account
	  this.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()也可以,这里用
		//调用合约内部函数getAdopters
		const adopters = await adoptionInstance.getAdopters.call()
		this.setState({adopters})			//此时得到所有领养者的信息,方便后续的渲染render
		console.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 App



App.css 所有代码如下
@import '~antd/dist/antd.css';

img{
 width:100%;
}

.center{
	text-align:center;
	margin:20px;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口基础知识3:详解url

课程大纲 一、定义 URL即访问的链接&#xff0c;是Uniform Resource Locator的缩写&#xff0c;译为"统一资源定位符"。 URL是一种URI&#xff0c;它标识一个互联网资源&#xff0c;并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述&#xff0c…

《昇思25天学习打卡营第05天|qingyun201003》

日期 心得 通过本节课的学习&#xff0c;学习到了通过网络获取数据集&#xff0c;处理数据集模型。数据模型层数据变换&#xff0c;模型参数解析和其对应代码中的API进行解析。 昇思MindSpore 基础入门学习 网络构建 (AI 代码解析) 网络构建 神经网络模型是由神经网络层和T…

一篇文章教你如何快速上手Spring MVC框架【万字详解|包含常用注解分析讲解】

目录 一.什么是Spring Web MVC 二.Spring MVC的使用 ▐ 建立连接 RestController RequestMapping ▐ 传递参数 1.简单类型传参 2.类对象传参&#xff08;RequestParam&#xff09; 3.数组&集合传参 4.JSON传参&#xff08;RequestBody&#xff09; 5.URL中的参数…

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是计算几何一个非常基础核心的概念。我理解的凸包就是给定一个点集合, 最外围的点的包围体就是凸包。如下所示: 极点(ExtremityPoint) 给定的点集合中, 如果一个点存在一条直线, 让其他所有点都在于该直线的同一侧, 则该点为极点。 非极点 …

【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 栈 栈的方法介绍 入栈push 出栈pop和 瞄一眼peek 判空isEmpty和判满isFull 模拟实现栈 push入栈 pop出栈和peek 测试 使用泛型实现栈 测试 使用链表实现栈&#xff08…

本地部署免费AI大模型+知识库

利用Ollama部署本地大模型 一&#xff1a;终端实现与大模型对话 1.去Ollama官网下载 https://ollama.com/download2.下载之后按照提示一步步安装即可 3.WinR, 输入cmd,打开命令行提示符 输入&#xff1a;ollama run llama3运行大模型 4.使用其他开源大模型&#xff0c;比如…

基于门控循环单元(GRU)的数据回归预测

代码原理 基于GRU&#xff08;Gated Recurrent Unit&#xff09;的数据回归预测通常涉及多输入单输出的情况。以下是简单的原理及流程&#xff1a; 数据准备&#xff1a; 准备多个时间序列作为输入特征&#xff0c;每个时间序列可以表示不同的变量或特征。准备一个目标变量作…

算法学习day12(动态规划)

一、不同的二叉搜索树 二叉搜索树的性质&#xff1a;父节点比左边的孩子节点都大&#xff1b;比右边的孩子节点都小&#xff1b; 由图片可知&#xff0c;dp[3]是可以由dp[2]和dp[1]得出来的。(二叉搜索树的种类和根节点的val有关) 当val为1时&#xff0c;左边是一定没有节点的…

写真图片视频打赏系统源码全开源无加密

这是一款开源的写真图片及视频打赏系统源码&#xff0c;顾名思义他可以做写真图片打赏站也可以做视频打赏站&#xff0c;支付对接了易支付&#xff0c;拥有独立代理后台&#xff0c;全部源码无加密&#xff0c;另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介…

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

Linux的load(负载)

负载(load)是Linux机器的一个重要指标&#xff0c;直观了反应了机器当前的状态。 在Linux系统中&#xff0c;系统负载是对当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数。 Linux的负载高&#xff0c;主要是由于CPU使用、内存使用、10消…

[UTCTF2020]babymips

水一篇 32位 c写的&#xff0c;长得比较丑陋 进入sub-401164函数 V7的数据可以得到 unsigned char ida_chars[] {0x62, 0x6C, 0x7F, 0x76, 0x7A, 0x7B, 0x66, 0x73, 0x76, 0x50, 0x52, 0x7D, 0x40, 0x54, 0x55, 0x79, 0x40, 0x49, 0x47, 0x4D, 0x74, 0x19, 0x7B, 0x6A, 0x…

大数据之路 读书笔记 Day5 数据同步遇到的问题与解决方案

回顾 Day 4 数据同步Day 3 无线客户端的日志采集 1. 分库分表的处理 分库分表&#xff08;Sharding&#xff09;是数据库水平扩展的一种策略&#xff0c;当单个数据库的性能和存储能力无法满足应用需求时&#xff0c;可以采用分库分表来分散数据和查询负载。它通常包括两个方面…

钡铼4G无线RTU助力智慧能源发展实现电网远程调控

随着全球对清洁能源和高效能源管理的需求日益增长&#xff0c;智慧能源技术正逐渐成为推动可持续发展的重要驱动力。在这一背景下&#xff0c;钡铼4G无线远程终端单元正在为智慧能源的发展和电网的远程调控提供强有力的支持。 钡铼4G无线RTU&#xff1a;智慧能源的神经网络 钡…

数据恢复篇:适用于 Android 的恢复工具

正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的照片恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的图片。 Android 上文件被删除的主要原因 在获…

Blender使用(二)点线面基本操作

Blender使用之点线面 1.编辑模式 tab键进行切换&#xff0c;为了方便菜单调出&#xff0c;可以设置键位映射为拖动时的饼菜单。 设置好后&#xff0c;按住tab键移动鼠标(注意不要点击鼠标)&#xff0c;即可弹出编辑菜单。 默认是点模式&#xff0c;在左上角可进行点线面的切换…

Linux系统OpenSSH出现漏洞(CVE-2024-6387)修复

CVE-2024-6387 是一个影响 OpenSSH 服务器&#xff08;sshd&#xff09;的严重远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;它允许未经身份验证的攻击者在受影响的 Linux 系统上以 root 权限执行任意代码。此漏洞尤其危险&#xff0c;因为它可以在不需要任何用户交…

husky 和 lint-staged 构建代码项目规范

目录 前言 最简单的方法 过 scripts 来解决如果检测工具多&#xff0c;需要多次处理 通过 husky(哈士奇)来解决容易遗忘的问题 1. 安装 2. husky init 3. 试一试​ lint-stadge 只 lint 改动的 1. 安装 2. 修改 package.json 配置 3. 添加 npm 脚本: 4.使用 Husky…