2025河北省职业院校技能大赛高职组“区块链技术应用”任务书卷Ⅱ
文章目录
您好,我是旺仔Sec 为帮助别人少走弯路而写博客。如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😘 ((●’◡’●)) 。想看更多实用文章 那就点个关注吧!! 我会尽力创作并带来有趣的内容 。
我的B站链接
:鹏璃Sec
WeChat公众号
:鹏璃安全需要竞赛答案等资源可联系我(微信方式在文章最下方!)
感谢您订阅专栏。点赞关注收藏三连文章
模块一:区块链产品方案设计及系统运维(35分)
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。
任务 1-1:区块链产品需求分析与方案设计
区块链食品溯源涉及到生产、收购、运输、销售等参与方,他们需要在区块链系统平台中完成基于不同业务场景下的功能操作,生产商主要针对农户的产品种植、收购商主要面向生产商进行食品收购、运输商负责食品运输以及销售商负责食品分销等场景,完成需求分析与方案设计,具体要求如下:
1.依据给定的背景信息,对基于区块链的食品供应链需求进行分析,要求使用 Y 模型即需求场景、背后目标、产品功能进行分析;
2.依据给定的背景信息,对考题进行核心业务分析,使用 Visio 工具编制系统业务流程图,包含食品加工商查询食品信息进行加工的核心业务流程、终端商户对食品进行查询后,进行上架销售的业务流程的核心业务流程、消费者查询食品信息进行购买的核心业务流程;
3.依据给定的背景信息,对考题进行核心业务分析,使用 Visio 工具编制系统业务用例图,包含食品加工商查询食品信息进行加工的核心业务用例、终端商户对食品进行查询后,进行上架销售的业务流程的核心业务用例、消费者查询食品信息进行购买的核心业务用例;
4.依据给定的背景信息,使用 Visio 工具编制业务系统功能结构图;
5.依据给定的背景信息,使用表格编制业务系统功能清单;
任务 1-2:区块链系统部署与运维
围绕食品安全溯源区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终根据业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护,具体要
求如下:
1.根据参数与端口设置要求,部署区块链系统并验证;
2.根据参数与端口设置要求,部署区块链网络管理平台并验证;
3.基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证;
基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。
子任务 1-2-1: 搭建区块链系统并验证
基于给定服务器环境以及软件(地址“/root/tools”),搭建一条 4 节点的区块链系统并验证,具体工作内容如下:
(1)采用默认配置搭建区块链网络;
(2)通过命令验证区块链节点进程运行状况;
(3)通过命令验证区块链连接状态和共识状态日志输出。
子任务 1-2-2:控制台配置及使用
基于给定服务器环境以及软件(地址“/root/tools”),搭建区块链控制台并开展相关运维工作,具体工作内容如下:
(1)配置控制台,管理相关证书并启动;
(2)使用控制台部署 HelloWorld 智能合约;
(3)使用控制台完成 HelloWorld 智能合约的 set 与 get 操作;
(4)使用控制台查看区块链中区块高度。
(5)创建表 t_user,主键为 name,其余字段为 course_name 和 score
(6)向表 t_user 插入数据,name=“Alice”,course_name=“Blockchain”, score=“100”,并查询表中数据;
(7)更新表 t_user 数据,name=“Alice“,course_name=“Blockchain”, score=“90”,并查询表中数据;
(8)在表 t_user 中删除 Alice 的所有数据,并查询表中数据;
子任务 1-2-3:区块链节点运维
基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下:
(1)获取指定区块链节点输出等级为警告级,并设置日志存储阈值位100MB并验证;
(2)通过给定工具(地址/root/tools)完成新节点(node4)配置,新节点端口依次增加;
(3)启动新节点加入区块链系统并验证;
(4)将新节点(node4)进行退网并验证。
子任务 1-2-4:区块链网络运维
根据任务描述要求,完成网络配置与管理运维操作,具体内容如下:
(1)设置区块链系统黑名单,将 node3 设为黑名单禁止连接,并验证;
(2)设置系统中区块打包最大交易数量设为 2000;
(3)验证区块最大打包交易数量情况。
子任务 1-2-5:搭建区块链系统管理平台并验证
基于已有的区块链基础上,完成搭建 WeBASE 管理平台搭建,具体内容如下:
1.配置 MySQL,将 WeBASE-Node-Manager 的数据存储在 webasenodemanager 中,WeBASE-Sign 签名数据存储在 webasesign 数据库中;
2.在当前用户环境变量中设置 Java 环境变量;
3.校验 WeBASE 子系统进程状态,包括 webase.front、webase.node.mgr、webase.sign。
任务 1-3:区块链系统测试
设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
子任务 1-3-1:系统测试
通过可视化平台生成包括生产商(Producer)、经销商(distributor)、零售商(retailer)账户,并将账户以 p12 加密形式导出后倒入指定前置可视化平台, 验证地址一致性;
使用 Postman 对食品溯源系统服务端“添加食品”(/produce)功能接口进行验证。
子任务 1-3-2:压力测试
参照工程项目(地址:“/root/projects”)使用 Caliper 测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试。具体要求如下:
(1)提供核心测试代码;
(2)设置 txNumber=10,tps=1,所有测试通过率为 100%。
子任务 1-3-3:安全测试
智能合约安全漏洞测试。有如下问题智能合约:
pragmasolidity>=0.8.3;
contractEtherStore{
mapping(address=>uint)publicbalances;
functiondeposit()publicpayable{
balances[msg.sender]+=msg.value;
emitBalance(balances[msg.sender]);
}
6
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;
constructor(address_etherStoreAddress){
etherStore=EtherStore(_etherStoreAddress);
}
//FallbackiscalledwhenEtherStoresendsEthertothiscontract.
fallback()externalpayable{
if(address(etherStore).balance>=1){
etherStore.withdraw();
}
}
function attack() external payable {
require(msg.value >= 1);
etherStore.deposit{value: 1}();
etherStore.withdraw();
}
// Helper function to check the balance of this contract
function getBalance() public view returns (uint) {
return address(this).balance;
}
}
(1)分析智能合约中存在问题,并说明危害;
(2)根据测试工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞;
(3)创建新的智能合约,修复其中问题,说明修复内容并测试。
完成本任务后将相关命令、代码以及运行结果截图填写至工程文档并提交。
模块二:智能合约开发与测试(30分)
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。
任务 2-1:智能合约设计
根据区块链食品溯源应用需求分析和方案设计文档的描述,编写该区块链产品的智能合约功能需求文档,以及设计该智能合约 UML 图。具体要求如下:
1.编写区块链食品溯源智能合约功能需求文档
根据区块链食品溯源产品项目背景和需求分析,编写该区块链食品溯源产品的智能合约功能需求文档。
2.完成区块链食品溯源智能合约的设计图
设计区块链食品溯源智能合约接口,画出区块链食品溯源智能合约的角色UML 用例图,以及画出区块链食品溯源各智能合约关系的时序图。
任务 2-2:智能合约开发
使用 Solidity 语言完成智能合约开发、部署和调用,要求如下: 1.食品信息(FoodInfoItem)的接口编码
(1)编写食品信息实体的接口,完成可溯源食品信息初始化,实现可追溯的原始生产商食品信息上链功能;
contract FoodInfoItem{
//①保存食品流转过程中各个阶段的时间戳
//②保存食品流转过程各个阶段的用户名
//③保存食品流转过程各个阶段的用户地址信息(和用户一一对应)
//④保存食品流转过程中各个阶段的质量
//⑤食品名称
//⑥当前用户名称
//⑦质量(0=优质 1=合格 2=不合格)
//⑧状态(0:生产 1:分销 2:出售)
//⑨初始化 owner
(2)编写分销商食品上链信息接口,根据食品溯源智能合约地址获取分销商上链食品的信息;
function addTraceInfoByDistributor( ① , uint8 quality) public returns(bool) {
require(_status == 0 , “status must be producing”);
//②
_timestamp.push(now);
_traceName.push(traceName);
_currentTraceName = traceName;
//③
//④
_traceQuality.push(_quality);
_status = 1; return true;
}
(3)编写超市进行食品上链信息的接口,根据食品溯源智能合约地址获取超市上链食品信息。
function addTraceInfoByRetailer( ① , uint8 quality) public returns(bool) {
require(_status == 1 , “status must be distributing”);
//②
_timestamp.push(now);
_traceName.push(traceName);
_currentTraceName = traceName;
//③
//④
_traceQuality.push(_quality);
_status = 2; return true;
}
2.食品溯源(Trace)的接口编码
(1)编写食品溯源智能合约生产商 Producer 添加食品接口,必须生产商才能添加可溯源的食品,实现溯源功能;
function newFood(①, string traceName, uint8 quality) public ② returns(③)
{
//④
//⑤
//⑥
//⑦
//⑧
}
(2)编写食品溯源智能合约分销商 Distributor 添加食品接口,必须分销商才能添加可溯源的食品,实现溯源功能;
function addTraceInfoByDistributor(①, uint8 quality)
public ② returns(bool) {
//③
return FoodInfoItem(foods[traceNumber]).④, quality);
}
(3)编写食品溯源智能合约超市 Retailer 添加食品接口,必须超市才能添加可溯源的食品,实现溯源功能。
function addTraceInfoByRetailer(①, uint8 quality) public ② returns(bool) {
require(③, “traceNumber does not exist”);
return FoodInfoItem(foods[traceNumber]).④, quality);
}
(4)编写食品溯源智能合约各个角色的评价接口,必须是对已存在的食品信息才能添加评价,实现功能。
3.角色(Role)管理的接口编码
(1)编写食品溯源增加角色接口,必须是未增加的角色才能被添加,实现添加角色的功能;
function add(①, address account) ② {
require(!③, “Roles: account already has role”); role.④ = true;
}
(2)编写食品溯源移除角色接口,必须是已增加的角色才能被移除,实现移除角色的功能;
function remove(①, address account) ② {
require(③, “Roles: account does not have role”); role.④ = false;
}
(3)编写食品溯源角色授权接口,必须是授权的角色地址,实现角色权限管理功能。
function has(①, address account) ② returns (bool) {
require(③, “Roles: account is the zero address”); return role.④;
}
4.合约编译、部署和调用
(1)解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和 abi;
(2)调用食品溯源智能合约的接口,完整验证业务流程。
任务 2-3:智能合约测试
编写智能合约单元测试代码并完成合约功能测试、性能测试,具体要求如下: 1.配置区块链网络
启动区块链网络,创建新的 Workspace,配置对外访问的 RPC 接口为 7545, 配置项目的配置文件 config.js 实现与新建 Workspace 的连接。
2.设置 producerId 和 sellederId 两个变量
基于 VSCODE 加载测试项目,补全位于 test 文件夹中 foodTraceNew.js 文件预操作的方法。在测试文件中添加预定义的方法(在其他方法启动前使用),在方法中分别设置 producerId 和 sellederId 两个变量,具体要求如下:
(1)producerId 设置为 1;
(2)sellderId 设置为 4。
3.补全 newFood 和 getFood 方法
基于 VSCODE 加载的测试项目,补全位于 test 文件夹中 foodTraceNew.js 文件,添加测试用例,测试智能合约的 newFood 和 getFood 方法。
4.测试 addTraceInfoByDistributor 方法
基于 VSCODE 加载的测试项目,补全位于 test 文件夹中 foodTraceNew.js 文件,添加测试用例,测试智能合约的 addTraceInfoByDistributor 方法。
5.测试 getTraceInfo 和 getAllFood 方法
基于 VSCODE 加载的测试项目,补全位于 test 文件夹中 foodTraceNew.js 文件,添加测试用例,测试智能合约的 getTraceInfo 和 getAllFood 方法。
模块三:区块链应用系统开发(30分)
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。
任务 3-1:区块链应用前端功能开发
1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下:
具体要求如下:
(1)有明确的提示,提示用户选择角色;
(2)用户可看到四个不同的角色可选(生产商、中间商、超市、消费者);
(3)每个用户所对应的组件请在 components 中找寻并填入;
页面顶部要有食品溯源平台的网站标题和 logo。
Login.js:
代码片段 1:
template: `
<div class="login">
<!-- 角色选择 -->
<h3 v-if="currentUser === null">选手填写部分</h3>
<el-row :gutter="80" v-if="currentUser === null">
<el-col :span="6" v-for="选手填写部分" :key="index">
<div @click="选手填写部分">选手填写部分</div>
</el-col>
</el-row>
代码片段 2:
// 用户身份
users: [
{
name: 选手填写部分, userName: 'producer', component: 选手填写部分,
},
{
name: 选手填写部分, userName: 'distributor', component: 选手填写部分,
},
{
name: 选手填写部分, userName: 'retailer', component: 选手填写部分,
},
{
name: 选手填写部分, userName: 'consumer', component: 选手填写部分,
},
],
currentUser: 选手填写部分, // 当前用户components.js:
代码片段 3:
// 头部组件const Header = {
// 接受传入的登录状态、用户信息props: ['login', 'user'], template: `
<div class="header">
<img src="选手填写部分" />
<h3>选手填写部分</h3>
<span v-if="login" class="user-name">{{ 选 手 填 写 部分 }}</span>
</div>
`
}
2.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下:
具体要求如下:
(1)点击角色进入相应角色登录页面;
(2)登录界面提示用户的地址(消费者不显示),有登录操作的相关提示;
(3)登录界面有 5 秒倒计时;
(4)登录界面有“直接登录”按钮,点击可直接跳转到相应角色首页。
login.js:
代码片段 1:
<!-- 角色登录 -->
<div v-else class="is-login">
<h3>登录中......(倒计时:{{ 选手填写部分}} 秒)</h3>
<div>角色:
<span>{{ 选手填写部分}}</span>
</div>
<!-- 非消费者则显示角色地址 -->
<div v-if="选手填写部分">角色地址:
<span>{{ 选手填写部分}}</span>
</div>
<!-- 直接登录按钮 -->
<el-button type="primary" 选 手 填 写 部 分 > 直 接 登 录
</el-button>
</div>
代码片段 2:
// 登录时有个 5 秒的倒计时,这里是在点击直接登录时,清除倒计时,直接跳到相关页面
clearTimer() {
clearInterval(选手填写部分); this.$emit(选手填写部分, {
component: this.loginItem.component, user: this.loginItem.name,
});
},
// 倒计时
countdownInterval({ component, name: user }) { this.timer = setInterval(() => {
if(this.countdown <= 0){ 选手填写部分;
}
选手填写部分;
}, 选手填写部分);
},
代码片段 3:
// 点击用户登录,获取用户地址handleClick(item) {
this.loginItem = item;
// 处理消费者角色,其他三个角色都有一个角色地址if (item.userName !== 选手填写部分) {
axios({
method: 'get',
url: `/userinfo?userName=${item.userName}`,
})
.then(ret => {
this.address = 选手填写部分; this.currentUser = 选手填写部分; this.countdownInterval(选手填写部分);
})
.catch(err => { console.log(err)
})
} else {
this.currentUser = item.name; this.countdownInterval(item);
}
}
3.请基于前端系统的开发模板,在组件管理文件 components.js 中添加对应的逻辑代码,实现对中间商和超市角色对产品的评价展示和添加功能,并测试功能完整性,示例页面如下:
具体要求如下:
(1)点击中间商或者超市进入相应角色登录页面;
(2)对产品进行评价,并点击溯源编号查看角色的评论信息
affirm(){
选手填写部分
}
任务 3-2:区块链应用后端功能开发
1.请基于已有的项目,开发完善 IndexController 类,编写添加食品生产信息的方法,实现食品信息的添加功能,并测试功能完整性。
本任务具体要求如下:
(1)) 开发文件 IndexController.java 中的 produce 方法, 请求接口为
/produce;
(2)开发文件 IndexController.java 中的 produce 方法,要求对前端传入的参数进行二次验证;
(3)开发文件 IndexController.java 中的 produce 方法,要求封装返回值为 String,但不返回视图页面。
produce 方法:
/**
* 添加食品生产信息
* traceNumber: 食品溯源id,食品溯源过程中的标识符
19
* foodName: 食物名称
* traceName: 用户名,食品流转过程各个阶段的用户名
* quality: 当前食品质量(0=优质 1=合格 2=不合格)
* @return:添加食品生产信息结果
*/
@选手填写部分
@PostMapping(
选 手 填 写 部 分 ,
produces=MediaType.APPLICATION_JSON_VALUE)
public String produce(@RequestBody JSONObject jsonParam) {
//声明返回对象
JSONObject _outPutObj = new JSONObject();
//生产商生产食品
if(jsonParam == null){
选手填写部分
}
int trace_number = 选手填写部分;
String food_name = 选手填写部分;
String trace_name = 选手填写部分;
int quality = 选手填写部分;
JSONArray
params
=
JSONArray.parseArray("[\""+food_name+"\","+trace_number+",\""+trace_n
ame+"\","+quality+"]");
JSONObject _jsonObj = new JSONObject();
_jsonObj.put("contractName",CONTRACT_NAME);
_jsonObj.put("contractAddress",CONTRACT_ADDRESS);
20
_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));
_jsonObj.put("user",PRODUCER_ADDRESS);
_jsonObj.put("funcName",选手填写部分);
_jsonObj.put("funcParam",选手填写部分);
String responseStr = httpPost(URL,选手填写部分);
JSONObject
JSON.parseObject(responseStr);
responseJsonObj
String msg = responseJsonObj.getString("message");
if (msg.equals("Success")){
_outPutObj.put("ret",选手填写部分);
_outPutObj.put("msg",msg);
}else{
_outPutObj.put("ret",选手填写部分);
_outPutObj.put("msg",msg);
}
return 选手填写部分;
}
2.开发完善 IndexController 类,编写中间商添加食品流转信息的方法, 实现中间商添加食品流转信息的功能,并测试功能完整性。
具体要求如下:
(1)开发文件 IndexController.java 中的 add_trace_by_distrubutor 方法,请求接口为/adddistribution;
(2)开发文件 IndexController.java 中的 add_trace_by_distrubutor 方法,要求对前端传入的参数进行二次验证;
(3)开发文件 IndexController.java 中的 add_trace_by_distrubutor 方法,要求封装返回值为 String,但不返回视图页面;
add_trace_by_distrubutor 方法:
/**
* 中间商添加食品流转信息
* traceNumber: 食品溯源id,食品溯源过程中的标识符
* traceName: 用户名,食品流转过程各个阶段的用户名
* quality: 当前食品质量(0=优质 1=合格 2=不合格)
* @return:中间商添加食品流转信息结果
*/
@选手填写部分
@PostMapping(
选 手 填 写 部 分 ,
produces=MediaType.APPLICATION_JSON_VALUE)
public String add_trace_by_distrubutor(@RequestBody JSONObject
jsonParam) {
//声明返回对象
JSONObject _outPutObj = new JSONObject();
if(jsonParam == null){
选手填写部分
}
String trace_number = 选手填写部分;
String trace_name = 选手填写部分;
int quality = 选手填写部分;
JSONArray
params
=
JSONArray.parseArray("["+trace_number+",\""+trace_name+"\","+quality+
"]");
JSONObject _jsonObj = new JSONObject();
_jsonObj.put("contractName",CONTRACT_NAME);
_jsonObj.put("contractAddress",CONTRACT_ADDRESS);
22
_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));
_jsonObj.put("user",DISTRIBUTOR_ADDRESS);
_jsonObj.put("funcName",选手填写部分);
_jsonObj.put("funcParam",选手填写部分);
String responseStr = httpPost(URL,选手填写部分);
JSONObject
JSON.parseObject(responseStr);
responseJsonObj
String msg = responseJsonObj.getString("message");
if (msg.equals("Success")){
_outPutObj.put("ret",选手填写部分);
_outPutObj.put("msg",msg);
}else{
_outPutObj.put("ret",选手填写部分);
_outPutObj.put("msg",msg);
}
return 选手填写部分;
}
3.请基于已有的项目,开发完善 IndexController 类,编写获取某个食品的溯源信息的方法,实现获取某个食品的溯源信息的功能,并测试功能完整性。
具体要求如下:
(1)开发文件 IndexController.java 中的 trace 方法,请求接口为/trace,该接口调用私有方法 get_trace,不直接与合约交互,提高系统的安全性;
(2)开发文件 IndexController.java 中的 trace 方法,对传入数据进行二次验证;
(3)开发文件 IndexController.java 中的 get_trace 方法,要求通过合约进行溯源信息的查询,且外部无法直接调用;
(4)开发文件 IndexController.java 中的 trace 方法,要求封装返回值为 String,但不返回视图页面。
trace 方法:
/**
* 获取某个食品的溯源信息
* @param traceNumber 食品溯源id,食品溯源过程中的标识符
* @return 对应食品的溯源信息
*/
@选手填写部分
@GetMapping(
选 手 填 写 部 分 ,
produces=MediaType.APPLICATION_JSON_VALUE)
public String trace(String traceNumber){
JSONObject _outPut = new JSONObject();
if (Integer.parseInt(traceNumber) <= 0){
选手填写部分
}
List res = get_trace(traceNumber);
JSONArray o = new JSONArray(res);
return 选手填写部分;
}
get_trace 方法:
/**
* 从链上获取某个食品的溯源信息
24
* @param traceNumber 食品溯源id,食品溯源过程中的标识符
* @return 对应食品的溯源信息
*/
选手填写部分JSONArray get_trace(String traceNumber){
//获取食品基本信息
JSONArray params =
JSONArray.parseArray("["+traceNumber+"]");
JSONObject _jsonObj = new JSONObject();
_jsonObj.put("contractName",CONTRACT_NAME);
_jsonObj.put("contractAddress",CONTRACT_ADDRESS);
_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));
_jsonObj.put("user","");
_jsonObj.put("funcName",选手填写部分);
_jsonObj.put("funcParam",选手填写部分);
String responseStr = httpPost(URL,选手填写部分);
JSONArray food = JSON.parseArray(responseStr);
//获取食品溯源信息
JSONObject _jsonObj2 = new JSONObject();
_jsonObj2.put("contractName",CONTRACT_NAME);
_jsonObj2.put("contractAddress",CONTRACT_ADDRESS);
_jsonObj2.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));
_jsonObj2.put("user","");
_jsonObj2.put("funcName",选手填写部分);
_jsonObj2.put("funcParam",选手填写部分);
25
String responseStr2 = httpPost(URL,选手填写部分);
JSONArray traceInfoList = JSON.parseArray(responseStr2);
JSONArray time_list = 选手填写部分;
JSONArray name_list = 选手填写部分;
JSONArray address_list = 选手填写部分;
JSONArray quality_list = 选手填写部分;
JSONArray _outPut = new JSONArray();
for (int i=0;i<time_list.size();i++){
if (i==0){
JSONObject _outPutObj = new JSONObject();
_outPutObj.put("traceNumber",选手填写部分);
_outPutObj.put("name",选手填写部分);
_outPutObj.put("produce_time",选手填写部分);
_outPutObj.put("timestamp",选手填写部分);
_outPutObj.put("from",选手填写部分);
_outPutObj.put("quality",选手填写部分);
_outPutObj.put("from_address",选手填写部分);
_outPut.add(_outPutObj);
}else{
JSONObject _outPutObj = new JSONObject();
_outPutObj.put("traceNumber",选手填写部分);
_outPutObj.put("name",选手填写部分);
_outPutObj.put("produce_time",选手填写部分);
_outPutObj.put("timestamp",选手填写部分);
_outPutObj.put("from",选手填写部分);
_outPutObj.put("to",选手填写部分);
_outPutObj.put("quality",选手填写部分);
26
_outPutObj.put("from_address",选手填写部分);
_outPutObj.put("to_address",选手填写部分);
_outPut.add(_outPutObj);
}
}
return _outPut;
}
4.请基于已有的项目,开发完善 IndexController 类,编写中间商和超市角色的添加评价信息和查看评价信息的方法,实现评价信息的添加和查看功能, 并测试功能完整性。
本任务具体要求如下:
(1)开发文件 IndexController.java 中的 setMessage 方法,要求对前端传入的参数进行二次验证,请求接口为/setMessage;
@ResponseBody
@PostMapping(path = "/setMessage", produces = MediaType.APPLICATION_JSON_VALUE)
public String setMessage(@RequestBody JSONObject jsonParam) {
//声明返回对象
JSONObject _outPutObj = new JSONObject(); 选手填写部分
}
(2)开发文件 IndexController.java 中的 getMessage 方法,请求接口为
/getMessag
public JSONArray get_message_list(String traceNumber) {
//选手填写部分
}
@ResponseBody
@GetMapping(path = "/getMessage", produces =
MediaType.APPLICATION_JSON_VALUE)
public String getMessage(String traceNumber) {
JSONObject _outPut = new JSONObject();
//选手填写部分
}