增加维护收款图片功能

main
岩仔88 2 days ago
parent bbd4f5ded6
commit 38f1a80365

@ -24,4 +24,47 @@ class MemberController
->get(); ->get();
return \Yz::Return(true,'获取成功',['list'=>$list,'count'=>$count]); return \Yz::Return(true,'获取成功',['list'=>$list,'count'=>$count]);
} }
public function GetDetail()
{
$id = request('memberId');
if(empty($id)){
return \Yz::Return(false, '请输入会员ID');
}
$detail = DB::table('members')
->select('members.*')
->where(['members.id'=>$id,'members.is_del'=>0])
->first();
if(empty($detail)){
return \Yz::Return(false, '会员不存在');
}
return \Yz::Return(true,'获取成功',$detail);
}
public function Update()
{
$info = request('info');
if(empty($info['id'])){
return \Yz::Return(false, '请输入会员ID');
}
$detail = DB::table('members')
->select('members.*')
->where(['members.id'=>$info['id'],'members.is_del'=>0])
->first();
if(empty($detail)){
return \Yz::Return(false, '会员不存在');
}
if(empty($info)){
return \Yz::Return(false, '请输入会员信息');
}
$u_data=[
'res_bank_img'=>$info['res_bank_img']
];
$u=DB::table('members')
->where(['id'=>$info['id']])
->update($u_data);
if(empty($u)){
return \Yz::Return(false, '更新失败');
}
return \Yz::Return(true,'更新成功');
}
} }

@ -58,6 +58,8 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () {
Route::post('admin/TransactionRecharge','App\Http\Controllers\API\Admin\YeWu\TransactionController@Recharge'); //admin充值 Route::post('admin/TransactionRecharge','App\Http\Controllers\API\Admin\YeWu\TransactionController@Recharge'); //admin充值
Route::post('admin/TransactionDelete','App\Http\Controllers\API\Admin\YeWu\TransactionController@Delete'); //删除交易记录 Route::post('admin/TransactionDelete','App\Http\Controllers\API\Admin\YeWu\TransactionController@Delete'); //删除交易记录
Route::post('admin/MemberGetList','App\Http\Controllers\API\Admin\YeWu\MemberController@GetList'); //会员列表 Route::post('admin/MemberGetList','App\Http\Controllers\API\Admin\YeWu\MemberController@GetList'); //会员列表
Route::post('admin/MemberGetDetail','App\Http\Controllers\API\Admin\YeWu\MemberController@GetDetail'); //会员详情
Route::post('admin/MemberUpdate','App\Http\Controllers\API\Admin\YeWu\MemberController@Update'); //会员详情
Route::post('admin/LoanGetList','App\Http\Controllers\API\Admin\YeWu\LoanController@GetList'); //借款列表 Route::post('admin/LoanGetList','App\Http\Controllers\API\Admin\YeWu\LoanController@GetList'); //借款列表
Route::post('admin/LoanVerify','App\Http\Controllers\API\Admin\YeWu\LoanController@Verify'); //借款列表 Route::post('admin/LoanVerify','App\Http\Controllers\API\Admin\YeWu\LoanController@Verify'); //借款列表
Route::post('admin/GetCutDay','App\Http\Controllers\API\Admin\YeWu\DayCutController@GetCutDay'); //获取日切日期 Route::post('admin/GetCutDay','App\Http\Controllers\API\Admin\YeWu\DayCutController@GetCutDay'); //获取日切日期

@ -159,3 +159,9 @@ export const TransactionDelete = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/TransactionDelete',data:data}) return axios({url:import.meta.env.VITE_APP_API+'v1/admin/TransactionDelete',data:data})
} }
export const MemberGetDetail = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/MemberGetDetail',data:data})
}
export const UpdateMemberInfo = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/MemberUpdate',data:data})
}

@ -6,7 +6,7 @@
<el-input v-model="SearchInfo.info" style="width: 240px; margin-right: 8px;" placeholder="输入手机号" /> <el-input v-model="SearchInfo.info" style="width: 240px; margin-right: 8px;" placeholder="输入手机号" />
<el-button type="primary" @click="GetList()"></el-button> <el-button type="primary" @click="GetList()"></el-button>
</el-row> </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="id" label="Id" /> -->
<el-table-column prop="tel" label="用户名(手机号)" /> <el-table-column prop="tel" label="用户名(手机号)" />
<el-table-column prop="name" label="姓名" /> <el-table-column prop="name" label="姓名" />
@ -24,10 +24,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="created_at" label="注册时间" /> <el-table-column prop="created_at" label="注册时间" />
<el-table-column label="操作"> <el-table-column label="操作" width="180px">
<template #default="scope"> <template #default="scope">
<div style="display: flex;" v-if="scope.row.status==1"> <div style="display: flex;" v-if="scope.row.status==1">
<el-button type="primary" @click="RechargeFunc(scope.row)"></el-button> <el-button type="primary" @click="RechargeFunc(scope.row)"></el-button>
<el-button type="" @click="DetailFunc(scope.row)"></el-button>
</div> </div>
</template> </template>
@ -54,7 +55,7 @@
<div>验证码</div> <div>验证码</div>
<div style="display: flex;align-items: center;"> <div style="display: flex;align-items: center;">
<el-input v-model="code" placeholder="输入验证码" /> <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 /> <el-button icon="Refresh" @click="getVerifyCode()" circle />
</div> </div>
@ -71,6 +72,89 @@
</div> </div>
</el-dialog> </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> </div>
</template> </template>
@ -84,18 +168,26 @@
ElMessage ElMessage
} from 'element-plus' } from 'element-plus'
import { import {
MemberGetList,ImageVerificationGetCode,ImageVerificationCheckCode,TransactionRecharge MemberGetList,ImageVerificationGetCode,ImageVerificationCheckCode,TransactionRecharge,MemberGetDetail,UpFileUrl,UpdateMemberInfo
} from '@/api/api.js' } from '@/api/api.js'
import { import {
Edit Edit
} from '@element-plus/icons-vue' } from '@element-plus/icons-vue'
let loading = ref(false) 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 tableData = ref([])
let currentPage = ref(1) // let currentPage = ref(1) //
let pageSize = ref(15) // let pageSize = ref(15) //
let total = 0 // let total = 0 //
let dialogVisible = ref(false) let dialogVisible = ref(false)
let detailDialogVisible = ref(false) //
let detailLoading = ref(false) //
let detailInfo = ref({}) //
let SelectedInfo = ref(0) //row let SelectedInfo = ref(0) //row
let Note = ref('') let Note = ref('')
let RechargeAmount = ref('') let RechargeAmount = ref('')
@ -142,7 +234,7 @@
const previewSrcList = ref(['']) const previewSrcList = ref([''])
const imageRef = ref() const imageRef = ref()
const ShowImage = async (img_url) => { const ShowImage = async (img_url) => {
previewSrcList.value[0] = import.meta.env.VITE_APP_FILE + img_url previewSrcList.value[0] = fileUrlPrefix.value + img_url
nextTick(() => { nextTick(() => {
const imgElement = imageRef.value?.$el.querySelector('img') const imgElement = imageRef.value?.$el.querySelector('img')
if (imgElement) { if (imgElement) {
@ -160,6 +252,69 @@
dialogVisible.value = true 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 = () => { const RechargeSubmit = () => {
if(RechargeAmount.value<1){ if(RechargeAmount.value<1){
ElMessage.error('金额不能小于1元') ElMessage.error('金额不能小于1元')
@ -229,4 +384,58 @@
color: #00aaff; color: #00aaff;
font-weight: 900; 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> </style>
Loading…
Cancel
Save