diff --git a/app/[...slug]/page.jsx b/app/[...slug]/page.jsx
index 1229260..f5248fc 100644
--- a/app/[...slug]/page.jsx
+++ b/app/[...slug]/page.jsx
@@ -12,13 +12,20 @@ const LoadingSpinner = () => (
);
-export const revalidate = Number(process.env.JSITE_REVALIDATE_SECONDS) || 3600;
+// 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() {
- const slugs = await getAllSlugs();
- return slugs.map(slug => ({
- slug: slug,
- }));
+ 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 }) {
diff --git a/app/api/revalidate/route.js b/app/api/revalidate/route.js
new file mode 100644
index 0000000..29fbb3c
--- /dev/null
+++ b/app/api/revalidate/route.js
@@ -0,0 +1,55 @@
+import { revalidatePath } from 'next/cache';
+import { NextRequest, NextResponse } from 'next/server';
+
+/**
+ * 按需重新验证 API 路由
+ * 当后端内容更新时,通过调用此 API 来手动触发特定页面的重新生成。
+ *
+ * 调用方式:
+ * POST /api/revalidate
+ * Headers:
+ * Content-Type: application/json
+ * x-revalidate-secret: YOUR_SECRET_TOKEN
+ * Body:
+ * {
+ * "path": "/page-to-revalidate"
+ * }
+ */
+export async function POST(request) {
+
+ // 1. 从请求头中获取密钥
+ const secret = request.headers.get('x-revalidate-secret');
+
+ // 2. 验证密钥
+ // 为了安全,这个密钥应该存储在环境变量中,并且不能硬编码。
+ if (secret !== process.env.REVALIDATE_TOKEN) {
+ console.warn('Invalid revalidate token received.');
+ return NextResponse.json({ message: 'Invalid token' }, { status: 401 });
+ }
+
+ // 3. 从请求体中获取并记录需要重新验证的路径
+ const body = await request.json();
+ const { path } = body;
+
+ console.log('Revalidation request body:', body);
+
+ if (!path) {
+ console.warn('Revalidation request received without a path.');
+ return NextResponse.json({ message: 'Path is required' }, { status: 400 });
+ }
+
+ try {
+ // 4. 调用 Next.js 的 revalidatePath 函数
+ // 这将清除指定路径的缓存,并在下次请求时重新生成页面。
+ revalidatePath(path);
+ console.log(`Successfully revalidated path: ${path}`);
+ return NextResponse.json({ revalidated: true, now: Date.now() });
+ } catch (error) {
+ // 5. 如果发生错误,返回错误信息
+ console.error(`Error revalidating path: ${path}`, error);
+ return NextResponse.json(
+ { message: 'Error revalidating', error: error.message },
+ { status: 500 }
+ );
+ }
+}
\ No newline at end of file
diff --git a/app/page.jsx b/app/page.jsx
index d600861..f4df10b 100644
--- a/app/page.jsx
+++ b/app/page.jsx
@@ -4,7 +4,9 @@ import CategoryItems from "@/components/homes/home-15/CategoryItems";
import React from "react";
import { getSiteSettings } from "@/utils/siteSettings";
-export const revalidate = Number(process.env.JSITE_REVALIDATE_SECONDS) || 3600;
+// 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 generateMetadata() {
const siteUrl = process.env.SITE_URL;
diff --git a/app/products/[...slug]/page.jsx b/app/products/[...slug]/page.jsx
index 7a6c421..e01aa5f 100644
--- a/app/products/[...slug]/page.jsx
+++ b/app/products/[...slug]/page.jsx
@@ -4,6 +4,7 @@ import { getSiteSettings } from "@/utils/siteSettings";
import { notFound } from 'next/navigation';
import DynamicListPage from "@/components/common/DynamicListPage";
import { Suspense } from 'react';
+import { getPageData } from "@/utils/data";
const baseSlug = 'products';
@@ -19,13 +20,8 @@ export async function generateMetadata({ params }) {
const resolvedParams = await params;
const slug = resolvedParams.slug || [];
const slugArr = [baseSlug, ...(Array.isArray(slug) ? slug : [slug])];
- const res = await fetch(`${process.env.SITE_URL}/api/get-page-data`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ slug_list: slugArr })
- });
- const json = await res.json();
- const { data, error, page_info } = json;
+ const { data, error, page_info } = await getPageData({ slug_list: slugArr });
+
if (error) {
return {
title: error.title || 'Page Error',
@@ -52,14 +48,13 @@ export default async function Page({ params }) {
const siteSettings = await getSiteSettings(process.env.SITE_URL);
const pageSize = Number(siteSettings.page_size) || 12;
- // Fetch only page 1 for initial static render
- const res = await fetch(`${process.env.SITE_URL}/api/get-page-data`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ slug_list: slugArr, page: 1, page_size: pageSize })
+ const { data, error, total } = await getPageData({
+ slug_list: slugArr,
+ page: 1,
+ page_size: pageSize,
+ downloadFiles: true,
});
- const result = await res.json();
- const { data, error, total } = result;
+
if (error) {
notFound();
}
diff --git a/components/homes/home-15/SwiperItems/SwiperItemsUI.jsx b/components/homes/home-15/SwiperItems/SwiperItemsUI.jsx
index e0bccef..b2588fc 100644
--- a/components/homes/home-15/SwiperItems/SwiperItemsUI.jsx
+++ b/components/homes/home-15/SwiperItems/SwiperItemsUI.jsx
@@ -22,6 +22,7 @@ export default function SwiperItemsUI({ data, items, ...props }) {
const subtitle = data?.subtitle || props.subtitle;
const category_slug = data?.t3 || props.category_slug || "";
const columns = data?.t5 || props.columns || 4;
+ const button_text = data?.button_text || props.button_text || "查看详情";
const rows = (data?.p1 && !isNaN(Number(data.p1))) ? Number(data.p1) : (props.rows || 1);
// Loading and error states are now handled by the server component and React Suspense.
@@ -190,7 +191,7 @@ export default function SwiperItemsUI({ data, items, ...props }) {
- 查看详情
+ {button_text}
diff --git a/public/files/1732346059482090.jpg b/public/files/1732346059482090.jpg
new file mode 100644
index 0000000..2615a0e
Binary files /dev/null and b/public/files/1732346059482090.jpg differ
diff --git a/public/files/1732346059493375.jpg b/public/files/1732346059493375.jpg
new file mode 100644
index 0000000..b9775f9
Binary files /dev/null and b/public/files/1732346059493375.jpg differ
diff --git a/public/files/1732346060256137.jpg b/public/files/1732346060256137.jpg
new file mode 100644
index 0000000..49de3a4
Binary files /dev/null and b/public/files/1732346060256137.jpg differ
diff --git a/public/files/1732346060269459.jpg b/public/files/1732346060269459.jpg
new file mode 100644
index 0000000..553860b
Binary files /dev/null and b/public/files/1732346060269459.jpg differ