feat: complete product overhaul
Refactor homepage, match feature, data storage, and my page; implement paid reading logic. #VERCEL_SKIP Co-authored-by: undefined <undefined+undefined@users.noreply.github.com>
This commit is contained in:
307
lib/book-data.ts
307
lib/book-data.ts
@@ -24,12 +24,9 @@ export interface Part {
|
||||
}
|
||||
|
||||
export const BASE_BOOK_PRICE = 9.9
|
||||
export const PRICE_INCREMENT_PER_SECTION = 1
|
||||
export const SECTION_PRICE = 1
|
||||
export const AUTHOR_SHARE = 0.9
|
||||
export const DISTRIBUTOR_SHARE = 0.1
|
||||
|
||||
export function getFullBookPrice(sectionsCount?: number): number {
|
||||
export function getFullBookPrice(): number {
|
||||
return 9.9
|
||||
}
|
||||
|
||||
@@ -46,40 +43,39 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "1.1",
|
||||
title: "自行车荷总:一个行业做到极致是什么样",
|
||||
title: "荷包:电动车出租的被动收入模式",
|
||||
price: 1,
|
||||
isFree: true,
|
||||
filePath: "book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.1 自行车荷总:一个行业做到极致是什么样.md",
|
||||
filePath: "book/第一篇|真实的人/第1章|人与人之间的底层逻辑/1.1 荷包:电动车出租的被动收入模式.md",
|
||||
},
|
||||
{
|
||||
id: "1.2",
|
||||
title: "老墨:资源整合高手的社交方法",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.2 老墨:资源整合高手的社交方法.md",
|
||||
filePath: "book/第一篇|真实的人/第1章|人与人之间的底层逻辑/1.2 老墨:资源整合高手的社交方法.md",
|
||||
},
|
||||
{
|
||||
id: "1.3",
|
||||
title: "笑声背后的MBTI:为什么ENTJ适合做资源,INTP适合做系统",
|
||||
title: "笑声背后的MBTI:为什么ENTJ适合做资源,INTP适合做系统",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
filePath:
|
||||
"book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.3 笑声背后的MBTI:为什么ENTJ适合做资源,INTP适合做系统.md",
|
||||
"book/第一篇|真实的人/第1章|人与人之间的底层逻辑/1.3 笑声背后的MBTI:为什么ENTJ适合做资源,INTP适合做系统.md",
|
||||
},
|
||||
{
|
||||
id: "1.4",
|
||||
title: "人性的三角结构:情绪、价值、利益",
|
||||
title: "人性的三角结构:利益、情感、价值观",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
filePath: "book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.4 人性的三角结构:情绪、价值、利益.md",
|
||||
filePath: "book/第一篇|真实的人/第1章|人与人之间的底层逻辑/1.4 人性的三角结构:利益、情感、价值观.md",
|
||||
},
|
||||
{
|
||||
id: "1.5",
|
||||
title: "为什么99%的合作死在沟通差而不是能力差",
|
||||
title: "沟通差的问题:为什么你说的别人听不懂",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
filePath: "book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.5 为什么99%的合作死在沟通差而不是能力差.md",
|
||||
filePath: "book/第一篇|真实的人/第1章|人与人之间的底层逻辑/1.5 沟通差的问题:为什么你说的别人听不懂.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -92,42 +88,36 @@ export const bookData: Part[] = [
|
||||
title: "相亲故事:你以为找的是人,实际是在找模式",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.1 相亲故事:你以为找的是人,实际是在找模式.md",
|
||||
filePath: "book/第一篇|真实的人/第2章|人性困境案例/2.1 相亲故事:你以为找的是人,实际是在找模式.md",
|
||||
},
|
||||
{
|
||||
id: "2.2",
|
||||
title: "找工作迷茫者:为什么简历解决不了人生",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.2 找工作迷茫者:为什么简历解决不了人生.md",
|
||||
filePath: "book/第一篇|真实的人/第2章|人性困境案例/2.2 找工作迷茫者:为什么简历解决不了人生.md",
|
||||
},
|
||||
{
|
||||
id: "2.3",
|
||||
title: "撸运费险:小钱困住大脑的真实心理",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.3 撸运费险:小钱困住大脑的真实心理.md",
|
||||
filePath: "book/第一篇|真实的人/第2章|人性困境案例/2.3 撸运费险:小钱困住大脑的真实心理.md",
|
||||
},
|
||||
{
|
||||
id: "2.4",
|
||||
title: "游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath:
|
||||
"book/_第一篇|真实的人/第2章|人性困境案例/2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md",
|
||||
filePath: "book/第一篇|真实的人/第2章|人性困境案例/2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md",
|
||||
},
|
||||
{
|
||||
id: "2.5",
|
||||
title: "健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath:
|
||||
"book/_第一篇|真实的人/第2章|人性困境案例/2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md",
|
||||
"book/第一篇|真实的人/第2章|人性困境案例/2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -145,43 +135,31 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "3.1",
|
||||
title: "电商财税窗口:我错过的第一桶金",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.1 电商财税窗口:我错过的第一桶金.md",
|
||||
},
|
||||
{
|
||||
id: "3.2",
|
||||
title: "3000万流水如何跑出来(退税模式解析)",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.2 3000万流水如何跑出来(退税模式解析).md",
|
||||
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: "供应链之王vs打工人:利润不在前端",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.3 供应链之王 vs 打工人:利润不在前端.md",
|
||||
},
|
||||
{
|
||||
id: "3.4",
|
||||
title: "社区团购的底层逻辑",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.4 社区团购的底层逻辑.md",
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.3 社区团购的底层逻辑.md",
|
||||
},
|
||||
{
|
||||
id: "3.5",
|
||||
id: "3.4",
|
||||
title: "跨境电商与退税套利",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.5 跨境电商与退税套利.md",
|
||||
filePath: "book/第二篇|真实的行业/第3章|电商篇/3.4 跨境电商与退税套利.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -194,7 +172,6 @@ export const bookData: Part[] = [
|
||||
title: "旅游号:30天10万粉的真实逻辑",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.1 旅游号:30天10万粉的真实逻辑.md",
|
||||
},
|
||||
{
|
||||
@@ -202,7 +179,6 @@ export const bookData: Part[] = [
|
||||
title: "做号工厂:如何让一个号变成一个机器",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.2 做号工厂:如何让一个号变成一个机器.md",
|
||||
},
|
||||
{
|
||||
@@ -210,7 +186,6 @@ export const bookData: Part[] = [
|
||||
title: "情绪内容为什么比专业内容更赚钱",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.3 情绪内容为什么比专业内容更赚钱.md",
|
||||
},
|
||||
{
|
||||
@@ -218,7 +193,6 @@ export const bookData: Part[] = [
|
||||
title: "猫与宠物号:为什么宠物赛道永不过时",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.4 猫与宠物号:为什么宠物赛道永不过时.md",
|
||||
},
|
||||
{
|
||||
@@ -226,7 +200,6 @@ export const bookData: Part[] = [
|
||||
title: "直播间里的三种人:演员、技术工、系统流",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.5 直播间里的三种人:演员、技术工、系统流.md",
|
||||
},
|
||||
],
|
||||
@@ -237,43 +210,38 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "5.1",
|
||||
title: "羽毛球馆:为什么体育培训是最稳定的现金流",
|
||||
title: "拍卖行抱朴:一天240万的摇号生意",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.1 羽毛球馆:为什么体育培训是最稳定的现金流.md",
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.1 拍卖行抱朴:一天240万的摇号生意.md",
|
||||
},
|
||||
{
|
||||
id: "5.2",
|
||||
title: "旅游供应链:资源越老越值钱",
|
||||
title: "土地拍卖:招拍挂背后的游戏规则",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.2 旅游供应链:资源越老越值钱.md",
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.2 土地拍卖:招拍挂背后的游戏规则.md",
|
||||
},
|
||||
{
|
||||
id: "5.3",
|
||||
title: "景区联盟:门票不是目的,是流量入口",
|
||||
title: "地摊经济数字化:一个月900块的餐车生意",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.3 景区联盟:门票不是目的,是流量入口.md",
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.3 地摊经济数字化:一个月900块的餐车生意.md",
|
||||
},
|
||||
{
|
||||
id: "5.4",
|
||||
title: "拍卖行抱朴:我人生错过的4件大钱机会(完整版)",
|
||||
title: "不良资产拍卖:我错过的一个亿佣金",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.4 拍卖行抱朴:我人生错过的4件大钱机会(完整版).md",
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.4 不良资产拍卖:我错过的一个亿佣金.md",
|
||||
},
|
||||
{
|
||||
id: "5.5",
|
||||
title: "飞机票供应链:为什么越便宜越亏",
|
||||
title: "桶装水李总:跟物业合作的轻资产模式",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.5 飞机票供应链:为什么越便宜越亏.md",
|
||||
filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.5 桶装水李总:跟物业合作的轻资产模式.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -291,35 +259,31 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "6.1",
|
||||
title: "错过电商财税(2016-2017)",
|
||||
title: "电商财税窗口:2016年的千万级机会",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.1 错过电商财税(2016-2017).md",
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.1 电商财税窗口:2016年的千万级机会.md",
|
||||
},
|
||||
{
|
||||
id: "6.2",
|
||||
title: "错过供应链(2017-2018)",
|
||||
title: "供应链金融:我不懂的杠杆游戏",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.2 错过供应链(2017-2018).md",
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.2 供应链金融:我不懂的杠杆游戏.md",
|
||||
},
|
||||
{
|
||||
id: "6.3",
|
||||
title: "错过内容红利(2018-2019)",
|
||||
title: "内容红利:2019年我为什么没做抖音",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.3 错过内容红利(2018-2019).md",
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.3 内容红利:2019年我为什么没做抖音.md",
|
||||
},
|
||||
{
|
||||
id: "6.4",
|
||||
title: "错过资源资产化(2019-2020)",
|
||||
title: "数据资产化:我还在观望的未来机会",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.4 错过资源资产化(2019-2020).md",
|
||||
filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.4 数据资产化:我还在观望的未来机会.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -329,10 +293,9 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "7.1",
|
||||
title: "投资房年轻人的迷茫:资金vs能力",
|
||||
title: "投资房年轻人的迷茫:资金 vs 能力",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.1 投资房年轻人的迷茫:资金 vs 能力.md",
|
||||
},
|
||||
{
|
||||
@@ -340,7 +303,6 @@ export const bookData: Part[] = [
|
||||
title: "信息差骗局:永远有人靠卖学习赚钱",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.2 信息差骗局:永远有人靠卖学习赚钱.md",
|
||||
},
|
||||
{
|
||||
@@ -348,7 +310,6 @@ export const bookData: Part[] = [
|
||||
title: "在Soul找恋爱但想赚钱的人",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.3 在Soul找恋爱但想赚钱的人.md",
|
||||
},
|
||||
{
|
||||
@@ -356,7 +317,6 @@ export const bookData: Part[] = [
|
||||
title: "创业者的三种死法:冲动、轻信、没结构",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.4 创业者的三种死法:冲动、轻信、没结构.md",
|
||||
},
|
||||
{
|
||||
@@ -364,7 +324,6 @@ export const bookData: Part[] = [
|
||||
title: "人情生意的终点:关系越多亏得越多",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.5 人情生意的终点:关系越多亏得越多.md",
|
||||
},
|
||||
],
|
||||
@@ -386,7 +345,6 @@ export const bookData: Part[] = [
|
||||
title: "流量杠杆:抖音、Soul、飞书",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.1 流量杠杆:抖音、Soul、飞书.md",
|
||||
},
|
||||
{
|
||||
@@ -394,15 +352,13 @@ export const bookData: Part[] = [
|
||||
title: "价格杠杆:供应链与信息差",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.2 价格杠杆:供应链与信息差.md",
|
||||
},
|
||||
{
|
||||
id: "8.3",
|
||||
title: "时间杠杆:自动化+AI",
|
||||
title: "时间杠杆:自动化 + AI",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.3 时间杠杆:自动化 + AI.md",
|
||||
},
|
||||
{
|
||||
@@ -410,7 +366,6 @@ export const bookData: Part[] = [
|
||||
title: "情绪杠杆:咨询、婚恋、生意场",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.4 情绪杠杆:咨询、婚恋、生意场.md",
|
||||
},
|
||||
{
|
||||
@@ -418,7 +373,6 @@ export const bookData: Part[] = [
|
||||
title: "社交杠杆:认识谁比你会什么更重要",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.5 社交杠杆:认识谁比你会什么更重要.md",
|
||||
},
|
||||
{
|
||||
@@ -426,7 +380,6 @@ export const bookData: Part[] = [
|
||||
title: "云阿米巴:分不属于自己的钱",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.6 云阿米巴:分不属于自己的钱.md",
|
||||
},
|
||||
],
|
||||
@@ -440,7 +393,6 @@ export const bookData: Part[] = [
|
||||
title: "游戏账号私域:账号即资产",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.1 游戏账号私域:账号即资产.md",
|
||||
},
|
||||
{
|
||||
@@ -448,7 +400,6 @@ export const bookData: Part[] = [
|
||||
title: "健康包模式:高复购、高毛利",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.2 健康包模式:高复购、高毛利.md",
|
||||
},
|
||||
{
|
||||
@@ -456,15 +407,13 @@ export const bookData: Part[] = [
|
||||
title: "药物私域:长期关系赛道",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.3 药物私域:长期关系赛道.md",
|
||||
},
|
||||
{
|
||||
id: "9.4",
|
||||
title: "残疾机构合作:退税×AI×人力成本",
|
||||
title: "残疾机构合作:退税 × AI × 人力成本",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath:
|
||||
"book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.4 残疾机构合作:退税 × AI × 人力成本.md",
|
||||
},
|
||||
@@ -473,7 +422,6 @@ export const bookData: Part[] = [
|
||||
title: "私域银行:粉丝即小股东",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.5 私域银行:粉丝即小股东.md",
|
||||
},
|
||||
{
|
||||
@@ -481,7 +429,6 @@ export const bookData: Part[] = [
|
||||
title: "Soul派对房:陌生人成交的最快场景",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.6 Soul派对房:陌生人成交的最快场景.md",
|
||||
},
|
||||
{
|
||||
@@ -489,10 +436,62 @@ export const bookData: Part[] = [
|
||||
title: "飞书中台:从聊天到成交的流程化体系",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
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",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -509,26 +508,23 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "10.1",
|
||||
title: "AI代聊与岗位替换",
|
||||
title: "AI时代:哪些工作会消失,哪些会崛起",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.1 AI代聊与岗位替换.md",
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.1 AI时代:哪些工作会消失,哪些会崛起.md",
|
||||
},
|
||||
{
|
||||
id: "10.2",
|
||||
title: "系统化工作vs杂乱工作",
|
||||
title: "一人公司:为什么越来越多人选择单干",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.2 系统化工作 vs 杂乱工作.md",
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.2 一人公司:为什么越来越多人选择单干.md",
|
||||
},
|
||||
{
|
||||
id: "10.3",
|
||||
title: "为什么链接能力会成为第一价值",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.3 为什么链接能力会成为第一价值.md",
|
||||
},
|
||||
{
|
||||
@@ -536,7 +532,6 @@ export const bookData: Part[] = [
|
||||
title: "新型公司:Soul-飞书-线下的三位一体",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.4 新型公司:Soul-飞书-线下的三位一体.md",
|
||||
},
|
||||
],
|
||||
@@ -547,34 +542,31 @@ export const bookData: Part[] = [
|
||||
sections: [
|
||||
{
|
||||
id: "11.1",
|
||||
title: "城市之间的模式差",
|
||||
title: "私域经济:为什么流量越来越贵",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.1 城市之间的模式差.md",
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.1 私域经济:为什么流量越来越贵.md",
|
||||
},
|
||||
{
|
||||
id: "11.2",
|
||||
title: "厦门样本:低成本高效率经济",
|
||||
title: "银发经济与孤独经济:两个被忽视的万亿市场",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.2 厦门样本:低成本高效率经济.md",
|
||||
filePath:
|
||||
"book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.2 银发经济与孤独经济:两个被忽视的万亿市场.md",
|
||||
},
|
||||
{
|
||||
id: "11.3",
|
||||
title: "流量红利的终局",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.3 流量红利的终局.md",
|
||||
},
|
||||
{
|
||||
id: "11.4",
|
||||
title: "大模型+供应链的组合拳",
|
||||
title: "大模型 + 供应链的组合拳",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.4 大模型 + 供应链的组合拳.md",
|
||||
},
|
||||
{
|
||||
@@ -582,7 +574,6 @@ export const bookData: Part[] = [
|
||||
title: "社会分层的最终逻辑",
|
||||
price: 1,
|
||||
isFree: false,
|
||||
unlockAfterDays: 3,
|
||||
filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.5 社会分层的最终逻辑.md",
|
||||
},
|
||||
],
|
||||
@@ -591,6 +582,7 @@ export const bookData: Part[] = [
|
||||
},
|
||||
]
|
||||
|
||||
// 特殊章节:序言、尾声、附录
|
||||
export const specialSections = {
|
||||
preface: {
|
||||
id: "preface",
|
||||
@@ -601,21 +593,49 @@ export const specialSections = {
|
||||
},
|
||||
epilogue: {
|
||||
id: "epilogue",
|
||||
title: "尾声|终极答案:努力不是关键,选择才是",
|
||||
title: "尾声|这本书的真实目的",
|
||||
price: 0,
|
||||
isFree: true,
|
||||
filePath: "book/尾声|终极答案:努力不是关键,选择才是.md",
|
||||
filePath: "book/尾声|这本书的真实目的.md",
|
||||
},
|
||||
appendix: [
|
||||
{
|
||||
id: "appendix-1",
|
||||
title: "附录1|Soul派对房精选对话",
|
||||
price: 0,
|
||||
isFree: true,
|
||||
filePath: "book/附录/附录1|Soul派对房精选对话.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 const FULL_BOOK_PRICE = getFullBookPrice()
|
||||
// 获取总章节数
|
||||
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[] = []
|
||||
if (typeof window !== "undefined") {
|
||||
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]")
|
||||
sections.push(...customSections)
|
||||
}
|
||||
bookData.forEach((part) => {
|
||||
part.chapters.forEach((chapter) => {
|
||||
sections.push(...chapter.sections)
|
||||
@@ -625,18 +645,17 @@ export function getAllSections(): Section[] {
|
||||
}
|
||||
|
||||
export function getSectionById(id: string): Section | undefined {
|
||||
if (typeof window !== "undefined") {
|
||||
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]") as Section[]
|
||||
const customSection = customSections.find((s) => s.id === id)
|
||||
if (customSection) return customSection
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -651,26 +670,4 @@ export function getChapterBySection(sectionId: string): { part: Part; chapter: C
|
||||
return undefined
|
||||
}
|
||||
|
||||
export function isSectionUnlocked(section: Section): boolean {
|
||||
if (section.isFree) return true
|
||||
if (!section.unlockAfterDays || !section.createdAt) return false
|
||||
|
||||
const createdDate = new Date(section.createdAt)
|
||||
const unlockDate = new Date(createdDate.getTime() + section.unlockAfterDays * 24 * 60 * 60 * 1000)
|
||||
return new Date() >= unlockDate
|
||||
}
|
||||
|
||||
export function addCustomSection(section: Omit<Section, "createdAt">): Section {
|
||||
const newSection: Section = {
|
||||
...section,
|
||||
createdAt: new Date().toISOString(),
|
||||
}
|
||||
|
||||
if (typeof window !== "undefined") {
|
||||
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]") as Section[]
|
||||
customSections.push(newSection)
|
||||
localStorage.setItem("custom_sections", JSON.stringify(customSections))
|
||||
}
|
||||
|
||||
return newSection
|
||||
}
|
||||
export const FULL_BOOK_PRICE = getFullBookPrice()
|
||||
|
||||
Reference in New Issue
Block a user