cloudflare
tcp/443 tcp/80 tcp/8443
Open service 172.67.195.71:443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server-Timing: cfEdge;dur=5,cfOrigin;dur=0
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=XFOw7xzez0j12mwGcMHxxQfF7r1wSVbCa33S92pxD5J7cJ9BsqsWWwaOWd9%2FB%2BhbJinMiWzuxlPwBRYQ%2FvlmA32%2BwrhU9i5M80KBsk2MQ6afntQ%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d609dc1c69-BOM
alt-svc: h3=":443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"bb46cad8be8341bcbcbb37d3195d4152","r":1,
Open service 172.67.195.71:80 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Length: 0
Connection: close
Location: https://mcyydsfun.dpdns.org/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=L9fPJ%2BlrDTN5yTSvxVTu7MPPyGYu%2BGPAz5hEbqSBShd3gJ2C14oFXW2i9UsVjhoz9o0vofwO%2F36qZqmcz8ZDoWFrH6XbK12%2BVZqeYYEwAUvmHrk%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=9,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9bcec4d5eaf526a7-BOM
alt-svc: h3=":443"; ma=86400
Open service 104.21.92.150:443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server-Timing: cfEdge;dur=23,cfOrigin;dur=0
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=zXrv%2FXPTd2bx0cSbZm5oSy6rG4YWaiTKAYyQsIVNRhM%2BRyyrlo2%2FL%2BE7JuEYhxPLiykcaPr5ZYW7ePuoCjy64MlwIign3Y2heFJsY7xwQfXAjZY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d5b8ff1b58-EWR
alt-svc: h3=":443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"bb46cad8be8341bcbcbb37d3195d4152","r":1,
Open service 2606:4700:3030::6815:5c96:8443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:06 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server-Timing: cfEdge;dur=349,cfOrigin;dur=0
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=SEftcN28WoZ2qdYkLwyOgG2bRNI9rcwof3IvfloyQsmcbPrEN9WNJGd%2BHsn70WLglUL7%2F2BHOdaXBjP4bQvPnZnkvb6prFl43Fkd0HyQ33B3hoo4weGo2hJ3f844Bq8%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d6997c3fcf-SIN
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"bb46cad8be8341bcbcbb37d3195d4152","r":1,
Open service 2606:4700:3036::ac43:c347:80 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Length: 0
Connection: close
Location: https://mcyydsfun.dpdns.org/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=R%2Bzz1RJ1%2B6oXAjJaM%2F8dzZ6sGWzB5F4apkBUcf0v%2FUSfqVPlulzVA9BL1xIFGohqWjq6mzX9XLauiZBx4XclcDCgCvVoPYKaQuRY3XF2SIn%2BeGFe9rFYFqd8THg%2Bc64%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=21,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9bcec4d58910ee2f-YYZ
alt-svc: h3=":443"; ma=86400
Open service 104.21.92.150:80 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Length: 0
Connection: close
Location: https://mcyydsfun.dpdns.org/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Tx78EvZ1Gs%2FbMaLuTIcHc9drukGk6dHPINeunrgX2CtUOG%2Fo9%2FZofPKL805d62h41BGajYQRmQRFI93b7XmOhJt3uzClJUjG%2FO%2BlMj41LOPWGJY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d519efb10b-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3036::ac43:c347:443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3797
Connection: close
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=oTukx95S2k%2Bz9eBhJoUjmobuNBruXP4zCh4r79syJSXiv1340gYRWGIXEy7aFCEUWR8Lk7OHqmoDDthqo9Z7lRSpCo7HYzOuwj0E8Lc70gtP4MzStvKL5DBUYtyt%2Bts%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d54966d9d0-FRA
alt-svc: h3=":443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
</body>
</html>
Open service 104.21.92.150:8443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server-Timing: cfEdge;dur=72,cfOrigin;dur=0
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=kJwx9krRBgg2pF87lOAw%2FKnzCN7ev0SoEu3G5LYXh4bUxIpWMV4uDIPCYsabCwuZvYmLTnksdBL4qz0IpqMREczm%2BYZ6o5oX%2BnTvJIvNS2uPIgc%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d57f7ba4c6-EWR
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"bb46cad8be8341bcbcbb37d3195d4152","r":1,
Open service 2606:4700:3030::6815:5c96:80 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Length: 0
Connection: close
Location: https://mcyydsfun.dpdns.org/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=NM5sPVPaxs4cywPdU0MLZ9a2A0U5OlE%2BgVZ51Hn8bqRPLjaG3%2BZCfaxukMGWEoubmgXNqiRUGtGKflVyY4IeCqiMi2BVOw%2Fm5TOCFSaSC84Tw8tYusLfJkKeGxib02w%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=14,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9bcec4d50b480f63-EWR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3036::ac43:c347:8443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server-Timing: cfEdge;dur=15,cfOrigin;dur=0
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=uhTa4YqzD%2BLQDogiLXAY2MBekRbuPw%2FwCykDTOHsInWDbatCaecZ%2FLuJbYDAoDfcrLWPXdZ3UTIqmht6t%2BRYuVYcVZ9qEwWxromRgTu%2BBmPs4ZwNHp2FFVwsN3odlxY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d4887bb547-EWR
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"bb46cad8be8341bcbcbb37d3195d4152","r":1,
Open service 172.67.195.71:8443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3797
Connection: close
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=b6M2bODPHKgWGnsR0T3y%2F9P3yiG7wilWfByZYuffQsZX3T5pBz4h%2F9%2FEehmgFuaGH8d0RFPv9bWjIarKDYqFnqZVeKUNOupUKwRhZukxUN2c"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d48813ef3c-LHR
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
</body>
</html>
Open service 2606:4700:3030::6815:5c96:443 · mcyydsfun.dpdns.org
2026-01-12 18:38
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2026 18:38:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3797
Connection: close
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=xfK16D0wtrgT8FpAWuT4XJkZKQrL7TXTO1sPFRu4JnwOcrnjSYs4BBQu5s0ou5x1RHh4MtZ1fA7GEFw9j%2B8Kx3ZngNcCXifC8JX4%2Ft6AVhFa3kE9%2F3G8ASb7M6aTWek%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bcec4d478ea94df-LHR
alt-svc: h3=":443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
</body>
</html>
Open service 2606:4700:3036::ac43:c347:8443 · mcyydsfun.dpdns.org
2026-01-09 21:27
HTTP/1.1 200 OK
Date: Fri, 09 Jan 2026 21:27:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3797
Connection: close
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mckIgVhZBAOZWXyTM%2B3o%2F7%2FkgZnTMpc7uqCBPKm4brmenxrC37dilSLMR1QhiEsQcLIeRNhhMVSaAALcZGTuffzi67ZHDF%2Fh63gn1MSgbse7CWDYkbV1J9G7zWmoyCY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bb7047d687b6c5f-FRA
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
</body>
</html>
Open service 172.67.195.71:80 · mcyydsfun.dpdns.org
2026-01-09 21:27
HTTP/1.1 301 Moved Permanently
Date: Fri, 09 Jan 2026 21:27:14 GMT
Content-Length: 0
Connection: close
Location: https://mcyydsfun.dpdns.org/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=TfsKKdIqPlXgbLLzPYDizYZz9UZ%2FhUZ%2BsSumtAjIX%2FDiA6guVTYp%2BSAc%2FZu%2FZ0FPSyTvfpVSPwh6hpJibKEAXAEC9TCM2iALEx9sKoLXXWaE4AM%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bb7047bfc1edcc0-FRA
alt-svc: h3=":443"; ma=86400
Open service 104.21.92.150:8443 · mcyydsfun.dpdns.org
2026-01-09 21:27
HTTP/1.1 200 OK
Date: Fri, 09 Jan 2026 21:27:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3797
Connection: close
Speculation-Rules: "/cdn-cgi/speculation"
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=tWQh5umk%2BXJSk2B97%2BsjNLHfEdaYlBKy0ZVKxrsFnkycPIb7cg4U0hbG0GqwDeW50scCyWJbkHBCb28HFLp7jZqk5RmiVBNY%2FmwxxTS%2BZSY%2BH3E%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bb7047c1d5a9727-AMS
alt-svc: h3=":8443"; ma=86400
Page title: 订阅管理系统
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订阅管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
.login-container {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.login-box {
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.9);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.input-field {
transition: all 0.3s;
border: 1px solid #e2e8f0;
}
.input-field:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.25);
}
</style>
</head>
<body class="login-container flex items-center justify-center">
<div class="login-box p-8 rounded-xl w-full max-w-md">
<div class="text-center mb-8">
<h1 class="text-2xl font-bold text-gray-800"><i class="fas fa-calendar-check mr-2"></i>订阅管理系统</h1>
<p class="text-gray-600 mt-2">登录管理您的订阅提醒</p>
</div>
<form id="loginForm" class="space-y-6">
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-user mr-2"></i>用户名
</label>
<input type="text" id="username" name="username" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-lock mr-2"></i>密码
</label>
<input type="password" id="password" name="password" required
class="input-field w-full px-4 py-3 rounded-lg text-gray-700 focus:outline-none">
</div>
<button type="submit"
class="btn-primary w-full py-3 rounded-lg text-white font-medium focus:outline-none">
<i class="fas fa-sign-in-alt mr-2"></i>登录
</button>
<div id="errorMsg" class="text-red-500 text-center"></div>
</form>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const button = e.target.querySelector('button');
const originalContent = button.innerHTML;
button.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>登录中...';
button.disabled = true;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const result = await response.json();
if (result.success) {
window.location.href = '/admin';
} else {
document.getElementById('errorMsg').textContent = result.message || '用户名或密码错误';
button.innerHTML = originalContent;
button.disabled = false;
}
} catch (error) {
document.getElementById('errorMsg').textContent = '发生错误,请稍后再试';
button.innerHTML = originalContent;
button.disabled = false;
}
});
</script>
</body>
</html>