2025年度福建省职业院校技能大赛高职组“区块链技术应用”竞赛样题
近年来,高学历人才成为了各企业快速发展的基石,而学历认证成为判断高学历人才的重要指标,但现有的学历信息系统存在许多数据安全问题,比如学历信息数据篡改、学历信息数据泄露等。同时,高校毕业生数量逐年增加,给学历信息的查询和认证工作带来了很大的困难。
区块链以其不可篡改、可追溯等特性应用在多种场景中,将学历信息数据存储在区块链上,通过区块链共识机制对其进行信任背书,并且结合访问控制机制实现对学历信息的更可信、更细粒度的访问,可用效增强其安全性和完整性。
本项目设计并实现基于FISCO BCOS的可信学历认证系统,根据学历信息系统业务需求对系统架构、学籍管理功能模块及相关智能合约进行设计。本赛题通过创建相关配置文件,部署、启动FISCO BCOS区块链平台,从高校管理人员等不同角色出发,基于区块链特性开发学籍管理功能模块的智能合约,并进一步要求开发该模块的前后端实现对高校学籍信息的快速、高效、方便的动态操作,包括学籍信息的查询、更新、转移等,以确保学历信息的防篡改和可信任。
模块一:区块链开发平台运维(35分)
题1:按要求完成FISCO BCOS区块链系统部署
【要求】
登陆Linux服务器,以MySQL分布式存储方式安装并部署如图所示的三群组、四机构、七节点的星形组网拓扑区块链系统,在指定操作目录(~/fisco)中完成以下操作,并保证系统能正常运行。
【任务】
登陆Linux服务器,以MySQL分布式存储方式安装并部署如图所示的三群组、四机构、七节点的星形组网拓扑区块链系统。其中,三群组名称分别为group1、group2和group3,四个机构名称为agencyA、agencyB、agencyC、agencyD。p2p_port、channel_port、jsonrpc_port起始端口分别为30340、20240、8545,MySQL数据库命名“db_Group组群编号_机构编号”。其中,group1群组中机构agencyA的数据库命名示例为db_Group1_A。确保搭建的区块链系统能正常运行,并将执行的命令和完整的命令执行结果截图保存至答题文档中。具体任务如下:
(1)根据题目设置各项要求,使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库;
(2)通过命令启动所有7个节点,查看并验证节点进程状态;
(3)检查区块链节点node0的连接状态以及node0和node4的共识状态日志输出;
(4)检查MySQL分布式存储数据库状态,登陆MySQL数据库并查看所有节点的数据库信息。
题2:按要求完成区块链系统控制台Console的安装与运维
【要求】
登陆Linux服务器,安装、部署区块链系统控制台Console,并完成节点的运维。同时,检查控制台是否能够正常运行。
【任务】
1.登陆linux服务器,进入指定操作目录(~/fisco)按下列要求完成控制的安装与部署,并将安装过程和部署启动结果截图,保存至答题文档。
(1)使用tar命令解压缩console.tar.gz文件,拷贝配置文件,配置控制台证书相关信息并启动;
(2)修改配置信息,更换控制台登入节点为node2,并启动控制台;
(3)使用控制台完成以下操作:
获取群组列表;
获取共识节点列表;
获取group2共识状态;
获取等待处理的交易及交易数量。
获取当前块高和累计交易数。
(4)使用用户生成工具生成两个新的区块链账户;
(5)使用第一个账户登录控制台group2并安装部署roomRent智能合约并验证;
将/fisco/solidity目录中的roomReent智能合约与Ownable智能合约拷贝到/fisco/console/contracts/solidity目录下;
在控制台中验证roomRent合约是否部署成功,并查看群组信息是否正确。
(6)使用控制台调用roomRent智能合约。
调用roomRent智能合约的setRent方法,并设置金额为500;
使用另一个账户登录控制台使用getRent方法获取金额;
使用当前账户调用payRent方法,并支付500租金。
2.基于已完成的区块链系统与管理平台,开展区块链节点的扩容与退出运维任务,并将运维过程及运行结果截图,保存至答题文档。
(1)新增节点node7,并将其作为共识节点仅加入到group1中;
(2)修改配置文件,指定node7输出等级为警告级,并设置日志存储阈值位100MB;
题3:按要求完成WeBASE-Front的安装与部署
【要求】
登录Linux服务器,部署区块链管理前置平台的安装与部署,并将安装过程和使用情况截图,保存至答题文档。
【任务】
登录linux服务器,进入指定操作目录(~/fisco)中完成区块链管理前置平台WeBASE-Front的安装与部署,并检查是否安装成功,并使用WeBASE-Front实施监控。具体要求如下:
(1)使用unzip命令解压webase-front.zip文件;
(2)配置秘钥文件并检查WeBASE-Front是否启动;
(3)使用命令查看WeBASE-Front日志、WeBASE-Front进程;
(4)查看20240、5002端口是否已监听,并使用浏览器访问服务;
题4:按要求完成区块链系统的测试
【要求】
登录Linux服务器,结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等,并将测试设计与执行过程结果截图,保存至答题文档。
【任务】
登录linux服务器,进入工程项目(工程项目在~/fisco/projects/benchmarks目录下),使用Caliper测试工具对test.sol中add和get功能进行压力测试,具体操作任务如下。
(1)提供add功能核心测试代码;
(2)提供get功能核心测试代码;
(3)设置txNumber=1000,tps=100,所有测试通过率为100%;
(4)编写Python脚本,隔2秒输出一次当前区块链网络区块数和共识。
模块二:智能合约开发与测试(30分)
题1:按要求完成智能合约开发
【要求】
1、基于提供的服务器环境,利用已安装部署好的FISCO BCOS区块链底层平台,安装WeBASE区块链管理工具,并完成智能合约的开发。
2、使用Solidity语言完成“学籍认证”系统中智能合约功能代码。使用开发工具打开~/projects/contracts目录下的相应合约,找到“选手填写部分”,并使用正确代码替换,最后将完成的代码结果截图保存至答题文档并上传。
【任务】
1、学籍信息合约(Roll)接口编码
(1)编写学籍信息合约中的RollInfo 实体接口,完成RollInfo实体通用数据的初始化,实现可追溯的学籍信息上链功能;
(2)编写学籍信息RollInfo上链信息接口,在其构造函数中设置学籍状态为在籍,设置上传时间为当前时间;
’
(3)编写学籍信息上链信息接口,实现学籍中就读学校信息的更新。
2、用户信息合约(User)接口编码
(1)编写用户信息合约接口,完善增加用户addUser()函数 ,实现学籍认证系统用户的添加;
(2)编写用户信息合约接口,完善用户角色判断isOperater()函数,实现信息获取的权限控制。
3、学校学籍(SchoolRoll)接口编码
(1)编写学校学籍管理接口,完善removeRoll()函数实现学籍信息的删除;
(2)编写学校学籍管理接口,完善queryRoll()函数实现学籍信息存在与否的验证;
(3)编写学校学籍管理接口,完善transRoll()函数实现学籍的转移;
(4)编写学校学籍管理接口,完善updateStatus()函数实现学籍状态的更新。
题2:按要求完成智能合约的编译、部署与调用
【要求】
登陆linux服务器,进入~/fisco目录,启动WeBASE-Front环境,通过浏览器访问WeBASE-Front服务。根据上述已完成的智能合约,使用WeBASE-Front的合约管理模块完成智能合约的编译、部署与调用。最后将完成的代码结果截图保存至答题文档并上传。
【任务】
1、启动WeBASE-Front服务,使用浏览器登陆WeBASE-Front管理平台;
2、正确编译并部署上题中的智能合约,调用相关接口验证智能合约的业务流程。要求如下:
(1)使用WeBASE-Front管理平台编译、部署“Roll.sol”、“User.sol”、“SchoolRoll.sol”合约,获取三个合约的abi;
(2)测试Roll.sol合约,先调用getRollInfo()获取学籍信息,再调用updateRollStatus()更新学籍状态为1并验证是否修改成功;
(3)测试User.sol合约,先调用addUser()添加用户,再调用isOperater()判断其是否为管理人员;
(4)测试SchoolRoll.sol合约,调用addRoll()添加学籍信息,调用转移学籍transroll()实现学籍信息的变更,并通过获取学籍信息getRoll()验证是否成功。
题3:按要求完成智能合约的功能测试
【要求】
根据上述已完成的智能合约,基于已有的truffle、ganache-cli环境,创建文件夹truffle_test1,使用truffle工具、JavaScript语言完成智能合约的部署、测试用例代码编写,并执行测试。最后将完成的代码及测试结果截图保存至答题文档并上传。
【任务】
1、在~/fisco目录下创建文件夹truffle_test1文件夹,在该文件夹下完成脚本编写与测试。启动ganache-cli环境,要求配置监听端口为7545,网络ID为5777。使用truffle编写User、SchoolRoll合约的部署脚本并测试SchoolRoll.sol合约;
2、编写第一个测试用例,通过校验学生账户表的长度来验证SchoolRoll.sol智能合约中addRoll()功能的正确性;在test目录中新建“SchoolRoll.js”文件,完成验证addRoll()功能的正确性;
3、编写第二个测试用例,测试SchoolRoll.sol合约中transRoll()功能的正确性。完善上一步的“SchoolRoll.js”文件,添加针对transRoll()功能的正确性测试。
题4:按要求完成智能合约的安全漏洞测试
【要求】
根据给定的EtherGame 智能合约,基于truffle、ganache-cli环境,创建测试文件truffle_test2,使用truffle工具、JavaScript语言完成智能合约的部署、测试用例代码编写,完成该智能合约的安全漏洞测试,并对其进行修复。最后将完成的代码及测试结果截图保存至答题文档并上传。
【任务】
有如下问题智能合约,使用truffle工具完成对该智能合约的漏洞测试与修复。
1、分析EtherGame 智能合约中存在的问题,并说明危害;
2、在~/fisco目录下创建文件夹truffle_test2,使用truffle工具编写测试用例复现智能合约中存在的漏洞;
3、修复EtherGame 智能合约中存在的问题,详细说明修复的内容,重新完成对EtherGame的测试。
4、使用Foundry测试框架,对本模块的学生信息管理智能合约做功能测试,分别测试adduser、queryRoll和transRoll三个接口测试。
模块三:应用开发与部署(30分)
学历造假、认证造假等是一个全球日益普遍的现象,不仅对社会产生了巨大的负面影响,同时也极大增加了企业和单位的用人成本。一种高度可靠、易保存、易证伪同时还顾全隐私保护的学历认证管理系统,是一个必然的需求。
区块链是去中心化信任网络,适合作为此类分布式应用的底层架构和基础工具。本应用基于Fisco BCOS开发可信学历认证系统,主要涉及学籍管理功能模块。系统采用前后端分离架构,前端使用Vue.js和JavaScript,后端开发使用Java。完成的区块链系统所记录的信息更加真实可靠,可以帮助解决信任危机。
题1:按要求完成应用后端开发
【要求】
后端系统需要与区块链平台和数据库进行交互,并完成复杂的业务逻辑。本题需要根据具体需求完成学籍信息管理模块相关智能合约的部署、数据库的创建与配置。同时,使用IntelliJ IDEA开发工具打开~/fisco/projects/backend代码,基于后端系统的开发模板,代码文件中的“选手填写部分”注释,补充缺失的代码段,并使用Postman完成后端接口功能测试。完成后,将所有补充的代码截图和运行结果保存到答题文档,并上传到竞赛平台。
【任务】
1、基于提供的服务器环境,利用已安装部署好的FISCO BCOS区块链底层平台,使用ADMIN账户完成~/fisco/projects/contracts目录下三个智能合约的上传、编译和部署,并获取合约地址;
(1)启动FISCO BCOS区块链平台(~/fisco),使用浏览器打开WeBASE-Front;
(2)上传Roll、SchoolRoll和User智能合约,编译并部署合约;
(3)获取智能合约的abi及合约地址。
2、基于提供的服务器环境,登陆已安装好的MySQL数据库,创建SchoolRoll数据库,并在该数据库中添加tb_user和tb_roll表,完成后端系统的相关数据库配置;
(1)打开命令行终端,使用root账号登陆MySQL Monitor,密码为123456,查看已部署的数据库;
(2)使用命令创建SchoolRoll数据库,并在该数据库中创建tb_user和tb_roll表。打开~/fisco/projects/sql/SchoolRoll.sql,找到文件中的“选手填写部分”注释,补全相关SQL语句,并在MySQL Monitor使用命令执行SchoolRoll.sql文件;
(3)使用命令显示SchoolRoll数据库中的所有数据表,并用SQL语句查询tb_roll表中的数据记录数。
3、使用Java语言,完成学籍信息管理模块的后端功能开发。使用IntelliJ IDEA开发工具打开~/fisco/projects/backend代码,基于后端系统的开发模板,找到“选手填写部分”的注释,补充缺失的代码段。
(1)设置应用程序相关配置,填写数据库、智能合约参数;
(2)打开UserService.java文件,添加对应的个人信息管理相关功能的代码逻辑;
代码片断1:
代码片断2:
代码片断3:
(3)打开RollService.java文件,添加对应的学籍信息管理相关功能的代码逻辑;
代码片断1:
代码片断2:
代码片断3:
//操作学籍对象应与操作者学校相同,且为在校状态
if (Objects.equals(registerBean.getSchool(), rollSchool))
if (rollEntity.getStatus() == 0) {
List params = new ArrayList();
params.add(/* 选手填写部分 */);
params.add(/* 选手填写部分 */);
JSONObject res = /* 选手填写部分 */;
if (res == null) {
log.info("学籍转移失败");
} else {
RollBean rollBean = new RollBean();
/* 选手填写部分
* 拷贝对象并设置转移学校及上传时间 */
RollEntity newRollEntity = new RollEntity();
BeanUtils.copyProperties(rollBean, newRollEntity);
newRollEntity.setManageAccount(registerBean.getChainAccount());
/* 选手填写部分
* 设置学籍状态为离校状态 */
return result > 0 ? true : false;
}
}
(4)打开RollController.java文件,添加对应的学籍信息管理相关代码逻辑;
代码片断1:
@ApiOperation(value = "学籍", notes = "上传学籍信息")
@ApiImplicitParam(name = "roll", value = "roll相关信息", required = true, dataType = "string")
@PostMapping("/roll/putRoll")
public AjaxResult<String> putRoll(@RequestBody RollBean rollBean, HttpServletRequest request) {
String token = request.getHeader("Authorization");
String username = TokenUtil.getLoginName(token);
rollBean.setStatus(0);//默认初始状态在校
rollBean.setDatetime(String.valueOf(System.currentTimeMillis()));//记录上传时间
RegisterBean registerBean = userService.getUser(username);
rollBean.setAttendingSchool(registerBean.getSchool()); //仅上传所属学校学籍
//登录用户需为管理员,并判断上链状态
/* 1.若操作人员非管理员,返回is not a manager
* 2.若上链成功,返回ok
* 3.若失败,则返回fail*/
}
代码片断2:
@ApiOperation(value = "学籍记录", notes = "获取管理员操作的学籍详细信息")
@GetMapping("/roll/infoRoll")
public AjaxResult<List<RollBean>> getRoll(HttpServletRequest request) {
String token = request.getHeader("Authorization");
String username = TokenUtil.getLoginName(token);
RegisterBean registerBean = userService.getUser(username);
List<RollBean> rolls = rollService.getInfo(/* 选手填写部分 */);
AjaxResult<List<RollBean>> result = new AjaxResult<>(200, "ok");
result./* 选手填写部分 */;
return result;
}
(5)打开UserController.java文件,添加对应的个人信息管理相关代码逻辑;
代码片断1:
@ApiOperation(value = "用户信息",notes = "获取用户详细信息")
@GetMapping("/user/info")
public AjaxResult<RegisterBean> getUserInfo(HttpServletRequest request) {
// 选手填写部分
result./* 选手填写部分 */;
return result;
}
4、使用Postman测试工具完成后端接口功能测试,将返回信息截图。
(1)测试注册register接口功能,并返回200及其它信息;
(2)测试获取账户地址chainAccount接口功能,并返回200及其它信息;
(3)测试上传学籍putRoll接口功能,并返回200及其它信息。
题2:按要求完成应用前端开发
【要求】
使用Vue.js和JavaScript,完成学籍信息管理模块的前端功能。使用VSCode开发工具打开~/fisco/projects/frontend代码,基于前端系统的开发模板,找到html目录下html文件中的“选手填写部分”注释,补充缺失的代码段,并完成相关功能测试。完成后,将所有补充的代码截图和运行结果保存到答题文档,并上传到竞赛平台。
【任务】
1、打开login.html文件,添加对应的登陆代码逻辑,实现对后端系统的登录功能,并测试功能完整性;
效果如下:
代码片断1:
<div id="app" class="modal-dialog" style="margin-top: 10%;">
<div class="alert alert-success" v-show="tip" role="alert">/* 选手填写部分 */</div>
<div class="modal-content">
...
<div class="input-group" style="width:85%">
<img src="../img/user.png" alt="" class="icon1">
<input type="/* 选手填写部分 */" class="form-control input" placeholder="用户名" autocomplete="off" v-model=/* 选手填写部分 */>
</div><br />
<div class="input-group" style="width:85%">
<img src="../img/key.png" alt="" class="icon1">
<input type="/* 选手填写部分 */" class="form-control input" placeholder="密码" autocomplete="off" v-model=/* 选手填写部分 */>
</div>
代码片断2:
axios.post(/* 选手填写部分 */).then(response => {
if (/* 选手填写部分 */) {
this.msg = "登录成功"
this.tip = true
/* 选手填写部分 */
setTimeout(() => {
// 请求拦截器(header中添加 token)
axios.interceptors.request.use(request => {
request.headers.Authorization = localStorage.getItem("Authorization")
return request
})
//跳转页面
window.location.href = " /* 选手填写部分 */";
}, 1000)
2、打开main.html文件,添加对应的首页代码逻辑,并测试功能完整性;
效果如下:
代码片断:
<script>
//创建Vue实例
new Vue({
methods: {
logout() {
//清除token
/* 选手填写部分 */
}
},
mounted() {
// 请求拦截器(header中添加 token)
/* 选手填写部分 */
//响应拦截器(认证授权)
axios.interceptors.response.use(response=>{
if (response.data.resultCode == 401) {
//跳转页面
window.location.href = " /* 选手填写部分 */";
}
return response
})
},
})
</script>
3、打开account.html文件,添加对应的个人信息显示代码逻辑,并测试功能完整性;
效果如下:
代码片断1:
<div class="modal-body" id="model-body">
<p style="margin-left: 50px;">
<label>用户名:</label>/* 选手填写部分 */
</p>
<p style="margin-left: 50px;">
<label>区块链账户地址:</label><button @click="/* 选手填写部分 */" v-on:click = "change" v-show="showArea">获取</button>
<br>/* 选手填写部分 */
</p>
<p style="margin-left: 50px;">
<label>学校:</label>/* 选手填写部分 */
</p>
<p style="margin-left: 50px;">
<label>用户ID:</label>/* 选手填写部分 */
</p>
<p style="margin-left: 50px;">
<label>邮箱地址:</label>/* 选手填写部分 */
</p>
</div>
代码片断2:
methods: {
logout() {
//清除token
/* 选手填写部分 */ },
get(){
//调用chainAccount接口
/* 选手填写部分 */
},
change:function(){
if(this.showArea){
this.showArea=false
}else{
this.showArea=true
}
}
},
mounted() {
// 请求拦截器(header中添加 token)
axios.interceptors.request.use(request => {
request.headers.Authorization = localStorage.getItem("Authorization")
return request
})
//响应拦截器(认证授权)
axios.interceptors.response.use(response=>{
if (response.data.resultCode == 401) {
//跳转页面
window.location.href = " /* 选手填写部分 */";
}
return response
})
//调用info接口
/* 选手填写部分 */
}
4、打开record.html文件,添加对应的学籍信息显示代码逻辑,并测试功能完整性;(2分)
代码片断1:
<tr v-for="/* 选手填写部分 */" :key="/* 选手填写部分 */">
<td style="padding-left: 50px;">/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
<td>/* 选手填写部分 */</td>
</tr>
代码片断2:
methods: {
logout() {
//清除token
/* 选手填写部分 */
},
},
mounted() {
// 请求发前拦截,header中添加 token
axios.interceptors.request.use(request => {
request.headers.Authorization = localStorage.getItem("Authorization")
return request
})
//响应拦截器(认证授权)
axios.interceptors.response.use(response => {
if (response.data.resultCode == 401) {
//跳转页面
window.location.href = "/* 选手填写部分 */";
}
return /* 选手填写部分 */
})
//调用infoRoll接口
axios.get(/* 选手填写部分 */).then(response => {
if (response.data.resultCode == /* 选手填写部分 */) {
this.records = /* 选手填写部分 */
console.log(this.records);
}
})
},
5、 打开register.html文件,添加对应的注册代码逻辑,并测试功能完整性;
效果如下:
代码片断1:
<div id="app" class="modal-dialog" style="margin-top: 10%;">
<div class="alert alert-success" v-show="tip" role="alert">=/* 选手填写部分 */</div>
<div class="modal-content">
...
<div class="modal-footer" style="margin-left: 150px;">
<div class="form-group" style="width:50%">
<button type="button" class="btn btn-success form-control" @click=/* 选手填写部分 */>确定</button>
</div>
</div>
代码片断2:
data: { //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
user: {
/* 选手填写部分 */
},
tip: false,
msg: ""
},
......
axios.post(/* 选手填写部分 */).then(response => {
if (response.data.resultCode == 200) {
this.msg = "注册成功"
this.tip = true
setTimeout(() => {
//跳转页面
window.location.href = "login.html";
}, 1000)
} else {
alert("注册失败")
}
})
6、打开update.html文件,添加对应的转移学籍代码逻辑,并测试功能完整性;
效果如下:
代码片断1:
<script>
//创建Vue实例
new Vue({
el: '#app', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
data: {
/* 选手填写部分 */
},
methods: {
logout() {
//清除token
(/* 选手填写部分 */
},
submit() {
if (this.info.account == '') {
alert("学生账户不能为空")
return
}
if (this.info.attendingSchool == '') {
alert("所属学校不能为空")
return
}
//调用trans接口
axios.post(/* 选手填写部分 */).then(response => {
if (response.data.resultCode == 200) {
alert("更新成功")
} else {
alert("更新失败")
}
})
},
},
mounted() {
// 请求发前拦截,header中添加 token
axios.interceptors.request.use(request => {
request.headers.Authorization = localStorage.getItem("Authorization")
return request
})
//响应拦截器(认证授权)
axios.interceptors.response.use(response => {
if (response.data.resultCode == 401) {
//跳转页面
window.location.href = "/* 选手填写部分 */";
}
return response
})
},
})
</script>
7、打开upload.html文件,添加对应的上传学籍代码逻辑,并测试功能完整性;
效果如下:
代码片断1:
//创建Vue实例
new Vue({
el: '#app', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
data: {
/* 选手填写部分 */
},
methods: {
logout() {
//清除token
/* 选手填写部分 */
},
submit() {
if (this.info.name == '') {
alert("学生姓名不能为空")
return
}
/* 选手填写部分 */
//调用putRoll接口
axios.post(/* 选手填写部分 */).then(response => {
if (response.data.resultCode == 200) {
alert("上传成功")
} else {
alert("上传失败")
}
})
},
},
mounted() {
// 请求发前拦截,header中添加 token
axios.interceptors.request.use(request => {
request.headers.Authorization = localStorage.getItem("Authorization")
return request
})
//响应拦截器(认证授权)
axios.interceptors.response.use(response => {
if (response.data.resultCode == 401) {
//跳转页面
window.location.href = "/* 选手填写部分 */";
}
return response
})
},
})
题3:按要求完成前后端集成测试
【要求】
登陆WeBASE-Front,添加合约账户test01和系统管理员用户test01,按要求使用test01用户完成前后端集成测试阶段测试用例的设计与执行。完成后,将所有测试用例设计和运行结果按如下格式保存到答题文档,并上传竞赛平台。
【任务】
1、补全以下客户登录操作的测试用例设计,使用test01用户测试并将测试结果截图保存。根据测试结果,描述测试结论和登陆功能存在的问题;
2、补全以下上传学籍操作的测试用例设计,新建合约账户Student01,并使用test01上传Student01学籍信息,保存测试结果截图。根据测试结果,描述测试结论和上传学籍功能存在的问题;
3、补全以下转移学籍操作的测试用例设计,使用用户test01再次转移Student01的学籍。根据测试结果,描述测试结论和转移学籍功能存在的问题;
4、补全以下学籍记录查询的测试用例设计,使用用户test01查询学籍记录,并将测试结果截图保存。根据测试结果,描述测试结论和学籍记录查询功能存在的问题。
题4:按要求完成区块链应用部署
【要求】
Docker容器化平台可以快速、可靠、可重复地部署和管理应用程序。本题将利用Docker虚拟化技术,完成学籍管理模块后端的部署。完成后,需将所有步骤截图和运行结果保存到答题文档,并上传到竞赛平台。
【任务】
1、构建并运行应用后端的docker镜像backend:v1;
(1)修改后端应用中的server.port =8090并保存,创建目录/home/jzsx/myDeploy,将backend后端应用打包至该目录下,jar包命名为backend.jar;
(2)查看docker版本并重启docker服务,进入目录/home/jzsx/myDeploy,创建并编辑Dockerfile,创建backend:v1镜像,并查看镜像id;
(3)创建并编辑docker-compose.yml文件,将端口8090映射为8080,使用docker-compose启动容器,并查看容器详情;
(4)使用netstat命令查看8080端口占用情况,同时打开swagger-ui页面检验backend是否正常可用。
2、运行应用前端,打开页面,测试学籍管理模块。
基于构建好的Docker后端应用,打开http://***:5500/login.html页面,使用test01登陆系统,查看学籍记录。
职业素养(5分)
题1:职业素养模块
【要求】
1、项目实施符合企业“5S”(即整理、整顿、清扫、清洁和素养)原则。
2、团队分工明确合理、操作规范、文明竞赛。