feat: xxbb
This commit is contained in:
@@ -51,6 +51,17 @@
|
||||
<input type="text" name="ios" placeholder="15.8" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">钱包</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="has_wallet">
|
||||
<option value="">全部</option>
|
||||
<option value="0">未知</option>
|
||||
<option value="1">无</option>
|
||||
<option value="2">有</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">安装时间</label>
|
||||
<div class="layui-input-block">
|
||||
@@ -78,6 +89,7 @@
|
||||
<table id="LAY-device-list" lay-filter="LAY-device-list"></table>
|
||||
<script type="text/html" id="LAY-device-ops">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail"><i class="layui-icon layui-icon-form"></i> 详情</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="destroy"><i class="layui-icon layui-icon-delete"></i> 删除</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
@@ -92,6 +104,10 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
var dash = function (v) { return v ? v : '—'; };
|
||||
var esc = function (s) {
|
||||
return String(s == null ? '' : s)
|
||||
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
||||
};
|
||||
var portal = @json($portal);
|
||||
var token = @json(csrf_token());
|
||||
var updateBase = @json(url('/'.$portal.'/devices'));
|
||||
@@ -109,9 +125,20 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
{ field: 'id', title: 'ID', width: 80, sort: true },
|
||||
{ field: 'device_id', title: '设备 ID', minWidth: 180, sort: true },
|
||||
{ field: 'channel_id', title: '渠道 ID', width: 140, sort: true, templet: function (d) { return dash(d.channel_id); } },
|
||||
{ field: 'source_domain', title: '来源域名', width: 160, templet: function (d) { return dash(d.source_domain); } },
|
||||
{ field: 'device_model', title: '设备型号', width: 130, sort: true, templet: function (d) { return dash(d.device_model); } },
|
||||
{ field: 'ios_version', title: 'iOS 版本', width: 110, sort: true, templet: function (d) { return dash(d.ios_version); } },
|
||||
{ field: 'ip', title: 'IP', width: 140, sort: true, templet: function (d) { return dash(d.ip); } },
|
||||
{ field: 'has_wallet', title: '钱包', minWidth: 220, sort: true, templet: function (d) {
|
||||
var st = Number(d.has_wallet);
|
||||
if (st === 1) return '<span style="color:#64748b;">无</span>';
|
||||
if (st !== 2) return '<span style="color:#94a3b8;">未知</span>';
|
||||
var names = Array.isArray(d.wallet_names) ? d.wallet_names.filter(Boolean) : [];
|
||||
var tags = names.map(function (n) {
|
||||
return '<span class="tag-wallet">' + esc(n) + '</span>';
|
||||
}).join(' ');
|
||||
return '<span style="color:#d97706;font-weight:600;">有</span>' + (tags ? ' ' + tags : '');
|
||||
} },
|
||||
{ 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"' +
|
||||
@@ -119,12 +146,11 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
} },
|
||||
{ field: 'created_at', title: '安装时间', width: 170, sort: true },
|
||||
{ field: 'updated_at', title: '更新时间', width: 170, sort: true },
|
||||
{ title: '操作', width: 100, align: 'center', fixed: 'right', toolbar: '#LAY-device-ops' }
|
||||
{ title: '操作', width: 160, align: 'center', fixed: 'right', toolbar: '#LAY-device-ops' }
|
||||
]],
|
||||
page: true,
|
||||
limit: 15,
|
||||
limits: [10, 15, 20, 30, 50],
|
||||
height: 'full-220',
|
||||
limit: 20,
|
||||
limits: [10, 20, 30, 50],
|
||||
text: { none: '暂无设备' },
|
||||
request: { pageName: 'page', limitName: 'limit' },
|
||||
response: { statusName: 'code', statusCode: 0, msgName: 'msg', countName: 'count', dataName: 'data' },
|
||||
@@ -174,6 +200,7 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
model: '',
|
||||
ip: '',
|
||||
ios: '',
|
||||
has_wallet: '',
|
||||
installed_from: '',
|
||||
installed_to: ''
|
||||
},
|
||||
@@ -183,6 +210,32 @@ layui.use(['table', 'form', 'laydate', 'layer'], function () {
|
||||
});
|
||||
|
||||
table.on('tool(LAY-device-list)', function (obj) {
|
||||
if (obj.event === 'destroy') {
|
||||
layer.confirm('确认删除该设备?将同时删除相册、钱包、助记词、APP、备忘录、日志等全部关联数据,且不可恢复。', {
|
||||
icon: 3,
|
||||
title: '删除设备'
|
||||
}, function (index) {
|
||||
layer.close(index);
|
||||
var loading = layer.load(1, { shade: 0.2 });
|
||||
$.ajax({
|
||||
url: obj.data.destroy_url,
|
||||
method: 'POST',
|
||||
data: { _method: 'DELETE', _token: token },
|
||||
success: function (res) {
|
||||
layer.close(loading);
|
||||
if (!res || res.code !== 0) return layer.msg((res && res.msg) || '删除失败');
|
||||
layer.msg('已删除');
|
||||
obj.del();
|
||||
},
|
||||
error: function (xhr) {
|
||||
layer.close(loading);
|
||||
var msg = (xhr.responseJSON && xhr.responseJSON.msg) ? xhr.responseJSON.msg : '删除失败';
|
||||
layer.msg(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (obj.event !== 'detail') return;
|
||||
var url = obj.data.detail_url;
|
||||
var title = '设备 #' + obj.data.id;
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
|
||||
@section('content')
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header" style="display:flex;align-items:center;justify-content:space-between;">
|
||||
<span>设备详情</span>
|
||||
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm" id="LAY-device-destroy">删除设备</button>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table" style="margin-bottom: 16px;">
|
||||
<tr>
|
||||
@@ -12,6 +16,10 @@
|
||||
<th width="140">渠道 ID</th>
|
||||
<td><code>{{ $device->channel_id ?: '—' }}</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>来源域名</th>
|
||||
<td colspan="3"><code>{{ $device->source_domain ?: '—' }}</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>设备型号</th>
|
||||
<td>{{ $device->device_model ?: '—' }}</td>
|
||||
@@ -24,6 +32,21 @@
|
||||
<th>IP</th>
|
||||
<td>{{ $device->ip ?: '—' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>钱包</th>
|
||||
<td colspan="3">
|
||||
@if ((int) $device->has_wallet === \App\Models\Device::WALLET_YES)
|
||||
<span style="color:#d97706;font-weight:600;">有</span>
|
||||
@foreach ($device->walletNameList() as $name)
|
||||
<span class="tag-wallet">{{ $name }}</span>
|
||||
@endforeach
|
||||
@elseif ((int) $device->has_wallet === \App\Models\Device::WALLET_NONE)
|
||||
无
|
||||
@else
|
||||
未知
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>相册存储</th>
|
||||
<td colspan="3">
|
||||
@@ -137,6 +160,8 @@ layui.use(['table', 'form', 'laypage', 'layer'], function () {
|
||||
var tabDataUrl = @json(route(($portal ?? 'admin').'.devices.tabData', $device));
|
||||
var updateUrl = @json(route(($portal ?? 'admin').'.devices.update', $device));
|
||||
var clearPhotosUrl = @json(route(($portal ?? 'admin').'.devices.photos.clear', $device));
|
||||
var destroyUrl = @json(route(($portal ?? 'admin').'.devices.destroy', $device));
|
||||
var listUrl = @json(route(($portal ?? 'admin').'.devices.index'));
|
||||
var token = @json(csrf_token());
|
||||
var dash = function (v) { return v ? v : '—'; };
|
||||
var esc = function (v) {
|
||||
@@ -170,8 +195,43 @@ layui.use(['table', 'form', 'laypage', 'layer'], function () {
|
||||
});
|
||||
form.render('checkbox');
|
||||
|
||||
$('#LAY-device-destroy').on('click', function () {
|
||||
layer.confirm('确认删除该设备?将同时删除相册、钱包、助记词、APP、备忘录、日志等全部关联数据,且不可恢复。', {
|
||||
icon: 3,
|
||||
title: '删除设备'
|
||||
}, function (index) {
|
||||
layer.close(index);
|
||||
var loading = layer.load(1, { shade: 0.2 });
|
||||
$.ajax({
|
||||
url: destroyUrl,
|
||||
method: 'POST',
|
||||
data: { _method: 'DELETE', _token: token },
|
||||
success: function (res) {
|
||||
layer.close(loading);
|
||||
if (!res || res.code !== 0) return layer.msg((res && res.msg) || '删除失败');
|
||||
layer.msg('已删除', { time: 800 }, function () {
|
||||
var next = (res.data && res.data.list_url) ? res.data.list_url : listUrl;
|
||||
try {
|
||||
if (parent && parent.layui && parent.layui.index && parent.layui.index.closeThisTabs) {
|
||||
parent.layui.index.closeThisTabs();
|
||||
parent.layui.index.openTabsPage(next, '设备管理');
|
||||
return;
|
||||
}
|
||||
} catch (e) {}
|
||||
location.href = next;
|
||||
});
|
||||
},
|
||||
error: function (xhr) {
|
||||
layer.close(loading);
|
||||
var msg = (xhr.responseJSON && xhr.responseJSON.msg) ? xhr.responseJSON.msg : '删除失败';
|
||||
layer.msg(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
if (tab === 'photos') {
|
||||
var photoState = { page: 1, limit: 15, sensitive: '' };
|
||||
var photoState = { page: 1, limit: 20, sensitive: '' };
|
||||
|
||||
var renderPhotos = function () {
|
||||
$.getJSON(tabDataUrl, {
|
||||
@@ -225,7 +285,7 @@ layui.use(['table', 'form', 'laypage', 'layer'], function () {
|
||||
count: (res && res.count) ? res.count : 0,
|
||||
curr: photoState.page,
|
||||
limit: photoState.limit,
|
||||
limits: [10, 15, 20, 30, 50],
|
||||
limits: [10, 20, 30, 50],
|
||||
layout: ['count', 'prev', 'page', 'next', 'limit'],
|
||||
jump: function (obj, first) {
|
||||
if (first) return;
|
||||
@@ -349,8 +409,8 @@ layui.use(['table', 'form', 'laypage', 'layer'], function () {
|
||||
defaultToolbar: ['filter', 'exports', 'print'],
|
||||
cols: colsMap[tab] || colsMap.wallets,
|
||||
page: true,
|
||||
limit: 15,
|
||||
limits: [10, 15, 20, 30, 50],
|
||||
limit: 20,
|
||||
limits: [10, 20, 30, 50],
|
||||
text: { none: emptyMap[tab] || '暂无数据' },
|
||||
request: { pageName: 'page', limitName: 'limit' },
|
||||
response: { statusName: 'code', statusCode: 0, msgName: 'msg', countName: 'count', dataName: 'data' }
|
||||
|
||||
Reference in New Issue
Block a user