区块链系统开发测试----链码部署&开发、系统开发&验证

一.检查配置环境

检查虚拟机环境,确保有正在运行的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>

验证更新征信主体

验证删除征信主体

猜你喜欢

转载自blog.csdn.net/2201_76041915/article/details/139278409