After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 664 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 602 B |
After Width: | Height: | Size: 3.7 KiB |
@ -0,0 +1,218 @@ |
|||||
|
|
||||
|
<template> |
||||
|
<div class="radial-indicator-container" :style="{'width':size+'px','height':size+'px'}"> |
||||
|
<div class="percentloop"> |
||||
|
<div class="circle-left" :style="{ background: 'linear-gradient(231.58deg, #2ED283 17.34%, #48F4C1 82.12%)'}"> |
||||
|
<div :style="{ background: backgroundColor}" ref="leftcontent"></div> |
||||
|
</div> |
||||
|
<div class="circle-right" :style="{ background: 'linear-gradient(231.58deg, #2ED283 17.34%, #48F4C1 82.12%)'}"> |
||||
|
<div :style="{ background: backgroundColor}" ref="rightcontent"></div> |
||||
|
</div> |
||||
|
<div class="content-wrap"> |
||||
|
<span class="content-number" :title="percent+'%'">{{percent}}%</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
// Events: animationFinished |
||||
|
|
||||
|
export default { |
||||
|
name: 'RadialIndicator', |
||||
|
|
||||
|
props: { |
||||
|
size: { |
||||
|
type: [String, Number], |
||||
|
default: 155 |
||||
|
}, |
||||
|
icon: { |
||||
|
type: String, |
||||
|
default: 'mail' |
||||
|
}, |
||||
|
content: String, |
||||
|
color: { |
||||
|
type: String, |
||||
|
default: '#00b3ef' |
||||
|
}, |
||||
|
backgroundColor: { |
||||
|
type: String, |
||||
|
default: '#7fd9f7' |
||||
|
}, |
||||
|
percentNum: { |
||||
|
type: [String, Number], |
||||
|
default: 0 |
||||
|
}, |
||||
|
speed: { |
||||
|
// suggest 1~3 |
||||
|
type: [String, Number], |
||||
|
default: 1 |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
data () { |
||||
|
return { |
||||
|
percent: 0, |
||||
|
initDeg: 0, |
||||
|
timeId: null, |
||||
|
animationing: false |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
created () { |
||||
|
this.goRotate(this.transformToDeg(this.percentNum)) |
||||
|
}, |
||||
|
|
||||
|
watch: { |
||||
|
'percentNum': function (val) { |
||||
|
if (this.animationing) return |
||||
|
this.goRotate(this.transformToDeg(val)) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
transformToDeg (percent) { |
||||
|
let deg = 0 |
||||
|
if (percent >= 100) { |
||||
|
deg = 360 |
||||
|
} else { |
||||
|
deg = parseInt(360 * percent / 100) |
||||
|
} |
||||
|
return deg |
||||
|
}, |
||||
|
|
||||
|
transformToPercent (deg) { |
||||
|
let percent = 0 |
||||
|
if (deg >= 360) { |
||||
|
percent = 100 |
||||
|
} else { |
||||
|
percent = parseInt(100 * deg / 360) |
||||
|
} |
||||
|
return percent |
||||
|
}, |
||||
|
|
||||
|
// > 180 |
||||
|
rotateLeft (deg) { |
||||
|
this.$refs.leftcontent.style.transform = 'rotate(' + (deg - 180) + 'deg)' |
||||
|
}, |
||||
|
|
||||
|
// < 180 |
||||
|
rotateRight (deg) { |
||||
|
this.$refs.rightcontent.style.transform = 'rotate(' + deg + 'deg)' |
||||
|
}, |
||||
|
|
||||
|
goRotate (deg) { |
||||
|
this.animationing = true |
||||
|
this.timeId = setInterval(() => { |
||||
|
if (deg > this.initDeg) { |
||||
|
this.initDeg += Number(this.speed) |
||||
|
if (this.initDeg >= 180) { |
||||
|
this.rotateLeft(this.initDeg) |
||||
|
this.rotateRight(180) |
||||
|
} else { |
||||
|
this.rotateRight(this.initDeg) |
||||
|
} |
||||
|
} else { |
||||
|
this.initDeg -= Number(this.speed) |
||||
|
if (this.initDeg >= 180) { |
||||
|
this.rotateLeft(this.initDeg) |
||||
|
} else { |
||||
|
this.rotateLeft(180) |
||||
|
this.rotateRight(this.initDeg) |
||||
|
} |
||||
|
} |
||||
|
this.percent = this.transformToPercent(this.initDeg) |
||||
|
const remainer = Number(deg) - this.initDeg |
||||
|
if (Math.abs(remainer) < this.speed) { |
||||
|
this.initDeg += remainer |
||||
|
if (this.initDeg > 180) { |
||||
|
this.rotateLeft(deg) |
||||
|
} else { |
||||
|
this.rotateRight(deg) |
||||
|
} |
||||
|
this.animationFinished() |
||||
|
} |
||||
|
}, 10) |
||||
|
}, |
||||
|
|
||||
|
animationFinished () { |
||||
|
this.percent = this.percentNum |
||||
|
this.animationing = false |
||||
|
clearInterval(this.timeId) |
||||
|
this.$emit('animationFinished') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
.radial-indicator-container{ |
||||
|
width: 120px; |
||||
|
height: 120px; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .percentloop { |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
border-radius: 50%; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .circle-left, |
||||
|
.radial-indicator-container .circle-right { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
width: 50%; |
||||
|
height: 100%; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .circle-left>div, |
||||
|
.radial-indicator-container .circle-right>div { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
transform-origin: right center; |
||||
|
/* transition: all .5s linear; */ |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .circle-right { |
||||
|
left: 50%; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .circle-right>div { |
||||
|
transform-origin: left center; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .content-wrap { |
||||
|
position: absolute; |
||||
|
top: 9%; |
||||
|
bottom: 9%; |
||||
|
left: 9%; |
||||
|
right: 9%; |
||||
|
background-color: #fff; |
||||
|
border-radius: 50%; |
||||
|
overflow: hidden; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
color: #000; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .content-wrap .content-number { |
||||
|
font-size: 24px; |
||||
|
padding: 5px 0 7px 0; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
|
||||
|
.radial-indicator-container .content-wrap .content-text { |
||||
|
display: inline-block; |
||||
|
max-width: 90px; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
white-space: nowrap; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,507 @@ |
|||||
|
<template> |
||||
|
<div class="app-container"> |
||||
|
<div class="bg bg-white"> |
||||
|
<el-table v-loading="loading" :data="UserCertificationList"> |
||||
|
<el-table-column :label="'订单编号'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.orderNo }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column :label="'用户名称'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.appealUser.name }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column :label="'交易类型'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.tradeType == 'buy' ? '购买' : '出售' }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column :label="'交易币种'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.coin }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column :label="'交易数量'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.realityCoinNum }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column :label="'交易单价'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.legalCurrency }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column :label="'交易总价'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.realityLegalNums }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column :label="'法币币种'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.limitCoin }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="订单状态" align="center" prop="orderStatus" :formatter="sysOrderStatusFormat" /> |
||||
|
|
||||
|
<el-table-column :label="'下单时间'" align="center" prop="balance"> |
||||
|
<template slot-scope="scope"> |
||||
|
{{ scope.row.order.createTime }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
</el-table> |
||||
|
|
||||
|
<div class="status-con" v-if="UserCertificationList.length"> |
||||
|
<div class="flex" style="align-items:flex-start"> |
||||
|
<div class="let item m-b-16" style="margin-right:60px"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
申诉人基本信息 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="flex" style="align-items: flex-start"> |
||||
|
<div class="let"> |
||||
|
<div class="text m-b-16"> |
||||
|
昵称:{{ UserCertificationList[0].appealUser.nickname ? |
||||
|
UserCertificationList[0].appealUser.nickname |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
姓名:{{ UserCertificationList[0].appealUser.name ? |
||||
|
UserCertificationList[0].appealUser.name |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
邮箱:{{ UserCertificationList[0].appealUser.email ? |
||||
|
UserCertificationList[0].appealUser.email |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="rig"> |
||||
|
<div class="text m-b-16"> |
||||
|
用户类型:{{ UserCertificationList[0].appealUser.userRole == 'user' ? '普通用户' : '认证商家' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
证件号:{{ UserCertificationList[0].appealUser.idNumber }} |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<div class="bottom flex"> |
||||
|
<div class="text let"> |
||||
|
总单量:{{ UserCertificationList[0].appealUser.totalNum }} |
||||
|
</div> |
||||
|
<div class="text"> |
||||
|
成交率:{{ NumberMul(UserCertificationList[0].appealUser.successRate, 100) }}% |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="right item"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
被申诉人基本信息 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="flex" style="align-items: flex-start"> |
||||
|
<div class="let"> |
||||
|
<div class="text m-b-16"> |
||||
|
昵称:{{ UserCertificationList[0].beAppealUser.nickname ? |
||||
|
UserCertificationList[0].beAppealUser.nickname |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
姓名:{{ UserCertificationList[0].beAppealUser.name ? |
||||
|
UserCertificationList[0].beAppealUser.name |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
邮箱:{{ UserCertificationList[0].beAppealUser.email ? |
||||
|
UserCertificationList[0].beAppealUser.email |
||||
|
: |
||||
|
'无' }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="rig"> |
||||
|
<div class="text m-b-16"> |
||||
|
用户类型:{{ UserCertificationList[0].beAppealUser.userRole == 'user' ? '普通用户' : '认证商家' |
||||
|
}} |
||||
|
</div> |
||||
|
<div class="text m-b-16"> |
||||
|
证件号:{{ UserCertificationList[0].beAppealUser.idNumber }} |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<div class="bottom flex"> |
||||
|
<div class="text let"> |
||||
|
总单量:{{ UserCertificationList[0].beAppealUser.totalNum }} |
||||
|
</div> |
||||
|
<div class="text"> |
||||
|
成交率:{{ NumberMul(UserCertificationList[0].beAppealUser.successRate, 100) }}% |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="bottom item"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
申诉资料 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="text m-b-16" style="margin-right:40px"> |
||||
|
申诉类型:{{ UserCertificationList[0].appealRemark ? UserCertificationList[0].appealRemark : '无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-16 "> |
||||
|
申诉原因:{{ UserCertificationList[0].appealDesc ? UserCertificationList[0].appealDesc : '无' }} |
||||
|
</div> |
||||
|
|
||||
|
<div class="text flex m-b-28"> |
||||
|
申诉文件: |
||||
|
<div class="flex"> |
||||
|
<template v-if="UserCertificationList[0].listUrl.length" > |
||||
|
<el-image v-for="dict in UserCertificationList[0].listUrl" |
||||
|
:key="dict" |
||||
|
@click="previewImage(dict)" |
||||
|
style="width: 150px;height:150px;margin-right:10px" |
||||
|
:src="dict" |
||||
|
:preview-src-list="srcList" |
||||
|
class="avatar" > |
||||
|
</el-image> |
||||
|
</template> |
||||
|
<span v-if="!UserCertificationList[0].listUrl.length">无</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="flex" style="margin-left:65px" |
||||
|
v-if="UserCertificationList[0].appealStatus == 'in_appeal'"> |
||||
|
<el-button type="primary" icon="" size="large" style="width:110px;height:40px" |
||||
|
@click="handleSuccess()">通过申诉</el-button> |
||||
|
<el-button size="large" type="danger" style="width:110px;height:40px" |
||||
|
@click="handleFail()">驳回申诉</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<!-- 成功对话框 --> |
||||
|
<el-dialog title="通过" :visible.sync="open" width="400px" append-to-body> |
||||
|
<div class="sub-tit m-b-16"> |
||||
|
是否通过该申诉申请? |
||||
|
</div> |
||||
|
<div slot="footer" class="dialog-footer flex-between"> |
||||
|
<el-button type="text" @click="cancelApple">取消</el-button> |
||||
|
<el-button type="text" @click="submitFormApple('success_appeal')">确定</el-button> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<!-- 驳回对话框 --> |
||||
|
<el-dialog title="驳回申诉" :visible.sync="openApple" width="400px" append-to-body> |
||||
|
<el-form ref="form" :model="formApple" :rules="rulesApple" label-width="0px"> |
||||
|
<div class="sub-tit m-b-16"> |
||||
|
是否确认驳回该申诉申请? |
||||
|
</div> |
||||
|
<el-form-item label="" prop="appealDesc"> |
||||
|
<el-input v-model="formApple.appealDesc" type="textarea" placeholder="驳回申诉备注" rows="5" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<div slot="footer" class="dialog-footer flex-between"> |
||||
|
<el-button type="text" @click="cancelApple">取消</el-button> |
||||
|
<el-button type="text" @click="submitFormApple('fail_appeal')">确定</el-button> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { listOtcAppealOrder, getOtcAppealOrder, delOtcAppealOrder, addOtcAppealOrder, updateOtcAppealOrder, exportOtcAppealOrder, appleOtcAppealOrder } from "@/api/otc/otcAppealOrder"; |
||||
|
|
||||
|
export default { |
||||
|
name: "UserDetail", |
||||
|
components: { |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
detailId: null, |
||||
|
openApple: false, |
||||
|
sysOrderStatus: [], |
||||
|
|
||||
|
// 遮罩层 |
||||
|
loading: false, |
||||
|
// 选中数组 |
||||
|
ids: [], |
||||
|
// 非单个禁用 |
||||
|
single: true, |
||||
|
// 非多个禁用 |
||||
|
multiple: true, |
||||
|
// 显示搜索条件 |
||||
|
showSearch: true, |
||||
|
// 总条数 |
||||
|
total: 0, |
||||
|
// 实名认证信息表格数据 |
||||
|
UserCertificationList: [], |
||||
|
|
||||
|
terminalSourceOptions: [], |
||||
|
appealStatusOptions: [], |
||||
|
// 弹出层标题 |
||||
|
title: "", |
||||
|
// 是否显示弹出层 |
||||
|
open: false, |
||||
|
// 查询参数 |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
witNo: null, |
||||
|
userId: null, |
||||
|
name: null, |
||||
|
certId: null, |
||||
|
phone: null, |
||||
|
certFrontImg: null, |
||||
|
certReverseImg: null, |
||||
|
certHandImg: null, |
||||
|
idaHandImg: null, |
||||
|
corporateLicense: null, |
||||
|
auditStatus: null, |
||||
|
auditTime: null, |
||||
|
auditReason: null, |
||||
|
addTime: null, |
||||
|
authType: null |
||||
|
}, |
||||
|
// 表单参数 |
||||
|
formApple: { |
||||
|
appealDesc: null |
||||
|
}, |
||||
|
// 表单校验 |
||||
|
rulesApple: { |
||||
|
appealDesc: [ |
||||
|
{ required: true, message: "驳回申诉备注不能为空", trigger: "blur" } |
||||
|
], |
||||
|
}, |
||||
|
// 预览 |
||||
|
srcList: ["http://118.25.187.239:9099/img/adImg/557097620301025280.jpg"], |
||||
|
}; |
||||
|
}, |
||||
|
created() { |
||||
|
this.getDicts("terminal_source").then(response => { |
||||
|
this.terminalSourceOptions = response.data; |
||||
|
}); |
||||
|
this.getDicts("appeal_status").then(response => { |
||||
|
this.appealStatusOptions = response.data; |
||||
|
}); |
||||
|
this.getDicts("order_status").then(response => { |
||||
|
this.sysOrderStatus = response.data; |
||||
|
}); |
||||
|
this.detailId = this.$route.params.row.id |
||||
|
this.getList(this.detailId) |
||||
|
}, |
||||
|
methods: { |
||||
|
cancelApple() { |
||||
|
this.openApple = false; |
||||
|
this.open = false; |
||||
|
this.reset(); |
||||
|
}, |
||||
|
handleSuccess() { |
||||
|
this.reset(); |
||||
|
this.open = true; |
||||
|
this.formApple = this.UserCertificationList[0] |
||||
|
}, |
||||
|
handleFail() { |
||||
|
this.reset() |
||||
|
this.formApple = this.UserCertificationList[0] |
||||
|
this.openApple = true |
||||
|
}, |
||||
|
// 表单重置 |
||||
|
reset() { |
||||
|
this.formApple = {}; |
||||
|
this.resetForm("formApple"); |
||||
|
}, |
||||
|
/** 审核提交 */ |
||||
|
submitFormApple(v) { |
||||
|
if (!this.formApple.appealDesc && v == 'fail_appeal') { |
||||
|
this.$message.error('驳回申诉备注不能为空'); |
||||
|
return; |
||||
|
} |
||||
|
if (v == 'success_appeal') { |
||||
|
this.formApple = this.UserCertificationList[0] |
||||
|
} |
||||
|
// this.$refs["form"].validate(valid => { |
||||
|
// if (valid) { |
||||
|
this.formApple.appealStatus = v |
||||
|
appleOtcAppealOrder(this.formApple).then(response => { |
||||
|
this.$modal.msgSuccess("操作成功"); |
||||
|
this.getList(this.detailId); |
||||
|
this.open = false |
||||
|
this.openApple = false |
||||
|
}); |
||||
|
// } |
||||
|
// }); |
||||
|
}, |
||||
|
/** 查询OTC申诉订单列表 */ |
||||
|
getList(v) { |
||||
|
this.loading = true; |
||||
|
getOtcAppealOrder(v).then(response => { |
||||
|
this.UserCertificationList.push(response.data) |
||||
|
this.total = Number(response.total); |
||||
|
this.loading = false; |
||||
|
}); |
||||
|
}, |
||||
|
// 预览图片 |
||||
|
previewImage(abUrl) { |
||||
|
this.srcList[0] = abUrl; |
||||
|
}, |
||||
|
terminalSourceFormat(row, column) { |
||||
|
return this.selectDictLabel(this.terminalSourceOptions, row.terminalSource); |
||||
|
}, |
||||
|
appealStatusFormat(row, column) { |
||||
|
return this.selectDictLabel(this.appealStatusOptions, row.appealStatus); |
||||
|
}, |
||||
|
sysOrderStatusFormat(row, column) { |
||||
|
return this.selectDictLabel(this.sysOrderStatus, row.order.orderStatus); |
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
::v-deep .el-dialog__footer { |
||||
|
border-top: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 0; |
||||
|
height: 60px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button { |
||||
|
width: 50%; |
||||
|
height: 60px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button:nth-child(1) { |
||||
|
border-right: 1px solid rgba(223, 230, 236, 1); |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button:nth-child(1) span { |
||||
|
color: rgba(102, 102, 102, 1); |
||||
|
} |
||||
|
|
||||
|
.sub-tit { |
||||
|
font-size: 13px; |
||||
|
font-weight: 500; |
||||
|
text-align: center; |
||||
|
color: rgba(51, 51, 51, 1); |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-textarea__inner { |
||||
|
background: #F3F6F8 !important; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__body { |
||||
|
padding: 15px 20px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__header { |
||||
|
text-align: center; |
||||
|
font-size: 14px; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.status .bottom { |
||||
|
border-top: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding-top: 16px; |
||||
|
} |
||||
|
|
||||
|
.status .let { |
||||
|
width: 275px; |
||||
|
} |
||||
|
|
||||
|
.status-text {} |
||||
|
|
||||
|
.status-bar { |
||||
|
width: 40px; |
||||
|
height: 160px; |
||||
|
background: rgba(231, 53, 53, 1); |
||||
|
position: absolute; |
||||
|
right: 12px; |
||||
|
top: -32px; |
||||
|
color: rgba(255, 255, 255, 1); |
||||
|
font-size: 16px; |
||||
|
font-weight: 500; |
||||
|
transform: rotate(-40deg); |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
writing-mode: vertical-lr; |
||||
|
justify-content: center; |
||||
|
letter-spacing: 8px; |
||||
|
} |
||||
|
|
||||
|
.circle { |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
background: rgba(9, 186, 122, 1); |
||||
|
margin-right: 10px; |
||||
|
} |
||||
|
|
||||
|
.img-con-border { |
||||
|
border: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 9px; |
||||
|
width: 359px; |
||||
|
height: 203px; |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
|
||||
|
.img-con-border img { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
font-size: 24px; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.status-con { |
||||
|
margin-top: 52px; |
||||
|
} |
||||
|
|
||||
|
.status { |
||||
|
border: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 20px 16px; |
||||
|
border-radius: 8px; |
||||
|
position: relative; |
||||
|
flex-wrap: wrap; |
||||
|
} |
||||
|
|
||||
|
.status .text { |
||||
|
font-size: 16px; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,467 @@ |
|||||
|
<template> |
||||
|
<div class="app-container"> |
||||
|
<div class="bg bg-white"> |
||||
|
<el-table v-loading="loading" :data="UserCertificationList"> |
||||
|
<el-table-column label="姓名" align="center" prop="name" /> |
||||
|
<el-table-column label="证件类型" align="center" prop="typeName" /> |
||||
|
<el-table-column label="身份证号" align="center" prop="certId" /> |
||||
|
<el-table-column label="审核时间" align="center" prop="auditTime" width="180"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="添加时间" align="center" prop="addTime" width="180"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span>{{ parseTime(scope.row.addTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="认证类型" align="center" prop="authType" :formatter="authTypeFormat" /> |
||||
|
</el-table> |
||||
|
|
||||
|
<div class="flex status-con" v-if="UserCertificationList.length" style="align-items: flex-start;flex-wrap:wrap"> |
||||
|
<div class="let item m-r-16 m-b-16" v-if="kycData.authType"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
KYC认证信息 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="status-bar" |
||||
|
:style="{ background: kycData.auditStatus == 'agree' ? '#08B97A' : kycData.auditStatus == 'apply' ? '#F8A562' : '#E73535' }" |
||||
|
v-if="kycData.auditStatus"> |
||||
|
<span class="status-text" v-if="kycData.authType == 'basic'">{{ kycData.auditStatus == 'agree' ? |
||||
|
'已通过' : kycData.auditStatus == 'apply' ? '审核中' : '不通过' }} |
||||
|
</span> |
||||
|
|
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
姓名:{{ kycData.name ? kycData.name : '无' }} |
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
证件号:{{ kycData.certId ? kycData.certId : '无' }} |
||||
|
</div> |
||||
|
<div class="flex m-b-16" style="align-items:flex-start"> |
||||
|
<div class="img-con m-r-16"> |
||||
|
<div class="text m-b-10"> |
||||
|
证件正面 |
||||
|
</div> |
||||
|
<div class="img-con-border" v-if="kycData.certFrontImg"> |
||||
|
<el-image @click="previewImage(kycData.certFrontImg)" :src="kycData.certFrontImg" |
||||
|
:preview-src-list="srcList" class="avatar"> |
||||
|
</el-image> |
||||
|
</div> |
||||
|
<span class="text" v-else>无</span> |
||||
|
</div> |
||||
|
<div class="img-con"> |
||||
|
<div class="text m-b-10"> |
||||
|
证件反面 |
||||
|
</div> |
||||
|
<div class="img-con-border" v-if="kycData.certReverseImg"> |
||||
|
<el-image @click="previewImage(kycData.certReverseImg)" :src="kycData.certReverseImg" |
||||
|
:preview-src-list="srcList" class="avatar"> |
||||
|
</el-image> |
||||
|
|
||||
|
</div> |
||||
|
<span class="text" v-else>无</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="img-con m-r-16 m-b-16"> |
||||
|
<div class="text m-b-10"> |
||||
|
手持身份证 |
||||
|
</div> |
||||
|
<div class="img-con-border" v-if="kycData.certHandImg"> |
||||
|
<el-image @click="previewImage(kycData.certHandImg)" :src="kycData.certHandImg" |
||||
|
:preview-src-list="srcList" class="avatar"> |
||||
|
</el-image> |
||||
|
|
||||
|
</div> |
||||
|
<span class="text" v-else>无</span> |
||||
|
</div> |
||||
|
<div style="color:red"> |
||||
|
审核备注:{{ kycData.auditReason ? kycData.auditReason : '无' }} |
||||
|
</div> |
||||
|
<div class="flex btnCon" v-if="kycData.auditStatus == 'apply'"> |
||||
|
<el-button type="primary" @click="handleSuccess('agree', kycData)">通过</el-button> |
||||
|
<el-button type="danger" @click="handleFail('reject', kycData)">驳回</el-button> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="right item" v-if="storeData.authType"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
商家认证信息 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="status-bar" |
||||
|
:style="{ background: storeData.auditStatus == 'agree' ? '#08B97A' : storeData.auditStatus == 'apply' ? '#F8A562' : '#E73535' }"> |
||||
|
<span class="status-text">{{ storeData.auditStatus == 'agree' ? '已通过' : storeData.auditStatus == |
||||
|
'apply' ? '审核中' : '不通过' }} |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
是否质押:{{ storeData.storePledge ? '是' : '否' }} |
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
质押金额:{{ storeData.storePledgeBalance }}{{ storeData.pledgeCoin }} |
||||
|
</div> |
||||
|
<div class="flex btnCon" v-if="storeData.auditStatus == 'apply'"> |
||||
|
<el-button type="primary" @click="handleSuccess('agree', storeData)">通过</el-button> |
||||
|
<el-button type="danger" @click="handleFail('reject', storeData)">驳回</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="right item" v-if="proData.authType"> |
||||
|
<div class="title m-b-16 flex"> |
||||
|
<div class="circle"></div> |
||||
|
Pro商家认证信息 |
||||
|
</div> |
||||
|
<div class="status"> |
||||
|
<div class="status-bar" |
||||
|
:style="{ background: proData.auditStatus == 'agree' ? '#08B97A' : proData.auditStatus == 'apply' ? '#F8A562' : '#E73535' }"> |
||||
|
<span class="status-text">{{ proData.auditStatus == 'agree' ? '已通过' : proData.auditStatus == |
||||
|
'apply' ? '审核中' : '不通过' }} |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
是否质押:{{ proData.storePledge ? '是' : '否' }} |
||||
|
</div> |
||||
|
<div class="text m-b-10"> |
||||
|
质押金额:{{ proData.storePledgeBalance }} {{ proData.pledgeCoin }} |
||||
|
</div> |
||||
|
<div class="flex m-b-16"> |
||||
|
<div class="img-con m-r-16"> |
||||
|
<div class="text m-b-10"> |
||||
|
公司营业执照 |
||||
|
</div> |
||||
|
<div class="img-con-border" v-if="proData.corporateLicense"> |
||||
|
<el-image @click="previewImage(proData.corporateLicense)" |
||||
|
:src="proData.corporateLicense" :preview-src-list="srcList" class="avatar"> |
||||
|
</el-image> |
||||
|
</div> |
||||
|
<span class="text" v-else>无</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="flex btnCon" v-if="proData.auditStatus == 'apply'"> |
||||
|
<el-button type="primary" @click="handleSuccess('agree', proData)">通过</el-button> |
||||
|
<el-button type="danger" @click="handleFail('reject', proData)">驳回</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<!-- 成功对话框 --> |
||||
|
<el-dialog title="通过" :visible.sync="open" width="400px" append-to-body> |
||||
|
<div class="sub-tit m-b-16"> |
||||
|
是否通过该认证申请? |
||||
|
</div> |
||||
|
<div slot="footer" class="dialog-footer flex-between"> |
||||
|
<el-button type="text" @click="cancelApple">取消</el-button> |
||||
|
<el-button type="text" @click="submitFormApple('agree')">确定</el-button> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<!-- 驳回对话框 --> |
||||
|
<el-dialog title="驳回" :visible.sync="openApple" width="400px" append-to-body> |
||||
|
<el-form ref="form" :model="formApple" :rules="rulesApple" label-width="0px"> |
||||
|
<div class="sub-tit m-b-16"> |
||||
|
是否确认驳回该认证申请? |
||||
|
</div> |
||||
|
<el-form-item label="" prop="auditReason"> |
||||
|
<el-input v-model="formApple.auditReason" type="textarea" placeholder="驳回备注" rows="5" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<div slot="footer" class="dialog-footer flex-between"> |
||||
|
<el-button type="text" @click="cancelApple">取消</el-button> |
||||
|
<el-button type="text" @click="submitFormApple('reject')">确定</el-button> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { listUserCertification, getUserCertification, delUserCertification, addUserCertification, updateUserCertification, exportUserCertification } from "@/api/user/UserCertification"; |
||||
|
|
||||
|
export default { |
||||
|
name: "UserDetail", |
||||
|
components: { |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
openApple: false, |
||||
|
kycData: {}, |
||||
|
storeData: {}, |
||||
|
proData: {}, |
||||
|
|
||||
|
// 遮罩层 |
||||
|
loading: false, |
||||
|
// 选中数组 |
||||
|
ids: [], |
||||
|
// 非单个禁用 |
||||
|
single: true, |
||||
|
// 非多个禁用 |
||||
|
multiple: true, |
||||
|
// 显示搜索条件 |
||||
|
showSearch: true, |
||||
|
// 总条数 |
||||
|
total: 0, |
||||
|
// 实名认证信息表格数据 |
||||
|
UserCertificationList: [], |
||||
|
|
||||
|
auditStatusOptions: [], |
||||
|
authTypeOptions: [], |
||||
|
// 弹出层标题 |
||||
|
title: "", |
||||
|
// 是否显示弹出层 |
||||
|
open: false, |
||||
|
// 查询参数 |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
witNo: null, |
||||
|
userId: null, |
||||
|
|
||||
|
}, |
||||
|
// 表单参数 |
||||
|
formApple: { |
||||
|
auditReason:null, |
||||
|
}, |
||||
|
// 表单校验 |
||||
|
rulesApple: { |
||||
|
authType: [ |
||||
|
{ required: true, message: "认证类型:基础basic 高级advanced不能为空", trigger: "change" } |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
// 预览 |
||||
|
srcList: ["http://118.25.187.239:9099/img/adImg/557097620301025280.jpg"], |
||||
|
}; |
||||
|
}, |
||||
|
created() { |
||||
|
this.getDicts("audit_status").then(response => { |
||||
|
this.auditStatusOptions = response.data; |
||||
|
}); |
||||
|
this.getDicts("auth_type").then(response => { |
||||
|
this.authTypeOptions = response.data; |
||||
|
}); |
||||
|
this.queryParams.userId = this.$route.params.row.userId |
||||
|
this.getList() |
||||
|
}, |
||||
|
methods: { |
||||
|
// 预览图片 |
||||
|
previewImage(abUrl) { |
||||
|
this.srcList[0] = abUrl; |
||||
|
}, |
||||
|
// 取消按钮 |
||||
|
cancelApple() { |
||||
|
this.openApple = false; |
||||
|
this.open = false; |
||||
|
this.resetApple(); |
||||
|
}, |
||||
|
// 表单重置 |
||||
|
resetApple() { |
||||
|
this.formApple = { |
||||
|
|
||||
|
}; |
||||
|
this.resetForm("formApple"); |
||||
|
}, |
||||
|
handleFail(v, d) { |
||||
|
this.resetApple() |
||||
|
this.formApple.auditStatus = v |
||||
|
this.formApple.witNo=d.witNo |
||||
|
this.openApple = true |
||||
|
}, |
||||
|
handleSuccess(v, d) { |
||||
|
this.resetApple(); |
||||
|
this.open = true; |
||||
|
this.formApple.witNo=d.witNo |
||||
|
this.formApple.auditStatus = v |
||||
|
}, |
||||
|
/** 审核提交 */ |
||||
|
submitFormApple(v) { |
||||
|
if (!this.formApple.auditReason && v == 'reject') { |
||||
|
this.$message.error('驳回备注不能为空'); |
||||
|
return; |
||||
|
} |
||||
|
updateUserCertification(this.formApple).then(response => { |
||||
|
this.msgSuccess("操作成功"); |
||||
|
this.open = false; |
||||
|
this.openApple = false; |
||||
|
this.getList(); |
||||
|
}); |
||||
|
}, |
||||
|
/** 查询实名认证信息列表 */ |
||||
|
getList() { |
||||
|
this.loading = true; |
||||
|
listUserCertification(this.queryParams).then(response => { |
||||
|
this.UserCertificationList = response.rows; |
||||
|
this.loading = false; |
||||
|
for (var i = this.UserCertificationList.length - 1; i >= 0; i--) { |
||||
|
if (this.UserCertificationList[i].authType == 'advanced') { |
||||
|
this.storeData = this.UserCertificationList[i] |
||||
|
if (this.UserCertificationList[i].auditStatus == 'apply') { |
||||
|
this.storeData = this.UserCertificationList[i] |
||||
|
} |
||||
|
} |
||||
|
if (this.UserCertificationList[i].authType == 'basic') { |
||||
|
this.kycData = this.UserCertificationList[i] |
||||
|
if (this.UserCertificationList[i].auditStatus == 'apply') { |
||||
|
this.kycData = this.UserCertificationList[i] |
||||
|
} |
||||
|
} |
||||
|
if (this.UserCertificationList[i].authType == 'pro') { |
||||
|
this.proData = this.UserCertificationList[i] |
||||
|
if (this.UserCertificationList[i].auditStatus == 'apply') { |
||||
|
this.proData = this.UserCertificationList[i] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
auditStatusFormat(row, column) { |
||||
|
return this.selectDictLabel(this.auditStatusOptions, row.auditStatus); |
||||
|
}, |
||||
|
authTypeFormat(row, column) { |
||||
|
return this.selectDictLabel(this.authTypeOptions, row.authType); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.status-con .item { |
||||
|
width: 46%; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer { |
||||
|
border-top: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 0; |
||||
|
height: 60px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button { |
||||
|
width: 50%; |
||||
|
height: 60px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button:nth-child(1) { |
||||
|
border-right: 1px solid rgba(223, 230, 236, 1); |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__footer .el-button:nth-child(1) span { |
||||
|
color: rgba(102, 102, 102, 1); |
||||
|
} |
||||
|
|
||||
|
.sub-tit { |
||||
|
font-size: 13px; |
||||
|
font-weight: 500; |
||||
|
text-align: center; |
||||
|
color: rgba(51, 51, 51, 1); |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-textarea__inner { |
||||
|
background: #F3F6F8 !important; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__body { |
||||
|
padding: 15px 20px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-dialog__header { |
||||
|
text-align: center; |
||||
|
font-size: 14px; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.btnCon { |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
|
||||
|
::v-deep .btnCon .el-button { |
||||
|
width: 110px; |
||||
|
height: 40px; |
||||
|
border-radius: 4px; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.status-text {} |
||||
|
|
||||
|
.status-bar { |
||||
|
width: 40px; |
||||
|
height: 160px; |
||||
|
background: rgba(231, 53, 53, 1); |
||||
|
position: absolute; |
||||
|
right: 12px; |
||||
|
top: -32px; |
||||
|
color: rgba(255, 255, 255, 1); |
||||
|
font-size: 16px; |
||||
|
font-weight: 500; |
||||
|
transform: rotate(-40deg); |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
writing-mode: vertical-lr; |
||||
|
justify-content: center; |
||||
|
letter-spacing: 8px; |
||||
|
} |
||||
|
|
||||
|
.circle { |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
background: rgba(9, 186, 122, 1); |
||||
|
margin-right: 10px; |
||||
|
} |
||||
|
|
||||
|
.img-con-border { |
||||
|
border: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 9px; |
||||
|
width: 359px; |
||||
|
height: 203px; |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
|
||||
|
.img-con-border .avatar { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
font-size: 24px; |
||||
|
font-weight: 500; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.status-con { |
||||
|
margin-top: 52px; |
||||
|
} |
||||
|
|
||||
|
.status { |
||||
|
border: 1px solid rgba(223, 230, 236, 1); |
||||
|
padding: 20px 16px; |
||||
|
border-radius: 8px; |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.status .text { |
||||
|
font-size: 16px; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
|
||||
|
|