1. 程式人生 > >基於eos的Dapp開發--元素戰爭(四)

基於eos的Dapp開發--元素戰爭(四)

上節內容中我們講了前端和智慧合約之間通過一個service元件進行互動,並將前端的資料通過push action的方式儲存到多索引表中。那麼我們如何從智慧合約的表中取資料出來並展示在前端介面呢,這便是我們今天要學習的內容。

對eos有一定了解的朋友們應該知道RPC介面的存在,我們可以通過cleos命令列的get table來獲取表中的內容,也可以通過RPC介面中的get_table_rows來獲取相關內容然後展示在前端頁面上,其主要流程可以按照下圖展示,我們接下來就來看這些操作是如何實現的:
在這裡插入圖片描述
在上一節內容中我們引入了ApiService的概念,接下來讓我們在ApiService中新增一個獲取當前使用者資訊的介面getUserByName(),username將是這個函式的唯一引數,當然通過上面的介紹我們很容易聯想到RPC介面中的get_table_rows,我們具體來看程式碼:

 1static async getUserByName(username) {
 2    try {
 3      //新建一個RPC物件
 4      const rpc = new Rpc.JsonRpc(process.env.REACT_APP_EOS_HTTP_ENDPOINT);
 5      const result = await rpc.get_table_rows({
 6     //傳參格式為JSON
 7        "json": true,
 8        "code": prodcess.env.REACT_APP_EOS_CONTRACT_NAME,    
 9    //code為合約賬戶名
10        "scope": process.env.REACT_APP_EOS_CONTRACT_NAME,   
11    // 合約的scope 
12        "table": "users", 
13    // 要查詢的表明
14        "limit": 1,
15    // 只查一個
16        "lower_bound": username,
17    //這個lower_bound和upper_bound建議參考以下multi-index.hpp學習哦
18      });
19      return result.rows[0];
20    } catch (err) {
21      console.error(err);
22    }
23  }

在上面的例子中我們使用了limit,lower_bound等限制,關於multi-index的內容,還是建議各位讀者稍微閱讀下原始碼,即multi-index.hpp中的一些內容,這樣能更方便的理解多索引表,當然我以前的文章中也多次提及過:

eos原始碼賞析(十三):EOS智慧合約資料持久化儲存(上)

eos原始碼賞析(十四):EOS智慧合約資料持久化儲存(下)

eos原始碼賞析(十六):EOS智慧合約資料表查詢

getUserByName的返回結果將是一個JSON格式的字串,包含了玩家的資訊以及遊戲的相關資訊。

然後我們來建立一個PlayerProfile元件來展示上面介面返回的內容,PlayerProfile是React中一個用於展示內容的元件,在這裡我們需要把他包含到Game元件內,做完以上內容我們可以發現:

mapStateToProps 和mapDispatchToProps已經被新增,用來連結元件和Redux store:

1import { connect } from 'react-redux';
2// Game subcomponents
3import { PlayerProfile } from './components';
constructor在Game元件啟動之前獲取多索引表中的資料:

1  constructor(props) {
2    // 初始化建構函式
3    super(props);
4    // 繫結
5    this.loadUser = this.loadUser.bind(this);
6    this.loadUser();
7  }

loaduser,通過ApiService裡的getUserByName獲取最新的玩家的資料:

 1  loadUser() {
 2    const { setUser, user: { name } } = this.props;
 3    // 通過ApiService傳送請求,呼叫getUserByName然後在通過RPC介面中的get_table_rows來查詢表中的資料,並解析展示出來
 4    return ApiService.getUserByName(name).then(user => {
 5      setUser({
 6        win_count: user.win_count,
 7        lost_count: user.lost_count,
 8        game: user.game_data,
 9      });
10    });
11  }

當PlayerProfile建立完成之後,我們在登入之後會看到已登入使用者的資訊,比如玩家名,贏的次數,輸的次數等。但是有個問題需要注意,使用者資料儲存在了Redux store中,但是Redux store會在每次瀏覽器頁面重新整理之後進行重構,資料就會被清空,我們怎麼來解決呢?

我們可以在ApiService中新增一個getCurrentUser函式從本地儲存中來獲取當前使用者的資訊,獲取到之後可以呼叫智慧合約的login action,如果登入成功了,我們就再次把使用者資料儲存到redux store中,從而實現自動登入的功能:

 1  static getCurrentUser() {
 2    return new Promise((resolve, reject) => {
 3      if (!localStorage.getItem("cardgame_account")) {
 4        return reject();
 5      }
 6      takeAction("login", { username: localStorage.getItem("cardgame_account") })
 7        .then(() => {
 8          resolve(localStorage.getItem("cardgame_account"));
 9        })
10        .catch(err => {
11          localStorage.removeItem("cardgame_account");
12          localStorage.removeItem("cardgame_key");
13          reject(err);
14        });
15    });
16  }

登入成功的頁面如下所示:
在這裡插入圖片描述
如果你覺得我的文章對你有一定的幫助,請點選文章末尾的喜歡該作者。

如果你對eos開發感興趣,歡迎關注本公眾號,一起學習eos開發。

在這裡插入圖片描述
微信公眾號

有任何疑問或者指教請新增本人個人微信,當然有對eos開發感興趣或者金庸粉的也可以新增一起交流,備註eos開發或金庸。

在這裡插入圖片描述

                                                                   個人微訊號  

相關推薦

基於eos的Dapp開發--元素戰爭

上節內容中我們講了前端和智慧合約之間通過一個service元件進行互動,並將前端的資料通過push action的方式儲存到多索引表中。那麼我們如何從智慧合約的表中取資料出來並展示在前端介面呢,這便是我們今天要學習的內容。 對eos有一定了解的朋友們應該知道RP

基於eos的Dapp開發--元素戰爭

我們前面的內容主要都是在對eos的原始碼體系進行分析,有很多朋友說不夠接地氣,想要學習基於eos的Dapp開發。然而對於很多開發者而言,eos入門並非易事。從環境的搭建到智慧合約的編寫、編譯、前端呼叫等等一系列的過程要耗費不少的時間。 今天eos官推方出了一款小

基於eos的Dapp開發--元素戰爭

我們上篇文章中講到完成一個Dapp的搭建需要兩個主要的部分,即智慧合約的編寫以及前段的構建,今天我們首先來一步步看智慧合約中主要有哪些內容以及是如何編寫的。 在智慧合約中,資料的儲存是較為重要的一環,我們在做原始碼分析的時候都知道資料是儲存在Multi-Inde

安卓開發筆記 Activity

nac 創建 intent nbsp star lda this 空白 空白頁 Activity -> Intent -> Activity startActivity(Intent) 創建Activity 步驟: 右擊->new

Java開發小技巧:配置文件敏感信息處理

加載 gem 加密解密 -i false valid ges enc factory 前言 不知道在上一篇文章中你有沒有發現,jdbc.properties中的數據庫密碼配置是這樣寫的: jdbc.password=5EF28C5A9A0CE86C2D231A526ED5

SpringCloud開發學習總結—— 客戶端負載均衡Ribbon

均衡 spring java www ref discovery 聯合 方式 嘗試   通過上一章《SpringCloud開發學習總結(三)—— 服務治理Eureka》,我們已經搭建起微服務架構中的核心組件——服務註冊中心(包括單點模式和高可用模式)。同時還註冊了一個服務,

Android開發 - 掌握ConstraintLayout建立基本約束

上一篇我們介紹了編輯器的基本使用,本文我們介紹建立基本的約束。 "約束"表示View之間的位置關係。當我們在ConstraintLayout佈局中建立View時,如果我們沒有新增任何約束,雖然在設計檢視我們可以拖動它們到任意位置,但是執行後都會在左上角的原點位置,同時代碼中也會給出警告: 所以我們必須

嵌入式Linux應用開發完全手冊UART

11. 通用非同步收發器 UART 11.1 UART原理,部件使用方法 11.1.1UART原理 UART是Universal Asynchronous Receiver Transmitter的縮寫,即通用非同步收發器 UART用來傳輸序列資料: - 傳送時,CPU將

微信開發學習總結——自定義選單5——個性化選單介面

一、個性化選單介面說明 為了幫助公眾號實現靈活的業務運營,微信公眾平臺新增了個性化選單介面,開發者可以通過該介面,讓公眾號的不同使用者群體看到不一樣的自定義選單。該介面開放給已認證訂閱號和已認證服務號。 開發者可以通過以下條件來設定使用者看到的選單: 1、使用者標籤(開發者的

微信開發學習總結——自定義選單4——自定義選單事件推送

一、自定義選單事件推送介面說明 使用者點選自定義選單後,微信會把點選事件推送給開發者,請注意,點選選單彈出子選單,不會產生上報。請注意,第3個到第8個的所有事件,僅支援微信iPhone5.4.1以上版本,和Android5.4以上版本的微信使用者,舊版本微信使用者點選後將沒有迴應,開

微信開發學習總結——自定義選單3——自定義選單刪除介面

自定義選單刪除介面 使用介面建立自定義選單後,開發者還可使用介面刪除當前使用的自定義選單。另請注意,在個性化選單時,呼叫此介面會刪除預設選單及全部個性化選單。 請求說明 http請求方式:GET https://api.weixin.qq.com/cgi-bin/menu/d

微信開發學習總結——自定義選單2——自定義選單查詢介面

自定義選單查詢介面 使用介面建立自定義選單後,開發者還可使用介面查詢自定義選單的結構。另外請注意,在設定了個性化選單後,使用本自定義選單查詢介面可以獲取預設選單和全部個性化選單資訊。 請求說明 http請求方式:GET https://api.weixin.qq.com/cg

微信開發學習總結——自定義選單1——自定義選單建立介面

一、自定義選單建立介面說明 自定義選單能夠幫助公眾號豐富介面,讓使用者更好更快地理解公眾號的功能。開啟自定義選單後,公眾號介面如圖所示: 請注意: ①自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。 ②一級選單最多4個漢字,二級選單最多7個漢字,多出來的部分將

微信開發學習總結——自定義選單——自定義選單建立介面

一、自定義選單建立介面說明 自定義選單能夠幫助公眾號豐富介面,讓使用者更好更快地理解公眾號的功能。開啟自定義選單後,公眾號介面如圖所示: 請注意: ①自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。 ②一級選單最多4個漢字,二級選單最多7個漢

輕裝上陣Html5遊戲開發,JEESJS

下面我將通過完善Demo的形式,來演示下用法。首先在html中匯入需要的庫,我定義了一個index.html用來作為演示的入口: index.html: <!DOCTYPE html> <html> <head> <title><

安卓開發學習筆記:Android Stuidio無法實現隱式Intent是為什麼?

1 package com.example.lenovo.activitytest; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view

IOS高階開發~Runtime

原文:http://blog.csdn.net/lizhongfu2013/article/details/9498233 用C代替OC: #import <objc/runtime.h> #import <objc/message

一步一步開發Game伺服器地圖執行緒

時隔這麼久 才再一次的迴歸正題繼續講解遊戲伺服器開發。 開始講解前有一個問題需要修正。之前講的執行緒和定時器執行緒的時候是分開的。 但是真正地圖執行緒與之前的執行緒模型是有區別的。 為什麼會有區別呢?一個地圖肯定有執行執行緒,但是每一個地圖都有不同的時間任務。比如檢測玩家身上的buffer,檢測玩家

ESP8266-SDK開發入坑- STATION模式

記一個慘痛教訓,務必記得即時儲存檔案。(這次不是丟了,而是無法build)。切記,切記,eclipse修改後務必ctrl+s然後clean 然後再build! 1、實驗目的 瞭解SDK開發的STA模式操作方法,熟悉相關API函式。 2、函式解

微信小程式開發詳解---微信小程式開發元件使用初步

1:建立一個微信小程式的工程 2:請參考如下連結裡面的內容,這是微信小程式的官方開發指南: https://mp.weixin.qq.com/debug/wxadoc/dev/component/button.html?t=20161222 3:可以拷貝部分例子程式到你