truffle unbox改编系列1:宠物商店pet-shop

宠物商店pet-shop

网上有很多教学如何部署pet-shop的教程,我就不在累赘的阐述了,可以从这里开始学习。
我主要从运行的逻辑和涉及的知识点,让和我一样对app.js文件中如何实现web访问ethereum的逻辑有一些简单的理解

pet-shop文件结构


//adoptpet.sol
pragma solidity ^0.4.24;

contract adoptpet{

    mapping(uint=>address)  public adopters;//直接使用映射,将地址与宠物id进行绑定

    function setPet(uint petid) public returns(uint){
        require(0<=petid&&petid<16);
        adopters[petid] = msg.sender;
        return petid;
    }
    //去除了取回领养宠物的函数:主要原因是--点击领取之后,领养按钮将失效,其他人无法重复领养
}
//app.js
App = {
  web3Provider: null,
  contracts: {},

  init: async function() {
    // Load pets.
    $.getJSON('../pets.json', function(data) {
      var petsRow = $('#petsRow');
      var petTemplate = $('#petTemplate');//按照id="petTemplate"下的规则取出'./pet.json'宠物内容

      for (i = 0; i < data.length; i ++) {
        petTemplate.find('.panel-title').text(data[i].name);
        petTemplate.find('img').attr('src', data[i].picture);
        petTemplate.find('.pet-breed').text(data[i].breed);
        petTemplate.find('.pet-age').text(data[i].age);
        petTemplate.find('.pet-location').text(data[i].location);
        petTemplate.find('.btn-adoptpet').attr('data-id', data[i].id);

        petsRow.append(petTemplate.html());//将取出的宠物信息显示在id="petsRow"部分内
      }
    });

    return await App.initWeb3();
  },

  initWeb3: async function() {
    //Proxy {selectedAddress: "0x2ad7852d02b20acb05d75e6ad43bbc488339a4d8",
    //networkVersion: "5777", _events: {…}, _eventsCount: 0, _maxListeners: 100, …}
    //window.ethereum/window.web3.currentProvider:当前连接以太坊节点
    if(window.ethereum){
    try{
      App.web3Provider = window.ethereum;
    }catch(error){
      console.log("not peer accessed");
      }
    }

    if(window.web3){
      App.web3Provider = window.web3.currentProvider;

    }else{
      App.web3Provider = new Web3.providers.HttpProvider("http://127.0.0.1:8545");
    }
    return App.initContract();
  },

  initContract: async function() {
    $.getJSON('adoptpet.json').then(function(contract){//这里需要调用异步,否则部署合约时会无法获取we3.Provider
    //var contract = $.getJSON('adoptpet.json');/直接传递--部署合约时会无法获取we3.Provider
    App.contracts.adoptpet = TruffleContract(contract);

    App.contracts.adoptpet.setProvider(App.web3Provider);

    App.contracts.adoptpet.deployed().then(function(){
    }).catch(function(error){
      console.log(error.message);
    })
  })
    return App.bindEvents();
  },

  bindEvents: function() {
    //$(document)是一个选择器,选中的是整个html所有元素的集合。
	//on:在被选元素及子元素上添加一个或多个事件处理程序。
	//on(events,[selector],[data],fn)
    $(document).on('click', '.btn-adopt', App.handleadoptpet);
  },

  handleadoptpet: function(event) {
    //规定阻止哪个事件的默认动作。这个 event 参数来自事件绑定函数。
    event.preventDefault();

    //event.target:返回哪个 DOM 元素触发了事件
    //parseInt是用于将字符串根据基数转换成整数
    var petId = parseInt($(event.target).data('id'));

    var account = web3.eth.getAccounts(function(err){
      if(err){
        console.log(err);
      }
    })

    App.contracts.adoptpet.deployed().then(function(instance){
        instance.setPet(petId,{from:account}).then( ()=>{ //()=>/function()
          instance.adopters(petId).then((data)=>{
          $('.panel-pet').find('button').eq(petId).text("seccess").attr("disabled",true);})
          .catch(function(err){
            console.log(err);
          })
        })
      })
    }
  };
//窗口加载时,启用app.init函数
$(function() {
  $(window).load(function() {
    App.init();
  });
});

实现的效果

简单理解:实现web端访问ethereum文档app.js内容


//app.js
类:APP
  状态变量:web3Provider,contracts
  方法:init,initWeb3,initContract,handleadoptpet
  事件:bindEvents
eth
  web3
  truffle-contract
  合约的部署,实例化,调用
其他:
  .then()/.catch()/console.log()/$(jQuery)

以上是我个人关于app.js文件的整理,应该可以在此基础上衍生出其他合约的web实现逻辑,后期我将继续尝试其他实例…

猜你喜欢

转载自blog.csdn.net/qq_36652517/article/details/86471616