mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 10:16:15 +00:00
feat: add admin panel with multi-chain support and notification system
- Add full admin REST API: auth, API keys, chains, chain tokens, wallets, orders, RPC nodes, settings, dashboard stats, notifications - Add JWT-based admin authentication and API key auth middleware - Add multi-chain listeners: BSC, ETH, Polygon, Plasma, EVM WebSocket - Add RPC node health check job with automatic failover - Add Telegram notification channel for order events - Add installer for first-run database initialization - Add new DB models: admin_user, api_key, chain, chain_token, rpc_node, settings, notification_channel - Add order statistics aggregation (daily/monthly/by-chain) - Serve built admin SPA from embedded www/ assets - Add comprehensive test coverage for all new features
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
<!doctype html>
|
||||
<html lang="en-US" data-mode="system">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta
|
||||
name="theme-color"
|
||||
content="#FFFFFF"
|
||||
media="(prefers-color-scheme: light)"
|
||||
>
|
||||
<meta
|
||||
name="theme-color"
|
||||
content="#000000"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
>
|
||||
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32x32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/favicon-16x16.png" type="image/png" sizes="16x16">
|
||||
|
||||
<script id="app-bootstrap-script">
|
||||
"use strict";
|
||||
(() => {
|
||||
window.__splashStart = Date.now();
|
||||
|
||||
const root = document.documentElement;
|
||||
let resolved = "light";
|
||||
try {
|
||||
const cookieValue = document.cookie
|
||||
.split("; ")
|
||||
.find((row) => row.startsWith("theme="))
|
||||
?.split("=")[1];
|
||||
const stored =
|
||||
cookieValue === "light" ||
|
||||
cookieValue === "dark" ||
|
||||
cookieValue === "system"
|
||||
? cookieValue
|
||||
: "system";
|
||||
const prefersDark = window.matchMedia(
|
||||
"(prefers-color-scheme: dark)"
|
||||
).matches;
|
||||
if (stored === "system") {
|
||||
resolved = prefersDark ? "dark" : "light";
|
||||
} else {
|
||||
resolved = stored;
|
||||
}
|
||||
} catch {
|
||||
// cookie access may be blocked in some environments
|
||||
}
|
||||
root.dataset.mode = resolved;
|
||||
root.style.colorScheme = resolved;
|
||||
})();
|
||||
</script>
|
||||
<style id="splash-style">
|
||||
@keyframes splash-bar {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateX(600%);
|
||||
}
|
||||
}
|
||||
|
||||
#splash {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2rem;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100dvh;
|
||||
min-height: 100vh;
|
||||
pointer-events: none;
|
||||
background: #fff;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
#splash img {
|
||||
border-radius: 1.5rem;
|
||||
}
|
||||
|
||||
#splash-track {
|
||||
width: 9rem;
|
||||
height: 0.25rem;
|
||||
overflow: hidden;
|
||||
background: rgba(0, 0, 0, 0.15);
|
||||
border-radius: 9999px;
|
||||
}
|
||||
|
||||
#splash-bar {
|
||||
display: block;
|
||||
width: 1.5rem;
|
||||
height: 100%;
|
||||
background: #000;
|
||||
border-radius: 9999px;
|
||||
animation: splash-bar 0.8s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#splash {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
#splash-track {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
#splash-bar {
|
||||
background: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
html[data-mode="dark"] #splash {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
html[data-mode="dark"] #splash-track {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
html[data-mode="dark"] #splash-bar {
|
||||
background: #fff;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>GMPay</title>
|
||||
<meta name="title" content="GMPay">
|
||||
<meta
|
||||
name="description"
|
||||
content="GMPay 收款管理后台 - 多链 USDT 支付中间件管理面板"
|
||||
>
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="">
|
||||
<meta property="og:title" content="GMPay">
|
||||
<meta
|
||||
property="og:description"
|
||||
content="GMPay 收款管理后台 - 多链 USDT 支付中间件管理面板"
|
||||
>
|
||||
<meta property="og:image" content="/images/logo.png">
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:url" content="">
|
||||
<meta name="twitter:title" content="GMPay">
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="GMPay 收款管理后台 - 多链 USDT 支付中间件管理面板"
|
||||
>
|
||||
<meta name="twitter:image" content="/images/logo.png">
|
||||
<script type="module" crossorigin src="/assets/index-CvQvpjMM.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/messages-BovT1T-w.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/with-selector-D_dmjfol.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/useStore-1-QVtiLb.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/ClientOnly-CtYi2y5F.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/button-DJA4fnJ8.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-15n4mVGL.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/useRouter-D03zSgJO.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/link-CA4H4hTz.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/matchContext-BcwcZvp2.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/useSearch-B5ZWp8fU.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/useNavigate-Dg8CkCoa.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/redirect-dE0wk0WH.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/route-BxpeArPd.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/_error-DGJYkCxd.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-DG5UMlBd.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-BEDXr2LC.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-BKfJQFVD.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-Cp1lAGZy.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-D28ivbfF.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/cookies-BNZcTwGc.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/wallet--XSRr4dT.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/dist-DvAgZMq72.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/auth-store-BpIS8RMn.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/Match-B8-zI9ZJ.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/useRouterState-DV1cSG1v.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/atom-DI1Bn-1s.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/circle-check-Dh8WOZF0.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/clock-3-BoF5rDzX.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/loader-circle-fg8-aSyl.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/zod-Cymc5bS-.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/general-error-DKtbS-qh.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/not-found-error-toRsO1Fi.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/router-Dohuf5K5.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/Matches-LuvVcyUg.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/font-provider-DvtNHF7l.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/theme-provider-CRKya7Cx.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-TVbhXeum.css">
|
||||
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<div id="splash">
|
||||
<img
|
||||
src="/images/logo.png"
|
||||
fetchpriority="high"
|
||||
alt="GM Wallet"
|
||||
width="144"
|
||||
height="144"
|
||||
>
|
||||
<div id="splash-track"><span id="splash-bar"></span></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user