




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2024年“中銀杯”甘肅省職業(yè)院校技能大賽
高職學(xué)生組電子與信息大類
區(qū)塊鏈技術(shù)應(yīng)用賽項(xiàng)競賽樣題(3)
背景描述
電子簽章可實(shí)現(xiàn)與紙質(zhì)文件蓋章操作相似的可視效果,以保障數(shù)
據(jù)來源的真實(shí)性、數(shù)據(jù)完整性以及簽名人行為的不可否認(rèn)性。
傳統(tǒng)的電子簽章系統(tǒng)是基于中心化的,也就是數(shù)據(jù)是集中存儲在
中心數(shù)據(jù)庫中,這就導(dǎo)致傳統(tǒng)電子簽章使用記錄存在被篡改、偽造的
風(fēng)險(xiǎn)。
而區(qū)塊鏈電子簽章系統(tǒng)在傳統(tǒng)電子簽章系統(tǒng)的基礎(chǔ)上,可以借助
于區(qū)塊鏈技術(shù),用不可篡改、不可抵賴的方式記錄電子簽章的整個流
轉(zhuǎn)過程,如領(lǐng)取、使用、查詢等,從而解決傳統(tǒng)電子簽章系統(tǒng)存在的
潛在風(fēng)險(xiǎn)。
某市政務(wù)部分?jǐn)M開發(fā)一款區(qū)塊鏈電子簽章系統(tǒng),該區(qū)塊鏈電子簽
章系統(tǒng)包含為印章使用者、監(jiān)管、平臺運(yùn)營方的管理功能,場景開放
平臺,印章底層引擎,和區(qū)塊鏈基座。場景開放平臺面向各類政務(wù)系
統(tǒng)與第三方電子簽名服務(wù)商提供電子簽章相關(guān)的開放能力。場景開放
平臺對上提供相關(guān)的基礎(chǔ)能力,對下連接區(qū)塊鏈基座。
1
模塊一:區(qū)塊鏈產(chǎn)品方案設(shè)計(jì)及系統(tǒng)運(yùn)維(35分)
任務(wù)1-1:區(qū)塊鏈系統(tǒng)部署與運(yùn)維(25分)
圍繞電子簽章區(qū)塊鏈平臺部署與運(yùn)維需求,進(jìn)行項(xiàng)目相關(guān)系統(tǒng)、節(jié)點(diǎn)以及管
理工具的部署工作。通過通過監(jiān)控工具完成對網(wǎng)絡(luò)、節(jié)點(diǎn)服務(wù)的監(jiān)控。最終利用
業(yè)務(wù)需求規(guī)范,完成系統(tǒng)日志、網(wǎng)絡(luò)參數(shù)、節(jié)點(diǎn)服務(wù)等系統(tǒng)結(jié)構(gòu)維護(hù)。
1.登陸Linux服務(wù)器,安裝并部署下圖所示的單機(jī)、四機(jī)構(gòu)、三群組、八
節(jié)點(diǎn)的星形組網(wǎng)拓?fù)鋮^(qū)塊鏈系統(tǒng);
2.登陸Linux服務(wù)器,安裝并部署區(qū)塊鏈系統(tǒng)控制臺,檢查部署控制臺是
否正常運(yùn)行;
3.登錄Linux服務(wù)器,部署區(qū)塊鏈管理前置平臺;
4.登陸Linux服務(wù)器,使用終端生成新的節(jié)點(diǎn),并且將該節(jié)點(diǎn)加入對應(yīng)群
組然后啟動節(jié)點(diǎn)。
子任務(wù)1-2-1:登陸Linux服務(wù)器,安裝并部署下圖所示的單機(jī)、四機(jī)構(gòu)、三
群組、八節(jié)點(diǎn)的星形組網(wǎng)拓?fù)鋮^(qū)塊鏈系統(tǒng),具體工作內(nèi)容如下:
搭建部署多群組聯(lián)盟鏈并啟動所有節(jié)點(diǎn);
通過命令驗(yàn)證區(qū)塊鏈節(jié)點(diǎn)進(jìn)程運(yùn)行狀況;
通過命令驗(yàn)證區(qū)塊鏈連接狀態(tài)和共識狀態(tài)日志輸出。
子任務(wù)1-2-2:登陸Linux服務(wù)器,安裝并部署區(qū)塊鏈系統(tǒng)控制臺,檢查部署控
制臺是否正常運(yùn)行,具體工作內(nèi)容如下:
解壓控制臺安裝包并拷貝配置文件到當(dāng)前目錄;
配置控制臺證書;
啟動控制臺;
驗(yàn)證控制臺是否正常運(yùn)行。
子任務(wù)1-2-3:登錄Linux服務(wù)器,部署區(qū)塊鏈管理前置平臺,具體內(nèi)容如下
解壓平臺操作對應(yīng)安裝包;
配置秘鑰文件并檢查前置平臺啟動情況;
查看日志以及查看中間件進(jìn)程;
2
檢查進(jìn)程端口以及訪問服務(wù)。
子任務(wù)1-2-4:登陸Linux服務(wù)器,使用終端生成新的節(jié)點(diǎn),并且將該節(jié)點(diǎn)
加入對應(yīng)群組然后啟動節(jié)點(diǎn),具體內(nèi)容如下:
生成新節(jié)點(diǎn),修改新節(jié)點(diǎn)配置;
啟動新節(jié)點(diǎn),并查看節(jié)點(diǎn)的nodeid;
將新節(jié)點(diǎn)作為觀察節(jié)點(diǎn)加入群組1當(dāng)中,并檢查是否加入成功。
任務(wù)1-2:區(qū)塊鏈系統(tǒng)測試(10分)
設(shè)計(jì)對區(qū)塊鏈系統(tǒng)的測試流程;結(jié)合實(shí)際業(yè)務(wù)需求,調(diào)用部署的智能合約中
進(jìn)行系統(tǒng)測試、性能測試等;根據(jù)業(yè)務(wù)需求,分析并且修復(fù)給定智能合約中的安
全漏洞。利用模擬業(yè)務(wù)和測試工具來完成對區(qū)塊鏈系統(tǒng)服務(wù)數(shù)據(jù)的測試。
1.基于給定腳本完成區(qū)塊鏈管理平臺部署以及結(jié)果驗(yàn)證,最后將執(zhí)行結(jié)
果截圖保存。
實(shí)現(xiàn)區(qū)塊鏈管理平臺部署;
實(shí)現(xiàn)管理平臺啟動情況驗(yàn)證;
驗(yàn)證身份認(rèn)證進(jìn)程啟動情況驗(yàn)證和瀏覽器驗(yàn)證。
2.智能合約安全漏洞測試。
有如下智能合約:
pragmasolidity^0.8.3;
contractEtherGame{
uintpublictargetAmount=7ether;
addresspublicwinner;
functiondeposit()publicpayable{
require(msg.value==1ether,"Youcanonlysend1Ether");
uintbalance=address(this).balance;
require(balance<=targetAmount,"Gameisover");
if(balance==targetAmount){
winner=msg.sender;
}
}
3
functionclaimReward()public{
require(msg.sender==winner,"Notwinner");
(boolsent,)=msg.sender.call{value:address(this).balance}("");
require(sent,"FailedtosendEther");
}
}
contractAttack{
EtherGameetherGame;
constructor(EtherGame_etherGame){
etherGame=EtherGame(_etherGame);
}
functionattack()publicpayable{
addresspayableaddr=payable(address(etherGame));
selfdestruct(addr);
}
}
分析智能合約中存在問題,并說明危害;
創(chuàng)建新的智能合約,修復(fù)其中問題;
說明修復(fù)內(nèi)容并測試其智能合約。
4
模塊二:智能合約開發(fā)與測試(30分)
選手完成本模塊的任務(wù)后,將任務(wù)中設(shè)計(jì)結(jié)果、運(yùn)行代碼、運(yùn)行結(jié)果等截圖
粘貼至客戶端桌面【區(qū)塊鏈技術(shù)應(yīng)用賽\重命名為工位號\模塊二提交結(jié)果.docx】
中對應(yīng)的任務(wù)序號下。
任務(wù)2-1:智能合約開發(fā)(20分)
使用Solidity語言完成智能合約開發(fā)、部署和調(diào)用,要求如下:
1.個人簽章信息接口編碼
(1)編寫個人簽章智能合約的實(shí)體接口,完成實(shí)體通用數(shù)據(jù)的初始化,實(shí)
現(xiàn)簽章和用戶實(shí)體信息上鏈的功能;
structSealInfo{
//①姓名
//②身份證
//③印章數(shù)據(jù)
//④創(chuàng)建印章時間戳
}
(2)編寫簽章信息上鏈的接口,實(shí)現(xiàn)Seal合約的構(gòu)造函數(shù);
//@dev構(gòu)造函數(shù)
//@param_name姓名
//@param_cardId身份證號碼
//@param_data個人印章數(shù)據(jù)
//@param_datetime賬戶注冊時間
constructor(string_name,string_cardId,string_data,string
_datetime)public{
//①用戶姓名
//②用戶身份ID
//③用戶數(shù)據(jù)
//④時間戳
isUsed=true;
5
}
(3)基于給定的智能合約代碼以及注釋,完成ElectronicSeal合約判斷多
人簽章文件編號是否存在的函數(shù)。
//@dev判斷多人簽名文件編號是否存在
//@param_code簽章文件編號
//@returnbooltrue:存在false:不存在
functionisExistMultiCode(string_code)viewinternal
returns(bool){
//①遍歷所有多人簽章文件編號并與傳入簽章文件編號參數(shù)進(jìn)行比較
//②返回不存在
}
2.電子印章接口編碼(8分)
(1)基于給定的智能合約代碼以及注釋,完成ElectronicSeal合約獲取
多人簽章信息函數(shù)(3分)
//@dev獲取多人簽章信息
//@param_code簽章文件編號
//@return(簽章文件摘要、多人簽章發(fā)起人賬戶地址、簽章文件編號、
簽章人數(shù)、簽章賬戶地址列表)
functiongetMultiSingInfo(string_code)publicview
onlyPromoterOrSingerreturns(string,address,string,uint,address[]
memory){
//①獲取多人簽章合約對象實(shí)例
//②返回多人簽章信息
}
(2)基于給定的智能合約代碼以及注釋,完成ElectronicSeal合約多人簽
章函數(shù)(5分)
//@dev多人簽章
//@param_address簽章人賬戶地址
6
//@param_hash簽章文件摘要
//@param_datatime簽章時間戳
functiondoMultiSign(address_address,string_hash,string
_datetime)publiconlyPromoter{
//①判斷傳入的簽章人賬戶地址不能為空
//②獲取多人簽章合約對象實(shí)例
//③獲取當(dāng)前等待簽章賬戶地址
//④判斷合約調(diào)用者是否為等待簽章人賬戶地址
//⑤進(jìn)行簽章
}
3.合約編譯、部署和調(diào)用
(1)解決代碼錯誤和警告,正確編譯并部署合約,成功獲取部署的合約地
址和abi;
(2)調(diào)用區(qū)塊鏈電子簽章智能合約的接口,完整驗(yàn)證業(yè)務(wù)流程。
任務(wù)2-2:智能合約測試(10分)
根據(jù)已完成的智能合約,針對開發(fā)功能開展相關(guān)合約測試工作,具體工作內(nèi)
容如下:
1.生成測試文件,在Remix中的合約測試目錄tests中生成
ElectionSeal_Test.sol的測試文件
編譯并部署合約,配置項(xiàng)目的ElectionSeal_Test.sol測試腳本文件。
2.注釋測試文件中自動生成的測試函數(shù)checkSuccess()、
checkSuccess2()、checkFailure()、checkSenderAndValue()相關(guān)代碼,運(yùn)行測
試按鈕
基于remix的測試項(xiàng)目,將checkSuccess()、checkSuccess2()、
checkFailure()、checkSenderAndValue()相關(guān)代碼注釋掉并進(jìn)行相關(guān)測試;
3.實(shí)例化
在測試文件中定義測試ElectronicSeal合約變量并在beforeAll()函數(shù)中
進(jìn)行實(shí)例化。
4.創(chuàng)建測試函數(shù)測試印章賬戶數(shù)量
7
基于remix的測試項(xiàng)目,補(bǔ)全位于test文件夾中的ElectionSeal_Test.sol
合約測試文件,添加測試用例,補(bǔ)全測試印章賬戶數(shù)量函數(shù)。
5.創(chuàng)建測試函數(shù)測試印章賬戶簽章
基于remix的測試項(xiàng)目,補(bǔ)全位于test文件夾中ElectionSeal_Test.sol
合約測試文件,添加測試用例,創(chuàng)建測試函數(shù)測試印章賬戶簽章。
8
模塊三:區(qū)塊鏈應(yīng)用系統(tǒng)開發(fā)(30分)
任務(wù)3-1:區(qū)塊鏈電子簽章前端功能開發(fā)(10分)
1.請基于前端系統(tǒng)的開發(fā)模板,在注冊頁面register.html文件中添加對
應(yīng)的代碼邏輯,實(shí)現(xiàn)對前端系統(tǒng)的注冊功能,并測試功能完整性,示例頁面如
下;
題目的具體要求如下:
(1)注冊身份證號碼的數(shù)據(jù)實(shí)現(xiàn)雙向綁定
(2)注冊按鈕的事件綁定
(3)將用戶輸入的注冊信息向后端系統(tǒng)發(fā)送注冊請求
register.html
代碼片段1:
<divclass="input-group"style="width:80%">
<spanclass="input-group-addonglyphiconglyphicon-list-alt"
id="basic-addon1"></span>
<inputtype="text"class="form-control"placeholder="身份證號碼
(必填)"autocomplete="off"選手填寫部分>
</div><br/>
代碼片段2:
<divclass="modal-footer"style="margin-left:150px;">
9
<divclass="form-group"style="width:50%">
<!--TODO:請補(bǔ)充注冊按鈕的事件綁定代碼-->
<buttontype="button"class="btnbtn-success
form-control"選手填寫部分>確定</button>
</div>
</div>
代碼片段3:
methods:{
submit(){
if(this.user.username==''){
alert("用戶名不能為空")
return
}
if(this.user.password==''){
alert("密碼不能為空")
return
}
if(this.user.chainAccount==''){
alert("區(qū)塊鏈賬戶地址不能為空")
return
}
if(==''){
alert("姓名不能為空")
return
}
if(this.user.cardId==''){
alert("身份證號碼不能為空")
return
10
}
if(this.user.phone==''){
alert("電話號碼不能為空")
return
}
選手填寫部分
}
}
2.請基于前端系統(tǒng)的開發(fā)模板,在登錄頁面login.html文件中添加對應(yīng)
的代碼邏輯,實(shí)現(xiàn)對前端系統(tǒng)的登錄功能,并測試功能完整性,示例頁面如下:
本題目的具體要求如下:
(1)登錄按鈕的事件綁定
(2)用戶輸入的登錄用戶名和密碼通過雙向綁定存放在user中
(3)登錄成功頁面跳轉(zhuǎn)到main.html頁面
(4)本地保存登錄狀態(tài)信息(token)
login.html
代碼片段1:
<divclass="modal-footer"style="margin-left:100px;">
<divclass="form-group"style="width:75%">
<buttontype="button"class="btnbtn-primary
form-control"選手填寫部分>確定</button>
</div>
</div>
11
代碼片段2:
//創(chuàng)建Vue實(shí)例
newVue({
el:'#app',//el用于指定當(dāng)前Vue實(shí)例為哪個容器服務(wù),值通常
為css選擇器字符串
data:{//data中用于存儲數(shù)據(jù),數(shù)據(jù)供el所指定的容器去使用,
值我們暫時先寫成一個對象。
user:{
選手填寫部分
},
tip:false,
msg:""
},
methods:{
submit(){
if(this.user.username==''){
this.msg="用戶名不能為空"
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
return
}
if(this.user.password==''){
this.msg="密碼不能為空"
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
12
return
}
axios.post("http://localhost/user/login",
this.user).then(response=>{
if(response.data.resultCode==200){
this.msg="登錄成功"
this.tip=true
setTimeout(()=>{
選手填寫部分
},1000)
選手填寫部分
}else{
this.msg="登錄失敗"
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
}
})
},
}
})
3.請基于前端系統(tǒng)的開發(fā)模板,在個人印章頁面myseal.html文件中添加對
應(yīng)的頁面代碼邏輯,實(shí)現(xiàn)對前端系統(tǒng)的個人印章功能,并測試功能完整性,示例
頁面如下:
13
具體要求如下:
(1)注銷按鈕的事件綁定
(2)注銷時清除本地保存的登錄狀態(tài)信息(token)
(3)發(fā)送請求到后端系統(tǒng)攜帶本地保存的登錄狀態(tài)信息(token)
(4)接收后端系統(tǒng)發(fā)送過來的印章圖片信息
myseal.html
代碼片段1:
<divclass="container-fluid">
<divclass="navbar-header">
<aclass="navbar-brand"href="#"><imgalt="Brand"
src="../images/logo.png"style="height:50px;"></a>
</div>
<imgalt="Brand"src="../images/main.png"style="height:
40px;margin-top:20px;">
<ulclass="navnavbar-nav"style="float:right;">
<li><ahref="../index.html"><buttontype="button"
class="btnbtn-success"選手填寫部分>注銷</button></a></li>
</ul>
</div>
代碼片段2:
methods:{
logout(){
選手填寫部分
}
14
},
代碼片段3:
//請求發(fā)前攔截,header中添加token
erceptors.request.use(config=>{
config.headers.Authorization=選手填寫部分
returnconfig
})
代碼片段4:
axios.get("http://localhost/user/seal").then(response=>{
if(response.data.resultCode==200){
this.seal=選手填寫部分
}
})
4.請基于前端系統(tǒng)的開發(fā)模板,請?jiān)谖募炚马撁鎠ignature.html文件中
添加對應(yīng)的頁面代碼邏輯,實(shí)現(xiàn)對前端系統(tǒng)的文件簽章業(yè)務(wù)功能,并測試功能完
整性,示例頁面如下:
具體要求如下:
(1)創(chuàng)建canvas畫布實(shí)例
(2)向后端系統(tǒng)發(fā)送簽章請求url
(3)向后端系統(tǒng)獲取個人印章請求url
(4)接收后端系統(tǒng)發(fā)送過來的印章圖片信息
signature.html
15
代碼片段1:
signature(){
if(this.status==0){
this.msg="請上傳文檔"
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
return
}
this.status=2
varcanvas;
canvas=選手填寫部分
canvas.width=$("#poster").width()
canvas.height=$("#poster").height()
varcontext=canvas.getContext("2d");
context.rect(0,0,canvas.width,canvas.height);
context.fillStyle="#fff";
context.fill();
代碼片段2:
uploadSeal(){
if(this.status!=2){
this.msg="文檔未上傳或未簽章"
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
16
return
}
varposterImg=document.getElementById('poster');
varimgBase64=posterImg.getAttribute("src");
axios.post("選手填寫部分",
{
"filename":this.filename,
"imgBase64":imgBase64,
}
).then(response=>{
if(response.data.resultCode==200){
this.msg="簽章文檔上鏈成功"
this.tip=true
setTimeout(()=>{
this.tip=false
window.location.href="main.html";
},1000)
}else{
this.msg="簽章文檔上鏈?zhǔn)?
this.tip=true
setTimeout(()=>{
this.tip=false
},1000)
}
})
}
代碼片段3:
mounted(){
17
//請求發(fā)前攔截,header中添加token
erceptors.request.use(request=>{
request.headers.Authorization=
localStorage.getItem("Authorization")
returnrequest
})
//響應(yīng)攔截器(認(rèn)證授權(quán))
erceptors.response.use(response=>{
if(response.data.resultCode==401){
//跳轉(zhuǎn)頁面
window.location.href="login.html";
}
returnresponse
})
//TODO:【5-1-4-3】請補(bǔ)充向服務(wù)器發(fā)送獲取個人印章請求代碼
axios.get("選手填寫部分").then(response=>{
if(response.data.resultCode==200){
this.seal=選手填寫部分
}
})
}
5.請基于前端系統(tǒng)的開發(fā)模板,在文件驗(yàn)章頁面verity.html文件中添加
對應(yīng)的頁面代碼邏輯,實(shí)現(xiàn)對前端系統(tǒng)的文件驗(yàn)章業(yè)務(wù)功能,并測試功能完整
性,示例頁面如下:
18
具體要求如下:
(1)將驗(yàn)章結(jié)果數(shù)據(jù)顯示在頁面中
(2)向后端系統(tǒng)發(fā)送驗(yàn)章請求并攜帶驗(yàn)章文件數(shù)據(jù)
verity.html
代碼片段1:
<divclass="modal-dialog"role="document">
<divclass="modal-content">
<divclass="modal-header">
<buttontype="button"class="close"
data-dismiss="modal"aria-label="Close"><span
aria-hidden="true">×</span></button>
<h4class="modal-title"
id="myModalLabel">簽章信息</h4>
</div>
<divclass="modal-body">
<pstyle="margin-left:50px;">
<label>姓名:</label>選手填寫部
分
</p>
<pstyle="margin-left:50px;">
<label>身份證號碼:</label>選手
填寫部分
19
</p>
<pstyle="margin-left:50px;">
<label>區(qū)塊鏈賬戶地址:</label>
選手填寫部分
</p>
<pstyle="margin-left:50px;">
<label>文件名稱:</label>選手填
寫部分
</p>
<pstyle="margin-left:50px;">
<label>文件編碼:</label>選手填
寫部分
</p>
<pstyle="margin-left:50px;">
<label>簽章時間:</label>選手填
寫部分
</p>
</div>
<divclass="modal-footer"style="width:
300px;">
<buttontype="button"class="btn
btn-success"data-dismiss="modal"@click="finish">確定</button>
</div>
</div>
</div>
代碼片段2:
asyncverify(event){//同步發(fā)送axios請求(獲取數(shù)據(jù)后彈出模態(tài)框)
if(this.status==0){
this.msg="請上傳文檔"
this.tip=true
20
event.stopPropagation()//阻止事件冒泡(防止彈出
模態(tài)框)
setTimeout(()=>{
this.tip=false
},1000)
return
}
awaitaxios.post("選手填寫部分",
{"imgBase64":this.contract}).then(response=>{
if(response.data.resultCode==200){
this.verifyInfo=response.data.data
}
})
},
任務(wù)3-2:區(qū)塊鏈應(yīng)用系統(tǒng)后端開發(fā)(20分)
1.請基于后端系統(tǒng)的開發(fā)模板,在userService.java文件中補(bǔ)充對應(yīng)的
代碼邏輯,完成后端代碼邏輯,實(shí)現(xiàn)對后端系統(tǒng)的注冊功能,并測試功能完整
性,題目具體要求如下:
(1)根據(jù)用戶注冊信息中的用戶名和賬戶地址從數(shù)據(jù)庫中查詢賬戶信息是否
存在
(2)將用戶密碼進(jìn)行md5加密操作
(3)將電子印章字節(jié)數(shù)組轉(zhuǎn)為字符串
(4)將用戶注冊信息寫入數(shù)據(jù)庫匯總
userService.java
代碼片段1:
publicbooleanregister(RegisterBeanregisterBean){
21
//校驗(yàn)用戶名或賬戶地址是否重復(fù)
QueryWrapper<UserEntity>queryWrapper=newQueryWrapper<>();
queryWrapper.eq("username",registerBean.getUsername())
.or().eq("chain_account",registerBean.getChainAccou
nt());
UserEntityuserOne=選手填寫部分
if(userOne!=null){
("注冊失?。河脩裘蛸~戶地址重復(fù)");
returnfalse;
}
//拷貝對象
UserEntityuserEntity=newUserEntity();
BeanUtils.copyProperties(registerBean,userEntity);
userEntity.setPassword(選手填寫部分);//md5加密密碼
//生成印章(Base64)
byte[]buffer=Seal.getSealImg(registerBean.getUsername(),
registerBean.getName());
Encoderencode=Base64.getEncoder();
StringsealImg=選手填寫部分
userEntity.setSealImg(sealImg);
//用戶注冊信息上鏈
ListfuncParams=newArrayList<>();
funcParams.add(registerBean.getChainAccount());
22
funcParams.add(registerBean.getName());
funcParams.add(registerBean.getCardId());
funcParams.add(String.valueOf(System.currentTimeMillis()));
JSONObjectres=HttpUtils.writeContract("addSealAccount",
funcParams);
if(res==null){
("注冊失?。河脩糇孕畔⑸湘?zhǔn)?);
returnfalse;
}
intresult=選手填寫部分
returnresult>0?true:false;
}
2.請基于后端系統(tǒng)的開發(fā)模板,補(bǔ)充代碼完成對應(yīng)的后端代碼邏輯,實(shí)現(xiàn)
后端系統(tǒng)的登錄功能,并測試功能完整性,具體要求如下:
(1)登錄成功向前端系統(tǒng)返回登錄狀態(tài)信息(token)
(2)添加登錄的用戶名和密碼兩個數(shù)據(jù)庫查詢條件
(3)根據(jù)登錄的用戶名和密碼到數(shù)據(jù)庫中進(jìn)行查詢操作
UserController.java
代碼片段1:
publicAjaxResult<String>login(@RequestBodyLoginBeanloginBean){
(loginBean.toString());
if(userService.isLogin(loginBean)){
//創(chuàng)建
Stringtoken=
TokenUtil.sign(loginBean.getUsername(),String.valueOf(System.curren
tTimeMillis()));
AjaxResult<String>result=newAjaxResult<>(200,"login
23
ok");
result.setData(選手填寫部分);
returnresult;
}else{
returnnewAjaxResult<String>(403,"loginfail");
}
}
UserService.java
代碼片段1:
publicbooleanisLogin(LoginBeanloginBean){
QueryWrapper<UserEntity>queryWrapper=newQueryWrapper<>();
loginBean.setPassword(SecureUtil.md5(loginBean.getPassword()));//md
5加密密碼
//TODO:請補(bǔ)充queryWrapper添加用戶名和密碼兩個數(shù)據(jù)庫查詢條
件代碼
queryWrapper.eq(選手填寫部分)
.eq(選手填寫部分);
//TODO:請補(bǔ)充數(shù)據(jù)庫查詢登錄用戶信息代碼
UserEntityuserEntity=選手填寫部分
returnuserEntity!=null?true:false;
}
3.請基于后端系統(tǒng)的開發(fā)模板,補(bǔ)充代碼完成對應(yīng)的后端代碼邏輯,實(shí)現(xiàn)
對后端系統(tǒng)的賬戶信息查看功能,并測試功能完整性,具體要求如下:
24
(1)從前端系統(tǒng)發(fā)送的請求頭中獲取登錄狀態(tài)信息(token)
(2)根據(jù)登錄狀態(tài)信息(token)獲取登錄用戶名
(3)根據(jù)用戶名查詢數(shù)據(jù)庫
(4)將查詢結(jié)果數(shù)據(jù)封裝到RegisterBean中
UserController.java
代碼片段1:
@ApiOperation(value="用戶信息",notes="獲取用戶詳細(xì)信息")
@GetMapping("/user/info")
publicAjaxResult<RegisterBean>getUserInfo(HttpServletRequest
request){
Stringtoken=選手填寫部分
Stringusername=選手填寫部分
RegisterBeanregisterBean=userService.getUser(username);
AjaxResult<RegisterBean>result=newAjaxResult<>(200,
"ok");
result.setData(registerBean);
returnresult;
}
UserService.java
代碼片段1:
publicRegisterBeangetUser(Stringusername){
QueryWrapper<UserEntity>queryWrapper=newQueryWrapper<>();
queryWrapper.eq("username",username);
UserEntityuserEntity=選手填寫部分
RegisterBeanregisterBean=newRegisterBean();
25
選手填寫部分
returnregisterBean;
}
4.請基于后端系統(tǒng)的開發(fā)模板,補(bǔ)充代碼完成對應(yīng)的后端代碼邏輯,實(shí)現(xiàn)
對后端系統(tǒng)的文件簽章功能,并測試功能完整性,具體要求如下:
(1)驗(yàn)證登錄狀態(tài)信息(token)
(2)獲取簽章文件的UUID編碼
(3)獲取驗(yàn)章文件摘要(hash)
(4)將驗(yàn)章文件信息寫入智能合約中
TokenInterceptor.java
代碼片段1:
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
if("OPTIONS".equals(request.getMethod())){
response.setStatus(HttpServletResponse.SC_OK);
returntrue;
}
response.setCharacterEncoding("utf-8");
Stringtoken=request.getHeader("Authorization");
("token:"+token);
if(token!=null){
booleanresult=選手填寫部分
if(result){
("通過攔截器");
returntrue;
26
}
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
PrintWriterout=null;
try{
JSONObjectjson=newJSONObject();
json.put("message","認(rèn)證失敗,未通過攔截器");
json.put("resultCode","401");
response.getWriter().append(json.toJSONString());
("認(rèn)證失敗,未通過攔截器");
}catch(Exceptione){
e.printStackTrace();
response.sendError(500);
returnfalse;
}
returnfalse;
}
SealService.java
代碼片段1:
publicbooleansignature(ContractBeancontractBean,String
chainAccount){
//獲取簽名文檔uuid編碼
Stringcode=選手填寫部分
SealEntitysealEntity=newSealEntity();
BeanUtils.copyProperties(contractBean,sealEntity);
String[]str=contractBean.getFilename().split("\\.");
sealEntity.setFilename(str[0]);
27
sealEntity.setType(str[1]);
sealEntity.setCode(code);
//簽章記錄上鏈
try{
//獲取印章文檔Hash值
MessageDigestmessageDigest=選手填寫部分
byte[]bytes=
messageDigest.digest(contractBean.getImgBase64().getBytes("UTF-8"))
;
Stringhash=Hex.toHexString
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- CPSM考試的常見問題試題及答案
- 微生物在生態(tài)中的角色試題及答案
- 骨質(zhì)疏松科普知識課件
- 生物多樣性的保護(hù)措施試題及答案
- 采購管理師實(shí)務(wù)操作試題及答案解析
- 國際物流師考試解讀與試題及答案
- 適應(yīng)能力CPSM考試試題及答案
- 《安全工程師》2024年陜西省寶雞市鳳縣模擬試題含解析
- 2024年CPSM復(fù)習(xí)的系統(tǒng)性試題及答案
- 2024年CPSM考試的設(shè)計(jì)思路與試題與答案
- 孤島交直流混合微電網(wǎng)群分布式低碳控制策略
- 2025年信陽職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 人教版美術(shù)八年級下冊全冊教案
- 隧洞運(yùn)輸車輛安全課件
- 用友軟件銷售合同(2025年)
- 節(jié)能環(huán)保新能源燃料項(xiàng)目商業(yè)計(jì)劃書
- 江蘇省91job智慧就業(yè)平臺單位中心操作手冊
- 職業(yè)生涯規(guī)劃企業(yè)訪談
- 《周易》全文電子版
- 2024年修訂版私營學(xué)校收購協(xié)議
- 英語KET詞匯中譯英列表
評論
0/150
提交評論