feat: extract templates to web/ folder, add PL-test server, auto-propagate, health scoring, admin dashboard redesign
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Дашборд · {%title%}</title>
|
||||
<link rel="stylesheet" href="/web/css/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="admin-bg"></div>
|
||||
<div class="admin-wrap">
|
||||
<header class="admin-header">
|
||||
<div class="header-left">
|
||||
<h1>📊 Дашборд</h1>
|
||||
</div>
|
||||
<div class="header-right">
|
||||
<a href="/admin/users" class="nav-link">👥 Пользователи</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="stat-grid">
|
||||
<div class="stat-card"><div class="stat-lbl">Всего</div><div class="stat-val" style="color:var(--accent)">{%total_users%}</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Free</div><div class="stat-val" style="color:var(--green)">{%free_users%}</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Test</div><div class="stat-val" style="color:var(--amber)">{%test_users%}</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Premium</div><div class="stat-val" style="color:var(--green)">{%paid_users%}</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Онлайн</div><div class="stat-val" style="color:var(--accent)">{%online_count%}</div><div class="stat-sub">на всех серверах</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Выручка</div><div class="stat-val" style="color:var(--green)">{%total_revenue%}₽</div><div class="stat-sub">всего оплат</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Серверов</div><div class="stat-val" style="color:var(--amber)">{%server_count%}</div></div>
|
||||
<div class="stat-card"><div class="stat-lbl">Инбаундов</div><div class="stat-val" style="color:var(--rose)">{%inbound_count%}</div></div>
|
||||
</div>
|
||||
|
||||
<div class="srv-section">
|
||||
<h2>🖥 Серверы</h2>
|
||||
{%servers_rows%}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function syncServer(name) {
|
||||
if (!confirm('Синхронизировать пользователей на ' + name + '?\nБудут добавлены только те, кто есть на большинстве других серверов.')) return;
|
||||
var btn = event.target;
|
||||
var orig = btn.textContent;
|
||||
btn.disabled = true;
|
||||
btn.textContent = '...';
|
||||
fetch('/admin/api/propagate/' + encodeURIComponent(name), {method:'POST'})
|
||||
.then(function(r) { return r.json(); })
|
||||
.then(function(d) {
|
||||
var msg = 'Сервер: ' + d.server + '\n Всего: ' + d.total + '\nУже были: ' + d.already_on_server + '\nДобавлено: ' + d.added + '\nПропущено (мало серверов): ' + d.skipped + '\nОшибок: ' + d.failed;
|
||||
alert(msg);
|
||||
location.reload();
|
||||
})['catch'](function(e) { alert('Ошибка: ' + e); })
|
||||
['finally'](function() { btn.disabled = false; btn.textContent = orig; });
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user