feat: 接入后端全局Snippet(导航菜单/站点设置),补充团队/证言/合作伙伴 service 层

- Header 改为异步 Server Component,接入 NavigationMenu(name=main),
  接口不可用或未配置时回退静态导航项
- Footer 改为异步 Server Component,接入 SiteSettings,
  公司名/ICP备案号/备案链接优先取后台配置,缺省回退硬编码值
- types/wagtail.ts 新增 TeamMember/Testimonial/Partner/NavigationMenu/SiteSettings 类型
- 新增 services: team/testimonial/partner/navigation/site-settings.service.ts
- lint、build 均已验证通过
This commit is contained in:
2026-08-07 13:06:45 +08:00
parent 77e1208c31
commit 24a2311e20
8 changed files with 159 additions and 11 deletions
+19
View File
@@ -0,0 +1,19 @@
import { fetchAPI } from "./api-client";
import type { NavigationMenuValue } from "@/types/wagtail";
/**
* 根据 name(如 main / footer)获取导航菜单(apps.core.NavigationMenu Snippet)。
* 未在后台配置对应菜单时返回 null,调用方应回退到静态导航项。
*/
export async function getNavigationMenu(
name: string,
): Promise<NavigationMenuValue | null> {
try {
return await fetchAPI<NavigationMenuValue>(
`/api/v1/custom/core/navigation/?name=${encodeURIComponent(name)}`,
{ tags: [`navigation:${name}`] },
);
} catch {
return null;
}
}
+11
View File
@@ -0,0 +1,11 @@
import { fetchAPI } from "./api-client";
import type { PartnerValue } from "@/types/wagtail";
/** 获取合作伙伴/客户 Logo 列表(apps.core.Partner Snippet)。 */
export async function getPartners(): Promise<PartnerValue[]> {
const res = await fetchAPI<{ items: PartnerValue[] }>(
"/api/v1/custom/core/partners/",
{ tags: ["partners"] },
);
return res.items;
}
+14
View File
@@ -0,0 +1,14 @@
import { fetchAPI } from "./api-client";
import type { SiteSettingsValue } from "@/types/wagtail";
/** 获取站点全局配置(apps.core.SiteSettingswagtail.contrib.settings)。 */
export async function getSiteSettings(): Promise<SiteSettingsValue | null> {
try {
return await fetchAPI<SiteSettingsValue>(
"/api/v1/custom/core/site-settings/",
{ tags: ["site-settings"] },
);
} catch {
return null;
}
}
+11
View File
@@ -0,0 +1,11 @@
import { fetchAPI } from "./api-client";
import type { TeamMemberValue } from "@/types/wagtail";
/** 获取团队成员列表(apps.core.TeamMember Snippet)。 */
export async function getTeamMembers(): Promise<TeamMemberValue[]> {
const res = await fetchAPI<{ items: TeamMemberValue[] }>(
"/api/v1/custom/core/team/",
{ tags: ["team"] },
);
return res.items;
}
+11
View File
@@ -0,0 +1,11 @@
import { fetchAPI } from "./api-client";
import type { TestimonialValue } from "@/types/wagtail";
/** 获取客户证言列表(apps.core.Testimonial Snippet)。 */
export async function getTestimonials(): Promise<TestimonialValue[]> {
const res = await fetchAPI<{ items: TestimonialValue[] }>(
"/api/v1/custom/core/testimonials/",
{ tags: ["testimonials"] },
);
return res.items;
}