Files
soul/lib/book-data.ts
卡若 b60edb3d47 feat: 完整重构小程序匹配功能 + 修复UI对齐 + 文章数据API
主要更新:
1. 按H5网页端完全重构匹配功能(match页面)
   - 4种匹配类型: 创业合伙/资源对接/导师顾问/团队招募
   - 资源对接等类型弹出手机号/微信号输入框
   - 去掉重新匹配按钮,改为返回按钮

2. 修复所有卡片对齐和宽度问题
   - 目录页附录卡片居中
   - 首页阅读进度卡片满宽度
   - 我的页面菜单卡片对齐
   - 推广中心分享卡片统一宽度

3. 修复目录页图标和文字对齐
   - section-icon固定40rpx宽高
   - section-title与图标垂直居中

4. 更新真实完整文章标题(62篇)
   - 从book目录读取真实markdown文件名
   - 替换之前的简化标题

5. 新增文章数据API
   - /api/db/chapters - 获取完整书籍结构
   - 支持按ID获取单篇文章内容
2026-01-21 15:49:12 +08:00

712 lines
25 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.

export interface Section {
id: string
title: string
price: number
isFree: boolean
filePath: string
content?: string
createdAt?: string
unlockAfterDays?: number
}
export interface Chapter {
id: string
title: string
sections: Section[]
}
export interface Part {
id: string
number: string
title: string
subtitle: string
chapters: Chapter[]
}
export const BASE_BOOK_PRICE = 9.9
export const SECTION_PRICE = 1
export const PREMIUM_SECTION_PRICE = 1 // 最新版每小节额外价格
// 基础版价格固定9.9
export function getFullBookPrice(): number {
return 9.9
}
// 最新完整版价格基础9.9 + 新增小节数 * 1元
// 假设基础版包含前50个小节之后每增加一个小节+1元
export const BASE_SECTIONS_COUNT = 50
export function getPremiumBookPrice(): number {
const totalSections = getTotalSectionCount()
const extraSections = Math.max(0, totalSections - BASE_SECTIONS_COUNT)
return BASE_BOOK_PRICE + extraSections * PREMIUM_SECTION_PRICE
}
// 获取新增小节数量
export function getExtraSectionsCount(): number {
const totalSections = getTotalSectionCount()
return Math.max(0, totalSections - BASE_SECTIONS_COUNT)
}
export const bookData: Part[] = [
{
id: "part-1",
number: "01",
title: "真实的人",
subtitle: "人性观察与社交逻辑",
chapters: [
{
id: "chapter-1",
title: "人与人之间的底层逻辑",
sections: [
{
id: "1.1",
title: "荷包:电动车出租的被动收入模式",
price: 1,
isFree: true,
filePath: "book/第一篇|真实的人/第1章人与人之间的底层逻辑/1.1 荷包:电动车出租的被动收入模式.md",
},
{
id: "1.2",
title: "老墨:资源整合高手的社交方法",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第1章人与人之间的底层逻辑/1.2 老墨:资源整合高手的社交方法.md",
},
{
id: "1.3",
title: "笑声背后的MBTI为什么ENTJ适合做资源INTP适合做系统",
price: 1,
isFree: false,
filePath:
"book/第一篇|真实的人/第1章人与人之间的底层逻辑/1.3 笑声背后的MBTI为什么ENTJ适合做资源INTP适合做系统.md",
},
{
id: "1.4",
title: "人性的三角结构:利益、情感、价值观",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第1章人与人之间的底层逻辑/1.4 人性的三角结构:利益、情感、价值观.md",
},
{
id: "1.5",
title: "沟通差的问题:为什么你说的别人听不懂",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第1章人与人之间的底层逻辑/1.5 沟通差的问题:为什么你说的别人听不懂.md",
},
],
},
{
id: "chapter-2",
title: "人性困境案例",
sections: [
{
id: "2.1",
title: "相亲故事:你以为找的是人,实际是在找模式",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第2章人性困境案例/2.1 相亲故事:你以为找的是人,实际是在找模式.md",
},
{
id: "2.2",
title: "找工作迷茫者:为什么简历解决不了人生",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第2章人性困境案例/2.2 找工作迷茫者:为什么简历解决不了人生.md",
},
{
id: "2.3",
title: "撸运费险:小钱困住大脑的真实心理",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第2章人性困境案例/2.3 撸运费险:小钱困住大脑的真实心理.md",
},
{
id: "2.4",
title: "游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力",
price: 1,
isFree: false,
filePath: "book/第一篇|真实的人/第2章人性困境案例/2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md",
},
{
id: "2.5",
title: "健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒",
price: 1,
isFree: false,
filePath:
"book/第一篇|真实的人/第2章人性困境案例/2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md",
},
],
},
],
},
{
id: "part-2",
number: "02",
title: "真实的行业",
subtitle: "社会运作的底层规则",
chapters: [
{
id: "chapter-3",
title: "电商篇",
sections: [
{
id: "3.1",
title: "3000万流水如何跑出来(退税模式解析)",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.1 3000万流水如何跑出来(退税模式解析).md",
},
{
id: "3.2",
title: "供应链之王 vs 打工人:利润不在前端",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.2 供应链之王 vs 打工人:利润不在前端.md",
},
{
id: "3.3",
title: "社区团购的底层逻辑",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.3 社区团购的底层逻辑.md",
},
{
id: "3.4",
title: "跨境电商与退税套利",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.4 跨境电商与退税套利.md",
},
],
},
{
id: "chapter-4",
title: "内容商业篇",
sections: [
{
id: "4.1",
title: "旅游号:30天10万粉的真实逻辑",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.1 旅游号:30天10万粉的真实逻辑.md",
},
{
id: "4.2",
title: "做号工厂:如何让一个号变成一个机器",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.2 做号工厂:如何让一个号变成一个机器.md",
},
{
id: "4.3",
title: "情绪内容为什么比专业内容更赚钱",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.3 情绪内容为什么比专业内容更赚钱.md",
},
{
id: "4.4",
title: "猫与宠物号:为什么宠物赛道永不过时",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.4 猫与宠物号:为什么宠物赛道永不过时.md",
},
{
id: "4.5",
title: "直播间里的三种人:演员、技术工、系统流",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.5 直播间里的三种人:演员、技术工、系统流.md",
},
],
},
{
id: "chapter-5",
title: "传统行业篇",
sections: [
{
id: "5.1",
title: "拍卖行抱朴一天240万的摇号生意",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.1 拍卖行抱朴一天240万的摇号生意.md",
},
{
id: "5.2",
title: "土地拍卖:招拍挂背后的游戏规则",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.2 土地拍卖:招拍挂背后的游戏规则.md",
},
{
id: "5.3",
title: "地摊经济数字化一个月900块的餐车生意",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.3 地摊经济数字化一个月900块的餐车生意.md",
},
{
id: "5.4",
title: "不良资产拍卖:我错过的一个亿佣金",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.4 不良资产拍卖:我错过的一个亿佣金.md",
},
{
id: "5.5",
title: "桶装水李总:跟物业合作的轻资产模式",
price: 1,
isFree: false,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.5 桶装水李总:跟物业合作的轻资产模式.md",
},
],
},
],
},
{
id: "part-3",
number: "03",
title: "真实的错误",
subtitle: "错过机会比失败更贵",
chapters: [
{
id: "chapter-6",
title: "我人生错过的4件大钱",
sections: [
{
id: "6.1",
title: "电商财税窗口2016年的千万级机会",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.1 电商财税窗口2016年的千万级机会.md",
},
{
id: "6.2",
title: "供应链金融:我不懂的杠杆游戏",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.2 供应链金融:我不懂的杠杆游戏.md",
},
{
id: "6.3",
title: "内容红利2019年我为什么没做抖音",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.3 内容红利2019年我为什么没做抖音.md",
},
{
id: "6.4",
title: "数据资产化:我还在观望的未来机会",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.4 数据资产化:我还在观望的未来机会.md",
},
],
},
{
id: "chapter-7",
title: "别人犯的错误",
sections: [
{
id: "7.1",
title: "投资房年轻人的迷茫:资金 vs 能力",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.1 投资房年轻人的迷茫:资金 vs 能力.md",
},
{
id: "7.2",
title: "信息差骗局:永远有人靠卖学习赚钱",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.2 信息差骗局:永远有人靠卖学习赚钱.md",
},
{
id: "7.3",
title: "在Soul找恋爱但想赚钱的人",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.3 在Soul找恋爱但想赚钱的人.md",
},
{
id: "7.4",
title: "创业者的三种死法:冲动、轻信、没结构",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.4 创业者的三种死法:冲动、轻信、没结构.md",
},
{
id: "7.5",
title: "人情生意的终点:关系越多亏得越多",
price: 1,
isFree: false,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.5 人情生意的终点:关系越多亏得越多.md",
},
],
},
],
},
{
id: "part-4",
number: "04",
title: "真实的赚钱",
subtitle: "所有行业的杠杆结构",
chapters: [
{
id: "chapter-8",
title: "底层结构",
sections: [
{
id: "8.1",
title: "流量杠杆:抖音、Soul、飞书",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.1 流量杠杆:抖音、Soul、飞书.md",
},
{
id: "8.2",
title: "价格杠杆:供应链与信息差",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.2 价格杠杆:供应链与信息差.md",
},
{
id: "8.3",
title: "时间杠杆:自动化 + AI",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.3 时间杠杆:自动化 + AI.md",
},
{
id: "8.4",
title: "情绪杠杆:咨询、婚恋、生意场",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.4 情绪杠杆:咨询、婚恋、生意场.md",
},
{
id: "8.5",
title: "社交杠杆:认识谁比你会什么更重要",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.5 社交杠杆:认识谁比你会什么更重要.md",
},
{
id: "8.6",
title: "云阿米巴:分不属于自己的钱",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.6 云阿米巴:分不属于自己的钱.md",
},
],
},
{
id: "chapter-9",
title: "我在Soul上亲访的赚钱案例",
sections: [
{
id: "9.1",
title: "游戏账号私域:账号即资产",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.1 游戏账号私域:账号即资产.md",
},
{
id: "9.2",
title: "健康包模式:高复购、高毛利",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.2 健康包模式:高复购、高毛利.md",
},
{
id: "9.3",
title: "药物私域:长期关系赛道",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.3 药物私域:长期关系赛道.md",
},
{
id: "9.4",
title: "残疾机构合作:退税 × AI × 人力成本",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.4 残疾机构合作:退税 × AI × 人力成本.md",
},
{
id: "9.5",
title: "私域银行:粉丝即小股东",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.5 私域银行:粉丝即小股东.md",
},
{
id: "9.6",
title: "Soul派对房:陌生人成交的最快场景",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.6 Soul派对房:陌生人成交的最快场景.md",
},
{
id: "9.7",
title: "飞书中台:从聊天到成交的流程化体系",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.7 飞书中台:从聊天到成交的流程化体系.md",
},
{
id: "9.8",
title: "餐饮女孩6万营收、1万利润的死撑生意",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.8 餐饮女孩6万营收、1万利润的死撑生意.md",
},
{
id: "9.9",
title: "电竞生态:从陪玩到签约到酒店的完整链条",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.9 电竞生态:从陪玩到签约到酒店的完整链条.md",
},
{
id: "9.10",
title: "淘客大佬损耗30%的白色通道",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.10 淘客大佬损耗30%的白色通道.md",
},
{
id: "9.11",
title: "蔬菜供应链:农户才是最赚钱的人",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.11 蔬菜供应链:农户才是最赚钱的人.md",
},
{
id: "9.12",
title: "美业整合:一个人的公司如何月入十万",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.12 美业整合:一个人的公司如何月入十万.md",
},
{
id: "9.13",
title: "AI工具推广一个隐藏的高利润赛道",
price: 1,
isFree: false,
filePath:
"book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.13 AI工具推广一个隐藏的高利润赛道.md",
},
{
id: "9.14",
title: "大健康私域一个月150万的70后",
price: 1,
isFree: false,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.14 大健康私域一个月150万的70后.md",
},
],
},
],
},
{
id: "part-5",
number: "05",
title: "真实的未来",
subtitle: "人与系统的关系",
chapters: [
{
id: "chapter-10",
title: "未来职业的变化趋势",
sections: [
{
id: "10.1",
title: "AI时代哪些工作会消失哪些会崛起",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.1 AI时代哪些工作会消失哪些会崛起.md",
},
{
id: "10.2",
title: "一人公司:为什么越来越多人选择单干",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.2 一人公司:为什么越来越多人选择单干.md",
},
{
id: "10.3",
title: "为什么链接能力会成为第一价值",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.3 为什么链接能力会成为第一价值.md",
},
{
id: "10.4",
title: "新型公司:Soul-飞书-线下的三位一体",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.4 新型公司:Soul-飞书-线下的三位一体.md",
},
],
},
{
id: "chapter-11",
title: "中国社会商业生态的未来",
sections: [
{
id: "11.1",
title: "私域经济:为什么流量越来越贵",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.1 私域经济:为什么流量越来越贵.md",
},
{
id: "11.2",
title: "银发经济与孤独经济:两个被忽视的万亿市场",
price: 1,
isFree: false,
filePath:
"book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.2 银发经济与孤独经济:两个被忽视的万亿市场.md",
},
{
id: "11.3",
title: "流量红利的终局",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.3 流量红利的终局.md",
},
{
id: "11.4",
title: "大模型 + 供应链的组合拳",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.4 大模型 + 供应链的组合拳.md",
},
{
id: "11.5",
title: "社会分层的最终逻辑",
price: 1,
isFree: false,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.5 社会分层的最终逻辑.md",
},
],
},
],
},
]
// 特殊章节:序言、尾声、附录
export const specialSections = {
preface: {
id: "preface",
title: "序言为什么我每天早上6点在Soul开播?",
price: 0,
isFree: true,
filePath: "book/序言为什么我每天早上6点在Soul开播?.md",
},
epilogue: {
id: "epilogue",
title: "尾声|这本书的真实目的",
price: 0,
isFree: true,
filePath: "book/尾声|这本书的真实目的.md",
},
appendix: [
{
id: "appendix-1",
title: "附录1Soul派对房精选对话",
price: 0,
isFree: true,
filePath: "book/附录/附录1Soul派对房精选对话.md",
},
{
id: "appendix-2",
title: "附录2创业者自检清单",
price: 0,
isFree: true,
filePath: "book/附录/附录2创业者自检清单.md",
},
{
id: "appendix-3",
title: "附录3本书提到的工具和资源",
price: 0,
isFree: true,
filePath: "book/附录/附录3本书提到的工具和资源.md",
},
],
}
// 获取总章节数
export function getTotalSectionCount(): number {
let count = 0
bookData.forEach((part) => {
part.chapters.forEach((chapter) => {
count += chapter.sections.length
})
})
return count // 64章
}
export function getAllSections(): Section[] {
const sections: Section[] = []
bookData.forEach((part) => {
part.chapters.forEach((chapter) => {
sections.push(...chapter.sections)
})
})
return sections
}
export function getSectionById(id: string): Section | undefined {
for (const part of bookData) {
for (const chapter of part.chapters) {
const section = chapter.sections.find((s) => s.id === id)
if (section) return section
}
}
// 检查特殊章节
if (id === "preface") return specialSections.preface as Section
if (id === "epilogue") return specialSections.epilogue as Section
const appendix = specialSections.appendix.find((a) => a.id === id)
if (appendix) return appendix as Section
return undefined
}
export function getChapterBySection(sectionId: string): { part: Part; chapter: Chapter } | undefined {
for (const part of bookData) {
for (const chapter of part.chapters) {
if (chapter.sections.some((s) => s.id === sectionId)) {
return { part, chapter }
}
}
}
return undefined
}
// 获取下一篇文章
export function getNextSection(currentId: string): Section | undefined {
const allSections = getAllSections()
const currentIndex = allSections.findIndex((s) => s.id === currentId)
if (currentIndex === -1 || currentIndex >= allSections.length - 1) {
return undefined
}
return allSections[currentIndex + 1]
}
// 获取上一篇文章
export function getPrevSection(currentId: string): Section | undefined {
const allSections = getAllSections()
const currentIndex = allSections.findIndex((s) => s.id === currentId)
if (currentIndex <= 0) {
return undefined
}
return allSections[currentIndex - 1]
}
export const FULL_BOOK_PRICE = getFullBookPrice()