2024年廣西職業(yè)院校技能大賽高職組《區(qū)塊鏈技術(shù)應(yīng)用》賽項(xiàng)樣卷_第1頁(yè)
2024年廣西職業(yè)院校技能大賽高職組《區(qū)塊鏈技術(shù)應(yīng)用》賽項(xiàng)樣卷_第2頁(yè)
2024年廣西職業(yè)院校技能大賽高職組《區(qū)塊鏈技術(shù)應(yīng)用》賽項(xiàng)樣卷_第3頁(yè)
2024年廣西職業(yè)院校技能大賽高職組《區(qū)塊鏈技術(shù)應(yīng)用》賽項(xiàng)樣卷_第4頁(yè)
2024年廣西職業(yè)院校技能大賽高職組《區(qū)塊鏈技術(shù)應(yīng)用》賽項(xiàng)樣卷_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2024年廣西職業(yè)院校技能大賽

區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)

樣卷

務(wù)

書(shū)

參賽隊(duì)編號(hào):

1

模塊一區(qū)塊鏈產(chǎn)品方案設(shè)計(jì)與系統(tǒng)運(yùn)維(35分)

選手完成本模塊的任務(wù)后,將任務(wù)中設(shè)計(jì)結(jié)果、運(yùn)行代碼、運(yùn)行

結(jié)果等截圖粘貼至客戶端桌面【區(qū)塊鏈技術(shù)應(yīng)用賽\重命名為工位號(hào)\

模塊一提交結(jié)果.docx】中對(duì)應(yīng)的任務(wù)序號(hào)下。

任務(wù)1-1:區(qū)塊鏈產(chǎn)品需求分析與方案設(shè)計(jì)

本任務(wù)需要依據(jù)項(xiàng)目背景完成需求分析與方案設(shè)計(jì),具體要求如

下:

1.依據(jù)給定區(qū)塊鏈?zhǔn)称匪菰聪到y(tǒng)的業(yè)務(wù)架構(gòu)圖,對(duì)考題進(jìn)行業(yè)務(wù)

分析,盡可能全面的考慮一個(gè)業(yè)務(wù)系統(tǒng)所需要的模塊,使用Visio或

思維導(dǎo)圖工具展現(xiàn)本系統(tǒng)的基本設(shè)計(jì)概念和處理流程,要求分為區(qū)塊

鏈?zhǔn)称匪菰礃I(yè)務(wù)平臺(tái)和支撐平臺(tái)兩個(gè)部分;

2.根據(jù)食品溯源系統(tǒng)設(shè)計(jì),在系統(tǒng)中分別包括用戶管理以及訂單

追溯功能,在訂單追溯中需要包括生產(chǎn)商、分銷商、經(jīng)銷商訂單的追

溯管理功能。根據(jù)描述,設(shè)計(jì)區(qū)塊鏈系統(tǒng)的總體功能概覽圖;

3.整合上述設(shè)計(jì)內(nèi)容,完善“區(qū)塊鏈?zhǔn)称匪菰聪到y(tǒng)概要設(shè)計(jì)說(shuō)明

書(shū).doc”,具體工作內(nèi)容如下:

(1)將設(shè)計(jì)內(nèi)容根據(jù)說(shuō)明書(shū)中模塊需求進(jìn)行補(bǔ)充,并完善概要

設(shè)計(jì)說(shuō)明書(shū)中的“需求概要”;

(2)完善說(shuō)明書(shū)中接口說(shuō)明部分內(nèi)容。

完成后提交“區(qū)塊鏈?zhǔn)称匪菰聪到y(tǒng)概要設(shè)計(jì)說(shuō)明書(shū).doc”文檔至

【區(qū)塊鏈技術(shù)應(yīng)用賽\重命名為工位號(hào)】下。

2

任務(wù)1-2:區(qū)塊鏈系統(tǒng)部署與運(yùn)維

圍繞食品安全溯源區(qū)塊鏈平臺(tái)部署與運(yùn)維需求,進(jìn)行項(xiàng)目相關(guān)系

統(tǒng)、節(jié)點(diǎn)以及管理工具的部署工作。通過(guò)監(jiān)控工具完成對(duì)網(wǎng)絡(luò)、節(jié)點(diǎn)

服務(wù)的監(jiān)控。最終根據(jù)業(yè)務(wù)需求規(guī)范,完成系統(tǒng)日志、網(wǎng)絡(luò)參數(shù)、節(jié)

點(diǎn)服務(wù)等系統(tǒng)結(jié)構(gòu)的維護(hù),具體要求如下:

1.根據(jù)參數(shù)與端口設(shè)置要求,部署區(qū)塊鏈系統(tǒng)并驗(yàn)證;

2.根據(jù)參數(shù)與端口設(shè)置要求,部署區(qū)塊鏈網(wǎng)絡(luò)管理平臺(tái)并驗(yàn)證;

3.基于區(qū)塊鏈系統(tǒng)相關(guān)管理平臺(tái),按照任務(wù)指南實(shí)施系統(tǒng)運(yùn)維工

作并驗(yàn)證;

4.基于區(qū)塊鏈系統(tǒng)相關(guān)監(jiān)管工具,按照任務(wù)指南對(duì)區(qū)塊鏈系統(tǒng)進(jìn)

行監(jiān)管。

子任務(wù)1-2-1:搭建區(qū)塊鏈系統(tǒng)并驗(yàn)證

基于給定服務(wù)器環(huán)境以及軟件(地址“/root/tools”),搭建一

條4節(jié)點(diǎn)的區(qū)塊鏈系統(tǒng)并驗(yàn)證,具體工作內(nèi)容如下:

(1)采用默認(rèn)配置搭建區(qū)塊鏈網(wǎng)絡(luò);

(2)通過(guò)命令驗(yàn)證區(qū)塊鏈節(jié)點(diǎn)進(jìn)程運(yùn)行狀況;

(3)通過(guò)命令驗(yàn)證區(qū)塊鏈連接狀態(tài)和共識(shí)狀態(tài)日志輸出。

子任務(wù)1-2-2:搭建區(qū)塊鏈系統(tǒng)管理平臺(tái)并驗(yàn)證

基于給定服務(wù)器環(huán)境以及軟件(地址“/root/tools”),搭建區(qū)

塊鏈控制臺(tái)并開(kāi)展相關(guān)運(yùn)維工作,具體工作內(nèi)容如下:

(1)配置控制臺(tái),管理相關(guān)證書(shū)并啟動(dòng);

(2)使用控制臺(tái)安裝HelloWorld智能合約;

(3)使用控制臺(tái)完成HelloWorld智能合約的set與get操作;

(4)使用控制臺(tái)查看區(qū)塊鏈中區(qū)塊高度。

3

子任務(wù)1-2-3:區(qū)塊鏈節(jié)點(diǎn)運(yùn)維

基于已完成的區(qū)塊鏈系統(tǒng)與管理平臺(tái)搭建工作,開(kāi)展區(qū)塊鏈節(jié)點(diǎn)

的加入與退出運(yùn)維工作,具體內(nèi)容如下:

(1)獲取指定區(qū)塊鏈節(jié)點(diǎn)輸出等級(jí)為警告級(jí),并設(shè)置日志存儲(chǔ)

閾值位100MB并驗(yàn)證;

(2)通過(guò)給定工具(地址/root/tools)完成新節(jié)點(diǎn)(node4)

配置;

(3)啟動(dòng)新節(jié)點(diǎn)加入?yún)^(qū)塊鏈系統(tǒng)并驗(yàn)證。

子任務(wù)1-2-4:區(qū)塊鏈網(wǎng)絡(luò)運(yùn)維

根據(jù)任務(wù)描述要求,完成網(wǎng)絡(luò)配置與管理運(yùn)維操作,具體內(nèi)容如

下:

(1)設(shè)置區(qū)塊鏈系統(tǒng)黑名單,將node3設(shè)為黑名單禁止連接,

并驗(yàn)證;

(2)設(shè)置系統(tǒng)中區(qū)塊打包最大交易數(shù)量設(shè)為2000;

(3)驗(yàn)證區(qū)塊最大打包交易數(shù)量情況。

任務(wù)1-3:區(qū)塊鏈系統(tǒng)測(cè)試

設(shè)計(jì)對(duì)區(qū)塊鏈系統(tǒng)的測(cè)試流程;結(jié)合實(shí)際業(yè)務(wù)需求,調(diào)用部署的

智能合約進(jìn)行系統(tǒng)測(cè)試、性能測(cè)試等;根據(jù)業(yè)務(wù)需求,分析并且修復(fù)

給定智能合約中的安全漏洞。利用模擬業(yè)務(wù)和測(cè)試工具來(lái)完成對(duì)區(qū)塊

鏈系統(tǒng)服務(wù)數(shù)據(jù)的測(cè)試。

1.使用命令啟動(dòng)區(qū)塊鏈系統(tǒng)可視化一體平臺(tái)并驗(yàn)證啟動(dòng)情況;

2.通過(guò)可視化平臺(tái)生成包括生產(chǎn)商(Producer)、經(jīng)銷商

(distributor)、零售商(retailer)賬戶,并將賬戶以p12加密形式

導(dǎo)出后倒入指定前置可視化平臺(tái),驗(yàn)證地址一致性;

4

3.使用Postman對(duì)上述功能接口進(jìn)行驗(yàn)證,并將驗(yàn)證結(jié)果截圖提

交工程文檔。對(duì)食品溯源系統(tǒng)服務(wù)端“添加食品”(/produce)功能接

口進(jìn)行驗(yàn)證。

請(qǐng)求路由:/produce

請(qǐng)求方法:POST

輸入項(xiàng)說(shuō)

輸入項(xiàng)類型說(shuō)明

明:

traceNumberString追蹤編號(hào)

foodNameString食品名稱

traceNameString存證人地址

qualityInteger食品質(zhì)量

輸出項(xiàng)說(shuō)

輸出項(xiàng)類型說(shuō)明

明:

retInteger返回值

返回消息,

msgString"Success"表示

操作成功

4.參照工程項(xiàng)目(地址:“/root/projects”)使用Caliper測(cè)試

工具對(duì)食品安全溯源系統(tǒng)智能合約生成新食品(newFood)功能進(jìn)行壓

力測(cè)試。具體要求如下:

(1)提供核心測(cè)試代碼;

(2)設(shè)置txNumber=10,tps=1,所有測(cè)試通過(guò)率為100%。

5.智能合約安全漏洞測(cè)試。

有如下問(wèn)題智能合約:

5

pragmasolidity>=0.8.3;

contractEtherStore{

mapping(address=>uint)publicbalances;

functiondeposit()publicpayable{

balances[msg.sender]+=msg.value;

emitBalance(balances[msg.sender]);

}

functionwithdraw()public{

uintbal=balances[msg.sender];

require(bal>0);

(boolsent,)=msg.sender.call{value:bal}("");

require(sent,"FailedtosendEther");

balances[msg.sender]=0;

}

//Helperfunctiontocheckthebalanceofthiscontract

functiongetBalance()publicviewreturns(uint){

returnaddress(this).balance;

}

}

contractAttack{

EtherStorepublicetherStore;

6

constructor(address_etherStoreAddress){

etherStore=EtherStore(_etherStoreAddress);

}

//FallbackiscalledwhenEtherStoresendsEthertothiscontract.

fallback()externalpayable{

if(address(etherStore).balance>=1){

etherStore.withdraw();

}

}

functionattack()externalpayable{

require(msg.value>=1);

etherStore.deposit{value:1}();

etherStore.withdraw();

}

//Helperfunctiontocheckthebalanceofthiscontract

functiongetBalance()publicviewreturns(uint){

returnaddress(this).balance;

}

}

(1)分析智能合約中存在問(wèn)題,并說(shuō)明危害;

(2)根據(jù)測(cè)試工具中的代碼文件,編寫(xiě)測(cè)試用例,復(fù)現(xiàn)智能合

約中存在的漏洞;

(3)創(chuàng)建新的智能合約,修復(fù)其中問(wèn)題,說(shuō)明修復(fù)內(nèi)容并測(cè)試。

7

模塊二智能合約開(kāi)發(fā)與測(cè)試(30分)

選手完成本模塊的任務(wù)后,將任務(wù)中設(shè)計(jì)結(jié)果、運(yùn)行代碼、運(yùn)行

結(jié)果等截圖粘貼至客戶端桌面【區(qū)塊鏈技術(shù)應(yīng)用賽\重命名為工位號(hào)\

模塊二提交結(jié)果.docx】中對(duì)應(yīng)的任務(wù)序號(hào)下。

任務(wù)2-1:智能合約設(shè)計(jì)

根據(jù)區(qū)塊鏈?zhǔn)称匪菰磻?yīng)用需求分析和方案設(shè)計(jì)文檔的描述,編寫(xiě)

該區(qū)塊鏈產(chǎn)品的智能合約功能需求文檔,以及設(shè)計(jì)該智能合約UML圖。

具體要求如下:

1.編寫(xiě)區(qū)塊鏈?zhǔn)称匪菰粗悄芎霞s功能需求文檔

根據(jù)區(qū)塊鏈?zhǔn)称匪菰串a(chǎn)品項(xiàng)目背景和需求分析,編寫(xiě)該區(qū)塊鏈?zhǔn)?/p>

品溯源產(chǎn)品的智能合約功能需求文檔。

2.完成區(qū)塊鏈?zhǔn)称匪菰粗悄芎霞s的設(shè)計(jì)圖

設(shè)計(jì)區(qū)塊鏈?zhǔn)称匪菰粗悄芎霞s接口,畫(huà)出區(qū)塊鏈?zhǔn)称匪菰粗悄芎?/p>

約的角色UML用例圖,以及畫(huà)出區(qū)塊鏈?zhǔn)称匪菰锤髦悄芎霞s關(guān)系的時(shí)

序圖。

任務(wù)2-2:智能合約開(kāi)發(fā)

使用Solidity語(yǔ)言完成智能合約開(kāi)發(fā)、部署和調(diào)用,要求如下:

1.食品信息(FoodInfoItem)的接口編碼

(1)編寫(xiě)食品信息實(shí)體的接口,完成可溯源食品信息初始化,

實(shí)現(xiàn)可追溯的原始生產(chǎn)商食品信息上鏈功能;

名稱類型說(shuō)明

_currentTraceNamestring當(dāng)前用戶名

_namestring食品名稱

8

_owneraddress合約的創(chuàng)建者

_qualityuint8質(zhì)量

_statusuint8狀態(tài)

_traceNamestring[]用戶名

_timestampuint[]流轉(zhuǎn)時(shí)間戳

_traceAddressaddress[]用戶地址

_traceQualityuint8[]食品質(zhì)量

contractFoodInfoItem{

//①保存食品流轉(zhuǎn)過(guò)程中各個(gè)階段的時(shí)間戳

//②保存食品流轉(zhuǎn)過(guò)程各個(gè)階段的用戶名

//③保存食品流轉(zhuǎn)過(guò)程各個(gè)階段的用戶地址信息(和用戶一一對(duì)應(yīng))

//④保存食品流轉(zhuǎn)過(guò)程中各個(gè)階段的質(zhì)量

//⑤食品名稱

//⑥當(dāng)前用戶名稱

//⑦質(zhì)量(0=優(yōu)質(zhì)1=合格2=不合格)

//⑧狀態(tài)(0:生產(chǎn)1:分銷2:出售)

//⑨初始化owner

(2)編寫(xiě)分銷商食品上鏈信息接口,根據(jù)食品溯源智能合約地

址獲取分銷商上鏈?zhǔn)称返男畔ⅲ?/p>

functionaddTraceInfoByDistributor(①,uint8quality)publicreturns(b

ool){

require(_status==0,"statusmustbeproducing");

//②

_timestamp.push(now);

_traceName.push(traceName);

9

_currentTraceName=traceName;

//③

//④

_traceQuality.push(_quality);

_status=1;

returntrue;

}

(3)編寫(xiě)超市進(jìn)行食品上鏈信息的接口,根據(jù)食品溯源智能合

約地址獲取超市上鏈?zhǔn)称沸畔ⅰ?/p>

functionaddTraceInfoByRetailer(①,uint8quality)publicreturns(bool

){

require(_status==1,"statusmustbedistributing");

//②

_timestamp.push(now);

_traceName.push(traceName);

_currentTraceName=traceName;

//③

//④

_traceQuality.push(_quality);

_status=2;

returntrue;

}

2.食品溯源(Trace)的接口編碼

(1)編寫(xiě)食品溯源智能合約生產(chǎn)商Producer添加食品接口,必

須生產(chǎn)商才能添加可溯源的食品,實(shí)現(xiàn)溯源功能;

functionnewFood(①,stringtraceName,uint8quality)

public②returns(③)

{

10

//④

//⑤

//⑥

//⑦

//⑧

}

(2)編寫(xiě)食品溯源智能合約分銷商Distributor添加食品接口,

必須分銷商才能添加可溯源的食品,實(shí)現(xiàn)溯源功能;

functionaddTraceInfoByDistributor(①,uint8quality)

public②returns(bool){

//③

returnFoodInfoItem(foods[traceNumber]).④,quality);

}

(3)編寫(xiě)食品溯源智能合約超市Retailer添加食品接口,必須

超市才能添加可溯源的食品,實(shí)現(xiàn)溯源功能。

functionaddTraceInfoByRetailer(①,uint8quality)

public②returns(bool){

require(③,"traceNumberdoesnotexist");

returnFoodInfoItem(foods[traceNumber]).④,quality);

}

3.角色(Role)管理的接口編碼

(1)編寫(xiě)食品溯源增加角色接口,必須是未增加的角色才能被

添加,實(shí)現(xiàn)添加角色的功能;

functionadd(①,addressaccount)②{

require(!③,"Roles:accountalreadyhasrole");

role.④=true;

}

11

(2)編寫(xiě)食品溯源移除角色接口,必須是已增加的角色才能被

移除,實(shí)現(xiàn)移除角色的功能;

functionremove(①,addressaccount)②{

require(③,"Roles:accountdoesnothaverole");

role.④=false;

}

(3)編寫(xiě)食品溯源角色授權(quán)接口,必須是授權(quán)的角色地址,實(shí)

現(xiàn)角色權(quán)限管理功能。

functionhas(①,addressaccount)②returns(bool){

require(③,"Roles:accountisthezeroaddress");

returnrole.④;

}

4.合約編譯、部署和調(diào)用

(1)解決代碼錯(cuò)誤和警告,正確編譯并部署合約,成功獲取部

署的合約地址和abi;

(2)調(diào)用食品溯源智能合約的接口,完整驗(yàn)證業(yè)務(wù)流程。

任務(wù)2-3:智能合約測(cè)試

編寫(xiě)智能合約單元測(cè)試代碼并完成合約功能測(cè)試、性能測(cè)試,具

體要求如下:

1.配置區(qū)塊鏈網(wǎng)絡(luò)

啟動(dòng)區(qū)塊鏈網(wǎng)絡(luò),創(chuàng)建新的Workspace,配置對(duì)外訪問(wèn)的RPC接

口為7545,配置項(xiàng)目的配置文件config.js實(shí)現(xiàn)與新建Workspace

的連接。

2.設(shè)置producerId和sellederId兩個(gè)變量

基于VSCODE加載測(cè)試項(xiàng)目,補(bǔ)全位于test文件夾中

12

foodTraceNew.js文件預(yù)操作的方法。在測(cè)試文件中添加預(yù)定義的

方法(在其他方法啟動(dòng)前使用),在方法中分別設(shè)置producerId和

sellederId兩個(gè)變量,具體要求如下:

(1)producerId設(shè)置為1

(2)sellderId設(shè)置為4

3.補(bǔ)全createMember和getMember方法

基于VSCODE加載的測(cè)試項(xiàng)目,補(bǔ)全位于test文件夾中

foodTraceNew.js文件,添加測(cè)試用例,測(cè)試智能合約的

createMember和getMember方法。

4.測(cè)試createOrder和getOrder方法

基于VSCODE加載的測(cè)試項(xiàng)目,補(bǔ)全位于test文件夾中

foodTraceNew.js文件,添加測(cè)試用例,測(cè)試智能合約的createOrder

和getOrder方法。

5.測(cè)試createFood和getFood方法

基于VSCODE加載的測(cè)試項(xiàng)目,補(bǔ)全位于test文件夾中

foodTraceNew.js文件,添加測(cè)試用例,測(cè)試智能合約的createFood

和getFood方法。

13

模塊三區(qū)塊鏈應(yīng)用系統(tǒng)開(kāi)發(fā)(30分)

選手完成本模塊的任務(wù)后,將任務(wù)中設(shè)計(jì)結(jié)果、運(yùn)行代碼、運(yùn)行

結(jié)果等截圖粘貼至客戶端桌面【區(qū)塊鏈技術(shù)應(yīng)用賽\重命名為工位號(hào)\

模塊三提交結(jié)果.docx】中對(duì)應(yīng)的任務(wù)序號(hào)下。

任務(wù)3-1:區(qū)塊鏈應(yīng)用前端開(kāi)發(fā)

1.請(qǐng)基于前端系統(tǒng)的開(kāi)發(fā)模板,在登錄組件login.js、組件管

理文件components.js中添加對(duì)應(yīng)的邏輯代碼,實(shí)現(xiàn)對(duì)前端的角色選

擇功能,并測(cè)試功能完整性,示例頁(yè)面如下:

具體要求如下:

(1)有明確的提示,提示用戶選擇角色;

(2)用戶可看到四個(gè)不同的角色可選(生產(chǎn)商、中間商、超市、

消費(fèi)者);

(3)每個(gè)用戶所對(duì)應(yīng)的組件請(qǐng)?jiān)赾omponents中找尋并填入;

(4)頁(yè)面頂部要有食品溯源平臺(tái)的網(wǎng)站標(biāo)題和logo。

Login.js:

代碼片段1:

14

template:`

<divclass="login">

<!--角色選擇-->

<h3v-if="currentUser===null">選手填寫(xiě)部分</h3>

<el-row:gutter="80"v-if="currentUser===null">

<el-col:span="6"v-for="選手填寫(xiě)部分":key="index">

<div@click="選手填寫(xiě)部分">選手填寫(xiě)部分</div>

</el-col>

</el-row>

代碼片段2:

//用戶身份

users:[

{

name:選手填寫(xiě)部分,

userName:'producer',

component:選手填寫(xiě)部分,

},

{

name:選手填寫(xiě)部分,

userName:'distributor',

component:選手填寫(xiě)部分,

},

{

name:選手填寫(xiě)部分,

userName:'retailer',

component:選手填寫(xiě)部分,

},

{

name:選手填寫(xiě)部分,

15

userName:'consumer',

component:選手填寫(xiě)部分,

},

],

currentUser:選手填寫(xiě)部分,//當(dāng)前用戶

components.js:

代碼片段3:

//頭部組件

constHeader={

//接受傳入的登錄狀態(tài)、用戶信息

props:['login','user'],

template:`

<divclass="header">

<imgsrc="選手填寫(xiě)部分"/>

<h3>選手填寫(xiě)部分</h3>

<spanv-if="login"class="user-name">{{選手填寫(xiě)部分}}</span>

</div>

`

}

2.請(qǐng)基于前端系統(tǒng)的開(kāi)發(fā)模板,在登錄組件login.js、組件管

理文件components.js中添加對(duì)應(yīng)的邏輯代碼,實(shí)現(xiàn)對(duì)前端的角色選

擇功能,并測(cè)試功能完整性,示例頁(yè)面如下:

16

具體要求如下:

(1)點(diǎn)擊角色進(jìn)入相應(yīng)角色登錄頁(yè)面;

(2)登錄界面提示用戶的地址(消費(fèi)者不顯示),有登錄操作的

相關(guān)提示;

(3)登錄界面有5秒倒計(jì)時(shí);

(4)登錄界面有“直接登錄”按鈕,點(diǎn)擊可直接跳轉(zhuǎn)到相應(yīng)角

色首頁(yè)。

login.js:

代碼片段1:

17

<!--角色登錄-->

<divv-elseclass="is-login">

<h3>登錄中......(倒計(jì)時(shí):{{選手填寫(xiě)部分}}秒)</h3>

<div>角色:

<span>{{選手填寫(xiě)部分}}</span>

</div>

<!--非消費(fèi)者則顯示角色地址-->

<divv-if="選手填寫(xiě)部分">角色地址:

<span>{{選手填寫(xiě)部分}}</span>

</div>

<!--直接登錄按鈕-->

<el-buttontype="primary"選手填寫(xiě)部分>直接登錄</el-button>

</div>

代碼片段2:

//登錄時(shí)有個(gè)5秒的倒計(jì)時(shí),這里是在點(diǎn)擊直接登錄時(shí),清除倒計(jì)時(shí),直接

跳到相關(guān)頁(yè)面

clearTimer(){

clearInterval(選手填寫(xiě)部分);

this.$emit(選手填寫(xiě)部分,{

component:this.loginIponent,

user:this.loginI,

});

},

//倒計(jì)時(shí)

countdownInterval({component,name:user}){

this.timer=setInterval(()=>{

if(this.countdown<=0){

18

選手填寫(xiě)部分;

}

選手填寫(xiě)部分;

},選手填寫(xiě)部分);

},

代碼片段3:

//點(diǎn)擊用戶登錄,獲取用戶地址

handleClick(item){

this.loginItem=item;

//處理消費(fèi)者角色,其他三個(gè)角色都有一個(gè)角色地址

if(item.userName!==選手填寫(xiě)部分){

axios({

method:'get',

url:`/userinfo?userName=${item.userName}`,

})

.then(ret=>{

this.address=選手填寫(xiě)部分;

this.currentUser=選手填寫(xiě)部分;

this.countdownInterval(選手填寫(xiě)部分);

})

.catch(err=>{

console.log(err)

})

}else{

this.currentUser=;

this.countdownInterval(item);

}

}

19

任務(wù)3-2:區(qū)塊鏈應(yīng)用后端開(kāi)發(fā)

1.請(qǐng)基于已有的項(xiàng)目,開(kāi)發(fā)完善IndexController類,編寫(xiě)添

加食品生產(chǎn)信息的方法,實(shí)現(xiàn)食品信息的添加功能,并測(cè)試功能完整

性。

本任務(wù)具體要求如下:

(1)開(kāi)發(fā)文件IndexController.java中的produce方法,請(qǐng)求

接口為/produce;

(2)開(kāi)發(fā)文件IndexController.java中的produce方法,要求

對(duì)前端傳入的參數(shù)進(jìn)行二次驗(yàn)證;

(3)開(kāi)發(fā)文件IndexController.java中的produce方法,要求

封裝返回值為String,但不返回視圖頁(yè)面。

produce方法:

/**

*添加食品生產(chǎn)信息

*traceNumber:食品溯源id,食品溯源過(guò)程中的標(biāo)識(shí)符

*foodName:食物名稱

*traceName:用戶名,食品流轉(zhuǎn)過(guò)程各個(gè)階段的用戶名

*quality:當(dāng)前食品質(zhì)量(0=優(yōu)質(zhì)1=合格2=不合格)

*@return:添加食品生產(chǎn)信息結(jié)果

*/

@選手填寫(xiě)部分

@PostMapping(選手填寫(xiě)部

分,produces=MediaType.APPLICATION_JSON_VALUE)

publicStringproduce(@RequestBodyJSONObjectjsonParam){

//聲明返回對(duì)象

JSONObject_outPutObj=newJSONObject();

20

//生產(chǎn)商生產(chǎn)食品

if(jsonParam==null){

選手填寫(xiě)部分

}

inttrace_number=選手填寫(xiě)部分;

Stringfood_name=選手填寫(xiě)部分;

Stringtrace_name=選手填寫(xiě)部分;

intquality=選手填寫(xiě)部分;

JSONArrayparams=JSONArray.parseArray("[\""+food_name+"\","+trace_

number+",\""+trace_name+"\","+quality+"]");

JSONObject_jsonObj=newJSONObject();

_jsonObj.put("contractName",CONTRACT_NAME);

_jsonObj.put("contractAddress",CONTRACT_ADDRESS);

_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));

_jsonObj.put("user",PRODUCER_ADDRESS);

_jsonObj.put("funcName",選手填寫(xiě)部分);

_jsonObj.put("funcParam",選手填寫(xiě)部分);

StringresponseStr=httpPost(URL,選手填寫(xiě)部分);

JSONObjectresponseJsonObj=JSON.parseObject(responseStr);

Stringmsg=responseJsonObj.getString("message");

if(msg.equals("Success")){

_outPutObj.put("ret",選手填寫(xiě)部分);

_outPutObj.put("msg",msg);

}else{

_outPutObj.put("ret",選手填寫(xiě)部分);

_outPutObj.put("msg",msg);

21

}

return選手填寫(xiě)部分;

}

2.開(kāi)發(fā)完善IndexController類,編寫(xiě)中間商添加食品流轉(zhuǎn)信

息的方法,實(shí)現(xiàn)中間商添加食品流轉(zhuǎn)信息的功能,并測(cè)試功能完整性。

具體要求如下:

(1)開(kāi)發(fā)文件IndexController.java中的

add_trace_by_distrubutor方法,請(qǐng)求接口為/adddistribution;

(2)開(kāi)發(fā)文件IndexController.java中的

add_trace_by_distrubutor方法,要求對(duì)前端傳入的參數(shù)進(jìn)行二次

驗(yàn)證;

(3)開(kāi)發(fā)文件IndexController.java中的

add_trace_by_distrubutor方法,要求封裝返回值為String,但不

返回視圖頁(yè)面;

add_trace_by_distrubutor方法:

/**

*中間商添加食品流轉(zhuǎn)信息

*traceNumber:食品溯源id,食品溯源過(guò)程中的標(biāo)識(shí)符

*traceName:用戶名,食品流轉(zhuǎn)過(guò)程各個(gè)階段的用戶名

*quality:當(dāng)前食品質(zhì)量(0=優(yōu)質(zhì)1=合格2=不合格)

*@return:中間商添加食品流轉(zhuǎn)信息結(jié)果

*/

@選手填寫(xiě)部分

@PostMapping(選手填寫(xiě)部分,produces=MediaType.

APPLICATION_JSON_VALUE)

publicStringadd_trace_by_distrubutor(@RequestBodyJSONObjectjsonPa

ram){

22

//聲明返回對(duì)象

JSONObject_outPutObj=newJSONObject();

if(jsonParam==null){

選手填寫(xiě)部分

}

Stringtrace_number=選手填寫(xiě)部分;

Stringtrace_name=選手填寫(xiě)部分;

intquality=選手填寫(xiě)部分;

JSONArrayparams=JSONArray.parseArray("["+trace_number+",\""+trace

_name+"\","+quality+"]");

JSONObject_jsonObj=newJSONObject();

_jsonObj.put("contractName",CONTRACT_NAME);

_jsonObj.put("contractAddress",CONTRACT_ADDRESS);

_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));

_jsonObj.put("user",DISTRIBUTOR_ADDRESS);

_jsonObj.put("funcName",選手填寫(xiě)部分);

_jsonObj.put("funcParam",選手填寫(xiě)部分);

StringresponseStr=httpPost(URL,選手填寫(xiě)部分);

JSONObjectresponseJsonObj=JSON.parseObject(responseStr);

Stringmsg=responseJsonObj.getString("message");

if(msg.equals("Success")){

_outPutObj.put("ret",選手填寫(xiě)部分);

_outPutObj.put("msg",msg);

}else{

_outPutObj.put("ret",選手填寫(xiě)部分);

23

_outPutObj.put("msg",msg);

}

return選手填寫(xiě)部分;

}

3.請(qǐng)基于已有的項(xiàng)目,開(kāi)發(fā)完善IndexController類,編寫(xiě)獲

取某個(gè)食品的溯源信息的方法,實(shí)現(xiàn)獲取某個(gè)食品的溯源信息的功能,

并測(cè)試功能完整性。

具體要求如下:

(1)開(kāi)發(fā)文件IndexController.java中的trace方法,請(qǐng)求接

口為/trace,該接口調(diào)用私有方法get_trace,不直接與合約交互,

提高系統(tǒng)的安全性;

(2)開(kāi)發(fā)文件IndexController.java中的trace方法,對(duì)傳入

數(shù)據(jù)進(jìn)行二次驗(yàn)證;

(3)開(kāi)發(fā)文件IndexController.java中的get_trace方法,要

求通過(guò)合約進(jìn)行溯源信息的查詢,且外部無(wú)法直接調(diào)用;

(4)開(kāi)發(fā)文件IndexController.java中的trace方法,要求封

裝返回值為String,但不返回視圖頁(yè)面。

trace方法:

/**

*獲取某個(gè)食品的溯源信息

*@paramtraceNumber食品溯源id,食品溯源過(guò)程中的標(biāo)識(shí)符

*@return對(duì)應(yīng)食品的溯源信息

*/

@選手填寫(xiě)部分

@GetMapping(選手填寫(xiě)部分,produces=MediaType.

APPLICATION_JSON_VALUE)

24

publicStringtrace(StringtraceNumber){

JSONObject_outPut=newJSONObject();

if(Integer.parseInt(traceNumber)<=0){

選手填寫(xiě)部分

}

Listres=get_trace(traceNumber);

JSONArrayo=newJSONArray(res);

return選手填寫(xiě)部分;

}

get_trace方法:

/**

*從鏈上獲取某個(gè)食品的溯源信息

*@paramtraceNumber食品溯源id,食品溯源過(guò)程中的標(biāo)識(shí)符

*@return對(duì)應(yīng)食品的溯源信息

*/

選手填寫(xiě)部分JSONArrayget_trace(StringtraceNumber){

//獲取食品基本信息

JSONArrayparams=JSONArray.parseArray("["+trac

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論