web-nuxt 的 Footer 是配置驱动的。请编辑 apps/web-nuxt/zship.app.json,并把 Footer 相关内容放在顶层 footer 对象里。
不要把 Footer 文案、链接或法律说明硬编码进 LandingFooter.vue。组件只负责渲染 siteConfig.footer。
Footer 字段
{
"footer": {
"brandDisplay": "logo-and-site-name",
"contactEmail": "[email protected]",
"description": [
{
"en": "Short product promise for the footer.",
"zh-CN": "底部展示的简短产品说明。"
}
],
"socialLinks": [
{
"labelKey": "footer_github",
"to": "https://github.com/your-org/your-repo",
"external": true,
"icon": "i-simple-icons-github"
}
],
"sections": [
{
"titleKey": "footer_section_product",
"items": [
{
"labelKey": "nav_pricing",
"to": "/pricing"
}
]
}
],
"disclaimer": [
{
"en": "Optional legal or trademark disclaimer.",
"zh-CN": "可选的法律或商标免责声明。"
}
],
"copyright": "© {year} {siteName}"
}
}
字段说明
brandDisplay:控制品牌展示方式,可选logo-and-site-name、logo-only、site-name-only。contactEmail:Footer 专用联系邮箱。设为空字符串可以隐藏邮箱行;如果省略该字段,会回退到顶层contactEmail。description:Footer 左侧的描述文案,可以配置多行。多语言站点建议使用 localized object。socialLinks:邮箱下方的社交图标按钮。每一项需要to、icon,以及labelKey或多语言label。设为空数组可以隐藏所有社交按钮。sections:右侧导航列。每个栏目使用titleKey或label,每个链接使用labelKey或label加to。disclaimer:底部法律或商标声明。设为空数组可以隐藏。copyright:底部左侧版权文案,支持{year}、{siteName}、{brandName}。设为空字符串可以隐藏。
标签与多语言
已有翻译建议复用 apps/web-nuxt/app/i18n/ui.json 里的 labelKey:
{
"labelKey": "footer_support",
"to": "/docs/support-and-refund"
}
产品专属链接可以直接写多语言 label:
{
"label": {
"en": "Changelog",
"zh-CN": "更新日志"
},
"to": "/blog/changelog"
}
多语言对象可以包含 en、zh-CN、zh-TW 或 default。如果当前语言缺失,系统会回退到默认语言或第一个非空值。
链接规则
- 站内路由以
/开头,例如/pricing或/docs/quick-start。 - 页面锚点可以写成
/#section-id。 - 外部链接需要设置
"external": true。 /llms.txt这类站内非页面资源可以设置"localize": false,保留原始 URL。- 可以使用
mailto:链接,但 Footer 邮箱通常建议用footer.contactEmail管理。
上线检查清单
正式发布前请确认:
footer.description不再保留模板占位文案。footer.contactEmail指向真实支持邮箱。- 所有
footer.sections[].items[].to都是存在的路由。 - 外部链接指向正确的品牌账号。
footer.disclaimer符合你的法律与商标使用策略。- 执行
pnpm --filter @zship/web-nuxt exec nuxt prepare。
