72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
import type { Metadata } from 'next'
|
|
import './globals.css'
|
|
import Providers from './providers'
|
|
import { prisma } from '@/lib/prisma'
|
|
|
|
// 强制动态渲染,避免构建时数据库连接错误
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
async function getSystemSettings() {
|
|
try {
|
|
// 直接从数据库查询,避免网络请求超时问题
|
|
const settings = await prisma.systemSettings.findFirst({
|
|
select: {
|
|
siteName: true,
|
|
}
|
|
})
|
|
return settings
|
|
} catch (error) {
|
|
console.error('Failed to fetch system settings:', error)
|
|
}
|
|
return null
|
|
}
|
|
|
|
export async function generateMetadata(): Promise<Metadata> {
|
|
const settings = await getSystemSettings()
|
|
|
|
return {
|
|
title: settings?.siteName || 'FLNXI素材库',
|
|
description: '3D素材分享平台',
|
|
}
|
|
}
|
|
|
|
const themeInitScript = `
|
|
(function() {
|
|
try {
|
|
var storageKey = 'admin-theme-preference';
|
|
var classNameDark = 'dark';
|
|
var stored = typeof window !== 'undefined' ? window.localStorage.getItem(storageKey) : null;
|
|
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
var theme = stored === 'light' || stored === 'dark' ? stored : (prefersDark ? 'dark' : 'light');
|
|
var root = document.documentElement;
|
|
if (theme === 'dark') {
|
|
root.classList.add(classNameDark);
|
|
} else {
|
|
root.classList.remove(classNameDark);
|
|
}
|
|
root.dataset.theme = theme;
|
|
} catch (error) {
|
|
console.warn('初始化主题失败', error);
|
|
}
|
|
})();
|
|
`
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
return (
|
|
<html lang="zh-CN" suppressHydrationWarning>
|
|
<body className="font-sans antialiased">
|
|
<script dangerouslySetInnerHTML={{ __html: themeInitScript }} />
|
|
<Providers>
|
|
{children}
|
|
</Providers>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|
|
|
|
|