<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          axios 封裝,API接口統一管理,支持動態API!

          前端達人

          分享一個自己封裝的 axios 網絡請求

          主要的功能及其優點:

          將所有的接口放在一個文件夾中管理(api.js)。并且可以支持動態接口,就是 api.js 文件中定義的接口可以使用 :xx 占位,根據需要動態的改變。動態接口用法模仿的是vue的動態路由,如果你不熟悉動態路由可以看看我的這篇文章:Vue路由傳參詳解(params 與 query)

          1.封裝請求:

          1. 首先在 src 目錄下創建 http 目錄。繼續在 http 目錄中創建 api.js 文件與 index.js 文件。
          2. 然后再 main.js 文件中導入 http 目錄下的 index.js 文件。將請求注冊為全局組件。
          3. 將下面封裝所需代碼代碼粘到對應的文件夾

          2.基本使用:

          //示例:獲取用戶列表 getUsers() { const { data } = await this.$http({ url: 'users' //這里的 users 就是 api.js 中定義的“屬性名” }) }, 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          3.動態接口的使用:

          //示例:刪除用戶 deleteUser() { const { data } = await this.$http({ method: 'delete', //動態接口寫法模仿的是vue的動態路由 //這里 params 攜帶的是動態參數,其中 “屬性名” 需要與 api 接口中的 :id 對應 //也就是需要保證攜帶參數的 key 與 api 接口中的 :xx 一致 url: { // 這里的 name 值就是 api.js 接口中的 “屬性名” name: 'usersEdit', params: { id: userinfo.id, }, }, }) }, 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16

          4.不足:

          封裝的請求只能這樣使用 this.$http() 。不能 this.$http.get() 或 this.$http.delete()

          由于我感覺使用 this.$http() 這種就夠了,所以沒做其他的封裝處理

          如果你有更好的想法可以隨時聯系我

          如下是封裝所需代碼:

          • api.js 管理所有的接口
          // 如下接口地址根據自身項目定義 const API = { // base接口 baseURL: 'http://127.0.0.1:8888/api/private/v1/', // 用戶 users: '/users', // “修改”與“刪除”用戶接口(動態接口) usersEdit: '/users/:id', } export default API 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • index.js 邏輯代碼
          // 這里請求封裝的主要邏輯,你可以分析并將他優化,如果有更好的封裝方法歡迎聯系我Q:2356924146 import axios from 'axios' import API from './api.js' const instance = axios.create({ baseURL: API.baseURL, timeout: '8000', method: 'GET' }) // 請求攔截器 instance.interceptors.request.use( config => { // 此處編寫請求攔截代碼,一般用于加載彈窗,或者每個請求都需要攜帶的token console.log('正在請求...') // 請求攜帶的token config.headers.Authorization = sessionStorage.getItem('token') return config }, err => { console.log('請求失敗', err) } ) // 響應攔截器 instance.interceptors.response.use( res => { console.log('響應成功') //該返回對象會綁定到響應對象中 return res }, err => { console.log('響應失敗', err) } ) //options 接收 {method, url, params/data} export default function(options = {}) { return instance({ method: options.method, url: (function() { const URL = options.url if (typeof URL === 'object') { //拿到動態 url let DynamicURL = API[URL.name] //將 DynamicURL 中對應的 key 進行替換 for (const key of Object.keys(URL.params)) { DynamicURL = DynamicURL.replace(':' + key, URL.params[key]) } return DynamicURL } else { return API[URL] } })(), //獲取查詢字符串參數 params: options.params, //獲取請求體字符串參數 data: options.data }) } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • main.js 將請求注冊為全局組件
          import Vue from 'vue' // 會自動導入 http 目錄中的 index.js 文件 import http from './http' Vue.prototype.$http = http
          

          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          分享此文一切功德,皆悉回向給文章原作者及眾讀者 轉自:csdn. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          elementui導出數據為xlsx、excel表格

          前端達人

          我這里為了同學們好理解,把所有元素都寫到一個頁面。

          1.第一步安裝插件

          
          
          1. npm install file-saver
          2. npm install xlsx

          2.第二步在mian.js中設置全局

          
          
          1. // vue中導出excel表格模板
          2. import FileSaver from 'file-saver'
          3. import XLSX from 'xlsx'
          4. Vue.prototype.$FileSaver = FileSaver; //設置全局
          5. Vue.prototype.$XLSX = XLSX; //設置全局

          3.第三步使用 

          
          
          1. <template>
          2. <div class="daochu">
          3. <el-button @click="o" type="success" round>導出</el-button>
          4. <el-table
          5. id="ou"
          6. :data="tableData"
          7. style="width: 100%"
          8. :default-sort="{ prop: 'date', order: 'descending' }"
          9. >
          10. <el-table-column prop="date" label="日期" sortable width="180">
          11. </el-table-column>
          12. <el-table-column prop="name" label="姓名" sortable width="180">
          13. </el-table-column>
          14. <el-table-column prop="address" label="地址" :formatter="formatter">
          15. </el-table-column>
          16. </el-table>
          17. </div>
          18. </template>
          19. <script>
          20. export default {
          21. data() {
          22. return {
          23. tableData: [
          24. {
          25. date: "2016-05-02",
          26. name: "王小虎",
          27. address: "上海市普陀區金沙江路 1518 弄",
          28. },
          29. {
          30. date: "2016-05-04",
          31. name: "王小虎",
          32. address: "上海市普陀區金沙江路 1517 弄",
          33. }
          34. ],
          35. };
          36. },
          37. methods:{
          38. o() {
          39. let tables = document.getElementById("ou");
          40. let table_book = this.$XLSX.utils.table_to_book(tables);
          41. var table_write = this.$XLSX.write(table_book, {
          42. bookType: "xlsx",
          43. bookSST: true,
          44. type: "array",
          45. });
          46. try {
          47. this.$FileSaver.saveAs(
          48. new Blob([table_write], { type: "application/octet-stream" }),
          49. "sheetjs.xlsx"
          50. );
          51. } catch (e) {
          52. if (typeof console !== "undefined") console.log(e, table_write);
          53. }
          54. return table_write;
          55. },
          56. }
          57. }
          58. </script>

          可以看到已經導出 

          實際工作中導出按鈕單獨抽離出去做到可以復用才是比較合理的




          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          轉自:csdn
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



          MAC上 nodejs express 安裝

          前端達人

          最近在MAC上搭建 nodejs環境以及安裝 express 框架,遇到了一些問題,不過最后總算還是安裝成功了,下面是操作步驟

          1.node js 安裝

          訪問nodejs官網進入下載mac上的安裝包 , 從這里下載    這里可以選mac installer 的 pkg 安裝包,下載后直接點擊安裝就好,當然了也可以選擇 binary 包進行安裝,下載后用 tar -zxvf 命令先解壓開然后 編譯 在安裝。新版本的安裝包會把 npm(nodejs 的package管理工具)都會安裝上,測試是否安裝成功可以下方式測試。

          用 node -v 和 npm -v 來查看各自的版本信息,如果node 命令找不到 可以先用 which node 命令來看看安裝目錄 ,然后就可以用了

          其次可以按照nodejs 官網首頁提供的 demo js 腳本,寫一個hello world 程序, 然后在瀏覽器中訪問看看是否ok,到這里 node js 安裝完畢

          2.express 安裝

          express 作為 node js 的一個框架,該框架提供了很多組件,方便了 nodejs 的快速開發。這個就類似與其他語言的一些快速的框架, php中的yii,yp、java中的 SSH。

          安裝express的時候也可以參考 express官網 的 Getting started 步驟去安裝 , 但是我按照這個是沒有安裝起來。

          現在最新的express版本都是 4.0以上 , express4.0以后版本把express命令行工具從express library 中分離出來了(https://github.com/expressjs/generator) , 所安裝的方式也變化了。之前一直用

          npm istall -g express

           

          這個命令工具進行安裝,顯示成功了,但是命令行中無法使用 express 這個命令。

          現在進行全局安裝 , 這里根據自己的需求選擇是否全局安裝。命令如下

          npm install -g express-generator 

          等到上面的express命令行工具安裝完畢后,就可以安裝 express 框架

          cd /var/www/node
          express test && cd test //安裝express框架依賴 npm install //啟動test這個項目 npm start

          這里啟動過的時候 不要用 node app.js 這種方式, 你可以 用 vim 命令看看test目錄下的 package.json 這個文件的內容,其中找到scripts 哪一行

          接著就訪問 http://localhost:3000 , 可以看到 welcome express !??!

          到這就完畢了





          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:博客園

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          在MAC環境下之以太坊(ethereum)開發環境安裝

          前端達人

          先訪問github上go語言開發客戶端網址:

          安裝ethereum

          在MAC上安裝

          brew tap ethereum/ethereum

          brew install ethereum


          dogiant@bogon : /usr/local $brew tap ethereum/ethereum
          Updating Homebrew...
          ==> Tapping ethereum/ethereum
          Cloning into '/usr/local/Homebrew/Library/Taps/ethereum/homebrew-ethereum'...
          remote: Counting objects: 6, done.
          remote: Compressing objects: 100% (6/6), done.
          remote: Total 6 (delta 1), reused 1 (delta 0), pack-reused 0
          Unpacking objects: 100% (6/6), done.
          Checking connectivity... done.
          Tapped 3 formulae (31 files, 33.9K)
          dogiant@bogon : /usr/local $brew install ethereum
          ==> Installing ethereum from ethereum/ethereum
          ==> Installing dependencies for ethereum/ethereum/ethereum: go
          ==> Installing ethereum/ethereum/ethereum dependency: go
          ==> Downloadinghttps://homebrew.bintray.com/bottles/go-1.7.4_1.el_capitan.bottle.tar.gz
          ######################################################################## 100.0%
          ==> Pouring go-1.7.4_1.el_capitan.bottle.tar.gz
          ==> Caveats
          As of go 1.2, a valid GOPATH is required to use the `go get` command:
            https://golang.org/doc/code.html#GOPATH

          You may wish to add the GOROOT-based install location to your PATH:
            export PATH=$PATH:/usr/local/opt/go/libexec/bin
          ==> Summary
          ??  /usr/local/Cellar/go/1.7.4_1: 6,438 files, 250.7M
          ==> Installing ethereum/ethereum/ethereum
          ==> Cloninghttps://github.com/ethereum/go-ethereum.git
          Cloning into '/Users/dogiant/Library/Caches/Homebrew/ethereum--git'...
          remote: Counting objects: 2737, done.
          remote: Compressing objects: 100% (2066/2066), done.
          remote: Total 2737 (delta 963), reused 1654 (delta 553), pack-reused 0
          Receiving objects: 100% (2737/2737), 14.91 MiB | 112.00 KiB/s, done.
          Resolving deltas: 100% (963/963), done.
          Checking connectivity... done.
          Note: checking out 'ff07d54843ea7ed9997c420d216b4c007f9c80c3'.

          You are in 'detached HEAD' state. You can look around, make experimental
          changes and commit them, and you can discard any commits you make in this
          state without impacting any branches by performing another checkout.

          If you want to create a new branch to retain commits you create, you may
          do so (now or later) by using -b with the checkout command again. Example:

            git checkout -b <new-branch-name>

          Checking out files: 100% (2487/2487), done.
          ==> Checking out tag v1.5.5
          ==> go env
          ==> make all
          ==> Caveats
          To have launchd start ethereum/ethereum/ethereum now and restart at login:
            brew services start ethereum/ethereum/ethereum
          ==> Summary
          ??  /usr/local/Cellar/ethereum/1.5.5: 9 files, 47.7M, built in 5 minutes 30 seconds



          安裝完畢后

          geth -h

          列出當前的用戶
          geth account list 
          顯示空

          dogiant@bogon : ~/ethereum/workspace $geth --datadir "~/ethdev" --dev
          I1228 15:16:46.907316 cmd/utils/flags.go:615] WARNING: No etherbase set and no accounts found as default
          I1228 15:16:46.907493 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /Users/dogiant/ethdev/geth/chaindata
          I1228 15:16:46.911765 ethdb/database.go:176] closed db:/Users/dogiant/ethdev/geth/chaindata
          I1228 15:16:46.912892 node/node.go:176] instance: Geth/v1.5.5-stable-ff07d548/darwin/go1.7.4
          I1228 15:16:46.912925 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /Users/dogiant/ethdev/geth/chaindata
          I1228 15:16:46.935109 eth/backend.go:280] Successfully wrote custom genesis block: e5be92145a301820111f91866566e3e99ee344d155569e4556a39bc71238f3bc
          I1228 15:16:46.935127 eth/backend.go:299] ethash used in test mode
          I1228 15:16:46.935536 eth/db_upgrade.go:346] upgrading db log bloom bins
          I1228 15:16:46.935580 eth/db_upgrade.go:354] upgrade completed in 48.143μs
          I1228 15:16:46.935601 eth/backend.go:191] Protocol Versions: [63 62], Network Id: 1
          I1228 15:16:46.935744 eth/backend.go:219] Chain config: {ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000}
          I1228 15:16:46.935983 core/blockchain.go:219] Last header: #0 [e5be9214…] TD=131072
          I1228 15:16:46.935998 core/blockchain.go:220] Last block: #0 [e5be9214…] TD=131072
          I1228 15:16:46.936007 core/blockchain.go:221] Fast block: #0 [e5be9214…] TD=131072
          I1228 15:16:46.936626 p2p/server.go:342] Starting Server
          I1228 15:16:49.127910 p2p/discover/udp.go:227] Listening, enode://05399f51a43805c17f82e5016d5969d14b3092018cae87eec77ed52291d66c50c7d7bf024d953b0afcccd44c717f17aaf251b897d770054205ea268b49a3050b@10.0.37.126:58049
          I1228 15:16:49.128111 whisper/whisperv2/whisper.go:176] Whisper started
          I1228 15:16:49.128115 p2p/server.go:610] Listening on [::]:55739
          I1228 15:16:49.129641 node/node.go:341] IPC endpoint opened: /Users/dogiant/ethdev/geth.ipc



          dogiant@dubiaoqideMBP : ~ $geth --dev console 2>> file_to_log_output
          Welcome to the Geth JavaScript console!

          instance: Geth/v1.5.5-stable-ff07d548/darwin/go1.7.4
           modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0

          > eth.accounts
          []
          > personal.newAccount('123456')
          "0x556d64ecb09b5df590a2ab842b53a8041e3961b4"
          > eth.accounts
          [
           "0x556d64ecb09b5df590a2ab842b53a8041e3961b4" ]
          > eth.accounts
          [
           "0x556d64ecb09b5df590a2ab842b53a8041e3961b4" ]
          > personal.newAccount('123456')
          "0xb0945a303834ff763695e21ed8acbe80aefee9bb"
          > eth.accounts
          [
           "0x556d64ecb09b5df590a2ab842b53a8041e3961b4" , "0xb0945a303834ff763695e21ed8acbe80aefee9bb" ]
          >


          dogiant@dubiaoqideMBP : ~ $geth --dev account list
          Account #0: {556d64ecb09b5df590a2ab842b53a8041e3961b4} /var/folders/jy/q2f6pdjn6p11ytfx0xk8yp7m0000gn/T/ethereum_dev_mode/keystore/UTC--2016-12-28T07-20-52.337017793Z--556d64ecb09b5df590a2ab842b53a8041e3961b4
          Account #1: {b0945a303834ff763695e21ed8acbe80aefee9bb} /var/folders/jy/q2f6pdjn6p11ytfx0xk8yp7m0000gn/T/ethereum_dev_mode/keystore/UTC--2016-12-28T07-25-51.683157537Z—b0945a303834ff763695e21ed8acbe80aefee9bb




          > user1 = eth.accounts[0]
          "0x556d64ecb09b5df590a2ab842b53a8041e3961b4"
          > user2 = eth.accounts[1]
          "0xb0945a303834ff763695e21ed8acbe80aefee9bb"
          > user1
          "0x556d64ecb09b5df590a2ab842b53a8041e3961b4"
          > user2
          "0xb0945a303834ff763695e21ed8acbe80aefee9bb"
          > eth.getBalance(user1)
          0
          > eth.getBalance(user2)
          0
          > eth.blockNumber
          0
          > miner.start()
          true
          > eth.getBalance(user1)
          390000000000000000000

          > eth.getBalance(user2)
          0
          > miner.stop()
          true
          > eth.blockNumber
          99
          > eth.getBalance(user1)
          495000000000000000000
          > eth.getBalance(user2)
          0
          > eth.sendTransaction({from:user1,to:user2,value:web3.toWei(3,"ether")})
          Error: account is locked
              at web3.js:3119:20
              at web3.js:6023:15
              at web3.js:4995:36
              at <anonymous>:1:1

          > personal.unlockAccount("0x556d64ecb09b5df590a2ab842b53a8041e3961b4","123456")

          true
          > eth.sendTransaction({from:user1,to:user2,value:web3.toWei(3,"ether")})
          "0x39d604a1df899f6c80ce33279abe88aec28b6d97f83e2dda5f062dd3c099fcf3"
          > eth.getBalance(user2)
          0
          > miner.start()
          true
          > miner.stop()
          true
          > eth.getBalance(user2)
          3000000000000000000


          問題1:一開始用get account list總是看不到新建的用戶,后來考慮是開發控制臺創建的用戶要跟開發一致 加了 —dev后看到正常顯示賬號

          看日志以太幣轉賬,轉賬后需要挖礦確認




          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn
          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          二、學習基礎智能合約

          前端達人

          第一講 介紹

          1、 智能合約是什么?

          智能合約并非現實中常見的合同,而是存在區塊鏈上,可以被觸發執行的一段程序代碼,這些代碼實現了某種預定的規則,是存在于區塊鏈執行環境中的“自治代理”。智能合約需要被觸發,代碼才會執行,不被觸發他的狀態將會始終保持一個狀態,并且部署后的智能合約將不可被修改。智能合約語言的語法和js腳本語言很像,因此有過js開發經驗的小伙伴們學習起來會很快。

          2、 編程工具的介紹。

          我們都知道“預先善其事、必先利其器”的道理,現實中織布是需要織布機才能完成織布,同樣的我們的智能合約學習也是要有編程工具的使用的。我們本套課程都將以 remix 為編程工具進行講解課程。remix 就是我們手里的織布機,能織出什么布就看我們這些使用 remix 的程序員了。
          地址為(http://remix.ethereum.org/)可以直接在瀏覽器中開發,很方便,只要有一個 google chrome 谷歌瀏覽器就可以開發了。

          remix 有幾個主要的常用面板,分別是文件面板、編譯器、運行器、以及占用最大一部分的文本編輯器組成。

          文件面板:我們可以在這個面板進行創建文件、選擇文件等管理文件的操作。
          編譯器:我們可以將sol文件進行編譯,編譯不通過將不能執行合約,并且可以得到code.json以及abi.json。我們可以將他們在支持sol語言的公鏈上運行。
          運行器:可以將sol智能合約部署在eth鏈上,并且能對合約的方法進行調用等操作。
          文本編輯器:我們的代碼就是寫在這個位置的,后面基本大部分時間你將面對的是這個頁面。

          3、 我的第一個智能合約程序

          下面的智能合約是我們第一個合約程序,因此我們命名為 “FirstContract.sol” 文件名

          pragma solidity ^0.6.0;
          
          // first contract
          contract FirstContract {
              // first method
              function firstMethod() public pure returns (string memory) {
                  return 'I am first method !!!';
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          上面代碼很多小伙伴應該不是很懂什么意思,不懂沒關系,我來給大家一行一行講解。
          pragma solidity ^0.6.0;
          這一行是說明使用solidity 0.6.0版本寫的,可以運行在0.6.0到0.7.0之間的版本上。
          contract FirstContract {
          這一句是定義一個叫 FirstContract 名稱的合約。
          function firstMethod() public pure returns (string memory){
          這一行是定義一個方法叫做 firstMethod, 該方法有返回值,類型是 string 類型的。
          return ‘I am first method !!!’;
          這一行是這個方法將會返回 “I am first method !!!”。

          看起來可能還是會有小伙伴們有不明白的地方,但是我們先只教這么多,關于什么是string,string 就是字符串的意思,字符串你就可以當作是任意的abcde這些字母等還有標點符號寫在了單引號或者雙引號中。這就是字符串最通俗易懂的解釋了,小伙伴們,大家可以動手試試自定義一些字符串讓他返回。

          第二講 智能合約結構

          在solidity中,合約有點類似面向對象語言中的類,每個合約中包含狀態變量、函數、函數變量、函數修飾器、事件、結構、和枚舉類的聲明,合約也可以繼承其他的合約。大家可能對類和類中的結構的概念沒有什么了解,我簡單給大家舉個例子。一個類可以比作是汽車,汽車里面的油就是變量,然后油門、剎車等就是函數,我們踩油門相當于調用類中的函數,汽車動起來,油減少,相當于變量值改變了。

          我們來根據上面的描述寫一個汽車的合約。先使用remix 創建一個CarContract1.sol文件,然后設定一個CarContract1名字的合約。汽車有了,還要有一個油箱,設定一個變量_gasoline,作為油箱。然后我們再給汽車加一個油門,寫一個startUp函數作為油門?,F在有了油箱但是不知道有多少油,再加gatGasoline函數作為一個儀表盤。咱們只有油箱沒有油汽車也跑不了,在加一個加油的接口,給汽車加油,使用addGasoline函數進行加油。下面就是我們完整的小汽車的代碼。

          CarContract1.sol

          pragma solidity ^0.6.0;
          
          contract CarContract1 {
              uint256 _gasoline;
          
              function startUp() public {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline = _gasoline + gasoline;
              }
          
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          1、 狀態變量

          小汽車合約中的_gasoline就是我們定義的狀態變量,類型是 uint256 類型。 該變量是存儲在鏈上的,也就是說他的數據是被保存起來的,每次改動都會記錄下來。因此我們在進行調用 addGasoline 函數時,會給這個小汽車加油成功,_gasoline 的值會變化,同樣的我們調用 startUp 函數時,_gasoline 的值也會變化。

          2、 函數

          在CarContract1小汽車中,startUp()、getGasoline()、addGasoline(uint256 gasoline) 都是函數。這些函數有的是沒有參數的,又叫無參函數,比如:startUp()、getGasoline()。有的是有參數的,就叫有參函數,比如:addGasoline(uint256 gasoline)。這些函數,有的有返回值,有的沒有返回值,根據具體場景來定,一般call操作都是有返回值的,call操作不會改變合約狀態。只有send操作,才會進行改變合約的狀態。

          3、 函數變量
          我們都知道加不同的型號汽油會有不一樣的效果,我們來給汽車換下不同的型號汽油,在汽車上我們放置一個桶名字是_bucket,用來裝另一個型號的汽油。如果我們自己的兩個容器里面有一個是空的,我們可以直接進行轉換汽油。但是我們自己的兩個容器中都有油的時候,兩個容器很明顯不能進行交換汽油,這個時候我們需要向隔壁的老李借一個桶 __tempBucket,這樣三個容器就能進行轉換油箱里面的汽油和桶里面的汽油進行對換了,換完以后把桶還回去。

          我們進行在進行造一個新的小汽車名字是CarContract2,增加一個桶,設定變量為_bucket,作為桶。還需要記錄當前汽車的油的型號。設定變量 _gasolineType 為當前油類型,默認是 1類型。設定一個函數 changeGasolineType,進行交換汽油類型,在設定一個函數進行查看當前汽車的類型 getGasolineType 。至此我們小汽車升級成功。

          CarContract2.sol

          pragma solidity ^0.6.0;
          
          contract CarContract2 {
              uint256 _gasoline;
              uint256 _bucket;
              int _gasolineType = 1;
          
              function startUp() public {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline += gasoline;
              }
          
              function changeGasolineType() public {
                  require(_gasoline != 0 || _bucket != 0, "can not change");
          
                  if (_gasoline == 0) {
                      _gasoline = _bucket;
                      _bucket = 0;
                  } else if (_bucket == 0) {
                      _bucket = _gasoline;
                      _gasoline = 0;
                  } else {
                      uint256 __tempBucket = _gasoline;
                      _gasoline = _bucket;
                      _bucket = __tempBucket;
                  }
          
                  _gasolineType = -1 * _gasolineType;
              }
          
              function getGasolineType() public view returns(int gasolineType) {
                  return _gasolineType;
              }
          
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44

          上面的小汽車2代正式出爐,我來給大家講下做了那些升級,首先我們的changeGasolineType內部定義了 __tempBucket 變量,該變量就是函數變量,是臨時創建的并且不會被記錄在鏈上的變量,也就是我們用完就還給隔壁老李了,還回去的時候桶是空的。

          4、 函數修飾器

          我們的小汽車還是很簡單,我們在給他加一點東西,規定小汽車要想啟動必須關閉車門。

          下面我們再一次修改我們的小汽車,加一個_doorStatus狀態變量作為我們的車門狀態。再加連個函數getDoorStatus()、changeDoorStatus(),用來控制開門/關門并且查看門的狀態。并且加入一個whenDoorClose()作為我們的判斷器。

          pragma solidity ^0.6.0;
          
          contract CarContract3 {
              uint256 _gasoline;
              uint256 _bucket;
              int _gasolineType = 1;
          
              bool _doorStatus;
          
              modifier whenDoorClose() {
                  require(!_doorStatus, "door is not close");
                  _;
          
              }
          
              function startUp() public whenDoorClose {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline += gasoline;
              }
          
              function changeGasoline() public {
                  require(_gasoline != 0 || _bucket != 0, "can not change");
          
                  if (_gasoline == 0) {
                      _gasoline = _bucket;
                      _bucket = 0;
                  } else if (_bucket == 0) {
                      _bucket = _gasoline;
                      _gasoline = 0;
                  } else {
                      uint256 __tempBucket = _gasoline;
                      _gasoline = _bucket;
                      _bucket = __tempBucket;
                  }
          
                  _gasolineType = -1 * _gasolineType;
              }
          
              function getGasolineType() public view returns(int gasolineType) {
                  return _gasolineType;
              }
          
              function getDoorStatus() public view returns(bool doorStatus) {
                  return _doorStatus;
              }
          
              function changeDoorStatus() public {
                  _doorStatus = ! _doorStatus;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59

          上面我們的3代小汽車已經完成了,whenDoorClose() 就是我們定義的函數修飾器 使用modifier 來定義的。

          5、 事件

          每次都到沒有油了才去加油,我們加一個功能,當行駛時油量低于5的時候我們要進行預警。

          我們加入一個 gasolineAlarm 事件,該事件有一個參數,當前的油量。這樣我們在啟動的函數中加入這個事件的調用,判斷本次使用后的油量是否小于等于5,是的話進行調用該事件

          pragma solidity ^0.6.0;
          
          contract CarContract4 {
              uint256 _gasoline;
              uint256 _bucket;
              int _gasolineType = 1;
          
              bool _doorStatus;
          
              modifier whenDoorClose() {
                  require(!_doorStatus, "door is not close");
                  _;
          
              }
          
              event gasolineAlarm(uint256 gasoline);
          
              function startUp() public whenDoorClose {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
                  if (_gasoline <= 5) {
                      emit gasolineAlarm(_gasoline);
                  }
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline += gasoline;
              }
          
              function changeGasoline() public {
                  require(_gasoline != 0 || _bucket != 0, "can not change");
          
                  if (_gasoline == 0) {
                      _gasoline = _bucket;
                      _bucket = 0;
                  } else if (_bucket == 0) {
                      _bucket = _gasoline;
                      _gasoline = 0;
                  } else {
                      uint256 __tempBucket = _gasoline;
                      _gasoline = _bucket;
                      _bucket = __tempBucket;
                  }
          
                  _gasolineType = -1 * _gasolineType;
              }
          
              function getGasolineType() public view returns(int gasolineType) {
                  return _gasolineType;
              }
          
              function getDoorStatus() public view returns(bool doorStatus) {
                  return _doorStatus;
              }
          
              function changeDoorStatus() public {
                  _doorStatus = ! _doorStatus;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64

          我們已經更新到第四代小汽車了,四代小汽車的gasolineAlarm 就是我們定義的事件,事件是會在虛擬機上記錄一條日志的,我么可以通過查詢日志的方式得到事件內容。

          6、 結構

          我們的汽車感覺成熟了,這個時候我們要給我們的汽車打上一些特性,比如顏色,比如車輪數,比如車門數等等。

          我們在小汽車里面加入CarInfo結構體,里面可以定義color顏色,wheelNum 車輪數等等,然后我們加入設置和獲取的函數:setCarInfo()、getCarInfo(), 這樣我們的小汽車就有了一些參數了。

          pragma solidity ^0.6.0;
          
          contract CarContract5 {
              uint256 _gasoline;
              uint256 _bucket;
              int _gasolineType = 1;
              bool _doorStatus;
          
              struct CarInfo {
                  string color;
                  uint8 wheelNum;
              }
          
              CarInfo _carInfo;
          
              modifier whenDoorClose() {
                  require(!_doorStatus, "door is not close");
                  _;
          
              }
          
              event gasolineAlarm(uint256 gasoline);
          
              function startUp() public whenDoorClose {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
                  if (_gasoline <= 5) {
                      emit gasolineAlarm(_gasoline);
                  }
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline += gasoline;
              }
          
              function changeGasoline() public {
                  require(_gasoline != 0 || _bucket != 0, "can not change");
          
                  if (_gasoline == 0) {
                      _gasoline = _bucket;
                      _bucket = 0;
                  } else if (_bucket == 0) {
                      _bucket = _gasoline;
                      _gasoline = 0;
                  } else {
                      uint256 __tempBucket = _gasoline;
                      _gasoline = _bucket;
                      _bucket = __tempBucket;
                  }
          
                  _gasolineType = -1 * _gasolineType;
              }
          
              function getGasolineType() public view returns(int gasolineType) {
                  return _gasolineType;
              }
          
              function getDoorStatus() public view returns(bool doorStatus) {
                  return _doorStatus;
              }
          
              function changeDoorStatus() public {
                  _doorStatus = ! _doorStatus;
              }
          
              function setCarInfo(string memory color, uint8 wheelNum) public {
                  _carInfo.color = color;
                  _carInfo.wheelNum = wheelNum;
          
                  //_carInfo = CarInfo(color, wheelNum);
          
              }
          
              function getCarInfo() public view returns(string memory color, int wheelNum) {
                  color = _carInfo.color;
                  wheelNum = _carInfo.wheelNum;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77
          • 78
          • 79
          • 80
          • 81
          • 82
          • 83

          我們的5代小汽車加入了CarInfo就是結構體,結構體中不能進行設置初值,我們能把一類的屬性等進行分類的放在結構體中,可以充當我們的數據模型。

          7、 枚舉類

          我們的小汽車想要開門,需要打開車鎖,車鎖是一種狀態,開/關。

          我們加入枚舉類DoorSwitch,定義兩個狀態open,close 。在定義whenDoorSwitch函數修飾器,進行判斷。

          pragma solidity ^0.6.0;
          
          contract CarContract6 {
              uint256 _gasoline;
              uint256 _bucket;
              int _gasolineType = 1;
              bool _doorStatus;
          
              enum DoorSwitch{ open, close }
          
              DoorSwitch _doorSwitch;
          
              struct CarInfo {
                  string color;
                  uint8 wheelNum;
              }
          
              CarInfo _carInfo;
          
              modifier whenDoorClose() {
                  require(!_doorStatus, "door is not close");
                  _;
          
              }
          
              modifier whenDoorSwitch() {
                  if (!_doorStatus) {
                      require(_doorSwitch == DoorSwitch.open, "door switch is close");
                  }
                  _;
              }
          
              event gasolineAlarm(uint256 gasoline);
          
              function startUp() public whenDoorClose {
                  require(_gasoline >= 1, "gasoline is not haved");
                  _gasoline = _gasoline - 1;
                  if (_gasoline <= 5) {
                      emit gasolineAlarm(_gasoline);
                  }
              }
          
              function getGasoline() public view returns(uint256 gasoline) {
                  return _gasoline;
              }
          
              function addGasoline(uint256 gasoline) public {
                  _gasoline += gasoline;
              }
          
              function changeGasoline() public {
                  require(_gasoline != 0 || _bucket != 0, "can not change");
          
                  if (_gasoline == 0) {
                      _gasoline = _bucket;
                      _bucket = 0;
                  } else if (_bucket == 0) {
                      _bucket = _gasoline;
                      _gasoline = 0;
                  } else {
                      uint256 __tempBucket = _gasoline;
                      _gasoline = _bucket;
                      _bucket = __tempBucket;
                  }
          
                  _gasolineType = -1 * _gasolineType;
              }
          
              function getGasolineType() public view returns(int gasolineType) {
                  return _gasolineType;
              }
          
              function getDoorStatus() public view returns(bool doorStatus) {
                  return _doorStatus;
              }
          
              function changeDoorStatus() public {
                  _doorStatus = ! _doorStatus;
              }
          
              function setCarInfo(string memory color, uint8 wheelNum) public {
                  _carInfo.color = color;
                  _carInfo.wheelNum = wheelNum;
          
                  //_carInfo = CarInfo(color, wheelNum);
              }
          
              function getCarInfo() public view returns(string memory color, int wheelNum) {
                  color = _carInfo.color;
                  wheelNum = _carInfo.wheelNum;
              }
          
              function setDoorSwitch(DoorSwitch doorSwitch) public {
                  _doorSwitch = doorSwitch; 
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77
          • 78
          • 79
          • 80
          • 81
          • 82
          • 83
          • 84
          • 85
          • 86
          • 87
          • 88
          • 89
          • 90
          • 91
          • 92
          • 93
          • 94
          • 95
          • 96
          • 97
          • 98

          我們已經更新到6代小汽車了,在6代小汽車中我們加入了DoorSwitch車門的開關,使用的就是枚舉定義的,在實際項目中枚舉定義的話,一般使用在狀態和類型的定義上,方便進行管理。

          到此我們的小汽車已經完成了,經歷了6代的更新,相信大家對于本節課程有空了一定的了解了。智能合約包含的狀態變量、函數、函數變量、函數修飾器、事件、結構、枚舉類都已經在制作和升級小汽車中使用了。

          第三講 數據類型

          在solidity中有專門的數據類型,什么是數據類型呢,我們可以認為數字是類型,是否是類型,地址是類型等。在solidity中存在以下常用的類型,uint/int、bool、 address、 mapping、bytes、string、fixed/ufixed 常用的類型。

          pragma solidity ^0.6.0;
          
          contract Test {
              uint v1 = 1;
              int v2 = -2;
              bool v3 = true;
              address v4 = 0x8a5fa31F2bf83812ECd8E5Ef1878dD12bBaDb40C;
              mapping(uint => uint) v5;
              bytes v6 = "0x123"; 
              string v7 = "asd";
              fixed v8 = 1.3;
              ufixed v9 = 1.2;
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          1、 uint/int類型

          uint/int 類型都是整型,也就是都是整數。1、2、3、4類似的數沒有小數點。區別是uint是沒有符號的??创a中的 v1 就是無符號整數,v2就是有符號整數。默認是0

          2、bool

          bool 中文是布爾類型,表示是/否的類型。v3就是bool類型,只有兩個值 true/false,默認是false

          3、address

          address是地址類型,存儲地址的,賬戶地址,合約地址等,都可以。

          4、mapping

          映射類型示例中的代碼不是很全,我來解釋下,實際上他是一個key-value模型,也就是一個key對應一個value。比如我們說小明,我們就是到小明這個人。就是這個道理。

          5、bytes

          定長數組,就是說他的長度是固定的,不能改變,設定是多少就是多少。

          6、string

          字符串類型,可以放字符串,長度是255位二級制數。

          7、fixed/ufixed

          浮點類型,就是帶有小數點的,1.2、1.4、1.9這類數值。也是分為有無符號項。

          第四講 控制語句

          在solidity中可以使用以下控制結構,有 if,else,while,for,break,continue,return,? : 我們來以此介紹這些結構。

          1、if else語句

          大家肯定好奇什么是if else語句。他就是我們說的如果 否者。也就是說如果我怎么樣否者我怎么樣。注意else只能與if一同使用,大家一起來看下面代碼:

          pragma solidity ^0.6.0;
          
          contract Test {
              uint256 temp;
          
              function test1(bool doorSwitch) public {
                  if (doorSwitch) {
                      temp = 1;
                  }
              }
          
              function test2(bool doorSwitch) public {
                  if (doorSwitch) {
                      temp = 1;
                  }
                  temp = 2;
              }
          
              function test3(bool doorSwitch) public {
                  if (doorSwitch) {
                      temp = 1;
                  } else {
                      temp = 2;
                  }
              }
          
              function getTemp() public view returns(uint256){
                  return temp;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32

          上面代碼中我們定義了三個測試方法,以及一個獲取temp值的方法。第一個測試方法表示如果我們傳進去的doorSwitch是true,門是開的,那么temp就等于1,否者doorSwitch等于false的話temp值不變。第二個測試方法表示如果我們傳進去的doorSwitch是true,門是開的,那么temp就先等于1,然后等于2,否者doorSwitch等于false的話temp直接等于2。第三個測試方法表示如果我們傳進去的doorSwitch是true,門是開的,那么temp就等于1,否者doorSwitch等于false的話temp等于2。

          2、while語句

          while 語句是循環語句,表示滿足條件就一直循環,一般我么會和break來使用,當達到某種情況進行跳出循環,可以讓循環體自動結束循環。

          pragma solidity ^0.6.0;
          
          contract Test {
              function test1() public {
                  int a = 1;
                  while(true) {
                      if (a == 5) {
                          break;
                      }
                      a++;
                  }
              }
          
              function test2() public {
                  int a = 1;
                  while(a != 5) {
          
                      a++;
                  }
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22

          上面兩個函數內部都有一個循環,實際上兩個循環的效果是一樣的,有一些細微的差別,需要根據具體業務場景分析了,不建議使用while 一不小心死循環就不好玩了。

          3、for循環

          for循環概念直接上代碼大家好理解些。

          pragma solidity ^0.6.0;
          
          contract Test {
              function test1() public {
                  for(uint8 i = 0; i < 10; i ++) {
                      ...
                  }
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          上面就是一個常用的for循環使用方式,循環10次 “…” 的內容。

          4、continue 語句

          continue語句是跳過本次循環進入下一次循環,來看代碼:

          pragma solidity ^0.6.0;
          
          contract Test {
              function test1() public {
                  for(uint8 i = 0; i < 10; i ++) {
                      if (i == 3) {
                          continue;
                      }
          
                      ...
                  }
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          上面的代碼是如果i = 3后跳過這次循環。

          5、return 語句

          return 是返回的命令當遇到return時就是表示結束了??创a:

          pragma solidity ^0.6.0;
          
          contract Test {
              function test1() public {
                  for(uint8 i = 0; i < 10; i ++) {
                      if (i == 3) {
                          return;
                      }
          
                      ...
                  }
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          上面的代碼可以看出,運行到i = 3時,程序直接結束。

          6、 結束

          到此我們的控制語句基本學習結束。這些概念每個語言都差不多,所以很重要。多練小伙伴!

          結束

          學習完上面的課程大家對于智能合約基本已經學習好了,但是還是缺乏使用,只是知道有啥東西,什么時候用不知道,這個時候需要大家進行鍛煉了,多寫一些小東西練習。

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn
          作者:

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          一、Conflux 網頁錢包創建

          前端達人

          相信每一位新加入的小伙伴都有一個疑問,去中心化的錢包到底是什么,如何擁有一個自己錢包,如何使用這個錢包吧,下面我將會為大家講解如何創建錢包、導入錢包、使用錢包三個方面講解下。

          一、創建錢包

          首先大家進入錢包網站登錄頁面 (大家可以將該網址收藏), 可以看到頁面上有兩個選擇,一個是創建錢包,一個是進入錢包(即導入錢包),我們先講創建錢包然后在講如何導入錢包。

          我們點擊創建錢包,將會彈出下面頁面中的密碼輸入框,這里大家輸入一個記得住得的密碼(如果記不住寫在小本本上藏起來),本教程輸入密碼為 000000000 然后點擊繼續。

          我們會進入下面的頁面,提示大家進行下載Keystore文件,大家點擊下載就好了,這里的keystore千萬不要丟了,和上面密碼一樣很重要。在進行導入錢包時,會根據大家的keystore文件以及密碼進行計算出大家的私鑰,因此很重要,最好備份到U盤中,以及打印一份。

          下面是本次教程下載的keystore文件。

          {"version":3,"id":"74e5b4a2-4894-4144-837c-61479487a565","address":"ad9af053f4ffed7a061226663ec50ce46736da9a","crypto":{"ciphertext":"eaeced1cd595adb51832c03feca291794eb593270e733776543ea4f095110bfb","cipherparams":{"iv":"73ca3e626b5625817679f43e2a81ec10"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"4e914d37a14cd522dc70dd88e079170481e82d45418cfd34a5c1ccbf8d0a409c","n":8192,"r":8,"p":1},"mac":"16769410e64e4ed4e0b89c43a84a338569696f46cf9ec604b82c87d4e99385ea"}} 
          
          • 1

          我們下載好以后,會進入看到下面的頁面彈窗。我們點擊進入錢包。

          點擊進入錢包后,會進入個人的錢包頁面,這個錢包中有CFX(測試幣)、以及FC(合約幣)。會發現都是0余額,很正常,剛剛創建嘛,是0就對了。

          到此我們就有了一個錢包了,是不是很簡單,溫馨提示大家,密碼 + keystore文件很重要,不要搞沒了,沒了就找不回來了。也不要公開,別人拿到了以后,就相當于知道你的錢包了,就可以把你的余額等都轉走。

          二、導入錢包

          上面我們講解了如何創建錢包,下面我們來講解下如何導入錢包,已經使用錢包的小伙伴已經發現了吧,當我們刷新瀏覽器頁面時,會直接進入到錢包登錄頁面,這個時候我們已經創建了錢包,肯定不會在創建一個了,那么我們就看下如何進入錢包(即導入錢包)吧。我們點擊進入錢包,

          會彈出下面頁面,我們繼續點擊繼續按鈕

          會讓我們選擇文件,這里直接選擇我們在上面創建的錢包時,下載的keystore文件,點擊打開

          這里會讓我們輸入密碼,就是上面創建錢包時的密碼,輸入密碼后點擊進入

          是不是進入了大家熟悉的錢包頁面啦!

          導入錢包是不是很簡單,這會知道keystore和密碼重要性了吧?。?!

          三、錢包使用

          小伙伴是不是還是很懵,我有了錢包能做什么,我來給大家介紹下錢包如何使用。大家可以看到下面錢包頁面上我標注的10個功能序號。我將為大家介紹這10個功能。

          功能1,復制錢包公鑰地址,這個錢包公鑰地址,可以進行公開,這個合約地址就是大家進行接受轉賬的地址,每個人都有一個唯一的公鑰地址。

          功能2, 錢包公鑰地址二維碼,可以使用支持掃碼的dapp進行掃碼來解析出來你的公鑰地址,同樣是可以公開的。

          功能3, 區塊瀏覽器,可以在該頁面查詢某個賬戶地址余額,出塊情況,交易hash等等信息。

          功能4,錢包私鑰,這個私鑰很重要,和上面的keystore+密碼是一樣重要的,可以直接通過私鑰,進行進入你的錢包中,因此,不能進行公開。

          功能5,cfx發送, 這里點擊發送后會讓我們輸入轉出cfx余額,以及發送地址,還有燃油費等信息,大家可以在測試網建兩個賬號相互轉轉,挺有意思的。

          功能6,cfx接收,這個就是功能1和功能2的集合體。

          功能7,申領測試幣,可以申請測試幣,每次會申請100測試幣,大家隨便使用,反正上線后會清除的,沒啥用。

          功能8,fc發送,這個功能可以在兩個賬戶間來回轉下,大家不要隨便轉給別人,不然就找不回來了。這里的fc是真正的可以在上線后也是能用的。

          功能9,fc接收,和功能6一樣的東西。

          功能10,這個是查看合約信息的情況的入口。可以看到總量等信息。

          四、錢包轉賬

          我們以CFX錢包賬戶來進行轉賬,轉給某個社區的小伙伴的賬戶地址(0x10898FD8a20C28A2F2Ea46428cAfBD2B58c1E363)這個小伙伴是誰我也不知道。我們點擊CFX下面的發送按鈕。進入下面頁面

          我們在發送至中填入這個小伙伴地址,發送cfx為10cfx.

          點擊發送看到下面的彈窗,我們這次不點擊那個確定點擊下面查看詳情

          可以看到進入了區塊瀏覽器中了。里面的交易hash是本次交易的hash通過這個可以查找到本次交易情況,發送方就是你本人的公鑰地址,接收方是對方的公鑰地址,價值就是你轉了多少cfx,差不多知道這些信息已經夠了。

          到此我們錢包課程已經基本介紹結束。

          五、結束

          感謝小伙伴們閱讀本文。有對conflux感興趣的小伙伴可以添加我微信好友(15832013094),我拉大家進入conflux社區群。一起共同學習進步。


          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn
          作者:

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          Conflux智能合約——1.入門篇

          前端達人

          Conflux移植了EVM,兼容以太坊的合約虛擬機,使用solidity作為合約語言。所以,開發需要使用remix進行合約十六進制碼的生成。

          Conflux合約需要相應的sdk部署到鏈上,形成智能合約地址,再使用call或send的方法,調用在鏈上的合約 。

          我們使用node.js作為開發環境,需要安裝node.js的環境和java sdk。node.js使用express框架,而合約部署需要對應的 js-conflux-sdk(npm install即為最新版)。建立文件夾sol,存放下面的.sol和兩個.json文件,其它安裝和檢查辦法略去2000字。

          remix下刪除所有的原來.sol文件,添加自己的test.sol文件,代碼:

          pragma solidity ^0.5.0;
          
          contract Counter { uint public count=0; event SelfEvent(address indexed sender, uint current);
          
              constructor() public {
              } function inc(uint num) public returns (uint){ return count += num;
              } function self() public { emit SelfEvent(msg.sender, count);
              }
          } 

          然后按圖示選擇配置,完成編譯,分別生成一個abi.json和一個bytecode.json。

          將bytecode文件里的bytecode字段保留值,其余內容都刪除,另存為code.json。code.json內的內容僅為:“0x60.......”。例如:

          "0x6080604052600080553480156100145......5056fea265627a7a72315820b814......0ff600baf64736f6c63430005110032"

          寫調用合約的代碼deploy.js或者call.js。deploy.js 源碼:

           // 私鑰地址,即所用conflux的錢包私鑰,注意保密 const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; // 合約地址 const CONTRACT = ''; const { Conflux } = require('js-conflux-sdk'); async function main() { const cfx = new Conflux({ // 節點的地址和端口號,這里用的測試網。實際最好用最新的主網地址 url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
              defaultGasPrice: 100,
              defaultGas: 1000000,
              logger: console,
            }); const account = cfx.Account(PRIVATE_KEY); // create account instance console.log(account.address); // create contract instance const contract = cfx.Contract({
              abi: require('./sol/abi.json'),
              code: require('./sol/code.json'),
            }); // deploy the contract const contractinfo = await contract.constructor()
          
              .sendTransaction({ from: account,
          
                gas: 100000000, // if not set gas, will use 'cfx.defaultGas' })
              .confirmed(); console.log(contractinfo.contractCreated);
          }
          main().catch(e => console.error(e)); 

          而call.js源碼:

           const { Conflux, util } = require('js-conflux-sdk'); // 這個地址是上面打印出來的 contractAddress 變量,錢包地址及私鑰 const contractAddress = '0x2c692d83b1e4781fa9d894924f8a027c401ea9fa'; const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; async function main() { const cfx = new Conflux({
              url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
              defaultGasPrice: 100,
              defaultGas: 1000000,
            }); const contract = cfx.Contract({
              address : contractAddress,
              abi: require('./sol/abi.json'),
            }); // 不進行記錄。注意,這里的inc就是定義在test.sol中的方法。.sol文件定義合約方法,被外部調用以實現應用目的 console.log("1輸出" + await contract.inc(10)); const account = cfx.Account(PRIVATE_KEY); // 進行記錄并花費燃油 const balance = await contract.inc(10).sendTransaction({ from: account }).confirmed();
          
          }
          main().catch(e => console.error(e)); 

          call.js里的inc()就是定義在test.sol中的方法。.sol文件定義合約方法,被外部調用以實現應用目的。

          將deploy.js和call.js放置在nodejs的工作目錄下。

          如果.js中的函數無錯,鏈上節點正常使用,sdk版本匹配,啟動node deploy.js或node call.js即可。如果有錯誤會有明顯的error提示。


          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:開源博客

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          超級實用的干貨 . 《 部署智能合約到conflux公鏈 》

          前端達人

          找到了一位大佬的文章,受到了許多啟發


          一、準備合約

          本節課程教大家如何講智能合約部署到conflux公鏈上,首先大家可以看到下面的這個智能合約是不是很簡單。我們將會以這個合約演示部署到conflux公鏈的過程。

          pragma solidity ^0.5.0;
          
          contract Counter {
              uint public count=0;
              event SelfEvent(address indexed sender, uint current);
          
              constructor() public {
              }
          
              function inc(uint num) public returns (uint){
                  return count += num;
              }
          
              function self() public {
                  emit SelfEvent(msg.sender, count);
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17

          二、conflux的sdk安裝

          我們使用js-conflux-sdk作為本教程的web教程,交互首先我們需要進行安裝nodejs作為我們的運行環境。飛機票一張收下吧,我們安裝好nodejs后,就可以來玩我們的sdk了。廢話不多說,直接開始擼。

          我們使用WIN + R鍵打開命令行,然后創建一個文件夾(溫馨提示切換到非系統盤玩切換方式“D:”就切換到D盤了)使用“mkdir my-project && cd my-project” 創建好項目后自動進入文件夾,然后我們運行“npm init” 進行初始化node項目,這一步會讓你確認一些東西,如果你是小白一路回車(Enter鍵)就好。如果你是前端大神,我也沒啥好教的我也不太懂。為了穩定我們使用固定版本號方式安裝依賴,我們運行 “npm install js-conflux-sdk@0.9.2” 命令進行安裝js-conflux-sdk的0.9.2版本依賴(可以使用“npm uninstall package-name” 命令刪除對應依賴)。前置準備到這里基本已經完成。

          三、編寫調用合約js代碼

          下面請看我的目錄結構跟隨我一起來學習,下面的目錄結構請不要直接看到了就創建,因為你不知道都是什么意思,看玩我的解釋在回頭創建。

          image

          小伙伴應該已經發現了 node_modules、package-lock.json、package.json 這些文件是我們在進行安裝 sdk依賴時自動生成的。其他文件目前都沒有,我們來按順序生成他們。

          先創建sol這個文件夾,然后創建這三個文件。test.sol就是上面我們的合約代碼直接拷入文件中。abi.json和code.json兩個文件是通過這個工具 remix 在線生成的。我來說下生成過程。
          首先我們將里面的文件全部刪除,然后點擊這里找到我們的項目目錄下的test.sol 文件

          我們應該看到下方我框出來的兩個按鈕了吧,那兩個按鈕就是abi.json和code.json文件的來源。abi.json我們可以直接復制過去,code.json文件我們要改點東西。

          首先我們看到的code文件應該是這樣的

          {
              "linkReferences": {},
              "object": "608060405260...c63430005110032",
              "opcodes": "PUSH1 0x80 PUSH1 ... 1100 ORIGIN ",
              "sourceMap": "27:337:0 ... 37;;;;;;"
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          代碼有省略,太長不好看,我們看到object這個key值了吧,我們把它的值考出來然后在頭部加0x 就好了放在code.json文件中。code.js文件中只存放object的內容前面加0x,也就是下面的代碼,其他信息都不要,千萬記住了。這點很重要!?。?!

          "0x608060405260...c63430005110032" 
          
          • 1

          就是這樣的。然后我們在寫另外兩個call和deploy兩個文件

          先寫deploy文件

           // 私鑰地址
          const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e';
          // 合約地址
          const CONTRACT = '';
          const { Conflux } = require('js-conflux-sdk');
          
          async function main() {
            const cfx = new Conflux({
              url: 'http://mainnet-jsonrpc.conflux-chain.org:12537',
              defaultGasPrice: 100,
              defaultGas: 1000000,
            });
            const account = cfx.Account(PRIVATE_KEY); // create account instance
            console.log(account.address); 
          
            // create contract instance
            const contract = cfx.Contract({
              abi: require('./sol/RC20.abi.json'),
              bytecode: require('./sol/RC20.code.json'),
            });
          
            const receipt = await contract.constructor()
              .sendTransaction({ from: account })
              .confirmed();
            console.log(receipt.contractCreated); 
          }
          main().catch(e => console.error(e)); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28

          打開項目cmd窗口在上面的目錄下 運行命令 “node deploy.js”就將合約部署上去了

          receipt.contractCreated 這個會打印出合約地址。




          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn
          作者:
          原文鏈接:https://blog.csdn.net/pizhi1461/article/details/106967255

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          yarn的安裝和使用

          前端達人

          yarn的簡介:

          Yarn是facebook發布的一款取代npm的包管理工具。


          yarn的特點:

          • 速度超快。
            • Yarn 緩存了每個下載過的包,所以再次使用時無需重復下載。 同時利用并行下載以最大化資源利用率,因此安裝速度更快。
          • 超級安全。
            • 在執行代碼之前,Yarn 會通過算法校驗每個安裝包的完整性。
          • 超級可靠。
            • 使用詳細、簡潔的鎖文件格式和明確的安裝算法,Yarn 能夠保證在不同系統上無差異的工作。

          yarn的安裝:

          1. 下載node.js,使用npm安裝
            npm install -g yarn
            查看版本:yarn --version
          2. 安裝node.js,下載yarn的安裝程序:
            提供一個.msi文件,在運行時將引導您在Windows上安裝Yarn
          3. Yarn 淘寶源安裝,分別復制粘貼以下代碼行到黑窗口運行即可
            yarn config set registry https://registry.npm.taobao.org -g
            yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g

          yarn的常用命令:

          • 安裝yarn

            • npm install -g yarn
          • 安裝成功后,查看版本號:

            • yarn --version
          • 創建文件夾 yarn

            • md yarn
          • 進入yarn文件夾

            • cd yarn
          • 初始化項目

            • yarn init // 同npm init,執行輸入信息后,會生成package.json文件
          • yarn的配置項:

            • yarn config list // 顯示所有配置項
            • yarn config get <key> //顯示某配置項
            • yarn config delete <key> //刪除某配置項
            • yarn config set <key> <value> [-g|--global] //設置配置項
          • 安裝包:

            • yarn install //安裝package.json里所有包,并將包及它的所有依賴項保存進yarn.lock
            • yarn install --flat //安裝一個包的單一版本
            • yarn install --force //強制重新下載所有包
            • yarn install --production //只安裝dependencies里的包
            • yarn install --no-lockfile //不讀取或生成yarn.lock
            • yarn install --pure-lockfile //不生成yarn.lock
          • 添加包(會更新package.json和yarn.lock):

            • yarn add [package] // 在當前的項目中添加一個依賴包,會自動更新到package.json和yarn.lock文件中
            • yarn add [package]@[version] // 安裝指定版本,這里指的是主要版本,如果需要精確到小版本,使用-E參數
            • yarn add [package]@[tag] // 安裝某個tag(比如beta,next或者latest)

            //不指定依賴類型默認安裝到dependencies里,你也可以指定依賴類型:

            • yarn add --dev/-D // 加到 devDependencies
            • yarn add --peer/-P // 加到 peerDependencies
            • yarn add --optional/-O // 加到 optionalDependencies

            //默認安裝包的主要版本里的最新版本,下面兩個命令可以指定版本:

            • yarn add --exact/-E // 安裝包的精確版本。例如yarn add foo@1.2.3會接受1.9.1版,但是yarn add foo@1.2.3 --exact只會接受1.2.3版
            • yarn add --tilde/-T // 安裝包的次要版本里的最新版。例如yarn add foo@1.2.3 --tilde會接受1.2.9,但不接受1.3.0
          • 發布包

            • yarn publish
          • 移除一個包

            • yarn remove <packageName>:移除一個包,會自動更新package.json和yarn.lock
          • 更新一個依賴

            • yarn upgrade 用于更新包到基于規范范圍的最新版本
          • 運行腳本

            • yarn run 用來執行在 package.json 中 scripts 屬性下定義的腳本
          • 顯示某個包的信息

            • yarn info <packageName> 可以用來查看某個模塊的最新版本信息
          • 緩存

            • yarn cache
              • yarn cache list # 列出已緩存的每個包 yarn cache dir # 返回 全局緩存位置 yarn cache clean # 清除緩存

          npm 與 yarn命令比較:

          這里寫圖片描述


          npm 與 yarn相關問題比較:

          npm模塊的依賴:
          • npm存在一些歷史遺留問題,請看下圖:
            這里寫圖片描述

          比如說你的項目模塊依賴是圖中描述的,@1.2.1代表這個模塊的版本。在你安裝A的時候需要安裝依賴C和D,很多依賴不會指定版本號,默認會安裝最新的版本,這樣就會出現問題:比如今天安裝模塊的時候C和D是某一個版本,而當以后C、D更新的時候,再次安裝模塊就會安裝C和D的最新版本,如果新的版本無法兼容你的項目,你的程序可能就會出BUG,甚至無法運行。這就是npm的弊端,而yarn為了解決這個問題推出了yarn.lock的機制,這是作者項目中的yarn.lock文件。

          yarn.lock文件格式:

          這里寫圖片描述

          大家會看到,這個文件已經把依賴模塊的版本號全部鎖定,當你執行yarn install的時候,yarn會讀取這個文件獲得依賴的版本號,然后依照這個版本號去安裝對應的依賴模塊,這樣依賴就會被鎖定,以后再也不用擔心版本號的問題了。其他人或者其他環境下使用的時候,把這個yarn.lock拷貝到相應的環境項目下再安裝即可。
          注意:這個文件不要手動修改它,當你使用一些操作如yarn add時,yarn會自動更新yarn.lock。

          使用yrm工具管理一些npm源

          安裝

          • yarn global add yrm

          查看可用源

          • yrm ls

          選擇源

          • yrm use yarn

          快速刪除node_modules

          手動刪除真的很慢:

          • 安裝: npm install rimraf -g
          • 使用:rimraf node_modules

          rimraf是node的一個包,可以快速刪除node_modules,再也不用等半天了


          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          npm,cnpm,yarn,tyarn 區別 與安裝

          前端達人



          做前端的應該都用過標題提到的包管理器。簡單說一下這4個包管理器的區別。

          npm

          這應該是最常用的,在某些情況會出現丟包,而且由于某種原因會下載很慢,通常會配置國內鏡像。我已經很少用npm了,主要用它下載 cnpm 或 yarn。

          cnpm

          這個就是npm的國內鏡像了。

          yarn

          它和npm最大區別是,yarn是并行下載的,所以下載速度很快,當然也是要配置國內鏡像。

          tyarn

          這個就是yarn的國內鏡像了。淘寶開發的。我主要就是用 tyarn。



          一、安裝

          1.1 安裝node.js

          下載地址,選擇自己的安裝位置,一直next即可。

          :.msi安裝程序會自動添加node.js路徑到系統環境配量


          image.png

          安裝完成目錄結構:


          # 查看版本號
          H:\Users\M>npm -v
          6.4.1
          
          H:\Users\M>node -v
          v10.15.1 

          1.2 安裝cnpm

          打開cmd命令窗口,執行:

          npm install -g cnpm --registry=https://registry.npm.taobao.org
          # 默認cnpm會會安裝在自己的用戶下面,并且自動配置了用戶環境變量
          # 比如我的安裝在:H:\Users\M\AppData\Roaming\npm 
          # 查看版本號
          H:\Users\M>cnpm -v
          cnpm@6.0.0 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\lib\parse_argv.js)
          npm@6.8.0 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\node_modules\npm\lib
          \npm.js)
          node@10.15.1 (D:\Develop\nodejs\node.exe)
          npminstall@3.20.2 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\node_modules
          \npminstall\lib\index.js)
          prefix=H:\Users\M\AppData\Roaming\npm
          win32 x64 6.1.7601
          registry=https://registry.npm.taobao.org 

          1.3 安裝tyarn

          # 國內源 $ cnpm i yarn tyarn -g #  $ tyarn -v 

          1.4 安裝umi

          $ tyarn global add umi
          $ umi -v 

          1.5安裝靜態服務

          cnpm install -g serve 
          0人點贊

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
          來源:csdn 與 簡書
          作者:境與界
          鏈接:https://www.jianshu.com/p/647328be9491
          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合