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

1.请基于前端系统的开发模板,在登陆组件LoginUser.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并且测试功能完整性,实例页面如下:

具体要求如下:

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

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

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

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

LoginUser.js:

代码片段1:

template:

选手填写部分

选手填写部分

代码片段2:

// 用户身份

users: [

{

name: 选手填写部分,

userName: ‘producer’,

component: 选手填写部分,

},

{

name: 选手填写部分,

userName: ‘distributor’,

component: 选手填写部分,

},

{

name: 选手填写部分,

userName: ‘retailer’,

component: 选手填写部分,

},

{

name: 选手填写部分,

userName: ‘consumer’,

component: 选手填写部分,

},

],

currentUser: 选手填写部分, // 当前用户

components.js:

代码片段3:

// 头部组件 HeaderV.vue 文件

const Header = {

// 接受传入的登录状态、用户信息

props: [‘login’, ‘user’],

template: `

选手填写部分

{{ 选手填写部分 }}

`

}

2.请基于前端系统的开发模板,在登陆组件LoginUser.js、组件管理文件components.js中添应对应的逻辑代码,实现对前端的角色选择功能,并测试功能的完整性,实例页面如下:

具体要求如下:

(1)点击角色进入相应角色登录页面

(2)登录界面提示用户的地址(消费者不显示),有登录操作的相关提示;

(3)登录界面有5秒倒计时;

(4) 登录界面有”直接登录”按钮,点击可直接跳转到相应角色首页

LoginUser.js:

代码片段1:

登录中……(倒计时:{{ 选手填写部分}} 秒)

角色:

{{ 选手填写部分}}

角色地址:

{{ 选手填写部分}}

直接登录

代码片段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” />})

.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方法:

/**

* 添加食品生产信息

* 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_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”,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中的addTraceByDistrubutor方法,请求接口为/adddistribution;

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

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

addTraceByDistrubutor方法:

/**

* 中间商添加食品流转信息

* traceNumber: 食品溯源id,食品溯源过程中的标识符

* traceName: 用户名,食品流转过程各个阶段的用户名

* quality: 当前食品质量(0=优质 1=合格 2=不合格)

* @return:中间商添加食品流转信息结果

*/

@选手填写部分

@PostMapping(选手填写部分, produces=MediaType.APPLICATION_JSON_VALUE)

public String addTraceByDistrubutor(@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中的getFoodTrace方法,请求接口为/trace,该接口调用私有方法indexService.getTrace,不直接与合约交互,提高系统的安全性;

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

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

(4)开发文件IndexController.java中的getFoodTrace方法,要求封装返回值为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方法:

/**

* 从链上获取某个食品的溯源信息

* @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;

}