|
|
|
|
@ -6,7 +6,7 @@
|
|
|
|
|
<el-input v-model="SearchInfo.info" style="width: 240px; margin-right: 8px;" placeholder="输入手机号" />
|
|
|
|
|
<el-button type="primary" @click="GetList()">查询</el-button>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-table :data="tableData" style="width: 100%;" row-key="id">
|
|
|
|
|
<el-table :data="tableData" style="width: 100%; overflow: scroll;" row-key="id">
|
|
|
|
|
<!-- <el-table-column prop="id" label="Id" /> -->
|
|
|
|
|
<el-table-column prop="tel" label="用户名(手机号)" />
|
|
|
|
|
<el-table-column prop="name" label="姓名" />
|
|
|
|
|
@ -24,10 +24,11 @@
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="created_at" label="注册时间" />
|
|
|
|
|
<el-table-column label="操作">
|
|
|
|
|
<el-table-column label="操作" width="180px">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<div style="display: flex;" v-if="scope.row.status==1">
|
|
|
|
|
<el-button type="primary" @click="RechargeFunc(scope.row)">充值</el-button>
|
|
|
|
|
<el-button type="" @click="DetailFunc(scope.row)">详情</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
@ -54,7 +55,7 @@
|
|
|
|
|
<div>验证码</div>
|
|
|
|
|
<div style="display: flex;align-items: center;">
|
|
|
|
|
<el-input v-model="code" placeholder="输入验证码" />
|
|
|
|
|
<el-image style="width:160px ;height: 35px;" :src="yanzhengma_image" fit="fit" />
|
|
|
|
|
<el-image style="width:160px ;height: 35px;" :src="yanzhengma_image" fit="cover" />
|
|
|
|
|
|
|
|
|
|
<el-button icon="Refresh" @click="getVerifyCode()" circle />
|
|
|
|
|
</div>
|
|
|
|
|
@ -71,6 +72,89 @@
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
<!-- 详情弹窗 -->
|
|
|
|
|
<el-dialog v-model="detailDialogVisible" title="用户详情" width="50%">
|
|
|
|
|
<div v-loading="detailLoading">
|
|
|
|
|
<div class="detail-content">
|
|
|
|
|
<el-form :model="detailInfo" label-position="top" label-width="120px" size="large" style="background-color: #fafafa; padding: 20px; border-radius: 8px;">
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="用户名(手机号)" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.tel || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="姓名" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.name || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="身份证" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.sfz || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="银行名称" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.bank_name || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="卡号" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.card_number || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
|
|
|
|
|
<el-form-item label="当前余额" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.balance || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="历史收益" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.total_interest || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="未偿还借款" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.outstanding_loan_amount || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="累计提现" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.withdraw_amount || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="注册时间" class="detail-form-item">
|
|
|
|
|
<span style="font-size: 14px;">{{ detailInfo.created_at || '--' }}</span>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
|
|
|
|
|
<el-form-item label="收款图片" class="detail-form-item">
|
|
|
|
|
<div class="bank-image-container">
|
|
|
|
|
<div class="image-preview">
|
|
|
|
|
<el-image
|
|
|
|
|
v-if="detailInfo.res_bank_img"
|
|
|
|
|
:src="fileUrlPrefix + detailInfo.res_bank_img"
|
|
|
|
|
fit="cover"
|
|
|
|
|
style="width: 100%; height: 200px; border-radius: 6px;"
|
|
|
|
|
/>
|
|
|
|
|
<div v-else style="width: 100%; height: 200px; background-color: #f0f0f0; display: flex; align-items: center; justify-content: center; border-radius: 6px; color: #999;">
|
|
|
|
|
暂无图片
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="upload-btn-container">
|
|
|
|
|
<el-upload
|
|
|
|
|
class="upload-demo"
|
|
|
|
|
:action="upfileurl"
|
|
|
|
|
:headers="headerObj"
|
|
|
|
|
:show-file-list="false"
|
|
|
|
|
:on-success="onUploadSuccess"
|
|
|
|
|
accept="image/*"
|
|
|
|
|
>
|
|
|
|
|
<el-button type="primary" size="large" style="border-radius: 4px;">更新收款图片</el-button>
|
|
|
|
|
</el-upload>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="display: flex; margin-top: 20px; justify-content: end;">
|
|
|
|
|
<el-button type="primary" @click="SaveDetail">保存</el-button>
|
|
|
|
|
<el-button type="info" @click="detailDialogVisible = false">关闭</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
@ -84,18 +168,26 @@
|
|
|
|
|
ElMessage
|
|
|
|
|
} from 'element-plus'
|
|
|
|
|
import {
|
|
|
|
|
MemberGetList,ImageVerificationGetCode,ImageVerificationCheckCode,TransactionRecharge
|
|
|
|
|
MemberGetList,ImageVerificationGetCode,ImageVerificationCheckCode,TransactionRecharge,MemberGetDetail,UpFileUrl,UpdateMemberInfo
|
|
|
|
|
} from '@/api/api.js'
|
|
|
|
|
import {
|
|
|
|
|
Edit
|
|
|
|
|
} from '@element-plus/icons-vue'
|
|
|
|
|
let loading = ref(false)
|
|
|
|
|
let fileUrlPrefix = ref(import.meta.env.VITE_APP_FILE) //文件URL前缀
|
|
|
|
|
let upfileurl = UpFileUrl() //上传文件URL
|
|
|
|
|
let headerObj = { //上传文件头信息
|
|
|
|
|
Authorization: 'Bearer ' + sessionStorage.getItem("token")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let tableData = ref([])
|
|
|
|
|
let currentPage = ref(1) //当前页码
|
|
|
|
|
let pageSize = ref(15) //每页数量
|
|
|
|
|
let total = 0 //总数量
|
|
|
|
|
let dialogVisible = ref(false)
|
|
|
|
|
let detailDialogVisible = ref(false) //详情弹窗可见性
|
|
|
|
|
let detailLoading = ref(false) //详情弹窗加载状态
|
|
|
|
|
let detailInfo = ref({}) //详情信息
|
|
|
|
|
let SelectedInfo = ref(0) //选中的row
|
|
|
|
|
let Note = ref('')
|
|
|
|
|
let RechargeAmount = ref('')
|
|
|
|
|
@ -142,7 +234,7 @@
|
|
|
|
|
const previewSrcList = ref([''])
|
|
|
|
|
const imageRef = ref()
|
|
|
|
|
const ShowImage = async (img_url) => {
|
|
|
|
|
previewSrcList.value[0] = import.meta.env.VITE_APP_FILE + img_url
|
|
|
|
|
previewSrcList.value[0] = fileUrlPrefix.value + img_url
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
const imgElement = imageRef.value?.$el.querySelector('img')
|
|
|
|
|
if (imgElement) {
|
|
|
|
|
@ -160,6 +252,69 @@
|
|
|
|
|
dialogVisible.value = true
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const DetailFunc = async(row) => {
|
|
|
|
|
SelectedInfo.value = row
|
|
|
|
|
await getMemberDetail(row.id)
|
|
|
|
|
detailDialogVisible.value = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getMemberDetail = async(memberId) => {
|
|
|
|
|
detailLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
const res = await MemberGetDetail({ memberId })
|
|
|
|
|
if (res.status) {
|
|
|
|
|
detailInfo.value = res.data
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(res.msg)
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
ElMessage.error('获取用户详情失败')
|
|
|
|
|
} finally {
|
|
|
|
|
detailLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//上传成功钩子
|
|
|
|
|
const onUploadSuccess = (res) => {
|
|
|
|
|
if (res.status) {
|
|
|
|
|
// 更新详情信息中的收款图片
|
|
|
|
|
const imagePath = res.data
|
|
|
|
|
detailInfo.value.res_bank_img = imagePath
|
|
|
|
|
console.log(res)
|
|
|
|
|
ElMessage.success('图片上传成功')
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(res.msg || '图片上传失败')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//保存详情信息
|
|
|
|
|
const SaveDetail = async () => {
|
|
|
|
|
if (!detailInfo.value.id) {
|
|
|
|
|
ElMessage.error('用户信息错误')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
detailLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
// 调用更新用户信息接口,按照要求的参数格式
|
|
|
|
|
const updateRes = await UpdateMemberInfo({info:detailInfo.value})
|
|
|
|
|
|
|
|
|
|
if (updateRes.status) {
|
|
|
|
|
ElMessage.success('保存成功')
|
|
|
|
|
detailDialogVisible.value = false
|
|
|
|
|
// 重新获取列表数据,刷新页面
|
|
|
|
|
GetList()
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(updateRes.msg || '保存失败')
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
ElMessage.error('保存失败')
|
|
|
|
|
} finally {
|
|
|
|
|
detailLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const RechargeSubmit = () => {
|
|
|
|
|
if(RechargeAmount.value<1){
|
|
|
|
|
ElMessage.error('金额不能小于1元')
|
|
|
|
|
@ -229,4 +384,58 @@
|
|
|
|
|
color: #00aaff;
|
|
|
|
|
font-weight: 900;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 详情弹窗样式 */
|
|
|
|
|
.detail-content {
|
|
|
|
|
max-height: 600px;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.detail-form-item {
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.bank-image-container {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
gap: 15px;
|
|
|
|
|
padding: 15px;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
border: 1px solid #ebeef5;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.image-preview {
|
|
|
|
|
width: 100%;
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.upload-btn-container {
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
padding: 10px 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 表单样式优化 */
|
|
|
|
|
:deep(.el-form-item__label) {
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
color: #303133;
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:deep(.el-input__wrapper) {
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
box-shadow: none;
|
|
|
|
|
transition: all 0.3s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:deep(.el-input__wrapper:hover) {
|
|
|
|
|
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:deep(.el-input.is-disabled .el-input__wrapper) {
|
|
|
|
|
background-color: #f5f7fa;
|
|
|
|
|
border-color: #e4e7ed;
|
|
|
|
|
}
|
|
|
|
|
</style>
|