import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; import { articleUrl, getPublishedArticle } from '@/lib/articles'; const siteUrl = (process.env.NEXT_PUBLIC_SITE_URL || process.env.PUBLIC_SITE_URL || 'https://www.aiameiba.com').replace(/\/$/, ''); const formatDate = (value: string) => { const date = new Date(value); return Number.isNaN(date.getTime()) ? value : date.toLocaleDateString('zh-CN'); }; const paragraphs = (body: string) => body.split(/\n\s*\n/).map(item => item.trim()).filter(Boolean); export async function generateMetadata({ params }: { params: { identifier: string } }): Promise { const article = await getPublishedArticle(params.identifier); if (!article) return { title: '文章不存在' }; const localUrl = `${siteUrl}${articleUrl(article)}`; const canonical = article.canonical_url || localUrl; return { title: article.title, description: article.summary, alternates: { canonical }, openGraph: { type: 'article', title: article.title, description: article.summary, url: canonical, images: article.cover_image_url ? [{ url: article.cover_image_url }] : undefined, publishedTime: article.published_at, modifiedTime: article.updated_at, authors: [article.author_name], }, }; } export default async function KnowledgeArticlePage({ params }: { params: { identifier: string } }) { const article = await getPublishedArticle(params.identifier); if (!article) notFound(); const localUrl = `${siteUrl}${articleUrl(article)}`; const canonical = article.canonical_url || localUrl; const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', headline: article.title, description: article.summary, url: canonical, mainEntityOfPage: localUrl, author: { '@type': 'Organization', name: article.author_name }, publisher: { '@type': 'Organization', name: '阿美巴AI', url: siteUrl }, datePublished: article.published_at, dateModified: article.updated_at, image: article.cover_image_url || undefined, articleSection: article.category, }; return (