diff --git a/app/(website)/[...slug]/page.jsx b/app/(website)/[...slug]/page.jsx
index 76b71b8..e1dc2bd 100644
--- a/app/(website)/[...slug]/page.jsx
+++ b/app/(website)/[...slug]/page.jsx
@@ -4,7 +4,8 @@ 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";
+import { getPageData } from "@/utils/data";
+import ProductImageGallery from "@/components/products/ProductImageGallery";
const LoadingSpinner = () => (
@@ -12,29 +13,13 @@ 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 slug = resolvedParams.slug || [];
+ const slugArr = Array.isArray(slug) ? slug : [slug];
+ const { data, error, page_info } = await getPageData({ slug_list: slugArr });
const siteSettings = await getSiteSettings();
const siteTitle = siteSettings.site_title || '';
const siteName = siteSettings.site_name || '';
@@ -76,31 +61,30 @@ export async function generateMetadata({ params }) {
};
}
-export default async function DynamicPage({ params, searchParams }) {
+export default async function Page({ params, searchParams }) {
const resolvedParams = await params;
- const slugArr = resolvedParams.slug;
+ const slug = resolvedParams.slug || [];
+ const slugArr = Array.isArray(slug) ? slug : [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: true // Download files for page rendering
+ downloadFiles: true,
});
if (error) {
notFound();
}
-
- const bannerComponentName = 'Banner-' + (slugArr[0] || 'home');
- const categoryComponentName = 'Category-' + (slugArr[0] || 'home');
-
+ const pageSlugBase = slugArr.length ? slugArr[slugArr.length - 1] : '';
+ const bannerComponentName = `Banner-${pageSlugBase}`;
+ const categoryComponentName = `Category-${pageSlugBase}`;
if (Array.isArray(data)) {
- const currentPath = '/' + (Array.isArray(slugArr) ? slugArr.join('/') : '');
- const listColumns = 4;
-
+ const currentPath = '/' + slugArr.join('/');
+ const listColumns = 4;
return (
<>
@@ -138,31 +122,30 @@ export default async function DynamicPage({ params, searchParams }) {
{/* 图片和附加信息并排显示,响应式优化 */}
{(data.image || data.subtitle) && (
-
- {data.image && (
-
-

-
- )}
- {data.subtitle && (
-
- {data.subtitle}
-
- )}
+
+ {/* 图片轮播区块 */}
+
+
+
+ {/* 产品标题 */}
+ {data.title && (
+
+ {data.title}
+
+ )}
+ {/* 产品副标题 */}
+ {data.subtitle && (
+
+ {data.subtitle}
+
+ )}
+
)}
- {/* Product Description 标题 */}
-
- {data.additional_content && (
- <>
- {/* Testing Report 标题 */}
-
- >
- )}
+ {/* 内容区域 */}
+
@@ -173,4 +156,4 @@ export default async function DynamicPage({ params, searchParams }) {
} else {
notFound();
}
-}
+}
diff --git a/public/files/aidc6054er_d92979cb.png b/public/files/aidc6054er_d92979cb.png
new file mode 100644
index 0000000..03827d0
Binary files /dev/null and b/public/files/aidc6054er_d92979cb.png differ
diff --git a/public/files/alv6ce8dj3_33b57c55.png b/public/files/alv6ce8dj3_33b57c55.png
new file mode 100644
index 0000000..ef9ba0e
Binary files /dev/null and b/public/files/alv6ce8dj3_33b57c55.png differ
diff --git a/public/files/aohums8vsl_3bd3733b.png b/public/files/aohums8vsl_3bd3733b.png
new file mode 100644
index 0000000..5b86caa
Binary files /dev/null and b/public/files/aohums8vsl_3bd3733b.png differ
diff --git a/public/files/aohums8vsl_ba6de487.png b/public/files/aohums8vsl_ba6de487.png
new file mode 100644
index 0000000..2da81f4
Binary files /dev/null and b/public/files/aohums8vsl_ba6de487.png differ
diff --git a/public/files/at05gkd37k_c02c70ce.png b/public/files/at05gkd37k_c02c70ce.png
new file mode 100644
index 0000000..7f3ea7e
Binary files /dev/null and b/public/files/at05gkd37k_c02c70ce.png differ
diff --git a/public/files/e7hkd4aq3m_17f58530.png b/public/files/e7hkd4aq3m_17f58530.png
new file mode 100644
index 0000000..df7b38b
Binary files /dev/null and b/public/files/e7hkd4aq3m_17f58530.png differ
diff --git a/public/files/e7shufki1s_12f8024e.png b/public/files/e7shufki1s_12f8024e.png
new file mode 100644
index 0000000..650e0dc
Binary files /dev/null and b/public/files/e7shufki1s_12f8024e.png differ
diff --git a/public/files/ef0g85canc_afd8ca27.png b/public/files/ef0g85canc_afd8ca27.png
new file mode 100644
index 0000000..d2bc33c
Binary files /dev/null and b/public/files/ef0g85canc_afd8ca27.png differ
diff --git a/public/files/ehng0ni35f_a6847c82.png b/public/files/ehng0ni35f_a6847c82.png
new file mode 100644
index 0000000..836a7b8
Binary files /dev/null and b/public/files/ehng0ni35f_a6847c82.png differ
diff --git a/public/files/ek5pp8snc0_cf17fef5.png b/public/files/ek5pp8snc0_cf17fef5.png
new file mode 100644
index 0000000..47005b6
Binary files /dev/null and b/public/files/ek5pp8snc0_cf17fef5.png differ
diff --git a/public/files/o2gnd8a1io_ce51fbd5.png b/public/files/o2gnd8a1io_ce51fbd5.png
new file mode 100644
index 0000000..bb16bbb
Binary files /dev/null and b/public/files/o2gnd8a1io_ce51fbd5.png differ