Files
soul/lib/documentation/catalog.ts
2026-01-09 11:58:08 +08:00

152 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { bookData, specialSections } from "@/lib/book-data"
export type DocumentationPage = {
path: string
title: string
subtitle?: string
caption?: string
group: string
waitForSelector?: string
order?: number
}
function pickRepresentativeReadIds(): { id: string; title: string; group: string }[] {
const picks: { id: string; title: string; group: string }[] = []
picks.push({ id: specialSections.preface.id, title: specialSections.preface.title, group: "阅读页面" })
for (const part of bookData) {
const firstChapter = part.chapters[0]
const firstSection = firstChapter?.sections?.[0]
if (firstSection) {
picks.push({
id: firstSection.id,
title: `${part.number} ${part.title}${firstSection.title}`,
group: "阅读页面",
})
}
}
const extraReadIds = ["9.11", "9.10", "9.9"]
for (const targetId of extraReadIds) {
const found = bookData
.flatMap((p) => p.chapters)
.flatMap((c) => c.sections)
.find((s) => s.id === targetId)
if (found) {
picks.push({ id: found.id, title: found.title, group: "阅读页面" })
}
}
const seen = new Set<string>()
return picks.filter((p) => {
if (seen.has(p.id)) return false
seen.add(p.id)
return true
})
}
export function getDocumentationCatalog(): DocumentationPage[] {
const pages: DocumentationPage[] = [
{
path: "/",
title: "首页",
subtitle: "应用主入口",
caption:
"首页是用户进入应用的第一个页面,展示书籍封面、简介、目录预览和购买入口。用户可以快速了解内容概要并进行购买决策。",
group: "核心页面",
order: 1,
},
{
path: "/chapters",
title: "目录页",
subtitle: "章节浏览与导航",
caption:
"目录页展示全书的完整章节结构,用户可以浏览各篇、各章内容,查看已解锁和待解锁章节,并快速跳转到阅读页面。",
group: "核心页面",
order: 2,
},
{
path: "/about",
title: "关于页面",
subtitle: "作者与产品介绍",
caption: "关于页面展示作者信息、产品理念、运营数据等,帮助用户建立对内容的信任和理解。",
group: "核心页面",
order: 3,
},
{
path: "/my",
title: "个人中心",
subtitle: "用户账户入口",
caption: "个人中心聚合用户的账户信息、购买记录、分销收益等功能入口,是用户管理个人信息的核心页面。",
group: "用户中心",
order: 4,
},
{
path: "/my/purchases",
title: "我的购买",
subtitle: "已购内容管理",
caption: "展示用户已购买的所有章节,包括购买时间、解锁进度,用户可快速跳转到已购内容继续阅读。",
group: "用户中心",
order: 5,
},
{
path: "/my/settings",
title: "账户设置",
subtitle: "个人信息配置",
caption: "用户可在此页面管理个人基础信息、通知偏好、隐私设置等账户相关配置。",
group: "用户中心",
order: 6,
},
{
path: "/my/referral",
title: "分销中心",
subtitle: "邀请与收益管理",
caption: "分销中心展示用户的专属邀请链接、邀请人数统计、收益明细支持一键分享到朋友圈或Soul派对。",
group: "用户中心",
order: 7,
},
{
path: "/admin/login",
title: "后台登录",
subtitle: "管理员入口",
caption: "管理后台的登录页面,管理员通过账号密码验证后进入管理系统。",
group: "管理后台",
order: 8,
},
{
path: "/admin",
title: "后台管理",
subtitle: "系统配置中心",
caption: "管理后台的核心页面,包含数据概览、内容管理、用户管理、支付配置、二维码管理、系统设置等功能模块。",
group: "管理后台",
order: 9,
},
{
path: "/docs",
title: "开发文档",
subtitle: "技术与配置说明",
caption: "面向开发者和运营人员的技术文档,包含支付接口配置说明、分销规则详解、提现流程等内容。",
group: "运营支持",
order: 10,
},
]
const readPicks = pickRepresentativeReadIds()
for (let i = 0; i < readPicks.length; i++) {
const pick = readPicks[i]
pages.push({
path: `/read/${encodeURIComponent(pick.id)}`,
title: pick.title,
subtitle: "章节阅读",
caption: "阅读页面展示章节的完整内容,未购买用户可预览部分内容,付费墙引导购买解锁全文。",
group: pick.group,
waitForSelector: "main",
order: 100 + i,
})
}
// Sort by order
return pages.sort((a, b) => (a.order || 999) - (b.order || 999))
}