feat: 贷款模块后端 — 申请+审批+放款

This commit is contained in:
testadmin
2026-04-28 20:53:00 +08:00
parent a323b7da8e
commit c426a5e7f6
4 changed files with 316 additions and 0 deletions
@@ -0,0 +1,113 @@
@extends('admin._layoutNew')
@section('title', '贷款管理')
@section('page-content')
<div class="layui-card">
<div class="layui-card-header">贷款审核管理</div>
<div class="layui-card-body">
<form class="layui-form" style="margin-bottom:10px;">
<div class="layui-inline">
<input id="f_keyword" class="layui-input" placeholder="用户ID/手机号/邮箱">
</div>
<div class="layui-inline">
<button type="button" class="layui-btn layui-btn-sm" onclick="searchList()">搜索</button>
</div>
</form>
<div class="layui-btn-group" style="margin-bottom:15px;">
<button class="layui-btn layui-btn-sm" onclick="loadData()"><i class="layui-icon">&#xe9aa;</i> 刷新</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" onclick="filterStatus('')">全部</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" onclick="filterStatus(0)">待审核</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="filterStatus(1)">已通过</button>
<button class="layui-btn layui-btn-sm layui-btn-danger" onclick="filterStatus(2)">已驳回</button>
</div>
<table id="loanTable" lay-filter="loanTable"></table>
</div>
</div>
<script type="text/html" id="imageTpl">
@{{# if(d.card_image){ }}
<img src="@{{ d.card_image }}" style="height:40px;cursor:pointer;" onclick="layer.photos({photos:{data:[{src:this.src}]}})">
@{{# } }}
</script>
<script type="text/html" id="statusTpl">
@{{# if(d.status == 0){ }}
<span class="layui-badge layui-bg-orange">待审核</span>
@{{# } else if(d.status == 1){ }}
<span class="layui-badge layui-bg-green">已通过</span>
@{{# } else { }}
<span class="layui-badge">已驳回</span>
@{{# } }}
</script>
<script type="text/html" id="actionTpl">
@{{# if(d.status == 0){ }}
<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="approve">通过</button>
<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="reject">驳回</button>
@{{# } }}
</script>
@endsection
@section('scripts')
<script>
var currentStatus = '';
layui.use(['table', 'layer'], function(){
var table = layui.table;
window.loadData = function(){
table.reload('loanTable', {where: {status: currentStatus, keyword: $('#f_keyword').val()}});
};
window.searchList = loadData;
window.filterStatus = function(s){
currentStatus = s;
loadData();
};
table.render({
elem: '#loanTable',
url: '/admin/loan/list',
page: true,
cols: [[
{field:'id', title:'ID', width:80, sort:true},
{field:'user_id', title:'用户ID', width:80},
{field:'user_email', title:'邮箱', width:180},
{field:'account_number', title:'账号', width:120},
{field:'amount', title:'贷款金额(USDT)', width:130},
{field:'institution', title:'机构', width:120},
{field:'card_image', title:'证件正面', width:80, templet:'#imageTpl'},
{field:'cardbm_image', title:'证件背面', width:80, templet:function(d){
return d.cardbm_image ? '<img src="'+d.cardbm_image+'" style="height:40px;cursor:pointer;" onclick="layer.photos({photos:{data:[{src:this.src}]}})">':'';
}},
{field:'hand_image', title:'手持照片', width:80, templet:function(d){
return d.hand_image ? '<img src="'+d.hand_image+'" style="height:40px;cursor:pointer;" onclick="layer.photos({photos:{data:[{src:this.src}]}})">':'';
}},
{field:'status', title:'状态', width:90, templet:'#statusTpl'},
{field:'remark', title:'备注', width:150},
{field:'create_time', title:'申请时间', width:170},
{fixed:'right', title:'操作', width:150, toolbar:'#actionTpl'}
]]
});
table.on('tool(loanTable)', function(obj){
var data = obj.data;
if(obj.event === 'approve'){
layer.confirm('确定通过该笔贷款 '+data.amount+' USDT', function(index){
$.post('/admin/loan/approve', {id: data.id, _token: '{{csrf_token()}}'}, function(res){
layer.close(index);
if(res.type=='ok') { layer.msg('审核通过'); loadData(); }
else layer.msg(res.message, {icon:2});
});
});
}
if(obj.event === 'reject'){
layer.prompt({title:'驳回原因(可选)', formType:2}, function(remark, index){
$.post('/admin/loan/reject', {id: data.id, remark: remark, _token: '{{csrf_token()}}'}, function(res){
layer.close(index);
if(res.type=='ok') { layer.msg('已驳回'); loadData(); }
else layer.msg(res.message, {icon:2});
});
});
}
});
});
</script>
@endsection