版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公共場(chǎng)所窗簾清洗與保養(yǎng)服務(wù)合同3篇
- 2025年度離婚后子女撫養(yǎng)權(quán)協(xié)商服務(wù)合同3篇
- 2025年度稅收籌劃與稅務(wù)籌劃合規(guī)性審查合同2篇
- 2025年度恐怖劇本定制與特效設(shè)計(jì)合同3篇
- 2024版輕鋼房屋建造協(xié)議模板協(xié)議
- 二零二四商鋪?zhàn)赓U合作協(xié)議:教育培訓(xùn)機(jī)構(gòu)商鋪?zhàn)赓U合同3篇
- 2025年度餐飲品牌連鎖拓展合同范本3篇
- 二零二四年家居裝飾團(tuán)購(gòu)合同3篇
- 2025年度材料墊資供應(yīng)鏈金融服務(wù)合同3篇
- 2024年鐵礦石采購(gòu)中介服務(wù)合同樣本
- 使用錯(cuò)誤評(píng)估報(bào)告(可用性工程)模版
- 公司章程(二個(gè)股東模板)
- GB/T 19889.7-2005聲學(xué)建筑和建筑構(gòu)件隔聲測(cè)量第7部分:樓板撞擊聲隔聲的現(xiàn)場(chǎng)測(cè)量
- 世界奧林匹克數(shù)學(xué)競(jìng)賽6年級(jí)試題
- 藥用植物學(xué)-課件
- 文化差異與跨文化交際課件(完整版)
- 國(guó)貨彩瞳美妝化消費(fèi)趨勢(shì)洞察報(bào)告
- 云南省就業(yè)創(chuàng)業(yè)失業(yè)登記申請(qǐng)表
- UL_標(biāo)準(zhǔn)(1026)家用電器中文版本
- 國(guó)網(wǎng)三個(gè)項(xiàng)目部標(biāo)準(zhǔn)化手冊(cè)(課堂PPT)
- 快速了解陌生行業(yè)的方法論及示例PPT課件
評(píng)論
0/150
提交評(píng)論