feat(settings): 添加开发模式开关和服务器信息显示功能

在设置面板中添加开发模式开关,允许用户手动设置服务器信息
修改页脚显示逻辑,根据开发模式状态显示自定义服务器信息或实际服务器信息
添加服务器图标显示功能,支持EdgeOne和Cloudflare的图标显示
This commit is contained in:
二叉树树
2025-12-30 00:45:26 +08:00
parent bba91e21e2
commit 67d4dd9ed1
5 changed files with 180 additions and 11 deletions

63
public/cdn/cf.svg Normal file
View File

@@ -0,0 +1,63 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1239.3 310.1" style="enable-background:new 0 0 1239.3 310.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#404041;}
.st1{fill:#FFFFFF;}
.st2{fill:#F38020;}
.st3{fill:#FAAE40;}
</style>
<g>
<g>
<path class="st0" d="M1158.5,187.7c-3.4,0-6.1-2.7-6.1-6.1c0-3.3,2.7-6.1,6.1-6.1c3.3,0,6.1,2.7,6.1,6.1
C1164.6,185,1161.8,187.7,1158.5,187.7 M1158.5,176.7c-2.7,0-4.9,2.2-4.9,4.9c0,2.7,2.2,4.9,4.9,4.9c2.7,0,4.9-2.2,4.9-4.9
C1163.4,178.9,1161.2,176.7,1158.5,176.7 M1161.6,184.8h-1.4l-1.2-2.3h-1.6v2.3h-1.3v-6.7h3.2c1.4,0,2.3,0.9,2.3,2.2
c0,1-0.6,1.7-1.4,2L1161.6,184.8z M1159.2,181.3c0.5,0,1-0.3,1-1c0-0.8-0.4-1-1-1h-2v2L1159.2,181.3L1159.2,181.3z">
</path>
<polygon class="st0" points="523,174.9 538.6,174.9 538.6,217.4 565.7,217.4 565.7,231 523,231 ">
</polygon>
<path class="st0" d="M581.8,203.1V203c0-16.1,13-29.2,30.3-29.2s30.1,12.9,30.1,29v0.2c0,16.1-13,29.2-30.3,29.2
C594.7,232.1,581.8,219.2,581.8,203.1 M626.4,203.1V203c0-8.1-5.8-15.1-14.4-15.1c-8.5,0-14.2,6.9-14.2,15v0.2
c0,8.1,5.8,15.1,14.3,15.1C620.7,218.1,626.4,211.2,626.4,203.1">
</path>
<path class="st0" d="M661.3,206.4v-31.5h15.8v31.2c0,8.1,4.1,11.9,10.3,11.9s10.3-3.7,10.3-11.5v-31.6h15.8V206
c0,18.1-10.3,26-26.3,26C671.3,232.1,661.3,224,661.3,206.4">
</path>
<path class="st0" d="M737.3,174.9H759c20,0,31.7,11.5,31.7,27.7v0.2c0,16.2-11.8,28.2-32,28.2h-21.3L737.3,174.9L737.3,174.9z
M759.2,217.2c9.3,0,15.5-5.1,15.5-14.2v-0.2c0-9-6.2-14.2-15.5-14.2h-6.3v28.5L759.2,217.2L759.2,217.2z">
</path>
<polygon class="st0" points="813.2,174.9 858.1,174.9 858.1,188.6 828.7,188.6 828.7,198.1 855.3,198.1 855.3,211 828.7,211
828.7,231 813.2,231 ">
</polygon>
<polygon class="st0" points="879.7,174.9 895.2,174.9 895.2,217.4 922.4,217.4 922.4,231 879.7,231 ">
</polygon>
<path class="st0" d="M963,174.5h15l23.9,56.5h-16.7l-4.1-10h-21.6l-4,10h-16.3L963,174.5z M976.7,208.9l-6.2-15.9l-6.3,15.9H976.7
z">
</path>
<path class="st0" d="M1021.9,174.9h26.5c8.6,0,14.5,2.2,18.3,6.1c3.3,3.2,5,7.5,5,13.1v0.2c0,8.6-4.6,14.3-11.5,17.2l13.4,19.6
h-18l-11.3-17h-6.8v17h-15.5L1021.9,174.9L1021.9,174.9z M1047.7,201.9c5.3,0,8.3-2.6,8.3-6.6V195c0-4.4-3.2-6.6-8.4-6.6h-10.2
v13.5L1047.7,201.9L1047.7,201.9z">
</path>
<polygon class="st0" points="1094.1,174.9 1139.2,174.9 1139.2,188.2 1109.5,188.2 1109.5,196.6 1136.4,196.6 1136.4,208.9
1109.5,208.9 1109.5,217.8 1139.6,217.8 1139.6,231 1094.1,231 ">
</polygon>
<path class="st0" d="M489,209.7c-2.2,4.9-6.8,8.4-12.8,8.4c-8.5,0-14.3-7.1-14.3-15.1v-0.2c0-8.1,5.7-15,14.2-15
c6.4,0,11.3,3.9,13.3,9.3h16.4c-2.6-13.4-14.4-23.3-29.6-23.3c-17.3,0-30.3,13.1-30.3,29.2v0.2c0,16.1,12.8,29,30.1,29
c14.8,0,26.4-9.6,29.4-22.4L489,209.7L489,209.7z">
</path>
</g>
<g>
<polygon class="st1" points="391.1,169.6 348.2,145 340.8,141.8 165.3,143.1 165.3,232.1 391.1,232.2 ">
</polygon>
<path class="st2" d="M313,224c2.1-7.2,1.3-13.8-2.2-18.7c-3.2-4.5-8.6-7.1-15.1-7.4l-123.1-1.6c-0.8,0-1.5-0.4-1.9-1
c-0.4-0.6-0.5-1.4-0.3-2.2c0.4-1.2,1.6-2.1,2.9-2.2l124.2-1.6c14.7-0.7,30.7-12.6,36.3-27.2l7.1-18.5c0.3-0.8,0.4-1.6,0.2-2.4
c-8-36.2-40.3-63.2-78.9-63.2c-35.6,0-65.8,23-76.6,54.9c-7-5.2-15.9-8-25.5-7.1c-17.1,1.7-30.8,15.4-32.5,32.5
c-0.4,4.4-0.1,8.7,0.9,12.7c-27.9,0.8-50.2,23.6-50.2,51.7c0,2.5,0.2,5,0.5,7.5c0.2,1.2,1.2,2.1,2.4,2.1l227.2,0
c1.3,0,2.5-0.9,2.9-2.2L313,224z">
</path>
<path class="st3" d="M352.2,144.9c-1.1,0-2.3,0-3.4,0.1c-0.8,0-1.5,0.6-1.8,1.4l-4.8,16.7c-2.1,7.2-1.3,13.8,2.2,18.7
c3.2,4.5,8.6,7.1,15.1,7.4l26.2,1.6c0.8,0,1.5,0.4,1.9,1c0.4,0.6,0.5,1.5,0.3,2.2c-0.4,1.2-1.6,2.1-2.9,2.2l-27.3,1.6
c-14.8,0.7-30.7,12.6-36.3,27.2l-2,5.1c-0.4,1,0.3,2,1.4,2h93.8c1.1,0,2.1-0.7,2.4-1.8c1.6-5.8,2.5-11.9,2.5-18.2
C419.5,175,389.4,144.9,352.2,144.9">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
public/cdn/eo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -27,7 +27,7 @@ try {
<!--<div class="border-t border-[var(--primary)] mx-16 border-dashed py-8 max-w-[var(--page-width)] flex flex-col items-center justify-center px-6">-->
<div class="transition border-t border-black/10 dark:border-white/15 my-10 border-dashed mx-32"></div>
<div class="transition border-t border-black/10 dark:border-white/15 my-10 border-dashed mx-4 md:mx-32"></div>
<div class="card-base w-fit mx-auto rounded-xl mt-4 mb-4">
<div class="transition text-50 text-sm text-center p-6">
&copy; <span id="copyright-year">2024 - {currentYear}</span> <a class="transition link text-[var(--primary)] font-medium" target="_blank" href="https://space.bilibili.com/325903362"> {profileConfig.name} </a>,采用
@@ -47,22 +47,69 @@ try {
<a class="transition link text-[var(--primary)] font-medium inline-flex items-center" href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank"><img alt="" src="/favicon/foot-icp.png" class="h-4 mr-1">皖ICP备2025099787号-2</a>
<br>
<span id="server-info" class="text-black/30 dark:text-white/30 text-xs"></span>
<div class="server-info-wrapper flex items-center justify-center">
<span class="server-info text-black/30 dark:text-white/30 text-xs"></span>
<img class="server-icon h-5 ml-1 hidden bg-white rounded p-0.5" alt="Server Icon">
</div>
<!-- <a class="transition link text-[var(--primary)] font-medium inline-flex items-center" href="https://beian.mps.gov.cn/#/query/webSearch?code=34010302002608" target="_blank"><img alt="" src="/favicon/foot-ga.png" class="h-4 mr-1">皖公网安备34010302002608号</a>
<br> -->
</div>
</div>
<script>
fetch(window.location.href, { method: "HEAD" }).then(response => {
const server = response.headers.get('server');
const serverInfo = document.getElementById('server-info');
if (serverInfo) {
if (server) {
serverInfo.innerText = `访问节点:${server}`;
} else {
serverInfo.innerText = "访问节点:未知";
function updateServerInfo(server) {
const wrappers = document.querySelectorAll('.server-info-wrapper');
wrappers.forEach(wrapper => {
const serverInfo = wrapper.querySelector('.server-info');
const serverIcon = wrapper.querySelector('.server-icon');
if (serverInfo) {
if (server) {
serverInfo.innerText = `访问节点:${server}`;
if (serverIcon) {
const serverLower = server.toLowerCase();
if (serverLower === 'edgeone-pages') {
serverIcon.src = '/cdn/eo.png';
serverIcon.classList.remove('hidden');
serverInfo.classList.add('hidden');
} else if (serverLower === 'cloudflare') {
serverIcon.src = '/cdn/cf.svg';
serverIcon.classList.remove('hidden');
serverInfo.classList.add('hidden');
} else {
serverIcon.classList.add('hidden');
serverInfo.classList.remove('hidden');
}
}
} else {
serverInfo.innerText = "访问节点:未知";
serverInfo.classList.remove('hidden');
if (serverIcon) serverIcon.classList.add('hidden');
}
}
});
}
function initServerInfo() {
const isDevMode = localStorage.getItem("dev-mode") === "true";
if (isDevMode) {
const devServer = localStorage.getItem("dev-server");
updateServerInfo(devServer);
} else {
const url = window.location.href;
fetch(url, { method: "HEAD" })
.then(response => {
const server = response.headers.get('server');
updateServerInfo(server);
})
.catch(error => {
console.error("Failed to fetch server info:", error);
updateServerInfo(null);
});
}
});
}
initServerInfo();
document.addEventListener('astro:after-swap', initServerInfo); // Support View Transitions if enabled
// Support Swup if enabled (listen to content replacement)
document.addEventListener('content:replace', initServerInfo);
</script>

View File

@@ -16,6 +16,10 @@ import {
setBgHueRotate,
getHideBg,
setHideBg,
getDevMode,
setDevMode,
getDevServer,
setDevServer,
} from "@utils/setting-utils";
import { AUTO_MODE, DARK_MODE, LIGHT_MODE } from "@constants/constants";
@@ -25,6 +29,8 @@ let isRainbowMode = getRainbowMode();
let rainbowSpeed = getRainbowSpeed();
let bgBlur = getBgBlur();
let hideBg = getHideBg();
let isDevMode = getDevMode();
let devServer = getDevServer();
let animationId: number;
let lastUpdate = 0;
let rainbowHue = 0; // Independent hue for background rotation
@@ -77,6 +83,15 @@ function toggleHideBg() {
setHideBg(hideBg);
}
function toggleDevMode() {
isDevMode = !isDevMode;
setDevMode(isDevMode);
}
function onDevServerChange() {
setDevServer(devServer);
}
function onSpeedChange() {
setRainbowSpeed(rainbowSpeed);
}
@@ -207,6 +222,32 @@ onMount(() => {
<input aria-label="背景模糊" type="range" min="0" max="20" bind:value={bgBlur}
class="slider" step="1" style="width: 100%">
</div>
<div class="flex flex-row gap-2 mb-3 mt-3 items-center justify-between">
<div class="flex gap-2 font-bold text-lg text-neutral-900 dark:text-neutral-100 transition relative ml-3
before:w-1 before:h-4 before:rounded-md before:bg-[var(--primary)]
before:absolute before:-left-3 before:top-[0.33rem]"
>
开发模式
</div>
<input type="checkbox" class="toggle-switch" checked={isDevMode} on:change={toggleDevMode} />
</div>
{#if isDevMode}
<div class="flex flex-row gap-2 mb-3 items-center justify-between transition-all" >
<div class="flex gap-2 font-bold text-lg text-neutral-900 dark:text-neutral-100 transition relative ml-3
before:w-1 before:h-4 before:rounded-md before:bg-[var(--primary)]
before:absolute before:-left-3 before:top-[0.33rem]"
>
Server
</div>
<div class="flex gap-1">
<input aria-label="Server Value" type="text" bind:value={devServer} on:input={onDevServerChange}
class="transition bg-[var(--btn-regular-bg)] w-32 h-7 rounded-md text-center font-bold text-sm text-[var(--btn-content)] outline-none"
/>
</div>
</div>
{/if}
</div>

View File

@@ -94,6 +94,24 @@ export function setHideBg(hide: boolean): void {
}
}
export function getDevMode(): boolean {
const stored = localStorage.getItem("dev-mode");
return stored === "true";
}
export function setDevMode(enabled: boolean): void {
localStorage.setItem("dev-mode", String(enabled));
}
export function getDevServer(): string {
const stored = localStorage.getItem("dev-server");
return stored || "";
}
export function setDevServer(server: string): void {
localStorage.setItem("dev-server", server);
}
export function applyThemeToDocument(theme: LIGHT_DARK_MODE) {
switch (theme) {
case LIGHT_MODE: