feat(cms): integrate global layout with CMS and document decision

- Move site-config and navigation to CMS-backed SiteConfigProvider
- Keep static constants as fallback for dev and degraded modes
- Add ADR-0005 recording the global layout CMS strategy

Refs ADR-0005
This commit is contained in:
张翔
2026-07-08 14:46:14 +08:00
parent 38be4a19ef
commit f4b98fb730
6 changed files with 282 additions and 39 deletions
+15 -13
View File
@@ -15,6 +15,8 @@ import { BackToTop } from "@/components/ui/back-to-top";
import { ClientLayout } from "@/components/layout/client-layout";
import { getPublishedItems } from "@/lib/cms/data-server";
import { SiteConfigProvider, type SiteConfig, type NavigationItem, type MegaDropdownGroup } from "@/lib/site-config";
import { COMPANY_INFO } from "@/lib/constants/company";
import { NAVIGATION_V2, MEGA_DROPDOWN_DATA } from "@/lib/constants/navigation";
export const metadata: Metadata = {
metadataBase: new URL("https://www.novalon.cn"),
@@ -90,19 +92,19 @@ export default async function RootLayout({
const configData = configItems[0]?.data as Record<string, unknown> | undefined;
const siteConfig: SiteConfig = {
name: (configData?.name as string) || '',
shortName: (configData?.shortName as string) || '',
displayName: (configData?.displayName as string) || '',
slogan: (configData?.slogan as string) || '',
description: (configData?.description as string) || '',
founded: (configData?.founded as string) || '',
location: (configData?.location as string) || '',
email: (configData?.email as string) || '',
address: (configData?.address as string) || '',
icp: (configData?.icp as string) || '',
police: (configData?.police as string) || '',
mainNav: (navData?.mainNav as NavigationItem[]) || [],
megaDropdown: (navData?.megaDropdown as Record<string, MegaDropdownGroup[]>) || {},
name: (configData?.name as string) || COMPANY_INFO.name,
shortName: (configData?.shortName as string) || COMPANY_INFO.shortName,
displayName: (configData?.displayName as string) || COMPANY_INFO.displayName,
slogan: (configData?.slogan as string) || COMPANY_INFO.slogan,
description: (configData?.description as string) || COMPANY_INFO.description,
founded: (configData?.founded as string) || COMPANY_INFO.founded,
location: (configData?.location as string) || COMPANY_INFO.location,
email: (configData?.email as string) || COMPANY_INFO.email,
address: (configData?.address as string) || COMPANY_INFO.address,
icp: (configData?.icp as string) || COMPANY_INFO.icp,
police: (configData?.police as string) || COMPANY_INFO.police,
mainNav: (navData?.mainNav as NavigationItem[]) || NAVIGATION_V2,
megaDropdown: (navData?.megaDropdown as Record<string, MegaDropdownGroup[]>) || MEGA_DROPDOWN_DATA,
};
return (