mirror of
https://gitee.com/technical-laohu/mpay.git
synced 2025-09-21 19:26:39 +08:00
Compare commits
4 Commits
a8bb0d7513
...
e4952f6389
Author | SHA1 | Date | |
---|---|---|---|
|
e4952f6389 | ||
|
ba8df721d7 | ||
|
a3d15ee7e2 | ||
|
2cd473019b |
1
.env
1
.env
@ -6,7 +6,6 @@ DB_NAME = mpay
|
|||||||
DB_USER = mpay
|
DB_USER = mpay
|
||||||
DB_PASS = 123456
|
DB_PASS = 123456
|
||||||
DB_PORT = 3306
|
DB_PORT = 3306
|
||||||
DB_CHARSET = utf8mb4
|
|
||||||
DB_PREFIX = mpay_
|
DB_PREFIX = mpay_
|
||||||
|
|
||||||
DEFAULT_LANG = zh-cn
|
DEFAULT_LANG = zh-cn
|
@ -132,7 +132,6 @@ class InstallController
|
|||||||
'user' => 'require',
|
'user' => 'require',
|
||||||
'pass' => 'require',
|
'pass' => 'require',
|
||||||
'port' => 'require|integer',
|
'port' => 'require|integer',
|
||||||
'charset' => 'require'
|
|
||||||
];
|
];
|
||||||
if (!$validate->rule($rule)->check($dbConfig)) {
|
if (!$validate->rule($rule)->check($dbConfig)) {
|
||||||
throw new ValidateException($validate->getError());
|
throw new ValidateException($validate->getError());
|
||||||
@ -187,7 +186,6 @@ DB_NAME = {$dbConfig['name']}
|
|||||||
DB_USER = {$dbConfig['user']}
|
DB_USER = {$dbConfig['user']}
|
||||||
DB_PASS = {$dbConfig['pass']}
|
DB_PASS = {$dbConfig['pass']}
|
||||||
DB_PORT = {$dbConfig['port']}
|
DB_PORT = {$dbConfig['port']}
|
||||||
DB_CHARSET = {$dbConfig['charset']}
|
|
||||||
DB_PREFIX = mpay_
|
DB_PREFIX = mpay_
|
||||||
|
|
||||||
DEFAULT_LANG = zh-cn
|
DEFAULT_LANG = zh-cn
|
||||||
@ -240,6 +238,7 @@ EOT;
|
|||||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
`close_time` datetime DEFAULT NULL,
|
`close_time` datetime DEFAULT NULL,
|
||||||
`pay_time` datetime DEFAULT NULL,
|
`pay_time` datetime DEFAULT NULL,
|
||||||
|
`platform` varchar(15) NOT NULL DEFAULT '',
|
||||||
`platform_order` varchar(255) NOT NULL DEFAULT '',
|
`platform_order` varchar(255) NOT NULL DEFAULT '',
|
||||||
`aid` int(11) NOT NULL DEFAULT 0,
|
`aid` int(11) NOT NULL DEFAULT 0,
|
||||||
`cid` int(11) NOT NULL DEFAULT 0,
|
`cid` int(11) NOT NULL DEFAULT 0,
|
||||||
|
@ -70,41 +70,32 @@ class Order extends BaseModel
|
|||||||
public static function serchOrders($query)
|
public static function serchOrders($query)
|
||||||
{
|
{
|
||||||
$select = [];
|
$select = [];
|
||||||
$_select = [];
|
$allow_field = ['id', 'order_id', 'pid', 'type', 'out_trade_no', 'name', 'really_price', 'money', 'state', 'create_time_start', 'create_time_end', 'close_time', 'pay_time', 'platform', 'platform_order', 'aid', 'cid',];
|
||||||
$allow_field = ['id', 'order_id', 'pid', 'type', 'out_trade_no', 'notify_url', 'return_url', 'name', 'really_price', 'money', 'clientip', 'device', 'state', 'create_time_start', 'create_time_end', 'close_time', 'pay_time', 'platform', 'platform_order', 'aid', 'cid',];
|
|
||||||
foreach ($query as $key => $value) {
|
foreach ($query as $key => $value) {
|
||||||
if (in_array($key, $allow_field) && isset($value)) {
|
if (in_array($key, $allow_field) && isset($value)) {
|
||||||
if ($key === 'name') {
|
if ($key === 'name') {
|
||||||
$select[] = ['Order.' . $key, 'like', '%' . $value . '%'];
|
$select[] = [$key, 'like', '%' . $value . '%'];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($key === 'create_time_start') {
|
if ($key === 'create_time_start') {
|
||||||
$select[] = ['Order.' . 'create_time', '>', $value];
|
$select[] = ['create_time', '>', $value];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($key === 'create_time_end') {
|
if ($key === 'create_time_end') {
|
||||||
$select[] = ['Order.' . 'create_time', '<', $value];
|
$select[] = ['create_time', '<', $value];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($key === 'platform') {
|
$select[] = [$key, '=', $value];
|
||||||
$_select['platform'] = $value;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$select[] = ['Order.' . $key, '=', $value];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self::with('payAccount')
|
return self::where($select);
|
||||||
->hasWhere('payAccount', function ($query) use ($_select) {
|
|
||||||
$query->where($_select);
|
|
||||||
})
|
|
||||||
->where($select);
|
|
||||||
}
|
}
|
||||||
// 查询订单详细
|
// 查询订单详细
|
||||||
public static function showOrderDetail($id)
|
public static function showOrderDetail($id)
|
||||||
{
|
{
|
||||||
$order = self::find($id);
|
$order = self::find($id);
|
||||||
$a_list = PayAccount::find($order->aid);
|
$a_list = PayAccount::withTrashed()->find($order->aid);
|
||||||
$c_list = PayChannel::find($order->cid);
|
$c_list = PayChannel::withTrashed()->find($order->cid);
|
||||||
if (!$order) {
|
if (!$order) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 47 KiB |
@ -54,17 +54,10 @@
|
|||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">端口</label>
|
<label class="layui-form-label">端口</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="port" required lay-verify="required" placeholder="请输入数据库名称"
|
<input type="text" name="port" required lay-verify="required" placeholder="请输入端口号"
|
||||||
autocomplete="off" class="layui-input" value="3306">
|
autocomplete="off" class="layui-input" value="3306">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">编码</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
<input type="text" name="charset" required lay-verify="required" placeholder="请输入数据库名称"
|
|
||||||
autocomplete="off" class="layui-input" value="utf8mb4">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">数据库</label>
|
<label class="layui-form-label">数据库</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
@ -76,7 +69,7 @@
|
|||||||
<label class="layui-form-label">用户名</label>
|
<label class="layui-form-label">用户名</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="user" required lay-verify="required" placeholder="请输入数据库用户名"
|
<input type="text" name="user" required lay-verify="required" placeholder="请输入数据库用户名"
|
||||||
autocomplete="off" class="layui-input" value="root">
|
autocomplete="off" class="layui-input" value="">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
@ -90,21 +83,21 @@
|
|||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">管理员昵称</label>
|
<label class="layui-form-label">管理员昵称</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="nickname" required lay-verify="required" placeholder="请输入管理员昵称"
|
<input type="text" name="nickname" required lay-verify="required" placeholder="设置管理员昵称"
|
||||||
autocomplete="off" class="layui-input" value="勇敢牛牛">
|
autocomplete="off" class="layui-input" value="Mpay">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">管理员账号</label>
|
<label class="layui-form-label">管理员账号</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="username" required lay-verify="required" placeholder="请输入管理员用户名"
|
<input type="text" name="username" required lay-verify="required" placeholder="设置管理员用户名"
|
||||||
autocomplete="off" class="layui-input" value="admin">
|
autocomplete="off" class="layui-input" value="admin">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">管理员密码</label>
|
<label class="layui-form-label">管理员密码</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="password" name="password" required lay-verify="required" placeholder="请输入管理员密码"
|
<input type="password" name="password" required lay-verify="required" placeholder="设置登陆密码"
|
||||||
autocomplete="off" class="layui-input">
|
autocomplete="off" class="layui-input">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -39,9 +39,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-inline">
|
<div class="layui-inline">
|
||||||
<label class="layui-form-label">用户ID</label>
|
<label class="layui-form-label">平台流水号</label>
|
||||||
<div class="layui-input-inline">
|
<div class="layui-input-inline">
|
||||||
<input type="text" name="pid" autocomplete="off" class="layui-input" placeholder="请输入">
|
<input type="text" name="platform_order" autocomplete="off" class="layui-input"
|
||||||
|
placeholder="请输入">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-inline">
|
<div class="layui-inline">
|
||||||
@ -126,6 +127,15 @@
|
|||||||
<i class="icon pear-icon pear-icon-history"></i>
|
<i class="icon pear-icon pear-icon-history"></i>
|
||||||
清空过期
|
清空过期
|
||||||
</button>
|
</button>
|
||||||
|
</script>
|
||||||
|
<script type="text/html" id="platformTpl">
|
||||||
|
<div>
|
||||||
|
{{#
|
||||||
|
let platforms = JSON.parse(sessionStorage.getItem('platforms')) || {};
|
||||||
|
let platformName = platforms[d.platform] || '已卸载';
|
||||||
|
return `${platformName} [${d.aid}:${d.cid}]`;
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</script>
|
</script>
|
||||||
<script src="/component/layui/layui.js"></script>
|
<script src="/component/layui/layui.js"></script>
|
||||||
<script src="/component/pear/pear.js"></script>
|
<script src="/component/pear/pear.js"></script>
|
||||||
@ -203,13 +213,16 @@
|
|||||||
(async () => {
|
(async () => {
|
||||||
const data = await fetch('/api/Plugin/pluginOption').then(res => res.json());
|
const data = await fetch('/api/Plugin/pluginOption').then(res => res.json());
|
||||||
let option_str = `<option value="">收款平台</option>`;
|
let option_str = `<option value="">收款平台</option>`;
|
||||||
|
let platforms = {};
|
||||||
data.forEach(val => {
|
data.forEach(val => {
|
||||||
option_str += `<option value="${val.platform}">${val.name}</option>`;
|
option_str += `<option value="${val.platform}">${val.name}</option>`;
|
||||||
|
platforms[val.platform] = val.name;
|
||||||
});
|
});
|
||||||
const select = document.querySelector('select[name="platform"]');
|
const select = document.querySelector('select[name="platform"]');
|
||||||
select.innerHTML = option_str;
|
select.innerHTML = option_str;
|
||||||
form.render('select');
|
form.render('select');
|
||||||
})()
|
// 会话存储
|
||||||
|
sessionStorage.setItem('platforms', JSON.stringify(platforms));
|
||||||
// 表格列参数
|
// 表格列参数
|
||||||
let cols = [[
|
let cols = [[
|
||||||
{ type: 'checkbox' },
|
{ type: 'checkbox' },
|
||||||
@ -222,7 +235,7 @@
|
|||||||
{ title: '支付状态', field: 'state', align: 'center', minWidth: 85, templet: '<div>{{# if(d.state==1){return`<span class="layui-badge layui-bg-green">成功</span>`}else{if(new Date(d.close_time)>new Date("<?php echo $servertime ?>")){return`<span class="layui-badge layui-bg-orange">等待</span>`}else{return`<span class="layui-badge layui-bg-gray">过期</span>`} } }}</div>' },
|
{ title: '支付状态', field: 'state', align: 'center', minWidth: 85, templet: '<div>{{# if(d.state==1){return`<span class="layui-badge layui-bg-green">成功</span>`}else{if(new Date(d.close_time)>new Date("<?php echo $servertime ?>")){return`<span class="layui-badge layui-bg-orange">等待</span>`}else{return`<span class="layui-badge layui-bg-gray">过期</span>`} } }}</div>' },
|
||||||
{ title: '支付时间', field: 'pay_time', align: 'center', minWidth: 160, templet: '<div>{{= d.pay_time == d.create_time ? "- -" : d.pay_time}}</div>' },
|
{ title: '支付时间', field: 'pay_time', align: 'center', minWidth: 160, templet: '<div>{{= d.pay_time == d.create_time ? "- -" : d.pay_time}}</div>' },
|
||||||
{ title: '支付平台', field: 'type', align: 'center', width: 120, templet: '<div>{{# if(d.type=="wxpay"){return`<div class="paytype"><img src="/static/img/wxpay.ico"width="15"><span>微信支付</span></div>`}if(d.type=="alipay"){return`<div class="paytype"><img src="/static/img/alipay.ico"width="15"><span>支付宝</span></div>`}if(d.type=="unionpay"){return`<div class="paytype"><img src="/static/img/unionpay.ico"width="15"><span>云闪付</span></div>`} }}</div>' },
|
{ title: '支付平台', field: 'type', align: 'center', width: 120, templet: '<div>{{# if(d.type=="wxpay"){return`<div class="paytype"><img src="/static/img/wxpay.ico"width="15"><span>微信支付</span></div>`}if(d.type=="alipay"){return`<div class="paytype"><img src="/static/img/alipay.ico"width="15"><span>支付宝</span></div>`}if(d.type=="unionpay"){return`<div class="paytype"><img src="/static/img/unionpay.ico"width="15"><span>云闪付</span></div>`} }}</div>' },
|
||||||
{ title: '收款平台[账号:终端]', field: 'platform', align: 'center', minWidth: 160, templet: '<div>{{# return`${d.payAccount.platform} [${d.aid}:${d.cid}]` }}</div>' },
|
{ title: '收款平台[账号:终端]', field: 'platform', align: 'center', minWidth: 160, templet: '#platformTpl' },
|
||||||
{ title: '操作', align: 'center', width: 120, fixed: 'right', templet: '<div><strong><a href="javascript:;" data-id="{{= d.id }}" class="layui-font-green {{= d.state==1 ? "orderSet-paid" : "orderSet-paying" }}">设置</a></strong></div>' }
|
{ title: '操作', align: 'center', width: 120, fixed: 'right', templet: '<div><strong><a href="javascript:;" data-id="{{= d.id }}" class="layui-font-green {{= d.state==1 ? "orderSet-paid" : "orderSet-paying" }}">设置</a></strong></div>' }
|
||||||
]]
|
]]
|
||||||
// 表格渲染
|
// 表格渲染
|
||||||
@ -256,7 +269,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
})()
|
||||||
// 事件处理
|
// 事件处理
|
||||||
|
|
||||||
// 表格单元格事件
|
// 表格单元格事件
|
||||||
|
@ -168,13 +168,7 @@
|
|||||||
table.on('toolDouble(account-table)', function (obj) {
|
table.on('toolDouble(account-table)', function (obj) {
|
||||||
if (obj.event === 'copy') {
|
if (obj.event === 'copy') {
|
||||||
const text = obj.tr[0].querySelector('td[data-field="checkUrl"]>div').innerText;
|
const text = obj.tr[0].querySelector('td[data-field="checkUrl"]>div').innerText;
|
||||||
if (navigator.clipboard) {
|
copyText(text);
|
||||||
navigator.clipboard.writeText(text).then(() => {
|
|
||||||
layer.msg('复制成功');
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
layer.msg('复制失败,请手动复制');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// 表格头部按钮事件
|
// 表格头部按钮事件
|
||||||
@ -331,6 +325,34 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
// 复制文本到剪贴板
|
||||||
|
function copyText(text) {
|
||||||
|
if (navigator.clipboard && window.isSecureContext === false) {
|
||||||
|
navigator.clipboard.writeText(text).then(() => {
|
||||||
|
layer.msg('复制成功');
|
||||||
|
}).catch(err => {
|
||||||
|
copyToClipboardFallback(text);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
copyToClipboardFallback(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 传统复制文本到剪贴板
|
||||||
|
function copyToClipboardFallback(text) {
|
||||||
|
const textarea = document.createElement('textarea');
|
||||||
|
textarea.value = text;
|
||||||
|
textarea.style.position = 'fixed';
|
||||||
|
document.body.appendChild(textarea);
|
||||||
|
textarea.select();
|
||||||
|
try {
|
||||||
|
document.execCommand('copy');
|
||||||
|
layer.msg('复制成功');
|
||||||
|
} catch (err) {
|
||||||
|
layer.msg('复制失败,请手动复制');
|
||||||
|
} finally {
|
||||||
|
document.body.removeChild(textarea);
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
@ -256,13 +256,7 @@
|
|||||||
util.on({
|
util.on({
|
||||||
'copyinfo': (ele) => {
|
'copyinfo': (ele) => {
|
||||||
const info = ele.attr('data-info');
|
const info = ele.attr('data-info');
|
||||||
if (navigator.clipboard) {
|
copyText(info);
|
||||||
navigator.clipboard.writeText(info).then(() => {
|
|
||||||
layer.msg('复制成功');
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
layer.msg('复制失败,请手动复制');
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
'resetKey': (ele) => {
|
'resetKey': (ele) => {
|
||||||
layer.confirm('重置密钥后,将无法使用原密钥,是否继续?', { icon: 3, title: '重置密钥' }, function (index) {
|
layer.confirm('重置密钥后,将无法使用原密钥,是否继续?', { icon: 3, title: '重置密钥' }, function (index) {
|
||||||
@ -297,8 +291,34 @@
|
|||||||
|
|
||||||
});
|
});
|
||||||
fetch('https://v1.hitokoto.cn?c=d&c=i&c=k&encode=text').then(res => res.text()).then(data => { document.getElementById('yiyan').innerHTML = data || '人无横财不富,马无夜草不肥'; })
|
fetch('https://v1.hitokoto.cn?c=d&c=i&c=k&encode=text').then(res => res.text()).then(data => { document.getElementById('yiyan').innerHTML = data || '人无横财不富,马无夜草不肥'; })
|
||||||
|
// 复制文本到剪贴板
|
||||||
|
function copyText(text) {
|
||||||
|
if (navigator.clipboard && window.isSecureContext === false) {
|
||||||
|
navigator.clipboard.writeText(text).then(() => {
|
||||||
|
layer.msg('复制成功');
|
||||||
|
}).catch(err => {
|
||||||
|
copyToClipboardFallback(text);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
copyToClipboardFallback(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 传统复制文本到剪贴板
|
||||||
|
function copyToClipboardFallback(text) {
|
||||||
|
const textarea = document.createElement('textarea');
|
||||||
|
textarea.value = text;
|
||||||
|
textarea.style.position = 'fixed';
|
||||||
|
document.body.appendChild(textarea);
|
||||||
|
textarea.select();
|
||||||
|
try {
|
||||||
|
document.execCommand('copy');
|
||||||
|
layer.msg('复制成功');
|
||||||
|
} catch (err) {
|
||||||
|
layer.msg('复制失败,请手动复制');
|
||||||
|
} finally {
|
||||||
|
document.body.removeChild(textarea);
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user