Files
novalon-website/src/app/(marketing)/services/page.tsx
T
zhangxiang 337e1e60c0 feat(cms): 品牌叙事与结构性文案全站 CMS 化并补齐信任证据阶段 0
- 品牌叙事内核(价值主张/定位/承诺/三支柱/语气)下沉 site-config,经 SiteConfigProvider 注入全站
- 新增 page-copy 内容模型承载结构性文案(章节标题/眉标/描述/CTA/空状态),覆盖首页+服务/方案/产品/案例/新闻列表页,「CMS 优先 + 硬编码兜底」不白屏
- 首页「首批客户共创计划」板块(earlyAccessTitle/CtaLabel/Status 驱动)替代单行标签,如实呈现共创/内测/授权公开三档状态
- 关于页资质区数据空时如实展示「建设中」空态
- 零编造:不虚构客户/数据/资质
2026-08-20 09:25:12 +08:00

21 lines
1.2 KiB
TypeScript

import { Metadata } from 'next';
import { COMPANY_INFO } from '@/lib/constants';
import { getPublishedItems, getPageCopy } from '@/lib/cms/data-server';
import type { Service } from '@/lib/constants/services';
import ServicesContentV3 from './services-content-v3';
export const metadata: Metadata = {
title: `服务 - ${COMPANY_INFO.displayName}`,
description: `专业技术团队,为您提供全方位的数字化解决方案。${COMPANY_INFO.displayName}涵盖软件开发、数据分析、咨询服务等核心业务。`,
};
// ISR:生产环境每 1 小时自动重新验证,CMS 发布/更新时通过 /api/cms/revalidate 主动刷新
export const revalidate = 3600;
export default async function ServicesPage() {
const items = await getPublishedItems('service');
const services = items.map((item) => ({ ...item.data, id: item.data.id || item.id, slug: item.data.slug || item.slug, title: item.data.title || item.title } as unknown as Service));
// 服务页结构性文案(Hero/区块标题/CTA/空状态),CMS 未配置时组件内部兜底
const pageCopy = await getPageCopy('services').catch(() => null);
return <ServicesContentV3 services={services} pageCopy={pageCopy?.data ?? null} />;
}