一.检查配置环境
检查虚拟机环境,确保有正在运行的Hyperledger Fabric区块链,并且其中chaincode_basic、credit_chaincode链码可以正常调用
查看chaincode_basic、credit_chaincode链码调用
二.开发征信链码代码
基于现有征信链码,开发征信链码的升级版,使用chaincode-init文件夹中的基础链码模板,创建完善其中lib目录以及index.js内容,在lib中创建CreditPlusContract对象,在对象中添加createCreditSubjectPlus功能,实现征信主体的保存,定义subject变量属性包括(key:征信主体主键, organizationName:征信主体评价机构名, type:评价类型,score:征信积分,creator:创建人,datetime:评价时间),其中属性除score外其余都为string类型。将subject内容上链保存
在链码中添加征信主体查询功能(queryCreditSubjectPlus),要求能够查询所有主体内容(包括:key:征信主体主键, organizationName:征信主体评价机构名, type:评价类型,score:征信积分,creator:创建人,datetime:评价时间)
'use strict';
const { Contract } = require("fabric-contract-api");
class CreditPlusContract extends Contract {
async createCreditSubjectPlus(ctx, key, organizationName, type, creator, datetime) {
console.info('=== START:创建征信主体 ===');
const subject = {
key: key,
organizationName: organizationName,
type: type,
score: 0,
creator: creator,
datetime: datetime
};
await ctx.stub.putState(key, Buffer.from(JSON.stringify(subject)));
console.info('=== END:创建征信主体 ===');
return subject;
}
// 查询征信主体
async queryCreditSubjectPlus(ctx, subjectKey) {
console.info('=== START : 查询征信主体 ===');
const bytes = await ctx.stub.getState(subjectKey);
if (!bytes || bytes.length === 0) {
const msg = `${subjectKey} 征信主体不存在`;
console.warn(msg);
throw new Error(msg);
}
const subject = JSON.parse(bytes.toString());
console.info('=== END : 查询征信主体 ===');
return subject;
}
}
module.exports = CreditPlusContract;
在链码结构中test目录中添加对于createCreditSubjectPlus以及QueryCreditSubjectPlus功能的单元测试,提交测试代码和验证结果。
'use strict';
const sinon = require('sinon');
const chai = require('chai');
const sinonChai = require('sinon-chai');
const expect = chai.expect;
chai.use(sinonChai);
let assert = sinon.assert;
const { Context } = require('fabric-contract-api');
const { ChaincodeStub, ClientIdentity } = require('fabric-shim');
const CreditPlusContract = require('../lib/creditContract');
describe('Credit Chaincode Test', () => {
let stub, ctx, ClientId;
beforeEach(() => {
ctx = new Context();
stub = sinon.createStubInstance(ChaincodeStub);
stub.getMspID.returns('Org1');
ctx.setChaincodeStub(stub);
ClientId = sinon.createStubInstance(ClientIdentity);
stub.putState.callsFake((key, value) => {
if (!stub.states) {
stub.states = {};
}
stub.states[key] = value;
});
stub.getState.callsFake(async (key) => {
let ret;
if (stub.states) {
ret = stub.states[key];
}
return Promise.resolve(ret);
});
stub.deleteState.callsFake(async (key) => {
if (stub.states) {
delete stub.states[key];
}
});
});
describe('Test CreditSubject function', () => {
it('should return success on createCreditSubject', async () => {
let creditContract = new CreditPlusContract();
let creditSubject = await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company","Admin","2024-05-28 14:35:00");
let scroe = creditSubject.score;
expect(scroe).to.equals(0);
});
it('should return success on queryCreditSubject', async () => {
let creditContract = new CreditPlusContract();
await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company", "Admin", "2024-05-28 14:35:00");
let creditSubject = await creditContract.queryCreditSubjectPlus(ctx, "A001");
let name = creditSubject.organizationName;
expect(name).to.equals("My Company");
});
});
})
测试代码:
三.部署征信链码
在虚拟机指定Hyperledger Fabric中实现对应链码的部署并验证部署情况。
将链码名修改切credit_chaincode_plus,删除node_modules目录以及对应package-lock.json文件,上传至服务器chaincode目录下:
打包测试:
export FABRIC_CFG_PATH=${PWD}/config
peer lifecycle chaincode package ./chaincode/credit_chaincode_plus.tar.gz --path ./chaincode/credit_chaincode_plus --lang node --label credit_chaincode_plus_1.0
查看打包结果:
安装链码:运行以下进入fabric-cli容器:
docker exec -it fabric-cli bash
1. 在org1中安装:运行以下链码安装:
. scripts/set-env.sh 1 0 7051
peer lifecycle chaincode install chaincode/credit_chaincode_plus.tar.gz
2. 在org2中安装,运行以下链码安装:
. scripts/set-env.sh 2 0 9051
peer lifecycle chaincode install chaincode/credit_chaincode_plus.tar.gz
3. 查看安装情况
peer lifecycle chaincode queryinstalled
批准链码
org1批准链码
1. 设置链码环境变量
export CC_PACKAGE_ID=credit_chaincode_plus_1.0:9415a0be8812a91c2e510619a4d2a6a5cd06a8cf8f9cef96ee4eec2f456ab7ec
2. 设置Org1环境变量
. scripts/set-env.sh 1 0 7051
3.批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA
1. 设置Org2环境变量
. scripts/set-env.sh 2 0 9051
2.批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA
检查提交准备
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --output json
提交链码
peer lifecycle chaincode commit -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA
查询提交的链码
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name credit_chaincode_plus --tls --cafile $ORDERER_CA
查看运行镜像形成容器情况
docker logs -f b1ddd21303a5
调用createCreditSubject功能
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name credit_chaincode_plus --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"createCreditSubjectPlus", "Args":["A001", "My Company", "Company","Admin","2024-05-28 14:35:00"]}'
调用queryCreditSubject功能
peer chaincode query -C $CHANNEL_NAME --name credit_chaincode_plus -c '{"function":"queryCreditSubjectPlus","Args":["A001"]}'
四.部署删除和更新代码
在链码中添加DeleteCreditSubject,实现按subject变量的key属性删除数据功能
在链码中添加UpdateSubjectScore功能,实现按key更新subject,更新subject变量中的score
'use strict';
const { Contract } = require("fabric-contract-api");
class CreditPlusContract extends Contract {
async createCreditSubjectPlus(ctx, key, organizationName, type, creator, datetime) {
console.info('=== START:创建征信主体 ===');
const subject = {
key: key,
organizationName: organizationName,
type: type,
score: 0,
creator: creator,
datetime: datetime
};
await ctx.stub.putState(key, Buffer.from(JSON.stringify(subject)));
console.info('=== END:创建征信主体 ===');
return subject;
}
// 查询征信主体
async queryCreditSubjectPlus(ctx, subjectKey) {
console.info('=== START : 查询征信主体 ===');
const bytes = await ctx.stub.getState(subjectKey);
if (!bytes || bytes.length === 0) {
const msg = `${subjectKey} 征信主体不存在`;
console.warn(msg);
throw new Error(msg);
}
const subject = JSON.parse(bytes.toString());
console.info('=== END : 查询征信主体 ===');
return subject;
}
async deleteCreditSubject(ctx, id) {
const exists = await this.creditSubjectExists(ctx, id);
if (!exists) {
throw new Error(`The asset ${id} does not exist`);
}
return ctx.stub.deleteState(id);
}
async creditSubjectExists(ctx, id) {
const assetJSON = await ctx.stub.getState(id);
return assetJSON && assetJSON.length > 0;
}
async updateSubjectScore(ctx,subjectKey,inputScore) {
const exists = await this.creditSubjectExists(ctx,subjectKey);
if (!exists) {
throw new Error(`The credit subject ${subjectKey} does not exist`);
}
const bytes = await ctx.stub.getState(subjectKey);
if (!bytes || bytes.length ===0){
const msg = `${subjectKey} 征信主体不存在`;
console.warn(msg)
throw new Error (msg);
}
var subject = JSON.parse(bytes.toString());
subject.score=inputScore;
return ctx.stub.putState(subjectKey, Buffer.from(JSON.stringify(subject)));
}
}
module.exports = CreditPlusContract;
在链码结构中test目录中添加对于DeleteCreditSubject以及UpdateSubjectScore功能的单元测试
'use strict';
const sinon = require('sinon');
const chai = require('chai');
const sinonChai = require('sinon-chai');
const expect = chai.expect;
chai.use(sinonChai);
let assert = sinon.assert;
const { Context } = require('fabric-contract-api');
const { ChaincodeStub, ClientIdentity } = require('fabric-shim');
const CreditPlusContract = require('../lib/creditContract');
describe('Credit Chaincode Test', () => {
let stub, ctx, ClientId;
beforeEach(() => {
ctx = new Context();
stub = sinon.createStubInstance(ChaincodeStub);
stub.getMspID.returns('Org1');
ctx.setChaincodeStub(stub);
ClientId = sinon.createStubInstance(ClientIdentity);
stub.putState.callsFake((key, value) => {
if (!stub.states) {
stub.states = {};
}
stub.states[key] = value;
});
stub.getState.callsFake(async (key) => {
let ret;
if (stub.states) {
ret = stub.states[key];
}
return Promise.resolve(ret);
});
stub.deleteState.callsFake(async (key) => {
if (stub.states) {
delete stub.states[key];
}
});
});
describe('Test CreditSubject function', () => {
it('should return success on createCreditSubject', async () => {
let creditContract = new CreditPlusContract();
let creditSubject = await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company","Admin","2024-05-28 14:35:00");
let scroe = creditSubject.score;
expect(scroe).to.equals(0);
});
it('should return success on queryCreditSubject', async () => {
let creditContract = new CreditPlusContract();
await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company", "Admin", "2024-05-28 14:35:00");
let creditSubject = await creditContract.queryCreditSubjectPlus(ctx, "A001");
let name = creditSubject.organizationName;
expect(name).to.equals("My Company");
});
it('should return sucess on DeleteCreditSubject', async () => {
let creditContract = new CreditPlusContract();
await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company", "Admin", "2024-05-28 14:35:00");
await creditContract.deleteCreditSubject(ctx,"A001");
let ret = await stub.getState('A001');
expect(ret).to.equal(undefined);
});
it('should return sucess on updateSubjectScore', async () => {
let creditContract = new CreditPlusContract();
await creditContract.createCreditSubjectPlus(ctx, "A001", "My Company", "Company", "Admin", "2024-05-28 14:35:00");
await creditContract.updateSubjectScore(ctx, "A001",10);
let ret = JSON.parse(await stub.getState('A001'));
expect(ret.score).to.eql(10);
});
});
})
测试代码:
五.更新部署征信链码
在链码中重新部署开发链码,实现链码更新(要求version、sequence有迭代痕迹)
打包测试:
export FABRIC_CFG_PATH=${PWD}/config
peer lifecycle chaincode package ./chaincode/credit_chaincode_plus.tar.gz --path ./chaincode/credit_chaincode_plus --lang node --label credit_chaincode_plus_1.1
安装链码
运行以下进入fabric-cli容器:
docker exec -it fabric-cli bash
1. 在org1中安装 | 运行以下链码安装:
. scripts/set-env.sh 1 0 7051
peer lifecycle chaincode install chaincode/credit_chaincode_plus.tar.gz
2. 在org2中安装
运行以下链码安装:
. scripts/set-env.sh 2 0 9051
peer lifecycle chaincode install chaincode/credit_chaincode_plus.tar.gz
3. 查看安装情况
peer lifecycle chaincode queryinstalled
三.批准链码
org1批准链码
设置链码环境变量
export CC_PACKAGE_ID=credit_chaincode_plus_1.1:a7d65de21f706c25029b84cbbf7de2163d06d9b8e9fc33fd20a5a59cc3a18b01
2. 设置Org1环境变量
. scripts/set-env.sh 1 0 7051
3.批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.1 --package-id $CC_PACKAGE_ID --sequence 2 --tls --cafile $ORDERER_CA
1. 设置Org2环境变量
. scripts/set-env.sh 2 0 9051
2.批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.1 --package-id $CC_PACKAGE_ID --sequence 2 --tls --cafile $ORDERER_CA
检查提交准备
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.1 --sequence 2 --tls --cafile $ORDERER_CA --output json
提交链码
peer lifecycle chaincode commit -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name credit_chaincode_plus --version 1.1 --sequence 2 --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA
查询提交的链码
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name credit_chaincode_plus --tls --cafile $ORDERER_CA
查看运行镜像形成容器情况
docker logs -f b1ddd21303a5
调用createCreditSubject功能
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name credit_chaincode_plus --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"createCreditSubjectPlus", "Args":["A001", "My Company", "Company","Admin","2024-05-28 14:35:00"]}'
调用queryCreditSubject功能
peer chaincode query -C $CHANNEL_NAME --name credit_chaincode_plus -c '{"function":"queryCreditSubjectPlus","Args":["A001"]}'
调用deleteCreditSubject功能
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name credit_chaincode_plus --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"deleteCreditSubject", "Args":["A001"]}'
调用updateSubjectScore功能(这边如果嫌麻烦的话可以更新功能之后再调用删除功能)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name credit_chaincode_plus --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"updateSubjectScore", "Args":["A002","10"]}'
六.部署应用系统前后端
按之前练习,部署应用系统前端和后端,在保证用户注册与登录功能外,实现对于修改链码的征信主体创建和查询功能。
确认之前的链码已经正常部署,拷贝organizations目录到go-gateway项目代码中,并启动go-gateway项目
启动:
确保虚拟机环境中已经正常运行了mysql(可以是linux环境中启动,也可以是通过容器启动)和redis服务(通过容器启动)
后端开发:
将之前开发的credit_back项目复制一份到实训练习目录。
使用vscode打开:
开发createCreditSubjectPlus功能,修改已有代码中createCreditSubject的代码,具体修改后代码内容如下:
开发queryCreditSubjectPlus功能,修改已有代码中queryCreditSubject的代码,具体修改后代码内容如下:
通过postman验证。
启动后端项目:
验证createCreditSubjectPlus功能
先登录获取用户token
使用对应路由调用接口:
验证queryCreditSubjectPlus功能
前端开发:
复制credit-front项目到实训目录下,并用VSCode打开:
启动前端项目:
npm run serve
修改views/Credit.vue文件
验证创建过程
验证查询:
七.部署前后端删除功能
在前后端应用系统中添加对链码中征信主体的删除和更新功能。
后端开发:
编辑/deleteCreditSubject,具体代码如下:
编辑/updateSubjectScore,具体代码如下:
from flask import Flask, request, jsonify
import requests
import json
import hashlib
import random
from config import app, db, redis_service
from user import User
invokeURL = "http://192.168.200.112:8080/invoke"
evaluateURL = "http://192.168.200.112:8080/evaluate"
def get_token():
"""
随机生成token
"""
src = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz!@#$%^&*()',20))
m2 = hashlib.md5()
m2.update(src.encode("utf8"))
return m2.hexdigest()
@app.route('/')
def hello_world():
return 'Hello World!'
@app.before_request
def before():
url = request.path
if url == '/login' or url == '/register':
pass
else:
token = request.headers.get('token')
if token is None:
return jsonify({'code':500,'data':'用户未登录'})
username = redis_service.get(token)
if username:
pass
else:
return jsonify({'code':500,'data':'用户未登录'})
@app.route('/register',methods=['POST'])
def register():
get_json = request.json
username = get_json['username']
password = get_json['password']
get_user = User.query.filter_by(username=username).first()
if get_user is not None:
return jsonify({'code':500, 'msg':'User exists!'})
save_user = User(username, password)
db.session.add(save_user)
db.session.commit()
return jsonify({'code': 200, 'msg': "Register Success!"})
@app.route('/login',methods=['POST'])
def login():
get_json = request.json
username = get_json['username']
password = get_json['password']
get_user = User.query.filter_by(username=username).first()
if get_user is None:
return jsonify({'code': 404, 'msg': "User not exist"})
if get_user.password == password:
token = get_token()
redis_service.set(token, username)
data = {'token': token, 'username': username}
return jsonify({'code': 200, 'msg': data})
else:
return jsonify({'code': 500, 'msg': 'Password error!'})
@app.route('/createCreditSubjectPlus', methods=['POST'])
def create_credit():
json_data = request.json
payload = json.dumps({
"channelName": "applicationchannel",
"chaincodeName": "credit_chaincode_plus",
"funcName": "createCreditSubjectPlus",
"paramArray": json_data.get("paramArray")
})
headers = {'Content-Type': 'application/json'}
response = requests.request("POST", invokeURL, headers=headers, data=payload)
print(response.text)
return jsonify({'code': 200, "msg": "create success"})
@app.route('/queryCreditSubjectPlus', methods=['POST'])
def credit_query():
json_data = request.json
payload = json.dumps({
"channelName": "applicationchannel",
"chaincodeName": "credit_chaincode_plus",
"funcName": "queryCreditSubjectPlus",
"paramArray": json_data.get("paramArray")
})
headers = {'Content-Type': 'application/json'}
response = requests.request("POST", evaluateURL, headers=headers, data=payload)
print(response.text)
return jsonify({'code': 200, "msg": "query success", "data": response.text})
@app.route('/deleteCreditSubject', methods=['POST'])
def creditDelete():
json_data = request.json
payload = json.dumps({
"channelName": "applicationchannel",
"chaincodeName": "credit_chaincode_plus",
"funcName": "deleteCreditSubject",
"paramArray": json_data.get("paramArray")
})
headers = {'Content-Type': 'application/json'}
response = requests.request("POST", invokeURL, headers=headers, data=payload)
print(response.text)
return jsonify({'code': 200, "msg": "delete success"})
@app.route('/updateSubjectScore', methods=['POST'])
def creditUpdateScore():
json_data = request.json
payload = json.dumps({
"channelName": "applicationchannel",
"chaincodeName": "credit_chaincode_plus",
"funcName": "updateSubjectScore",
"paramArray": json_data.get("paramArray")
})
headers = {'Content-Type': 'application/json'}
response = requests.request("POST", invokeURL, headers=headers, data=payload)
print(response.text)
return jsonify({'code': 200, "msg": "update success"})
if __name__ == '__main__':
app.run()
使用postman验证:
验证/deleteCreditSubject接口:
验证updateSubjectScore接口:
前端开发(围绕Credit.vue文件展开):
开发删除征信主体功能
开发更新征信主体积分功能
<template>
<el-row style="height: 100%;">
<el-row style="height: 10%; border-bottom-style: solid;border-bottom-color: #e6e6e6;">
<el-col :span="4" style="height: 100%;">
<h2>示例应用程序</h2>
</el-col>
<el-col :span="4" style="position: absolute; right: 10%; bottom: 0px;">
你好!{
{ $cookies.get("username") }}
<el-button type="text" size="medium" style="font-size: 20px" @click="logout">登出</el-button>
</el-col>
</el-row>
<el-row style="height: 90%;">
<el-col :span="4" style="height: 100%;">
<navigator></navigator>
</el-col>
<el-col :span="20" style="height: 100%;">
<h1>征信主体操作页面</h1>
<el-divider></el-divider>
<el-row>
<el-col :span="8" :offset="0">
<el-button type="primary" @click="Visible">创建征信主体</el-button>
</el-col>
</el-row>
<el-row>
<el-form>
<el-row>
<el-col :span="16">
<el-form-item label="Key:" label-width="150px">
<el-input type="primary" placeholder="请输入查询ID" v-model="Keyid"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="queryCreditSubject">查询</el-button>
</el-col>
</el-row>
<el-row>
<el-col :span="16">
<el-form-item label="Key:" label-width="150px">
<el-input type="primary" placeholder="请输入查询ID" v-model="deleteKeyId"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="deleteCreditSubject">删除</el-button>
</el-col>
</el-row>
<el-row>
<el-col :span="16" offset="0">
<el-button type="primary" @click="updateVisible = true">更新征信主体</el-button>
</el-col>
</el-row>
</el-form>
</el-row>
<el-divider></el-divider>
<el-row v-if="dataVisible">
<el-col :span="22" :offset="1">
<el-row>
<el-col :span="4">
<h1>查询结果</h1>
</el-col>
</el-row>
<el-row>
<el-form label-width="100px">
<el-form-item label="查询结果:">
{
{ result }}
</el-form-item>
</el-form>
</el-row>
</el-col>
</el-row>
<el-dialog :visible.sync="addVisible" title="征信主体">
<el-form :model="form" status-icon ref="form" label-width="150px">
<el-form-item label="key" prop="description">
<el-input type="primary" v-model="form.key"></el-input>
</el-form-item>
<el-form-item label="organizationName" prop="description">
<el-input type="primary" v-model="form.organizationName"></el-input>
</el-form-item>
<el-form-item label="type" prop="description">
<el-input type="primary" v-model="form.type"></el-input>
</el-form-item>
<el-form-item label="creator" prop="description">
<el-input type="primary" v-model="form.creator"></el-input>
</el-form-item>
<el-form-item label="datetime" prop="description">
<el-input type="primary" v-model="form.datetime"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="createCreditSubject">创建</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-dialog :visible.sync="updateVisible" title="更新征信主体">
<el-form :model="form" status-icon ref="form" label-width="150px">
<el-form-item label="key" prop="description">
<el-input type="primary" v-model="updateForm.key"></el-input>
</el-form-item>
<el-form-item label="score" prop="description">
<el-input type="primary" v-model="updateForm.score"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="updateSubjectScore">更新积分</el-button>
</el-form-item>
</el-form>
</el-dialog>
</el-col>
</el-row>
</el-row>
</template>
<script>
import Navigator from "@/components/Navigator";
export default {
name: "Home",
components: {
Navigator
},
data() {
return {
addVisible: false,
updateVisible:false,
dataVisible: false,
result: [],
Keyid: "",
deleteKeyId:"",
form: {
key: "",
organizationName: "",
type: "",
creator:"",
datetime:""
},
updateForm:{
key:"",
score:""
}
};
},
methods: {
validLogin() {
if (this.$cookies.get("username") === undefined) {
this.$router.push('/login');
}
},
logout() {
this.$cookies.remove('token');
this.$cookies.remove('username');
this.$router.push('/login');
},
Visible() {
this.addVisible = true;
},
createCreditSubject() {
let postData = {
paramArray: [this.form.key, this.form.organizationName, this.form.type, this.form.creator, this.form.datetime]
};
this.axios.post('/createCreditSubjectPlus', postData, {
headers: {
'token': this.$cookies.get("token")
}
}).then((response) => {
if (response.data.code === 200) {
alert('新增成功');
setTimeout(() => {
this.addVisible = false;
}, 1000);
} else {
alert(`新增失败,${response.data.data}`);
}
}).catch(error => {
console.error(error);
alert("网络错误,请稍后再试");
});
},
queryCreditSubject() {
let postData = {
paramArray: [this.Keyid]
};
this.axios.post('/queryCreditSubjectPlus', postData, {
headers: {
'token': this.$cookies.get("token")
}
}).then((response) => {
if (response.data.code === 200) {
this.result = response.data.data;
console.log(this.result);
this.dataVisible = true;
}
})
},
deleteCreditSubject() {
let postData = {
paramArray: [this.Keyid]
};
this.axios.post('/deleteCreditSubject', postData, {
headers: {
'token': this.$cookies.get("token")
}
}).then((response) => {
if (response.data.code === 200) {
this.result = response.data.data;
alert(response.data.msg)
this.dataVisible = true;
}
})
},
updateSubjectScore() {
let postData = {
paramArray: [this.updateForm.key,this.updateForm.score]
};
this.axios.post('/updateSubjectScore', postData, {
headers: {
'token': this.$cookies.get("token")
}
}).then((response) => {
if (response.data.code === 200) {
alert('更新成功')
setTimeout(() => {
this.addVisible = false;
}, 1000);
} else {
alert(`更新失败,${response.data.data}`);
}
}).catch(error => {
console.error(error);
alert("网络错误,请稍后再试");
});
},
},
created() {
this.validLogin();
}
};
</script>
<style scoped></style>
验证更新征信主体
验证删除征信主体