+
+ Yuzhiran AI
+
+
+ AI Tools & Knowledge
+
+
+ Community
+
+
+ Tools, Prompts, Skills & Sandbox for everyone
+
+
+ ),
+ { ...size },
+ );
+}
diff --git a/frontend/src/app/practices/[id]/page.tsx b/frontend/src/app/practices/[id]/page.tsx
index fc450a5..3b24c09 100644
--- a/frontend/src/app/practices/[id]/page.tsx
+++ b/frontend/src/app/practices/[id]/page.tsx
@@ -1,10 +1,57 @@
+import type { Metadata } from 'next';
+import { API_BASE, SITE_URL } from '@/lib/config';
+import { articleJsonLd, breadcrumbJsonLd, absoluteUrl } from '@/lib/seo';
import PracticeDetailClient from './client';
+async function getPractice(id: string) {
+ try {
+ const res = await fetch(`${API_BASE}/practices/${id}`, { next: { revalidate: 3600 } });
+ if (!res.ok) return null;
+ return res.json();
+ } catch {
+ return null;
+ }
+}
+
export function generateStaticParams() {
const ids = Array.from({ length: 20 }, (_, i) => i + 1);
- return ids.map(id => ({ id: String(id) }));
+ return ids.map((id) => ({ id: String(id) }));
}
-export default function PracticeDetailPage() {
- return