Files
coruna-lab/resources/views/admin/content.blade.php
T
2026-09-28 06:12:47 +08:00

145 lines
5.9 KiB
PHP

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>@yield('title', 'Coruna Lab')</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="{{ asset('static/layuiadmin/layui/css/layui.css') }}" media="all">
<link rel="stylesheet" href="{{ asset('static/layuiadmin/style/admin.css') }}" media="all">
<style>
.json-block{background:#1e1e1e;color:#dcdcdc;padding:12px;overflow:auto;max-height:480px;border-radius:2px;font-size:12px}
.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}
.tag-chain-app{background:#ea580c}
.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}
.photo-card{display:block;position:relative;background:#fff;padding:8px;text-align:center;color:#333;border:1px solid #f0f0f0}
.photo-card img{width:100%;height:120px;object-fit:cover;background:#eee}
.photo-thumb{position:relative;display:inline-block}
.photo-unread-dot{position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:#ff5722}
.scan-badge{position:absolute;left:8px;top:8px;font-size:11px;line-height:16px;padding:0 5px;border-radius:2px;color:#fff;background:#909399}
.scan-badge-1{background:#16b777}
.scan-badge-2{background:#ff5722}
.scan-badge-3{background:#16b777}
.scan-badge-4{background:#c2c2c2}
.scan-progress{color:#666;font-size:13px;margin:0 0 10px}
.note-card{background:#fff;border:1px solid #eee;border-radius:4px;padding:12px 14px;margin-bottom:10px}
.note-card-title{font-weight:600;margin-bottom:8px;word-break:break-word;color:#333}
.note-card-body{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:13px;line-height:1.55;color:#333}
.note-preview{color:#666;word-break:break-all}
/* Tables grow with the current page (e.g. 20 rows); the iframe/page scrolls. */
.layui-table-view{min-height:420px}
.layui-table-view .layui-table-box,
.layui-table-view .layui-table-body,
.layui-table-view .layui-table-main{height:auto !important}
.layui-table-view .layui-table-body{overflow-x:auto;overflow-y:visible !important}
</style>
@stack('head')
</head>
<body>
<div class="layui-fluid">
@yield('content')
</div>
<script src="{{ asset('static/layuiadmin/layui/layui.js') }}"></script>
<script>
layui.config({
base: @json(rtrim(asset('static/layuiadmin'), '/').'/')
}).extend({
index: 'lib/index'
}).use(['index'], function(){});
window.CorunaFilterOptions = (function () {
var portal = @json($portal ?? 'admin');
var channelsUrl = @json(route(($portal ?? 'admin').'.filterOptions.channels'));
var agentsUrl = portal === 'admin' ? @json(route('admin.filterOptions.agents')) : null;
var mem = { channels: null, agents: null, inflight: null };
var STORAGE_PREFIX = 'coruna_filter_opts_' + portal + '_';
var TTL_MS = 60 * 1000;
function readStore(key) {
try {
var raw = sessionStorage.getItem(STORAGE_PREFIX + key);
if (!raw) return null;
var parsed = JSON.parse(raw);
if (!parsed || !parsed.at || (Date.now() - parsed.at) > TTL_MS) return null;
return parsed.data;
} catch (e) { return null; }
}
function writeStore(key, data) {
try {
sessionStorage.setItem(STORAGE_PREFIX + key, JSON.stringify({ at: Date.now(), data: data }));
} catch (e) {}
}
function fillSelect(sel, rows, keepFirst) {
var $sel = window.layui && layui.$ ? layui.$(sel) : null;
if (!$sel || !$sel.length) return;
var keep = keepFirst || 1;
$sel.find('option').slice(keep).remove();
(rows || []).forEach(function (row) {
$sel.append(new Option(row.label, row.value));
});
}
function loadAll() {
if (mem.inflight) return mem.inflight;
var chCached = mem.channels || readStore('channels');
var agCached = agentsUrl ? (mem.agents || readStore('agents')) : [];
if (chCached && (!agentsUrl || agCached)) {
mem.channels = chCached;
mem.agents = agCached || [];
return layui.$.Deferred().resolve(mem).promise();
}
var $ = layui.$;
var reqs = [$.getJSON(channelsUrl)];
if (agentsUrl) reqs.push($.getJSON(agentsUrl));
mem.inflight = $.when.apply($, reqs).then(function () {
var args = arguments;
var chRes = reqs.length === 1 ? args[0] : args[0][0];
var agRes = reqs.length === 1 ? null : args[1][0];
mem.channels = (chRes && chRes.data) || [];
mem.agents = (agRes && agRes.data) || [];
writeStore('channels', mem.channels);
if (agentsUrl) writeStore('agents', mem.agents);
mem.inflight = null;
return mem;
}, function () {
mem.inflight = null;
return { channels: [], agents: [] };
});
return mem.inflight;
}
function apply(form) {
return loadAll().then(function (data) {
fillSelect('select[data-coruna-channels]', data.channels, 1);
fillSelect('select[data-coruna-agents]', data.agents, 2);
if (form && form.render) form.render('select');
});
}
function bust() {
mem.channels = null;
mem.agents = null;
try {
sessionStorage.removeItem(STORAGE_PREFIX + 'channels');
sessionStorage.removeItem(STORAGE_PREFIX + 'agents');
} catch (e) {}
}
return { apply: apply, bust: bust, loadAll: loadAll };
})();
</script>
@stack('scripts')
</body>
</html>