You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

576 lines
17 KiB
Vue

<script setup>
import {uuid} from "@/utils/index.js"
const { proxy } = getCurrentInstance();
// 完成状态
const finish = ref(1);
// 验证
const dialogVisible = ref(false);
// 解密
const tableData = reactive([
{
node:'企业',
redpackageAddress:'',
balance:'/',
deposit:'10000',
name:""
},
{
node:'消费者',
redpackageAddress: "",
balance: "",
deposit: "5000",
name:""
},
{
node:'商业银行',
redpackageAddress: "48C8E181-DEC9-5438-9BC6-404D23A62922",
balance: "1000000000",
deposit: "10000000000",
},
{
node:'中央银行',
redpackageAddress: "0A99D0E3-ECC5-FA84-F1D2-F445CE7B3BE5",
balance: "100000000",
deposit: "100000000",
},
]);
const tablist =reactive([
{
name:'构建交易节点',
id:1
},
{
name:'设置合约代码',
id:2
},
{
name:'触发交易条件',
id:3
},
{
name:'自动完成交易',
id:4
}
]);
// 商品form变量
const form = ref({
name: "",
price: "",
});
// 触发交易条件变量
const conditionForm=reactive({
name:'',
price:'',
number:'',
money:''
})
const fileInput=ref(null)
const tabsid=ref(1)
// 演练切换函数
const go = (idx) => {
if(idx==4){
document.getElementsByClassName('machine')[0].style.display='block'
}else{
document.getElementsByClassName('machine')[0].style.display='none'
}
tabsid.value = idx;
}
// 创建钱包
const createWallet = (val,money) => {
// if()
console.log(val,"val");
tableData.forEach(item=>{
if(item.node==val){
//生成uuid
if(item.name == ''){
proxy.$modal.msgError('请先创建节点')
return
}
const uuids=uuid()
item.redpackageAddress=uuids
item.balance='0'
}
})
};
// 充值
const recharge = (money) => {
// 商品名称和单价不等于空
tableData.forEach(item=>{
if(item.node=='消费者'){
if(item.redpackageAddress == ''){
proxy.$modal.msgError('请先创建钱包')
return
}
item.balance=item.deposit
item.deposit='0'
finish.value++
}
})
//
};
// 企业设置上架商品
const setGoods = () => {
if(form.value.name==''||form.value.price==''){
proxy.$modal.msgError('商品名称和单价不能为空')
return
}
conditionForm.name=form.value.name
conditionForm.price=form.value.price
proxy.$modal.msgSuccess('合约上链成功')
finish.value++
};
// 支付计算
const pay = () => {
// 拿到购买数量和单价
const number=conditionForm.number
const price=conditionForm.price
// 计算总价
const money=number*price
console.log(money,"money")
// 拿到消费者余额
const balance=tableData[1].balance
// 拿到支付金额
const payMoney=+conditionForm.money
console.log(payMoney,"payMoney")
// 支付金额必须全等于总价
if(payMoney==money){
proxy.$modal.msgSuccess('支付成功')
finish.value++
// 支付成功后消费者余额减去支付金额
tableData[1].balance=balance-payMoney
// 企业余额加上支付金额
tableData[0].balance=+tableData[0].balance+payMoney
}else{
proxy.$modal.msgError('支付失败')
}
}
//创建节点
const createNode=(val)=>{
if(val=='消费者'){
console.log(val,"val");
// 获取class为item4
const item4=document.getElementsByClassName('item4')[0]
// 添加id名
item4.setAttribute('id','item4')
tableData[1].name='消费者'
}else{
// 获取class为item3
const item3=document.getElementsByClassName('item3')[0]
item3.setAttribute('id','item3')
tableData[0].name='企业'
console.log(tableData,"tableData");
}
}
</script>
<template>
<div class="app-contract">
<el-row>
<el-col :span="24">
<img src="../../../assets/images/29.png" alt="" />
<span>智能合约演练</span>
</el-col>
</el-row>
<div class="contract-content">
<div class="manoeuvre">
<div class="manoeuvre_item" v-for="(item,index) in tablist" :key="item" @click="go(index+1)" :class="{'manoeuvre_item_complete':index<finish}">
<span>{{ item.name }}</span>
<img src="../../../assets//images/企业用户-切图/智能合约演练/向右.png" alt="">
</div>
</div>
<div class="manoeuvre-conter">
<div class="manoeuvre_conter_item" v-show="tabsid==1">
<p class="reseda">以自动售卖机为例,交易涉及四方:消费者、企业、中央银行</p>
<div class="step">
<div class="stop_title">第一步</div>
<span>构建网络交易点,企业和消费者加入中央银行和商业银行构建的合约代码平台,创建钱包,并充值</span>
</div>
<div class="el-tab el-tab1" style="width: 70%;margin-top: 20px;">
<el-table
:data="tableData"
style="width: 100%"
stripe
>
<el-table-column align="center" prop="node" label="节点" >
</el-table-column>
<el-table-column align="center" prop="redpackageAddress" label="钱包地址" >
</el-table-column>
<el-table-column align="center" prop="balance" label="数字货币账户余额" >
</el-table-column>
<el-table-column align="center" prop="deposit" label="人民币存款" >
</el-table-column>
<el-table-column align="center" prop="name" label="操作" >
<template #default="scope" >
<el-button link v-if="scope.row.node =='消费者'||scope.row.node =='企业'" @click="createNode(scope.row.node)">创建节点</el-button>
<el-button link v-if="scope.row.node =='消费者'||scope.row.node =='企业'" @click="createWallet(scope.row.node)">创建钱包</el-button>
<el-button link v-if="scope.row.node =='消费者'" @click="recharge(scope.row,)" v-preReClick>充值</el-button>
<span v-if="scope.row.node =='商业银行'||scope.row.node =='中央银行'">/</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="manoeuvre_conter_item" v-show="tabsid==2">
<p class="reseda">以自动售卖机为例,交易涉及四方:消费者、企业、中央银行</p>
<div class="step">
<div class="stop_title">第二步</div>
<span>企业上架商品,设置合约代码、合约触发条件</span>
</div>
<div class="item-form" style="width: 40%;margin-top: 30px;">
<el-form label-width="120px">
<el-form-item label="商品名称:">
<el-input placeholder="请输入商品名称" v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="单价:">
<el-input placeholder="请输入商品单价" v-model="form.price"></el-input>
<span style="margin-left: 20px;" >e--cny</span>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="setGoods">合约上链</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="manoeuvre_conter_item" v-show="tabsid==3">
<p class="reseda">以自动售卖机为例,交易涉及四方:消费者、企业、中央银行</p>
<div class="step">
<div class="stop_title">第二步</div>
<span>企业上架商品,设置合约代码、合约触发条件</span>
</div>
<div class="item-form" style="width: 40%;margin-top: 30px;">
<el-form label-width="120px">
<el-form-item label="商品名称:">
<el-input placeholder="请输入商品名称" v-model="conditionForm.name"></el-input>
</el-form-item>
<el-form-item label="单价:">
<el-input placeholder="请输入商品名称" v-model="conditionForm.price"></el-input>
</el-form-item>
<el-form-item label="购买数量:">
<el-input placeholder="请输入购买数量" v-model="conditionForm.number"></el-input>
</el-form-item>
<el-form-item label="支付金额:">
<el-input placeholder="请输入支付金额" v-model="conditionForm.money"></el-input>
<span style="margin-left: 20px;">e--cny</span>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="pay">支付</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="manoeuvre_conter_item" v-show="tabsid==4">
<p class="reseda">以自动售卖机为例,交易涉及四方:消费者、企业、中央银行</p>
<div class="step">
<div class="stop_title">第四步</div>
<span>资金完成从消费者到企业的转账,售货机开门掉出商品</span>
</div>
<div class="el-tab el-tab1" style="width: 50%;margin-top: 20px;">
<el-table
:data="tableData"
style="width: 100%"
stripe>
<el-table-column align="center" prop="node" label="节点" >
</el-table-column>
<el-table-column align="center" prop="redpackageAddress" label="钱包地址" >
</el-table-column>
<el-table-column align="center" prop="balance" label="数字货币账户余额" >
</el-table-column>
<el-table-column align="center" prop="deposit" label="人民币存款" >
</el-table-column>
</el-table>
</div>
</div>
</div>
</div>
<div style="display:flex;">
<div class="contract-footer">
<div class="footer-item">
</div>
<div class="item1 item"></div>
<div class="item2 item"></div>
<div class="item3 item"></div>
<div class="item4 item"></div>
</div>
<div class="machine">
<div :class="{'machine_item':finish==4}"></div>
</div>
</div>
</div>
</template>
<style lang='scss' scoped>
:deep(.el-button.is-link){
color: #00F0FF;
}
:deep(.el-button--primary){
width: 202px;
height: 42px;
border: 2px solid #25F4F9;
background: linear-gradient(0deg, #0654B5 0%, #003155 50%, #2CD1E4 100%);
box-shadow: 0px 5px 6px 0px rgba(0,48,255,0.77);
border-radius: 8px;
}
.grabble{
display: flex;
height: 38px;
label{
width: 132px;
text-align: center;
line-height: 38px;
margin-left: 54px;
font-size: 14px;
}
:deep(.el-input__wrapper){
background-color: transparent !important;
width: 275px;
height: 41px;
background:url('../../../assets/images/企业用户-切图/钱包管理/筛选框.png') no-repeat !important;
background-size: 100% 100% !important;
box-shadow: none !important;
// 输入框光标改变颜色
caret-color: #ffffff;
}
// 按钮
}
.el-col-24 {
height: 69px;
padding: 15px 13px;
display: flex;
align-items: center;
span {
padding-left: 15px;
font-weight: bold;
font-size: 14px;
}
}
.el-tab {
padding: 0 13px;
}
.el-tab1 {
border: 1px solid #1854a6;
padding: 6px;
--el-table-row-hover-bg-color: transparent;
:deep(.el-table .el-table__header-wrapper th) {
background-color: #06B675 !important;
color: #ffffff !important;
font-weight: 600;
}
}
.svg-icon{
margin-right: 6px;
}
.app-contract{
.contract-content{
padding: 0px 20px;
.manoeuvre{
width: calc(100% - 45%);
// background-color: pink;
display: flex;
padding: 0px 10px;
border-bottom: 1px solid #06B675;
.manoeuvre_item{
position: relative;
width: 178px;
height: 40px;
background: linear-gradient(0deg, #6F6F8D 0%, #D2D6E5 100%);
border-radius: 10px 10px 0px 0px;
display: flex;
justify-content: center;
align-content: center;
margin-right: 44px;
// 鼠标小手
cursor: pointer;
span{
line-height:40px;
font-size: 14px;
}
}
img{
position: absolute;
top: 15px;
right: -35px;
}
}
.manoeuvre_conter_item{
:deep(.item-form){
// background-color: ;
.el-form-item__label{
color: #ffffff;
}
.el-input--default{
width: 403px;
height: 46px;
background: #2B539C;
border: 1px solid #265AB9;
color: #ffffff;
}
.el-input__wrapper{
box-shadow: none;
// background-color: pink;
background: url('../../../assets/images/企业用户-切图/智能合约演练/输入框.png') no-repeat !important;
background-size: 100% 100% !important;
// 输入框光标改变颜色
caret-color: #ffffff;
// 输入框内提示文字颜色
}
}
}
}
.reseda{
font-size: 12px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #2FDD93;
}
.step{
width: calc(100% - 55%);
height: 32px;
border: 1px solid #2FDD93;
border-radius: 16px;
display: flex;
align-items: center;
padding: 0px 5px;
.stop_title{
width: 70px;
height: 23px;
background: #06B675;
border-radius: 12px;
line-height: 23px;
text-align: center;
font-size: 12px;
}
span{
font-size: 12px;
font-family: Source Han Sans CN;
padding-left: 22px;
}
}
}
.contract-footer{
position: relative;
width: calc(100% - 35%);
height: 458px;
display: flex;
justify-content: center;
align-items: center;
background:url('../../../assets/images/框.png') no-repeat !important;
background-size: 100% 100% !important;
margin-left: 32px;
.footer-item{
width:687.9px;
height:260px;
background:url('../../../assets/images/图(无按钮).png') no-repeat !important;
background-size: 100% 100% !important;
}
.item{
position: absolute;
width: 112px;
height: 71px;
}
.item1{
top: 225px;
left: 138px;
background:url('../../../assets/images/1-中央银行.png') no-repeat !important;
background-size: 100% 100% !important;
}
.item2{
top: 225px;
left: 828px;
background:url('../../../assets/images/4-商业银行.png') no-repeat !important;
background-size: 100% 100% !important;
}
.item3{
display: none;
top: 316px;
left: 363px;
background:url('../../../assets/images/3-企业.png') no-repeat !important;
background-size: 100% 100% !important;
}
.item4{
display: none;
top: 316px;
left: 605px;
background:url('../../../assets/images/2-消费者.png') no-repeat !important;
background-size: 100% 100% !important;
}
#item4{
display: block;
animation: item4 1s;
}
@keyframes item4{
// 慢慢的动画显示出来
0%{
opacity: 0;
}
100%{
opacity: 1;
}
}
#item3{
display: block;
animation: item4 1s;
}
@keyframes item3{
// 慢慢的动画显示出来
0%{
opacity: 0;
}
100%{
opacity: 1;
}
}
}
.machine{
position: absolute;
top:200px;
right: 86px;
width: 497px;
height: 738px;
background:url('../../../assets/images/售卖机(未打开).png') no-repeat !important;
background-size: 100% 100% !important;
display:none;
.machine_item{
position: absolute;
top: 29%;
left: 37%;
width: 150px;
height: 112px;
// commodity
background:url('../../../assets/images/commodity.png') no-repeat !important;
background-size: 100% 100% !important;
// 图片旋转
animation: machine_item 1s;
}
@keyframes machine_item{
// 慢慢的动画显示出来
0%{
transform: rotate(0deg);
}
100%{
transform: rotate(360deg);
}
}
//有一个从上往下掉落的动画
}
:deep(.el-input__inner){
color: #ffffff !important;
}
.manoeuvre_item_complete{
width: 178px;
height: 40px;
background: linear-gradient(0deg, #007D61 0%, #00E07E 100%) !important ;
border-radius: 10px 10px 0px 0px;
}
</style>