Files
website/.vitepress/config.mts
T
Dai0814 07b8321d18
mirror-to-gitee / mirror (push) Successful in 4s
feat(portal): 移除教程模块(导航入口、教程中心页、三项目教程视频页)
按要求删除导航栏「教程」及整个教程模块。

删除内容
- 导航项「教程」(/guide/videos) 及其 activeMatch
- 侧边栏「教程中心」条目
- pages/guide/videos.md(教程中心页,76 行)
- pages/projects/{iotlcm,xiu-dtu,xiu-admin}/guide/tutorial.md(三份教程视频页,共 251 行)
- data/projects.ts 里三个项目的「教程视频」子页面登记

同步清理的引用(避免 404)
- pages/projects/iotlcm/index.md:“下一步”表格里的教程视频行
- pages/projects/iotlcm/guide/quickstart.md:“下一步”里的教程链接
- 4 个审计脚本里的教程路径:
  audit-band-offset.mjs / audit-layout.mjs / audit-sidebar-footer.mjs / render-check.mjs
- 注释里「教程等」的措辞

保留的内容(与本次无关,未动)
- DemoVideo.vue 及其 data/demo.ts 里的 demoVideos:
  那是「系统演示」页里的 BV 号外链卡片,不是教程栏目
- compare.md 里「录屏教程」对比维度:属于竞品对比表的正常描述

验证
- 导航实测 8 项:首页/系统演示/产品功能/核心能力/界面预览/项目/官方文档/联系我们,无「教程」
- 侧边栏实测仅「门户部署」
- 干净副本构建成功,产物中无 tutorial/videos 文件
- 断链检查:失效项里无一条与教程相关
- check-registry 与 check-nav-brand 通过
2026-11-06 11:56:25 +08:00

160 lines
5.4 KiB
TypeScript

import { defineConfig } from 'vitepress'
import { projects } from '../data/projects'
import { docs, DOCS_HOME } from '../data/content'
/**
* 门户站构建配置
*
* SITE_BASE 由构建参数注入:
* - /www/ 过渡形态:挂在已有网关的 /www/ 路径下(没有独立域名时用)
* - / 独立域名形态:站点独占域名根路径
* 两者内容完全同源,只有资源前缀与路由前缀不同,所以用构建参数而不是改代码。
*/
const SITE_BASE = process.env.SITE_BASE ?? '/www/'
/** 代码仓组织(雪羊科技企业仓) */
const ORG_URL = process.env.ORG_URL ?? 'https://gitee.com/snowgoat'
/** 各项目的文档站地址(按项目 id 覆盖) */
const DOCS_URL: Record<string, string> = {
iotlcm: 'http://open.5iot.com:5051/docs/',
}
function tokenizeSearchText(text: string): string[] {
const terms = text.match(/[A-Za-z0-9]+|[\u3400-\u9fff]+/g) ?? []
return terms.flatMap((term) => {
if (!/^[\u3400-\u9fff]+$/.test(term)) return [term.toLowerCase()]
if (term.length === 1) return [term]
return Array.from({ length: term.length - 1 }, (_, index) => term.slice(index, index + 2))
})
}
const searchTranslations = {
button: {
buttonText: '搜索',
buttonAriaLabel: '搜索文档',
},
modal: {
displayDetails: '显示详细结果',
resetButtonTitle: '清除搜索',
backButtonTitle: '关闭搜索',
noResultsText: '没有找到相关结果',
footer: {
selectText: '选择',
selectKeyAriaLabel: '回车',
navigateText: '切换结果',
navigateUpKeyAriaLabel: '上箭头',
navigateDownKeyAriaLabel: '下箭头',
closeText: '关闭',
closeKeyAriaLabel: '退出',
},
},
}
export default defineConfig({
srcDir: './pages',
base: SITE_BASE,
title: '雪羊科技物联网卡与设备管理平台',
description: '雪羊科技开源的物联网卡与设备管理平台:物联网卡管理、DTU 设备管理、中后台开发框架,Apache-2.0 许可',
lang: 'zh-CN',
cleanUrls: true,
lastUpdated: false,
head: [
['link', { rel: 'icon', type: 'image/svg+xml', href: `${SITE_BASE}favicon.svg` }],
],
themeConfig: {
/**
* 导航左上角的品牌名 —— 主体固定为「雪羊科技」,不要替换成别的字。
*
* 后面那截 <span class="site-subtitle">物联网卡与设备管理平台</span>
* 是品牌定位副标题(样式见 portal.css 的 .site-subtitle),
* 与品牌名一起构成左上角的两行结构:上行品牌、下行定位。
*
* 注意区分:
* config.title → 浏览器标签页与 SEO 用的完整站名,不显示在导航
* siteTitle → 左上角实际渲染的内容
* 校验见 scripts/check-nav-brand.mjs(构建前自动执行)。
*/
siteTitle: '雪羊科技<span class="site-subtitle">物联网卡与设备管理平台</span>',
logo: { src: '/snowgoat-logo.png', alt: '雪羊科技' },
nav: [
{ text: '首页', link: '/' },
{ text: '产品功能', link: '/#features' },
{ text: '核心能力', link: '/#core' },
{ text: '界面预览', link: '/#preview' },
// activeMatch:进入任一项目详情页时「项目」保持高亮
{ text: '项目', link: '/projects/', activeMatch: '^/projects/' },
// 官方文档直接跳文档站(外站),不在本站内做锚点停留
{
text: '官方文档',
link: DOCS_HOME,
target: '_blank',
rel: 'noopener',
},
{ text: '关于', link: '/about' },
],
sidebar: {
'/projects/': [
{
text: '项目',
collapsed: false,
// 每个项目带自己的子页面(快速开始 / 部署 / 手册等),
// 子页面清单来自注册表的 sections,不在此处重复维护。
items: projects.map((p) => ({
text: p.name,
link: p.page,
collapsed: false,
items: p.sections.map((s) => ({ text: s.text, link: s.link })),
})),
},
],
'/guide/': [
{
text: '门户',
collapsed: false,
items: [
{ text: '门户部署', link: '/guide/portal-deploy' },
],
},
],
},
socialLinks: [
{ icon: 'github', link: ORG_URL },
],
footer: {
message: '雪羊科技物联网卡与设备管理平台 · Apache-2.0',
copyright: 'Copyright © 雪羊科技',
},
search: {
provider: 'local',
options: {
translations: searchTranslations,
miniSearch: {
options: { tokenize: tokenizeSearchText },
searchOptions: { combineWith: 'AND' },
},
_render(src, env, md) {
const html = md.render(src, env)
if (env.relativePath !== 'index.md') return html
const homeSearchText = [
'雪羊科技开源 首页 项目 产品功能 核心能力 界面预览 官方文档',
...projects.map((project) => `${project.name} ${project.tagline} ${project.summary}`),
...docs.map((doc) => `${doc.name} ${doc.desc} ${doc.project}`),
].join('\n\n')
return `${html}\n${md.render(homeSearchText, env)}`
},
},
},
outline: {
level: [2, 3],
label: '本页目录',
},
docFooter: {
prev: '上一页',
next: '下一页',
},
},
})