食品溯源3

区块链国赛题目--食品溯源(模块三)

任务 3-1:区块链应用前端功能开发

1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功

能完整性,示例页面如下:

具体要求如下:

(1)有明确的提示,提示用户选择角色;

(2)用户可看到四个不同的角色可选(生产商、中间商、超市、消费者);

(3)每个用户所对应的组件请在 components 中找寻并填入;

(4)页面顶部要有食品溯源平台的网站标题和 logo。

Login.js:

html 复制代码
代码片段 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:

html 复制代码
代码片段 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 !== 选手填写部分) { 
8
 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-2:区块链应用后端功能开发

1.请基于已有的项目,开发完善 IndexController 类,编写添加食品生产信息的方法,实现食品信息的添加功能,并测试功能完整性。

本任务具体要求如下:

(1)开发文件 IndexController.java 中的 produce 方法,请求接口为/produce;

(2)开发文件 IndexController.java 中的 produce 方法,要求对前端传入的参数进行二次验证;

(3)开发文件 IndexController.java 中的 produce 方法,要求封装返回值为 String,但不返回视图页面。

produce 方法:

java 复制代码
/** 
 * 添加食品生产信息 
 * traceNumber: 食品溯源 id,食品溯源过程中的标识符 
 * 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); 
 
_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI)); 
 _jsonObj.put("user",PRODUCER_ADDRESS); 
 _jsonObj.put("funcName",选手填写部分); 
 _jsonObj.put("funcParam",选手填写部分); 
 String responseStr = httpPost(URL,选手填写部分); 
 JSONObject responseJsonObj = 
JSON.parseObject(responseStr); 
 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 方法:

java 复制代码
/** 
 * 中间商添加食品流转信息 
 * 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); 
 
_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI)); 
 _jsonObj.put("user",DISTRIBUTOR_ADDRESS); 
 _jsonObj.put("funcName",选手填写部分); 
 _jsonObj.put("funcParam",选手填写部分); 
 String responseStr = httpPost(URL,选手填写部分); 
 JSONObject responseJsonObj = 
JSON.parseObject(responseStr); 
 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,不直接与合约交互,提高系统的安全性; 13

(2)开发文件 IndexController.java 中的 trace 方法,对传入数据进行二次验证;

(3)开发文件 IndexController.java 中的 get_trace 方法,要求通过合约进行溯源信息的查询,且外部无法直接调用;

(4)开发文件 IndexController.java 中的 trace 方法,要求封装返回值为String,但不返回视图页面。

trace 方法:

java 复制代码
/** 
 * 获取某个食品的溯源信息 
 * @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 方法: 
/** 
 * 从链上获取某个食品的溯源信息 
 * @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",选手填写部分); 
 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",选手填写部分); 
 _outPutObj.put("from_address",选手填写部分); 
 _outPutObj.put("to_address",选手填写部分); 
 _outPut.add(_outPutObj); 
 } 
 } 
 return _outPut; 
 }

任务3-3区块链应用业务测试

1.部署合约

2.绑定合约地址

3.启动项目

打开网址http://127.0.0.1:8081/index

4.业务测试

相关推荐
清 晨1 小时前
Web3的去中心化社交网络:区块链技术如何改变互动方式
web3·去中心化·区块链
搬砖的小码农_Sky3 小时前
什么是区块链?
区块链
BTColdman16 小时前
MetaArena推出《Final Glory》:引领Web3游戏技术新风向
区块链
weixin_eng020487 小时前
清仓和斩仓有什么不一样?
人工智能·金融·区块链
冲上云霄的Jayden15 小时前
Hyperledger Fabric有那些核心技术,和其他区块链对比Hyperledger Fabric有那些优势
区块链·智能合约·fabric·数据隐私·共识机制·多通道技术·模块化架构
BSV区块链17 小时前
BSV区块链如何确保数据真实透明
区块链
筱璦1 天前
期货跟单、量化交易模拟演示系统
区块链
sino_sound1 天前
伦敦银价格走势图种的“品字形”
金融·区块链
qiquandongkh2 天前
期权懂|个股期权交易手数有限制吗?
大数据·区块链
电报号dapp1192 天前
交易所开发:开启数字金融新时代
金融·区块链