提交说明

This commit is contained in:
QWQLwToo
2026-06-26 14:34:25 +08:00
parent 2171b933eb
commit f525e5f3ba
18 changed files with 28 additions and 31 deletions
@@ -2,7 +2,13 @@
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/admin/favicon.ico" />
<link rel="apple-touch-icon" href="/admin/logo-150.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="YMhut" />
<meta name="application-name" content="YMhut Box Admin" />
<meta name="description" content="YMhut Box unified management console for update.ymhut.cn." />
<meta name="theme-color" content="#111827" />
<title>YMhut Unified Admin</title> <title>YMhut Unified Admin</title>
</head> </head>
<body> <body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -2,7 +2,13 @@
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<link rel="apple-touch-icon" href="/logo-150.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="YMhut" />
<meta name="application-name" content="YMhut Box" />
<meta name="description" content="YMhut Box unified update, feedback, and interface source status portal for update.ymhut.cn." />
<meta name="theme-color" content="#10231d" />
<title>YMhut Box Service Portal</title> <title>YMhut Box Service Portal</title>
</head> </head>
<body> <body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { Activity, ArrowDownToLine, Database, HeartPulse, Network, ShieldCheck } from "lucide-vue-next"; import { Activity, ArrowDownToLine, Box, HeartPulse, Network, ShieldCheck } from "lucide-vue-next";
import { usePortalState } from "../state"; import { usePortalState } from "../state";
const state = usePortalState(); const state = usePortalState();
@@ -37,7 +37,7 @@ const state = usePortalState();
</section> </section>
<section class="metric-grid"> <section class="metric-grid">
<article class="metric"><Database :size="20" /><span>数据库</span><strong>{{ state.databaseStatus.value }}</strong></article> <article class="metric"><Box :size="20" /><span>服务版本</span><strong>{{ state.serviceVersion.value }}</strong></article>
<article class="metric"><Network :size="20" /><span>可见接口源</span><strong>{{ state.sourceCount.value }}</strong></article> <article class="metric"><Network :size="20" /><span>可见接口源</span><strong>{{ state.sourceCount.value }}</strong></article>
<article class="metric"><HeartPulse :size="20" /><span>健康接口</span><strong>{{ state.healthyCount.value }}</strong></article> <article class="metric"><HeartPulse :size="20" /><span>健康接口</span><strong>{{ state.healthyCount.value }}</strong></article>
<article class="metric"><Activity :size="20" /><span>可用率</span><strong>{{ state.availability.value }}%</strong></article> <article class="metric"><Activity :size="20" /><span>可用率</span><strong>{{ state.availability.value }}%</strong></article>
@@ -25,7 +25,6 @@ export function usePortalState() {
const availability = computed(() => sourceCount.value ? Math.round((healthyCount.value / sourceCount.value) * 100) : 0); const availability = computed(() => sourceCount.value ? Math.round((healthyCount.value / sourceCount.value) * 100) : 0);
const downloadUrl = computed(() => releases.value?.download_url || bootstrap.value?.release?.download_url || packages.value[0]?.url || ""); const downloadUrl = computed(() => releases.value?.download_url || bootstrap.value?.release?.download_url || packages.value[0]?.url || "");
const appVersion = computed(() => releases.value?.app_version || bootstrap.value?.release?.app_version || latestNotice.value?.version || "未发布"); const appVersion = computed(() => releases.value?.app_version || bootstrap.value?.release?.app_version || latestNotice.value?.version || "未发布");
const databaseStatus = computed(() => bootstrap.value?.health?.database?.activeProvider || bootstrap.value?.health?.database?.configProvider || "-");
const serviceVersion = computed(() => bootstrap.value?.serviceVersion || "-"); const serviceVersion = computed(() => bootstrap.value?.serviceVersion || "-");
async function load(force = false) { async function load(force = false) {
@@ -68,7 +67,6 @@ export function usePortalState() {
availability, availability,
downloadUrl, downloadUrl,
appVersion, appVersion,
databaseStatus,
serviceVersion, serviceVersion,
load, load,
sourceStatus, sourceStatus,
@@ -25,21 +25,14 @@ html { min-width: 320px; }
body { body {
margin: 0; margin: 0;
min-width: 320px; min-width: 320px;
background: background: #f6f8f4;
radial-gradient(circle at 8% 6%, rgba(31, 111, 91, 0.10), transparent 30%),
radial-gradient(circle at 90% 8%, rgba(217, 146, 39, 0.10), transparent 30%),
linear-gradient(180deg, #f2f5ef 0%, #f8faf6 42%, #ffffff 100%);
} }
body::before { body::before {
content: ""; content: "";
position: fixed; position: fixed;
inset: 0; inset: 0;
pointer-events: none; pointer-events: none;
background-image: background: rgba(31, 111, 91, 0.025);
linear-gradient(rgba(31, 111, 91, 0.045) 1px, transparent 1px),
linear-gradient(90deg, rgba(31, 111, 91, 0.045) 1px, transparent 1px);
background-size: 42px 42px;
mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.55), transparent 70%);
} }
a { color: inherit; } a { color: inherit; }
button, input { font: inherit; } button, input { font: inherit; }
@@ -86,7 +79,7 @@ button { cursor: pointer; }
place-items: center; place-items: center;
border-radius: 50%; border-radius: 50%;
color: #fff; color: #fff;
background: linear-gradient(135deg, #10231d, var(--primary)); background: #10231d;
box-shadow: 0 12px 26px rgba(31, 111, 91, 0.22); box-shadow: 0 12px 26px rgba(31, 111, 91, 0.22);
} }
.brand strong { letter-spacing: 0; } .brand strong { letter-spacing: 0; }
@@ -116,7 +109,7 @@ button { cursor: pointer; }
} }
.admin-link { .admin-link {
color: #fff; color: #fff;
background: linear-gradient(135deg, #10231d, #1f6f5b); background: #10231d;
box-shadow: 0 12px 28px rgba(31, 111, 91, 0.22); box-shadow: 0 12px 28px rgba(31, 111, 91, 0.22);
} }
.admin-link:hover { transform: translateY(-1px); box-shadow: 0 16px 36px rgba(31, 111, 91, 0.28); } .admin-link:hover { transform: translateY(-1px); box-shadow: 0 16px 36px rgba(31, 111, 91, 0.28); }
@@ -132,24 +125,12 @@ button { cursor: pointer; }
align-items: stretch; align-items: stretch;
border: 1px solid rgba(255, 255, 255, 0.70); border: 1px solid rgba(255, 255, 255, 0.70);
border-radius: 32px; border-radius: 32px;
background: background: rgba(255, 255, 255, 0.88);
linear-gradient(135deg, rgba(255, 255, 255, 0.88), rgba(255, 255, 255, 0.62)),
radial-gradient(circle at 88% 18%, rgba(31, 111, 91, 0.14), transparent 34%),
radial-gradient(circle at 18% 82%, rgba(217, 146, 39, 0.13), transparent 30%);
box-shadow: var(--shadow); box-shadow: var(--shadow);
padding: clamp(28px, 5vw, 58px); padding: clamp(28px, 5vw, 58px);
overflow: hidden; overflow: hidden;
} }
.hero::after { .hero::after { content: none; }
content: "";
position: absolute;
right: -80px;
bottom: -120px;
width: 360px;
height: 360px;
border-radius: 50%;
background: radial-gradient(circle, rgba(31, 111, 91, 0.13), transparent 68%);
}
.hero-copy { .hero-copy {
position: relative; position: relative;
z-index: 1; z-index: 1;
@@ -225,7 +206,7 @@ p {
.button.primary { .button.primary {
color: #fff; color: #fff;
border-color: transparent; border-color: transparent;
background: linear-gradient(135deg, #10231d, #1f6f5b); background: #10231d;
box-shadow: 0 16px 34px rgba(31, 111, 91, 0.24); box-shadow: 0 16px 34px rgba(31, 111, 91, 0.24);
} }
@@ -329,7 +310,7 @@ p {
margin: 0 auto 18px; margin: 0 auto 18px;
border: 1px solid rgba(255, 255, 255, 0.74); border: 1px solid rgba(255, 255, 255, 0.74);
border-radius: 28px; border-radius: 28px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.88), rgba(255, 255, 255, 0.68)); background: rgba(255, 255, 255, 0.88);
box-shadow: var(--shadow); box-shadow: var(--shadow);
padding: clamp(24px, 4vw, 42px); padding: clamp(24px, 4vw, 42px);
backdrop-filter: blur(16px); backdrop-filter: blur(16px);
@@ -2,7 +2,13 @@
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/setup/favicon.ico" />
<link rel="apple-touch-icon" href="/setup/logo-150.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="YMhut" />
<meta name="application-name" content="YMhut Box Setup" />
<meta name="description" content="YMhut Box unified management setup wizard for update.ymhut.cn." />
<meta name="theme-color" content="#111827" />
<title>YMhut Unified Setup</title> <title>YMhut Unified Setup</title>
</head> </head>
<body> <body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB