美文网首页区块链技术研究智能合约我爱编程
以太坊智能合约开发第七篇:智能合约与网页交互

以太坊智能合约开发第七篇:智能合约与网页交互

作者: 智能合约 | 来源:发表于2018-04-25 13:14 被阅读77次

    原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互

    上一篇中,我们通过truffle开发框架快速编译部署了合约。本篇,我们将来介绍网页如何与智能合约进行交互。

    编写网页

    首先我们需要编写一个网页。打开 smartcontract/app/index.html 文件,修改 head 区代码如下:

    <head>
      <title>Hello - Truffle</title>
      <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
      <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
      <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
      <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
      <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
      <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
      <script src="./app.js"></script>
    </head>
    

    修改 body 区代码如下:

    <body>
      <div class="alert alert-success" role="alert" style="display:none;" id="message-box"></div>
      <div class="form-group">
        <input type="text" class="form-control" id="username" aria-describedby="basic-addon1">
      </div>
      <button type="submit" id="submit" class="btn btn-success">调用合约</button>
      <button type="submit" id="cancel" class="btn btn-default">重置</button>
    </body>
    

    网页呈现效果如下图:


    demo

    修改启动脚本

    smartcontract/app/javascripts/app.js 脚本文件是智能合约与网页交互的核心,修改代码如下:

    //导入CSS
    import "../stylesheets/app.css";
    //导入web3和truffle-contract库
    import { default as Web3} from 'web3';
    import { default as contract } from 'truffle-contract'
    
    //导入Hello合约的ABI文件
    import Hello_artifacts from '../../build/contracts/Hello.json'
    //获取Hello合约对象
    var HelloContract = contract(Hello_artifacts);
    
    window.App = {
      init: function() {
        //设置web3连接
        HelloContract.setProvider(web3.currentProvider);
      },
    
      //封装合约中的say()方法调用过程,供javascript调用
      say: function(name, callback){
        //instance为Hello合约部署实例
        HelloContract.deployed().then(function(instance){
          //调用Hello合约中的say()方法,并传入参数name
          instance.say.call(name).then(function(result){
            //将返回结果传入回调函数
            callback(null, result);
          });
        }).catch(function(e){
          console.log(e, null);
        });
      }
    };
    
    window.addEventListener('load', function() {
      //设置web3连接  http://127.0.0.1:7545 为Ganache提供的节点链接
      window.web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545"));
      App.init();
    });
    

    前面的篇幅中,我们提到过 web3模块是以太坊提供的工具包,主要用于与合约的通信。从上面的代码中,我们可以看到,通过Hello合约的ABI文件获取到合约对象之后,再配合web3工具,就可以与Hello合约进行通信了。其中 App.say() 是对Hello合约中say()方法的调用过程进行了封装,方便前端代码进行调用。

    智能合约与网页交互

    启动脚本修改完了之后,就需要与网页进行整合。我们再返过来继续修改 smartcontract/app/index.html 文件。在文件末尾添加如下交互代码:

    <script>
      $(document).ready(function(){
          $('#submit').on('click', function(){
              var username = $('#username').val();
              if(typeof username == 'undefined' || username == false){
                  alert('不能为空');
              }else {
                  //调用App的say()方法
                  window.App.say(username, function (err, result) {
                      if(err){
                          alert(err);
                      }else {
                          $('#username').val(username);
                          $('#message-box').html(result);
                          $('#message-box').show();
                      }
                  });
              }
          });
          $('#cancel').on('click', function(){
              $('#username').val('');
              $('#message-box').hide();
              $('#message-box').html('');
          });
      });
    </script>
    

    接下来,就是见证奇迹的时刻。
    smartcontract 目录下执行 npm run dev

    npm run dev

    注意图中标识的部分。http://locahost:8083 为网页访问地址(每个人运行的端口号可能不一样)。我们也能看出,truffle开发框架集成了 webpack 工具,对网页中包含的静态资源文件进行了打包。

    最后,我们通过浏览器打开 http://locahost:8083 来测试下效果:

    Hello

    至此,一个简单的Dapp应用示例就此完成了。我们也熟练掌握了通过truffle开发框架编写合约代码、快速编译部署、构建Dapp的整个过程。

    我的专栏:智能合约
    智能合约开发QQ群:753778670

    智能合约开发QQ群

    相关文章

      网友评论

        本文标题:以太坊智能合约开发第七篇:智能合约与网页交互

        本文链接:https://www.haomeiwen.com/subject/nzoelftx.html