import ProductTabsClient from "@/components/ProductTabsClient"; import { Locale, LOCALES } from "@/i18n/routing"; import { getProducts } from "@/lib/getProducts"; import { constructMetadata } from "@/lib/metadata"; import { Product } from "@/types/product"; import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; import { notFound } from "next/navigation"; type Params = { locale: string; slug: string; }; type MetadataProps = { params: Promise; }; export async function generateMetadata({ params, }: MetadataProps): Promise { const { locale, slug } = await params; try { const { products }: { products: Product[] } = await getProducts(locale); const product = products.find((product) => product.slug === slug); if (!product) { return constructMetadata({ title: "404 - 产品不存在", description: "请求的产品页面未找到", noIndex: true, locale: locale as Locale, path: `/products/${slug}`, canonicalUrl: `/products/${slug}`, }); } return constructMetadata({ page: "products", title: product.title, description: `${product.title} - ${product.model} - ${product.place}`, images: product.images.length ? [product.images[0]] : [], locale: locale as Locale, path: `/products/${slug}`, canonicalUrl: `/products/${slug}`, }); } catch (error) { console.error("生成产品元数据失败:", error); return constructMetadata({ title: "产品详情", description: "产品详情页面", locale: (await params).locale as Locale, path: `/products/${(await params).slug}`, }); } } export default async function ProductPage({ params }: { params: Promise }) { const { locale, slug } = await params; const { products }: { products: Product[] } = await getProducts(locale); const product = products.find((item) => item.slug == slug); if (!product) return notFound(); const t = await getTranslations({ locale, namespace: "Product" }); // 获取所有产品图片 const allImages = product.images || []; const formattedPublishTime = (() => { if (!product.publishedTime) return "暂无"; const publishDate = typeof product.publishedTime === 'string' ? new Date(product.publishedTime) : product.publishedTime; return isNaN(publishDate.getTime()) ? "暂无" : publishDate.toLocaleDateString("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit", }); })(); return (

{t("detailTitle")}

{/* 调整后:左侧大图+下方缩略图 + 右侧信息 */}
{/* 左侧图片区域(大图+缩略图) */}
{/* 第一张大图 */} {allImages.length > 0 ? (
{`${product.title
) : (
暂无产品图片
)}
{/* 右侧产品信息区域 */}

{product.title || "未命名产品"}

{t("productModel")}: {product.model || "暂无"}
{t("productPlace")}: {product.place || "暂无"}
{t("productPublishedTime")}: {formattedPublishTime}
{/* 所有图片缩略图(横向滚动) */} {allImages.length > 0 && (
{allImages.map((img, index) => (
{`${product.title
))}
)}
); } export async function generateStaticParams() { try { const defaultLocale = LOCALES[0]; const { products }: { products: Product[] } = await getProducts(defaultLocale); const validProducts = products.filter((product) => product.slug.toString() && product.title); return LOCALES.flatMap((locale) => validProducts.map((product) => ({ locale, slug: product.slug.toString(), })) ); } catch (error) { console.error("生成产品静态参数失败:", error); return []; } }