import Banner from "@/components/banner/Banner";
import Category from "@/components/sidebar/Category";
import { getSiteSettings } from "@/utils/data";
import { notFound } from 'next/navigation';
import DynamicListPage from "@/components/common/DynamicListPage";
import { Suspense } from 'react';
import { getPageData, getAllSlugs } from "@/utils/data";
const LoadingSpinner = () => (
);
// Using a static value to comply with Next.js 15 build requirements.
// On-demand revalidation will be handled via the API route.
export const revalidate = 3600;
export async function generateStaticParams() {
try {
const slugs = await getAllSlugs();
return slugs.map(slug => ({
slug: slug,
}));
} catch (error) {
console.error("Failed to generate static params:", error);
return [];
}
}
export async function generateMetadata({ params }) {
const resolvedParams = await params;
const slugArr = resolvedParams.slug;
const { data, error, page_info } = await getPageData({
slug_list: slugArr,
downloadFiles: false // Do not download files for metadata
});
const siteSettings = await getSiteSettings();
const siteTitle = siteSettings.site_title || '';
const siteName = siteSettings.site_name || '';
const siteNameInPageTitles = siteSettings.site_name_in_page_titles || 'None';
let title = '';
if (error) {
title = error.title || 'Page Error';
return {
title,
description: error.message || '',
};
}
if (Array.isArray(data) && page_info) {
title = page_info.meta_title || page_info.title || '';
if (siteName && title) {
if (siteNameInPageTitles === 'After') {
title = `${title} - ${siteName}`;
} else if (siteNameInPageTitles === 'Before') {
title = `${siteName} - ${title}`;
}
}
return {
title,
description: page_info.meta_description || '',
};
}
title = data?.meta_title || data?.title || '';
if (siteName && title) {
if (siteNameInPageTitles === 'After') {
title = `${title} - ${siteName}`;
} else if (siteNameInPageTitles === 'Before') {
title = `${siteName} - ${title}`;
}
}
return {
title,
description: data?.meta_description || '',
};
}
export default async function DynamicPage({ params, searchParams }) {
const resolvedParams = await params;
const slugArr = resolvedParams.slug;
const siteSettings = await getSiteSettings();
const pageSize = Number(siteSettings.page_size) || 12;
// 始终获取第一页的数据用于静态生成
const { data, error, total } = await getPageData({
slug_list: slugArr,
page: 1,
page_size: pageSize,
downloadFiles: false,
rewriteToProxy: true
});
if (error) {
notFound();
}
const bannerComponentName = 'Banner-' + (slugArr[0] || 'home');
const categoryComponentName = 'Category-' + (slugArr[0] || 'home');
if (Array.isArray(data)) {
const currentPath = '/' + (Array.isArray(slugArr) ? slugArr.join('/') : '');
const listColumns = 4;
return (
<>
>
);
} else if (data) {
return (
<>
{/* 图片和附加信息并排显示,响应式优化 */}
{(data.image || data.subtitle) && (
{data.image && (
)}
{data.subtitle && (
{data.subtitle}
)}
)}
{data.additional_content && (
<>
>
)}
>
);
} else {
notFound();
}
}