Merge pull request #49 from liangshengmoran/frontend-refactoring

前端页面大型变动
This commit is contained in:
WJQSERVER 2025-02-14 09:31:30 +08:00 committed by GitHub
commit 459aa24f89
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,440 +1,461 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh"> <html lang="zh" data-bs-theme="auto">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Github文件加速</title> <title>GitHub加速服务</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<style> <style>
/* 通用样式 */
:root { :root {
--primary-color: #007aff; --primary: #007aff;
/* 主要按钮颜色 */ --secondary: #007aff;
--secondary-color: #34c759; --background: #f9f9f9;
/* 次要按钮颜色 */ --card-bg: #ffffff;
--background-color: #f9f9f9; --text: #333333;
/* 亮色模式背景 */ --border: #d1d1d6;
--card-background: #ffffff; --muted: #64748b;
/* 卡片背景 */ --success: #00a83ed2;
--text-color: #333333; --danger: #ce0000dd;
/* 亮色模式文本颜色 */
--border-color: #e0e0e0;
/* 边框颜色 */
--input-background: #ffffff;
/* 输入框背景 */
--input-border: #d1d1d6;
/* 输入框边框 */
--pre-background: #f1f3f4;
/* 代码块背景 */
--pre-text-color: #333333;
/* 代码块文本颜色 */
--version-badge-hover: #39c5bb;
/* 说明文字颜色 */
--muted-text-color: #6c757d;
} }
body {
background-color: var(--background-color);
color: var(--text-color);
font-family: sans-serif;
line-height: 1.8;
font-size: 15px;
margin: 0;
padding: 0;
}
h1, h2, h3, h4, h5, h6 {
color: var(--text-color);
font-weight: 800;
letter-spacing: 0.5px;
margin: 1rem 0;
}
p, span, a, li {
color: var(--text-color);
margin-bottom: 1rem;
}
a {
text-decoration: none;
color: var(--primary-color);
}
a:hover {
color: #0056b3;
}
.card {
background-color: var(--card-background);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 16px;
margin: 16px 0;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.2s, box-shadow 0.2s;
}
.card:hover {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
transform: translateY(-4px);
}
.btn-outline-secondary {
border-radius: 50%;
padding: 6px;
transition: #e9e9e9 0.3s ease-in-out, color 0.3s ease-in-out;
}
.btn-outline-secondary:hover {
background-color: var(--primary-color);
color: white;
}
.form-control {
background-color: var(--input-background);
border: 1px solid var(--input-border);
color: var(--text-color);
padding: 10px;
border-radius: 4px;
font-size: 14px;
outline: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.form-control:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3);
}
.text-muted {
color: var(--muted-text-color) !important;
}
.bg-light {
background-color: var(--card-background) !important;
}
pre {
background-color: var(--pre-background);
color: var(--pre-text-color);
padding: 16px;
border-radius: 8px;
overflow-x: auto;
font-size: 14px;
line-height: 1.6;
}
.version-badge {
position: fixed;
bottom: 20px;
right: 20px;
background-color: var(--secondary-color);
color: white;
padding: 6px 12px;
border-radius: 20px;
font-size: 0.8rem;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
transition: background-color 0.3s ease-in-out;
}
.version-badge:hover {
background-color: var(--version-badge-hover);
}
footer {
padding: 16px;
text-align: center;
color: var(--text-color);
font-size: 0.9rem;
background-color: var(--card-background);
}
footer a {
color: var(--primary-color);
}
footer a:hover {
color: #0056b3;
}
/* 暗色模式 */
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
:root { :root {
--background-color: #121212; --background: #121212;
/* 深灰色背景 */ --card-bg: #1e1e1e;
--card-background: #1e1e1e; --text: #ffffff;
/* 卡片背景稍浅 */ --border: #334155;
--text-color: #ffffff; --muted: #94a3b8;
/* 纯白文本 */
--primary-color: #0a84ff;
/* 按钮蓝色 */
--secondary-color: #30d158;
/* 次要按钮绿色 */
--border-color: #3a3a3a;
/* 边框颜色 */
--input-background: #2c2c2c;
/* 输入框背景 */
--input-border: #4a4a4a;
/* 输入框边框 */
--pre-background: #3b3636;
/* 代码块背景 */
--pre-text-color: #ffffff;
/* 代码块文本颜色 */
--version-badge-hover: #39c5bc9a;
/* 说明文字颜色 */
--muted-text-color: #a0a0a0;
} }
body { .form-control::placeholder {
background-color: var(--background-color); color: var(--muted);
color: var(--text-color);
} }
h1, .text-muted {
h2, color: var(--muted) !important;
h3,
h4,
h5,
h6,
p,
span,
a,
li {
color: var(--text-color);
}
.card {
background-color: var(--card-background);
color: var(--text-color);
border: 1px solid var(--border-color);
} }
.btn-outline-secondary { .btn-outline-secondary {
border-radius: 50%; color: var(--muted);
padding: 6px; border-color: var(--border);
transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
} }
.btn-outline-secondary:hover { .status-badge {
background-color: var(--primary-color); color: var(--text) !important;
color: white;
} }
.toast { .code-block {
background-color: var(--card-background); background: rgba(255, 255, 255, 0.05);
color: var(--text-color);
border: 1px solid var(--border-color);
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
} }
.toast-body { .command-example {
padding: 12px; background: rgba(255, 255, 255, 0.03);
} }
.btn-primary {
--bs-btn-bg: var(--primary);
--bs-btn-border-color: var(--primary);
--bs-btn-hover-bg: var(--secondary);
--bs-btn-hover-border-color: var(--secondary);
}
.form-control { .form-control {
background-color: var(--input-background); background-color: rgba(255, 255, 255, 0.05);
border: 1px solid var(--input-border); border-color: var(--border);
color: var(--text-color); color: var(--text);
} }
.bg-light { a {
background-color: var(--card-background) !important; color: var(--secondary);
} }
}
pre { body {
background-color: var(--pre-background); background: var(--background);
color: var(--pre-text-color); color: var(--text);
} font-family: 'Inter', system-ui, sans-serif;
line-height: 1.6;
}
footer { .main-card {
background-color: var(--card-background); background: var(--card-bg);
color: var(--text-color); border: 1px solid var(--border);
} border-radius: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
transition: transform 0.2s, box-shadow 0.2s;
}
footer a { .main-card:hover {
color: var(--primary-color); transform: translateY(-2px);
} box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
}
.code-block {
background: rgba(37, 99, 235, 0.05);
border-left: 3px solid var(--primary);
border-radius: 6px;
padding: 1rem;
position: relative;
overflow-x: auto;
}
.status-badge {
padding: 6px 12px;
border-radius: 20px;
font-size: 0.9rem;
font-weight: 500;
}
.guide-section {
border-left: 3px solid var(--primary);
padding-left: 1rem;
margin: 2rem 0;
}
.command-example {
position: relative;
padding: 1.25rem;
background: rgba(37, 99, 235, 0.03);
border-radius: 8px;
margin: 1rem 0;
}
.command-example::before {
content: "➜";
position: absolute;
left: -1.5rem;
color: var(--muted);
}
.toast {
position: fixed;
top: 1%;
right: 1%;
background-color: var(--card-background);
color: var(--text-color);
border: 1px solid var(--border-color);
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.toast-body {
padding: 12px;
}
#version {
text-align: center;
font-size: 13px;
line-height: 26px;
color: #747474;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="container py-4 py-md-5"> <div class="container py-4 py-lg-5">
<main> <!-- 头部 -->
<div class="card mb-4"> <header class="text-center mb-5">
<div class="card-body"> <h1 class="display-5 fw-bold mb-3">GitHub加速服务</h1>
<h1 class="text-center mb-4">Github文件加速</h1> <p class="lead text-muted">高速稳定的 GitHub 资源访问解决方案</p>
<p class="lead text-center mb-4">为访问Github文件进行加速</p> </header>
<form id="github-form">
<div class="mb-3"> <!-- 主功能区域 -->
<input type="text" class="form-control form-control-lg" id="githubLinkInput" <div class="main-card p-4 mb-4">
placeholder="请键入需要代理的 Github 链接"> <form id="mainForm" class="mb-4">
</div> <div class="mb-3">
<button type="submit" class="btn btn-primary btn-lg w-100">获取文件链接</button> <label for="inputUrl" class="form-label fw-semibold">GitHub 链接</label>
</form> <input type="url" class="form-control form-control-lg" id="inputUrl" placeholder="输入 GitHub 文件/仓库链接"
<div id="output" class="mt-3 bg-light p-3 rounded position-relative" style="display: none;"> required>
<pre id="formattedLinkOutput" class="mb-0"></pre> </div>
<button id="copyButton" <button type="submit" class="btn btn-primary btn-lg w-100 py-2">
class="btn btn-outline-secondary btn-sm position-absolute top-0 end-0 m-2" title="复制链接"> 🚀 生成加速链接
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" </button>
class="bi bi-clipboard" viewBox="0 0 16 16"> </form>
<path
d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z" /> <!-- 结果输出 -->
<path <div id="output" class="mt-4" hidden>
d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z" /> <div class="code-block">
</svg> <code id="outputLink" class="d-block text-break"></code>
</button> </div>
<button id="openButton" <div class="d-flex gap-2 mt-3">
class="btn btn-outline-secondary btn-sm position-absolute top-0 end-0 m-2 me-5" <button id="copyBtn" class="btn btn-outline-secondary">
title="在新标签页中打开"> ⎘ 复制链接
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" </button>
class="bi bi-box-arrow-up-right" viewBox="0 0 16 16"> <button id="openBtn" class="btn btn-primary">
<path fill-rule="evenodd" ↗ 立即打开
d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5z" /> </button>
<path fill-rule="evenodd"
d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0v-5z" />
</svg>
</button>
</div>
<p class="text-muted small mt-3 mb-0">GitHub 链接带不带协议头均可,支持 release、archive 以及文件,转换后链接均可使用。</p>
</div> </div>
</div> </div>
<div class="row"> </div>
<div class="col-md-4 mb-3">
<div class="card h-100"> <!-- 服务状态 -->
<div class="card-body"> <div class="row g-3 mb-4">
<h5 class="card-title">文件大小限制</h5> <div class="col-md-4">
<p class="card-text" id="sizeLimitDisplay">...</p> <div class="main-card p-3">
<div class="d-flex justify-content-between align-items-center">
<div>
<h6 class="mb-0">文件大小限制</h6>
<small class="text-muted">最大支持文件尺寸</small>
</div> </div>
<span id="sizeLimit" class="status-badge bg-primary">...</span>
</div> </div>
</div> </div>
<div class="col-md-4 mb-3"> </div>
<div class="card h-100"> <div class="col-md-4">
<div class="card-body"> <div class="main-card p-3">
<h5 class="card-title">白名单状态</h5> <div class="d-flex justify-content-between align-items-center">
<p class="card-text" id="whiteListStatus">...</p> <div>
<h6 class="mb-0">白名单状态</h6>
<small class="text-muted">访问控制列表</small>
</div> </div>
<span id="whitelistStatus" class="status-badge bg-success">...</span>
</div> </div>
</div> </div>
<div class="col-md-4 mb-3"> </div>
<div class="card h-100"> <div class="col-md-4">
<div class="card-body"> <div class="main-card p-3">
<h5 class="card-title">黑名单状态</h5> <div class="d-flex justify-content-between align-items-center">
<p class="card-text" id="blackListStatus">...</p> <div>
<h6 class="mb-0">黑名单状态</h6>
<small class="text-muted">屏蔽列表状态</small>
</div>
<span id="blacklistStatus" class="status-badge bg-danger">...</span>
</div>
</div>
</div>
</div>
<!-- 详细使用指南 -->
<div class="main-card p-4">
<h2 class="h4 fw-bold mb-4">📚 详细使用指南</h2>
<div class="guide-section">
<h3 class="h5 fw-semibold mb-3">支持的工具</h3>
<ul class="list-unstyled">
<li class="mb-2">✅ 支持域名github.com</li>
<li class="mb-2">✅ 支持域名raw.githubusercontent.com</li>
<li class="mb-2">✅ 支持域名gist.githubusercontent.com</li>
<li class="mb-2">✅ 支持HTTPS Git Clone</li>
<li class="text-muted">❌ 不支持 SSH Git Clone</li>
</ul>
</div>
<div class="guide-section">
<h3 class="h5 fw-semibold mb-3">基础用法示例</h3>
<div class="command-example">
<h4 class="h6 fw-medium mb-2">Git 克隆</h4>
<code
class="d-block mb-3">git clone <span class="protocol">https</span>://<span class="host">example.com</span>/https://github.com/user/project.git</code>
<h4 class="h6 fw-medium mb-2">私有仓库克隆</h4>
<code
class="d-block">git clone <span class="protocol">https</span>://user:your_token@<span class="host">example.com</span>/https://github.com/user/project.git</code>
</div>
<div class="command-example">
<h4 class="h6 fw-medium mb-2">文件下载</h4>
<code
class="d-block mb-3">wget <span class="protocol">https</span>://<span class="host">example.com</span>/https://raw.githubusercontent.com/user/project/main/README.md</code>
<h4 class="h6 fw-medium mb-2">版本发布</h4>
<code
class="d-block">curl -LO <span class="protocol">https</span>://<span class="host">example.com</span>/https://github.com/user/project/releases/download/v1.0.0/project_1.0.0.amd64.tar.gz</code>
</div>
</div>
<div class="guide-section">
<h3 class="h5 fw-semibold mb-3">支持的文件类型</h3>
<div class="row g-3">
<div class="col-md-6">
<div class="main-card p-3">
<h4 class="h6 fw-medium mb-2">原始文件</h4>
<code
class="d-block text-muted fs-sm">https://raw.githubusercontent.com/user/repo/main/file.txt</code>
</div>
</div>
<div class="col-md-6">
<div class="main-card p-3">
<h4 class="h6 fw-medium mb-2">分支源码</h4>
<code class="d-block text-muted fs-sm">https://github.com/user/repo/archive/main.zip</code>
</div>
</div>
<div class="col-md-6">
<div class="main-card p-3">
<h4 class="h6 fw-medium mb-2">版本发布</h4>
<code
class="d-block text-muted fs-sm">https://github.com/user/repo/releases/download/v1.0.0/app.zip</code>
</div>
</div>
<div class="col-md-6">
<div class="main-card p-3">
<h4 class="h6 fw-medium mb-2">Gist 文件</h4>
<code
class="d-block text-muted fs-sm">https://gist.githubusercontent.com/user/gist_id/raw/file.txt</code>
</div>
</div>
<div class="col-md-6">
<div class="main-card p-3">
<h4 class="h6 fw-medium mb-2">HTTPS Git Clone</h4>
<code class="d-block text-muted fs-sm">https://github.com/user/repo.git</code>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</main> </div>
<footer class="text-center mt-4">
<p class="text-muted"> <footer class="text-center mt-5 text-muted">
Copyright &copy; 2024-2025 WJQSERVER-STUDIO<br> <p class="mb-0 small" id="version">v </p>
<p class="mb-0 small">Copyright © 2024 - <span id="currentYear"></span> WJQSERVER-STUDIO<br>
<a href="https://github.com/WJQSERVER-STUDIO/ghproxy" class="text-decoration-none">GitHub 仓库</a> | <a href="https://github.com/WJQSERVER-STUDIO/ghproxy" class="text-decoration-none">GitHub 仓库</a> |
<a href="https://t.me/ghproxy_go" class="text-decoration-none">Telegram 交流群</a> <a href="https://t.me/ghproxy_go" class="text-decoration-none">Telegram 交流群</a>
</p> </p>
</footer> </footer>
</div> </div>
<div class="toast-container position-fixed top-0 end-0 p-3"> <!-- Toast 通知 -->
<div id="toast" class="toast" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="liveToast" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body"></div> <div class="toast-body"></div>
</div> </div>
</div> </div>
<div id="versionBadge" class="version-badge"></div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script> <script>
const githubForm = document.getElementById('github-form'); (() => {
const githubLinkInput = document.getElementById('githubLinkInput'); 'use strict';
const formattedLinkOutput = document.getElementById('formattedLinkOutput');
const output = document.getElementById('output');
const copyButton = document.getElementById('copyButton');
const openButton = document.getElementById('openButton');
const toast = new bootstrap.Toast(document.getElementById('toast'));
function showToast(message) { // 初始化基础配置
const toastBody = document.querySelector('.toast-body'); const currentYear = new Date().getFullYear();
toastBody.textContent = message; document.getElementById('currentYear').textContent = currentYear;
toast.show(); const toast = new bootstrap.Toast('#liveToast');
}
function formatGithubLink(githubLink) { // DOM 元素
const currentHost = window.location.host; const form = document.getElementById('mainForm');
let formattedLink = ""; const input = document.getElementById('inputUrl');
const output = document.getElementById('output');
const outputLink = document.getElementById('outputLink');
if (githubLink.startsWith("https://github.com/") || githubLink.startsWith("http://github.com/")) { // 获取当前域名
formattedLink = window.location.protocol + "//" + currentHost + "/github.com" + githubLink.substring(githubLink.indexOf("/", 8)); const CURRENT_PROTOCOL = window.location.protocol.replace(':', '');
} else if (githubLink.startsWith("github.com/")) { const CURRENT_HOST = window.location.host;
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink; // 替换协议部分
} else if (githubLink.startsWith("https://raw.githubusercontent.com/") || githubLink.startsWith("http://raw.githubusercontent.com/")) { document.querySelectorAll('code .protocol').forEach(span => {
formattedLink = window.location.protocol + "//" + currentHost + githubLink.substring(githubLink.indexOf("/", 7)); span.textContent = CURRENT_PROTOCOL;
} else if (githubLink.startsWith("raw.githubusercontent.com/")) { });
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink; // 替换域名部分
} else if (githubLink.startsWith("https://gist.githubusercontent.com/") || githubLink.startsWith("http://gist.githubusercontent.com/")) { document.querySelectorAll('code .host').forEach(span => {
formattedLink = window.location.protocol + "//" + currentHost + "/gist.github.com" + githubLink.substring(githubLink.indexOf("/", 18)); span.textContent = CURRENT_HOST;
} else if (githubLink.startsWith("gist.githubusercontent.com/")) { });
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
} else { // URL 转换规则
showToast('请输入有效的GitHub链接'); const URL_RULES = [
{
regex: /^(?:https?:\/\/)?(?:www\.)?(github\.com\/.*)/i,
build: path => `${location.protocol}//${location.host}/${path}`
},
{
regex: /^(?:https?:\/\/)?(raw\.githubusercontent\.com\/.*)/i,
build: path => `${location.protocol}//${location.host}/${path}`
},
{
regex: /^(?:https?:\/\/)?(gist\.(?:githubusercontent|github)\.com\/.*)/i,
build: path => `${location.protocol}//${location.host}/${path}`
}
];
// 核心功能:链接转换
function transformGitHubURL(url) {
const cleanURL = url.trim().replace(/^https?:\/\//i, '');
for (const rule of URL_RULES) {
const match = cleanURL.match(rule.regex);
if (match) return rule.build(match[1]);
}
return null; return null;
} }
return formattedLink; // 事件处理
} form.addEventListener('submit', e => {
e.preventDefault();
githubForm.addEventListener('submit', function (e) { if (!input.checkValidity()) {
e.preventDefault(); input.classList.add('is-invalid');
const formattedLink = formatGithubLink(githubLinkInput.value); showToast('⚠️ 请输入有效的 GitHub 链接');
if (formattedLink) { return;
formattedLinkOutput.textContent = formattedLink; }
output.style.display = 'block';
}
});
copyButton.addEventListener('click', function () { const result = transformGitHubURL(input.value);
navigator.clipboard.writeText(formattedLinkOutput.textContent).then(() => { if (!result) {
showToast('链接已复制到剪贴板'); showToast('❌ 不支持的链接格式');
return;
}
outputLink.textContent = result;
output.hidden = false;
window.scrollTo({ top: output.offsetTop - 100, behavior: 'smooth' });
}); });
});
openButton.addEventListener('click', function () { document.getElementById('copyBtn').addEventListener('click', async () => {
window.open(formattedLinkOutput.textContent, '_blank'); try {
}); await navigator.clipboard.writeText(outputLink.textContent);
showToast('✅ 链接已复制');
} catch {
showToast('❌ 复制失败');
}
});
function fetchAPI() { document.getElementById('openBtn').addEventListener('click', () => {
fetch('/api/size_limit') window.open(outputLink.textContent, '_blank', 'noopener,noreferrer');
.then(response => response.json()) });
.then(data => {
document.getElementById('sizeLimitDisplay').textContent = `${data.MaxResponseBodySize} MB`;
});
fetch('/api/whitelist/status') // 服务状态监控
.then(response => response.json()) async function loadServiceStatus() {
.then(data => { try {
document.getElementById('whiteListStatus').textContent = data.Whitelist ? '已开启' : '已关闭'; const [size, whitelist, blacklist, version] = await Promise.all([
}); fetchJSON('/api/size_limit'),
fetchJSON('/api/whitelist/status'),
fetchJSON('/api/blacklist/status'),
fetchJSON('/api/version')
]);
fetch('/api/blacklist/status') updateStatus('sizeLimit', `${size.MaxResponseBodySize}MB`);
.then(response => response.json()) updateStatus('whitelistStatus', whitelist.Whitelist ? '已开启' : '已关闭');
.then(data => { updateStatus('blacklistStatus', blacklist.Blacklist ? '已开启' : '已关闭');
document.getElementById('blackListStatus').textContent = data.Blacklist ? '已开启' : '已关闭'; updateStatus('version', `Version ${version.Version}`);
}); } catch {
showToast('⚠️ 服务状态获取失败');
}
}
fetch('/api/version') async function fetchJSON(url) {
.then(response => response.json()) const response = await fetch(url);
.then(data => { if (!response.ok) throw new Error('API Error');
document.getElementById('versionBadge').textContent = data.Version; return response.json();
}); }
}
document.addEventListener('DOMContentLoaded', fetchAPI); function updateStatus(elementId, text) {
const element = document.getElementById(elementId);
if (element) element.textContent = text;
}
// 工具函数
function showToast(message) {
const toastBody = document.querySelector('.toast-body');
toastBody.textContent = message;
toast.show();
}
// 初始化
input.addEventListener('input', () => {
input.classList.remove('is-invalid');
if (output.hidden === false) output.hidden = true;
});
loadServiceStatus();
})();
</script> </script>
</body> </body>
</html> </html>