添加自定义主题支持

This commit is contained in:
mtvpls
2025-12-12 18:06:34 +08:00
parent 4ff7c1caf3
commit 15d86e3252
7 changed files with 918 additions and 1 deletions

View File

@@ -0,0 +1,74 @@
/* eslint-disable @typescript-eslint/no-explicit-any,no-console */
import { NextRequest, NextResponse } from 'next/server';
import { getConfig } from '@/lib/config';
import { getThemeCSS } from '@/styles/themes';
export const runtime = 'nodejs';
export async function GET(request: NextRequest) {
try {
const adminConfig = await getConfig();
const themeConfig = adminConfig.ThemeConfig;
// 如果没有配置主题返回空CSS
if (!themeConfig) {
return new NextResponse('', {
headers: {
'Content-Type': 'text/css',
'Cache-Control': 'no-store',
},
});
}
let css = '';
// 如果启用了内置主题使用内置主题CSS
if (themeConfig.enableBuiltInTheme) {
css = getThemeCSS(themeConfig.builtInTheme as any);
} else {
// 否则使用自定义CSS
css = themeConfig.customCSS || '';
}
// 设置缓存控制
const cacheMinutes = themeConfig.cacheMinutes || 1440; // 默认1天1440分钟
const maxAge = cacheMinutes * 60; // 转换为秒
const staleWhileRevalidate = maxAge * 7; // 过期后7倍时间内可使用旧版本
const cacheControl = themeConfig.enableCache
? `public, max-age=${maxAge}, stale-while-revalidate=${staleWhileRevalidate}`
: 'no-store';
// 添加版本号到ETag
const etag = `"${themeConfig.cacheVersion}"`;
// 检查客户端缓存
const ifNoneMatch = request.headers.get('if-none-match');
if (ifNoneMatch === etag && themeConfig.enableCache) {
return new NextResponse(null, {
status: 304,
headers: {
'Cache-Control': cacheControl,
ETag: etag,
},
});
}
return new NextResponse(css, {
headers: {
'Content-Type': 'text/css; charset=utf-8',
'Cache-Control': cacheControl,
ETag: etag,
},
});
} catch (error) {
console.error('获取主题CSS失败:', error);
return new NextResponse('', {
headers: {
'Content-Type': 'text/css',
'Cache-Control': 'no-store',
},
});
}
}