-
-
- {isMenuOpen && (
- <>
-
setIsMenuOpen(false)} />
-
- {/* User info */}
-
-
{user.nickname}
-
{user.phone}
- {user.hasFullBook && (
-
- 已购买全书
-
- )}
-
-
- {/* Menu items */}
-
- setIsMenuOpen(false)}
- >
-
- 我的购买
-
- setIsMenuOpen(false)}
- >
-
- 分销中心
- {user.earnings > 0 && (
- ¥{user.earnings.toFixed(2)}
- )}
-
- {user.isAdmin && (
- setIsMenuOpen(false)}
- >
-
- 管理后台
-
- )}
-
-
- {/* Logout */}
-
-
-
-
- >
- )}
-
- )
-}
diff --git a/lib/book-data.ts b/lib/book-data.ts
deleted file mode 100644
index d734bd1..0000000
--- a/lib/book-data.ts
+++ /dev/null
@@ -1,676 +0,0 @@
-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 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 {
- return 9.9
-}
-
-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,
- unlockAfterDays: 3,
- 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: "为什么99%的合作死在沟通差而不是能力差",
- price: 1,
- isFree: false,
- filePath: "book/_第一篇|真实的人/第1章|人与人之间的底层逻辑/1.5 为什么99%的合作死在沟通差而不是能力差.md",
- },
- ],
- },
- {
- id: "chapter-2",
- title: "人性困境案例",
- sections: [
- {
- id: "2.1",
- title: "相亲故事:你以为找的是人,实际是在找模式",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.1 相亲故事:你以为找的是人,实际是在找模式.md",
- },
- {
- id: "2.2",
- title: "找工作迷茫者:为什么简历解决不了人生",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.2 找工作迷茫者:为什么简历解决不了人生.md",
- },
- {
- id: "2.3",
- title: "撸运费险:小钱困住大脑的真实心理",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/_第一篇|真实的人/第2章|人性困境案例/2.3 撸运费险:小钱困住大脑的真实心理.md",
- },
- {
- id: "2.4",
- title: "游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath:
- "book/_第一篇|真实的人/第2章|人性困境案例/2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md",
- },
- {
- id: "2.5",
- title: "健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath:
- "book/_第一篇|真实的人/第2章|人性困境案例/2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md",
- },
- ],
- },
- ],
- },
- {
- id: "part-2",
- number: "02",
- title: "真实的行业",
- subtitle: "社会运作的底层规则",
- chapters: [
- {
- id: "chapter-3",
- title: "电商篇",
- 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",
- },
- {
- 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",
- },
- {
- id: "3.5",
- title: "跨境电商与退税套利",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第3章|电商篇/3.5 跨境电商与退税套利.md",
- },
- ],
- },
- {
- id: "chapter-4",
- title: "内容商业篇",
- sections: [
- {
- id: "4.1",
- title: "旅游号:30天10万粉的真实逻辑",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.1 旅游号:30天10万粉的真实逻辑.md",
- },
- {
- id: "4.2",
- title: "做号工厂:如何让一个号变成一个机器",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.2 做号工厂:如何让一个号变成一个机器.md",
- },
- {
- id: "4.3",
- title: "情绪内容为什么比专业内容更赚钱",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.3 情绪内容为什么比专业内容更赚钱.md",
- },
- {
- id: "4.4",
- title: "猫与宠物号:为什么宠物赛道永不过时",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.4 猫与宠物号:为什么宠物赛道永不过时.md",
- },
- {
- id: "4.5",
- title: "直播间里的三种人:演员、技术工、系统流",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第4章|内容商业篇/4.5 直播间里的三种人:演员、技术工、系统流.md",
- },
- ],
- },
- {
- id: "chapter-5",
- title: "传统行业篇",
- sections: [
- {
- id: "5.1",
- title: "羽毛球馆:为什么体育培训是最稳定的现金流",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.1 羽毛球馆:为什么体育培训是最稳定的现金流.md",
- },
- {
- id: "5.2",
- title: "旅游供应链:资源越老越值钱",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.2 旅游供应链:资源越老越值钱.md",
- },
- {
- id: "5.3",
- title: "景区联盟:门票不是目的,是流量入口",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.3 景区联盟:门票不是目的,是流量入口.md",
- },
- {
- id: "5.4",
- title: "拍卖行抱朴:我人生错过的4件大钱机会(完整版)",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第二篇|真实的行业/第5章|传统行业篇/5.4 拍卖行抱朴:我人生错过的4件大钱机会(完整版).md",
- },
- {
- id: "5.5",
- title: "飞机票供应链:为什么越便宜越亏",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- 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-2017)",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.1 错过电商财税(2016-2017).md",
- },
- {
- id: "6.2",
- title: "错过供应链(2017-2018)",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.2 错过供应链(2017-2018).md",
- },
- {
- id: "6.3",
- title: "错过内容红利(2018-2019)",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.3 错过内容红利(2018-2019).md",
- },
- {
- id: "6.4",
- title: "错过资源资产化(2019-2020)",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第6章|我人生错过的4件大钱/6.4 错过资源资产化(2019-2020).md",
- },
- ],
- },
- {
- id: "chapter-7",
- title: "别人犯的错误",
- sections: [
- {
- id: "7.1",
- title: "投资房年轻人的迷茫:资金vs能力",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.1 投资房年轻人的迷茫:资金 vs 能力.md",
- },
- {
- id: "7.2",
- title: "信息差骗局:永远有人靠卖学习赚钱",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.2 信息差骗局:永远有人靠卖学习赚钱.md",
- },
- {
- id: "7.3",
- title: "在Soul找恋爱但想赚钱的人",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.3 在Soul找恋爱但想赚钱的人.md",
- },
- {
- id: "7.4",
- title: "创业者的三种死法:冲动、轻信、没结构",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第三篇|真实的错误/第7章|别人犯的错误/7.4 创业者的三种死法:冲动、轻信、没结构.md",
- },
- {
- id: "7.5",
- title: "人情生意的终点:关系越多亏得越多",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- 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,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.1 流量杠杆:抖音、Soul、飞书.md",
- },
- {
- id: "8.2",
- title: "价格杠杆:供应链与信息差",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.2 价格杠杆:供应链与信息差.md",
- },
- {
- id: "8.3",
- title: "时间杠杆:自动化+AI",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.3 时间杠杆:自动化 + AI.md",
- },
- {
- id: "8.4",
- title: "情绪杠杆:咨询、婚恋、生意场",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.4 情绪杠杆:咨询、婚恋、生意场.md",
- },
- {
- id: "8.5",
- title: "社交杠杆:认识谁比你会什么更重要",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.5 社交杠杆:认识谁比你会什么更重要.md",
- },
- {
- id: "8.6",
- title: "云阿米巴:分不属于自己的钱",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第8章|底层结构/8.6 云阿米巴:分不属于自己的钱.md",
- },
- ],
- },
- {
- id: "chapter-9",
- title: "我在Soul上亲访的赚钱案例",
- sections: [
- {
- id: "9.1",
- title: "游戏账号私域:账号即资产",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.1 游戏账号私域:账号即资产.md",
- },
- {
- id: "9.2",
- title: "健康包模式:高复购、高毛利",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.2 健康包模式:高复购、高毛利.md",
- },
- {
- id: "9.3",
- title: "药物私域:长期关系赛道",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.3 药物私域:长期关系赛道.md",
- },
- {
- id: "9.4",
- title: "残疾机构合作:退税×AI×人力成本",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath:
- "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.4 残疾机构合作:退税 × AI × 人力成本.md",
- },
- {
- id: "9.5",
- title: "私域银行:粉丝即小股东",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.5 私域银行:粉丝即小股东.md",
- },
- {
- id: "9.6",
- title: "Soul派对房:陌生人成交的最快场景",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.6 Soul派对房:陌生人成交的最快场景.md",
- },
- {
- id: "9.7",
- title: "飞书中台:从聊天到成交的流程化体系",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath:
- "book/第四篇|真实的赚钱/第9章|我在Soul上亲访的赚钱案例/9.7 飞书中台:从聊天到成交的流程化体系.md",
- },
- ],
- },
- ],
- },
- {
- id: "part-5",
- number: "05",
- title: "真实的未来",
- subtitle: "人与系统的关系",
- chapters: [
- {
- id: "chapter-10",
- title: "未来职业的变化趋势",
- sections: [
- {
- id: "10.1",
- title: "AI代聊与岗位替换",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.1 AI代聊与岗位替换.md",
- },
- {
- id: "10.2",
- title: "系统化工作vs杂乱工作",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.2 系统化工作 vs 杂乱工作.md",
- },
- {
- id: "10.3",
- title: "为什么链接能力会成为第一价值",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.3 为什么链接能力会成为第一价值.md",
- },
- {
- id: "10.4",
- title: "新型公司:Soul-飞书-线下的三位一体",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第10章|未来职业的变化趋势/10.4 新型公司:Soul-飞书-线下的三位一体.md",
- },
- ],
- },
- {
- id: "chapter-11",
- title: "中国社会商业生态的未来",
- sections: [
- {
- id: "11.1",
- title: "城市之间的模式差",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.1 城市之间的模式差.md",
- },
- {
- id: "11.2",
- title: "厦门样本:低成本高效率经济",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- 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: "大模型+供应链的组合拳",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- filePath: "book/第五篇|真实的社会/第11章|中国社会商业生态的未来/11.4 大模型 + 供应链的组合拳.md",
- },
- {
- id: "11.5",
- title: "社会分层的最终逻辑",
- price: 1,
- isFree: false,
- unlockAfterDays: 3,
- 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",
- },
-}
-
-export const FULL_BOOK_PRICE = getFullBookPrice()
-
-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)
- })
- })
- return sections
-}
-
-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
- }
- }
- 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 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 {
- 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
-}
diff --git a/lib/book-file-system.ts b/lib/book-file-system.ts
deleted file mode 100644
index 2197883..0000000
--- a/lib/book-file-system.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import fs from "fs"
-import path from "path"
-import type { Part, Chapter, Section } from "./book-data"
-
-const BOOK_DIR = path.join(process.cwd(), "book")
-
-const CHINESE_NUM_MAP: Record = {
- 一: "01",
- 二: "02",
- 三: "03",
- 四: "04",
- 五: "05",
- 六: "06",
- 七: "07",
- 八: "08",
- 九: "09",
- 十: "10",
-}
-
-const SUBTITLES: Record = {
- 真实的人: "人性观察与社交逻辑",
- 真实的行业: "社会运作的底层规则",
- 真实的错误: "错过机会比失败更贵",
- 真实的赚钱: "所有行业的杠杆结构",
- 真实的社会: "人与系统的关系",
-}
-
-function parsePartFolderName(folderName: string): { number: string; title: string } | null {
- const match = folderName.match(/_第([一二三四五六七八九十]+)篇|(.+)/)
- if (match) {
- return {
- number: CHINESE_NUM_MAP[match[1]] || match[1],
- title: match[2],
- }
- }
- return null
-}
-
-function parseChapterFolderName(folderName: string): { id: string; title: string } | null {
- const match = folderName.match(/第(\d+)章|(.+)/)
- if (match) {
- return {
- id: match[1],
- title: match[2],
- }
- }
- return null
-}
-
-function parseSectionFileName(fileName: string): { id: string; title: string } | null {
- if (!fileName.endsWith(".md")) return null
- const name = fileName.replace(".md", "")
- const match = name.match(/^([\d.]+)\s+(.+)/)
- if (match) {
- return {
- id: match[1],
- title: match[2],
- }
- }
- return {
- id: fileName,
- title: name,
- }
-}
-
-export function getBookStructure(): Part[] {
- if (!fs.existsSync(BOOK_DIR)) {
- return []
- }
-
- const partFolders = fs.readdirSync(BOOK_DIR).filter((f) => {
- const fullPath = path.join(BOOK_DIR, f)
- return fs.statSync(fullPath).isDirectory() && f.startsWith("_")
- })
-
- const parts: Part[] = partFolders
- .map((folderName) => {
- const parsed = parsePartFolderName(folderName)
- if (!parsed) return null
-
- const partPath = path.join(BOOK_DIR, folderName)
- const chapterFolders = fs.readdirSync(partPath).filter((f) => {
- const fullPath = path.join(partPath, f)
- return fs.statSync(fullPath).isDirectory() && f.startsWith("第")
- })
-
- const chapters: Chapter[] = chapterFolders
- .map((chapterFolderName) => {
- const parsedChapter = parseChapterFolderName(chapterFolderName)
- if (!parsedChapter) return null
-
- const chapterPath = path.join(partPath, chapterFolderName)
- const sectionFiles = fs.readdirSync(chapterPath).filter((f) => f.endsWith(".md"))
-
- const sections: Section[] = sectionFiles
- .map((fileName) => {
- const parsedSection = parseSectionFileName(fileName)
- if (!parsedSection) return null
-
- return {
- id: parsedSection.id,
- title: parsedSection.title,
- price: 1,
- isFree: parsedSection.id.endsWith(".1"),
- filePath: path.relative(process.cwd(), path.join(chapterPath, fileName)),
- }
- })
- .filter((s): s is Section => s !== null)
- .sort((a, b) => {
- const partsA = a.id.split(".").map(Number)
- const partsB = b.id.split(".").map(Number)
- for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
- const valA = partsA[i] || 0
- const valB = partsB[i] || 0
- if (valA !== valB) return valA - valB
- }
- return 0
- })
-
- return {
- id: parsedChapter.id,
- title: parsedChapter.title,
- sections,
- }
- })
- .filter((c): c is Chapter => c !== null)
- .sort((a, b) => Number(a.id) - Number(b.id))
-
- return {
- id: parsed.number,
- number: parsed.number,
- title: parsed.title,
- subtitle: SUBTITLES[parsed.title] || "",
- chapters,
- }
- })
- .filter((p): p is Part => p !== null)
- .sort((a, b) => Number(a.number) - Number(b.number))
-
- return parts
-}
-
-export function getSectionBySlug(slug: string): Section | null {
- const parts = getBookStructure()
- for (const part of parts) {
- for (const chapter of part.chapters) {
- for (const section of chapter.sections) {
- if (section.id === slug) {
- return section
- }
- }
- }
- }
- return null
-}
-
-export function getChapterBySectionSlug(slug: string): { part: Part; chapter: Chapter } | null {
- const parts = getBookStructure()
- for (const part of parts) {
- for (const chapter of part.chapters) {
- for (const section of chapter.sections) {
- if (section.id === slug) {
- return { part, chapter }
- }
- }
- }
- }
- return null
-}
diff --git a/lib/documentation/catalog.ts b/lib/documentation/catalog.ts
deleted file mode 100644
index 663d592..0000000
--- a/lib/documentation/catalog.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-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()
- 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))
-}
diff --git a/lib/documentation/docx.ts b/lib/documentation/docx.ts
deleted file mode 100644
index 011f760..0000000
--- a/lib/documentation/docx.ts
+++ /dev/null
@@ -1,272 +0,0 @@
-import {
- Document,
- HeadingLevel,
- ImageRun,
- Packer,
- Paragraph,
- TableOfContents,
- TextRun,
- AlignmentType,
- PageBreak,
- BorderStyle,
-} from "docx"
-import type { DocumentationPage } from "@/lib/documentation/catalog"
-
-export type DocumentationRenderItem = {
- page: DocumentationPage
- screenshotPng?: Buffer
- error?: string
-}
-
-function groupBy(items: T[], getKey: (item: T) => string): Record {
- const map: Record = {}
- for (const item of items) {
- const key = getKey(item)
- if (!map[key]) map[key] = []
- map[key].push(item)
- }
- return map
-}
-
-export async function renderDocumentationDocx(items: DocumentationRenderItem[]) {
- const now = new Date()
- const title = "Soul派对 - 应用功能文档"
- const subtitle = `生成时间:${now.toLocaleString("zh-CN", { hour12: false })}`
- const version = `文档版本:v1.0`
-
- const children: Paragraph[] = []
-
- children.push(new Paragraph({ text: "" }))
- children.push(new Paragraph({ text: "" }))
- children.push(
- new Paragraph({
- text: title,
- heading: HeadingLevel.TITLE,
- alignment: AlignmentType.CENTER,
- }),
- )
- children.push(
- new Paragraph({
- children: [new TextRun({ text: subtitle, size: 24 })],
- alignment: AlignmentType.CENTER,
- }),
- )
- children.push(
- new Paragraph({
- children: [new TextRun({ text: version, size: 20, color: "666666" })],
- alignment: AlignmentType.CENTER,
- }),
- )
- children.push(new Paragraph({ text: "" }))
- children.push(new Paragraph({ text: "" }))
-
- children.push(
- new Paragraph({
- text: "文档概述",
- heading: HeadingLevel.HEADING_1,
- }),
- )
- children.push(
- new Paragraph({
- children: [
- new TextRun({
- text: "本文档自动生成,包含应用程序所有核心页面的功能说明与界面截图。文档按功能模块分组,便于快速查阅和理解应用结构。",
- }),
- ],
- }),
- )
- children.push(
- new Paragraph({
- children: [
- new TextRun({
- text: `共包含 ${items.length} 个页面,${Object.keys(groupBy(items, (i) => i.page.group)).length} 个功能模块。`,
- }),
- ],
- }),
- )
- children.push(new Paragraph({ text: "" }))
-
- children.push(
- new Paragraph({
- text: "目录",
- heading: HeadingLevel.HEADING_1,
- }),
- )
- children.push(
- new TableOfContents("目录", {
- hyperlink: true,
- headingStyleRange: "1-3",
- }),
- )
- children.push(
- new Paragraph({
- children: [new PageBreak()],
- }),
- )
-
- const grouped = groupBy(items, (i) => i.page.group)
- const groupNames = Object.keys(grouped)
-
- let pageNumber = 1
- for (const groupName of groupNames) {
- children.push(
- new Paragraph({
- text: groupName,
- heading: HeadingLevel.HEADING_1,
- border: {
- bottom: { color: "2DD4BF", size: 6, style: BorderStyle.SINGLE },
- },
- }),
- )
- children.push(new Paragraph({ text: "" }))
-
- for (const item of grouped[groupName]) {
- const { page } = item
-
- children.push(
- new Paragraph({
- text: `${pageNumber}. ${page.title}`,
- heading: HeadingLevel.HEADING_2,
- }),
- )
-
- if (page.subtitle) {
- children.push(
- new Paragraph({
- children: [new TextRun({ text: page.subtitle, italics: true, color: "666666" })],
- }),
- )
- }
-
- children.push(
- new Paragraph({
- children: [
- new TextRun({ text: "页面路径:", bold: true }),
- new TextRun({ text: page.path, color: "2563EB" }),
- ],
- }),
- )
-
- if (page.caption) {
- children.push(new Paragraph({ text: "" }))
- children.push(
- new Paragraph({
- children: [new TextRun({ text: "功能说明:", bold: true })],
- }),
- )
- children.push(
- new Paragraph({
- children: [new TextRun({ text: page.caption })],
- }),
- )
- }
-
- children.push(new Paragraph({ text: "" }))
-
- if (item.error) {
- children.push(
- new Paragraph({
- children: [
- new TextRun({ text: "截图状态:", bold: true }),
- new TextRun({ text: `失败 - ${item.error}`, color: "DC2626" }),
- ],
- }),
- )
- } else if (item.screenshotPng) {
- children.push(
- new Paragraph({
- children: [new TextRun({ text: "界面截图:", bold: true })],
- }),
- )
- children.push(new Paragraph({ text: "" }))
- children.push(
- new Paragraph({
- children: [
- new ImageRun({
- data: item.screenshotPng,
- transformation: { width: 320, height: 693 },
- }),
- ],
- alignment: AlignmentType.CENTER,
- }),
- )
- children.push(
- new Paragraph({
- children: [new TextRun({ text: `图${pageNumber}: ${page.title}界面`, size: 20, color: "666666" })],
- alignment: AlignmentType.CENTER,
- }),
- )
- }
-
- children.push(new Paragraph({ text: "" }))
- children.push(new Paragraph({ text: "" }))
- pageNumber++
- }
-
- children.push(
- new Paragraph({
- children: [new PageBreak()],
- }),
- )
- }
-
- children.push(
- new Paragraph({
- text: "附录",
- heading: HeadingLevel.HEADING_1,
- }),
- )
- children.push(
- new Paragraph({
- children: [new TextRun({ text: "技术说明", bold: true })],
- }),
- )
- children.push(
- new Paragraph({
- children: [
- new TextRun({
- text: "• 截图尺寸:430×932像素 (iPhone 14 Pro Max)",
- }),
- ],
- }),
- )
- children.push(
- new Paragraph({
- children: [
- new TextRun({
- text: "• 截图方式:Playwright自动化浏览器截图",
- }),
- ],
- }),
- )
- children.push(
- new Paragraph({
- children: [
- new TextRun({
- text: "• 文档格式:Microsoft Word (.docx)",
- }),
- ],
- }),
- )
- children.push(new Paragraph({ text: "" }))
- children.push(
- new Paragraph({
- children: [new TextRun({ text: "本文档由系统自动生成,如有问题请联系技术支持。", color: "666666", size: 20 })],
- alignment: AlignmentType.CENTER,
- }),
- )
-
- const doc = new Document({
- title: "Soul派对 - 应用功能文档",
- description: "自动生成的应用功能文档",
- creator: "Soul派对文档生成器",
- sections: [
- {
- properties: {},
- children,
- },
- ],
- })
-
- return await Packer.toBuffer(doc)
-}
diff --git a/lib/documentation/screenshot.ts b/lib/documentation/screenshot.ts
deleted file mode 100644
index eff7d32..0000000
--- a/lib/documentation/screenshot.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-import type { DocumentationPage } from "@/lib/documentation/catalog"
-
-export type ScreenshotResult = {
- page: DocumentationPage
- screenshotPng?: Buffer
- error?: string
-}
-
-type CaptureOptions = {
- baseUrl: string
- timeoutMs: number
- viewport: { width: number; height: number }
-}
-
-export async function captureScreenshots(
- pages: DocumentationPage[],
- options: CaptureOptions,
-): Promise {
- const { chromium } = await import("playwright")
- const browser = await chromium.launch({
- headless: true,
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
- })
-
- try {
- const results: ScreenshotResult[] = []
-
- for (const pageInfo of pages) {
- const page = await browser.newPage({ viewport: options.viewport })
- try {
- const captureUrl = new URL("/documentation/capture", options.baseUrl)
- captureUrl.searchParams.set("path", pageInfo.path)
-
- console.log(`[v0] Capturing: ${pageInfo.path}`)
-
- await page.goto(captureUrl.toString(), {
- waitUntil: "networkidle",
- timeout: options.timeoutMs,
- })
-
- const iframeHandle = await page.waitForSelector('iframe[data-doc-iframe="true"]', {
- timeout: options.timeoutMs,
- })
-
- const frame = await iframeHandle.contentFrame()
- if (!frame) {
- throw new Error("无法获取iframe内容")
- }
-
- await frame.waitForLoadState("domcontentloaded", { timeout: options.timeoutMs })
-
- // Allow network to settle
- await frame.waitForLoadState("networkidle", { timeout: options.timeoutMs }).catch(() => {
- console.log(`[v0] Network idle timeout for ${pageInfo.path}, continuing...`)
- })
-
- if (pageInfo.waitForSelector) {
- await frame
- .waitForSelector(pageInfo.waitForSelector, {
- timeout: options.timeoutMs,
- })
- .catch(() => {
- console.log(`[v0] Selector timeout for ${pageInfo.path}, continuing...`)
- })
- }
-
- await page.waitForTimeout(500)
-
- const screenshot = await iframeHandle.screenshot({
- type: "png",
- animations: "disabled",
- })
-
- results.push({
- page: pageInfo,
- screenshotPng: Buffer.from(screenshot),
- })
-
- console.log(`[v0] Success: ${pageInfo.path}`)
- } catch (error) {
- const message = error instanceof Error ? error.message : String(error)
- console.log(`[v0] Error capturing ${pageInfo.path}: ${message}`)
- results.push({ page: pageInfo, error: message })
- } finally {
- await page.close().catch(() => undefined)
- }
- }
-
- return results
- } finally {
- await browser.close().catch(() => undefined)
- }
-}
diff --git a/lib/markdown.ts b/lib/markdown.ts
deleted file mode 100644
index a762b3e..0000000
--- a/lib/markdown.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import fs from 'fs'
-import path from 'path'
-import matter from 'gray-matter'
-
-export interface MarkdownContent {
- frontmatter: {
- [key: string]: any
- }
- content: string
-}
-
-export function getMarkdownContent(filePath: string): MarkdownContent {
- try {
- const fullPath = path.join(process.cwd(), filePath)
-
- // Ensure file exists
- if (!fs.existsSync(fullPath)) {
- console.warn(`File not found: ${filePath}`)
- return {
- frontmatter: {},
- content: 'Content not found.'
- }
- }
-
- const fileContents = fs.readFileSync(fullPath, 'utf8')
- const { data, content } = matter(fileContents)
-
- return {
- frontmatter: data,
- content,
- }
- } catch (error) {
- console.error(`Error reading markdown file: ${filePath}`, error)
- return {
- frontmatter: {},
- content: 'Error loading content.'
- }
- }
-}
diff --git a/lib/modules/marketing/types.ts b/lib/modules/marketing/types.ts
deleted file mode 100644
index ea001e3..0000000
--- a/lib/modules/marketing/types.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-export type CampaignType = 'popup' | 'banner' | 'modal' | 'toast';
-
-export interface Campaign {
- id: string;
- name: string;
- type: CampaignType;
- isActive: boolean;
- rules: CampaignRule[];
- content: CampaignContent;
- startDate?: Date;
- endDate?: Date;
-}
-
-export interface CampaignRule {
- type: 'time_on_page' | 'scroll_depth' | 'exit_intent' | 'user_segment';
- value: number | string; // e.g., 30 (seconds), 50 (percent)
-}
-
-export interface CampaignContent {
- title?: string;
- body?: string;
- imageUrl?: string;
- ctaText?: string;
- ctaUrl?: string;
-}
-
-export interface MarketingService {
- getActiveCampaigns(context: UserContext): Promise;
- trackImpression(campaignId: string): void;
- trackClick(campaignId: string): void;
-}
-
-export interface UserContext {
- userId?: string;
- pageUrl: string;
- device: 'mobile' | 'desktop';
-}
diff --git a/lib/modules/payment/types.ts b/lib/modules/payment/types.ts
deleted file mode 100644
index 00dee37..0000000
--- a/lib/modules/payment/types.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export type PaymentStatus = 'pending' | 'success' | 'failed' | 'refunded';
-
-export interface Order {
- id: string;
- userId: string;
- amount: number;
- currency: string;
- status: PaymentStatus;
- items: OrderItem[];
- createdAt: Date;
- updatedAt: Date;
-}
-
-export interface OrderItem {
- id: string;
- productId: string;
- productType: 'section' | 'full_book' | 'membership';
- quantity: number;
- price: number;
-}
-
-export interface PaymentProvider {
- name: string;
- createOrder(order: Order): Promise<{ payUrl: string; orderId: string }>;
- checkStatus(orderId: string): Promise;
-}
diff --git a/lib/modules/referral/types.ts b/lib/modules/referral/types.ts
deleted file mode 100644
index bdbc472..0000000
--- a/lib/modules/referral/types.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export interface ReferralCode {
- code: string;
- ownerId: string;
- createdAt: Date;
- campaignId?: string;
-}
-
-export interface ReferralStats {
- userId: string;
- totalClicks: number;
- totalConversions: number;
- totalEarnings: number;
- pendingEarnings: number;
-}
-
-export interface ReferralRecord {
- id: string;
- referrerId: string;
- refereeId: string; // The new user
- action: 'register' | 'purchase';
- amount?: number; // Purchase amount if applicable
- commission: number;
- status: 'pending' | 'paid' | 'cancelled';
- createdAt: Date;
-}
-
-export interface ReferralService {
- generateCode(userId: string): Promise;
- trackVisit(code: string, visitorInfo: any): Promise;
- recordConversion(code: string, action: 'register' | 'purchase', amount?: number): Promise;
- getStats(userId: string): Promise;
-}
diff --git a/lib/payment-service.ts b/lib/payment-service.ts
deleted file mode 100644
index d4b23d9..0000000
--- a/lib/payment-service.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-export interface PaymentOrder {
- orderId: string
- userId: string
- type: "section" | "fullbook"
- sectionId?: string
- sectionTitle?: string
- amount: number
- paymentMethod: "wechat" | "alipay" | "usdt" | "paypal"
- referralCode?: string
- status: "pending" | "completed" | "failed" | "refunded"
- createdAt: string
- expireAt: string
- transactionId?: string
- completedAt?: string
-}
-
-export class PaymentService {
- /**
- * Create a new payment order
- */
- static async createOrder(params: {
- userId: string
- type: "section" | "fullbook"
- sectionId?: string
- sectionTitle?: string
- amount: number
- paymentMethod: string
- referralCode?: string
- }): Promise {
- const response = await fetch("/api/payment/create-order", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(params),
- })
-
- const result = await response.json()
- if (result.code !== 0) {
- throw new Error(result.message || "创建订单失败")
- }
-
- return result.data
- }
-
- /**
- * Verify payment completion
- */
- static async verifyPayment(orderId: string, transactionId?: string): Promise {
- const response = await fetch("/api/payment/verify", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ orderId, transactionId }),
- })
-
- const result = await response.json()
- return result.code === 0 && result.data.status === "completed"
- }
-
- /**
- * Get user orders
- */
- static async getUserOrders(userId: string): Promise {
- const response = await fetch(`/api/orders?userId=${userId}`)
- const result = await response.json()
-
- if (result.code !== 0) {
- throw new Error(result.message || "获取订单失败")
- }
-
- return result.data
- }
-
- /**
- * Get payment gateway config
- */
- static getPaymentConfig(method: "wechat" | "alipay" | "usdt" | "paypal") {
- // In production, fetch from settings API
- // For now, use localStorage
- const settings = JSON.parse(localStorage.getItem("settings") || "{}")
- return settings.paymentMethods?.[method] || {}
- }
-
- /**
- * Generate payment QR code URL
- */
- static getPaymentQRCode(method: "wechat" | "alipay", amount: number, orderId: string): string {
- const config = this.getPaymentConfig(method)
-
- // If it's a redirect URL, return it directly
- if (
- config.qrCode?.startsWith("http") ||
- config.qrCode?.startsWith("weixin://") ||
- config.qrCode?.startsWith("alipays://")
- ) {
- return config.qrCode
- }
-
- // Otherwise return the QR code image
- return config.qrCode || ""
- }
-
- /**
- * Open payment app (Wechat/Alipay)
- */
- static openPaymentApp(method: "wechat" | "alipay", orderId: string): boolean {
- const config = this.getPaymentConfig(method)
- const redirectUrl = config.qrCode
-
- if (!redirectUrl) {
- console.error("[v0] No payment URL configured for", method)
- return false
- }
-
- // Open URL in new window/tab
- window.open(redirectUrl, "_blank")
- return true
- }
-}
diff --git a/lib/payment-store.ts b/lib/payment-store.ts
deleted file mode 100644
index 6df24c5..0000000
--- a/lib/payment-store.ts
+++ /dev/null
@@ -1,115 +0,0 @@
-export interface Order {
- id: string
- userId: string
- amount: number
- currency: string
- status: "pending" | "paid" | "failed" | "refunded"
- items: { type: "book" | "section"; id: string; title: string; price: number }[]
- gateway?: string
- transactionId?: string
- createdAt: string
- updatedAt: string
-}
-
-export interface PaymentConfig {
- wechat: {
- enabled: boolean
- qrcode: string
- appId?: string
- }
- alipay: {
- enabled: boolean
- qrcode: string
- appId?: string
- }
- usdt: {
- enabled: boolean
- walletAddress: string
- network: string
- }
-}
-
-const ORDERS_KEY = "soul_orders"
-const PAYMENT_CONFIG_KEY = "soul_payment_config"
-
-// 订单管理
-export function getOrders(): Order[] {
- if (typeof window === "undefined") return []
- const data = localStorage.getItem(ORDERS_KEY)
- return data ? JSON.parse(data) : []
-}
-
-export function getOrderById(id: string): Order | undefined {
- return getOrders().find((o) => o.id === id)
-}
-
-export function getOrdersByUser(userId: string): Order[] {
- return getOrders().filter((o) => o.userId === userId)
-}
-
-export function createOrder(order: Omit): Order {
- const orders = getOrders()
- const newOrder: Order = {
- ...order,
- id: `order_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
- createdAt: new Date().toISOString(),
- updatedAt: new Date().toISOString(),
- }
- orders.push(newOrder)
- localStorage.setItem(ORDERS_KEY, JSON.stringify(orders))
- return newOrder
-}
-
-export function updateOrder(id: string, updates: Partial): Order | null {
- const orders = getOrders()
- const index = orders.findIndex((o) => o.id === id)
- if (index === -1) return null
-
- orders[index] = {
- ...orders[index],
- ...updates,
- updatedAt: new Date().toISOString(),
- }
- localStorage.setItem(ORDERS_KEY, JSON.stringify(orders))
- return orders[index]
-}
-
-// 支付配置管理
-export function getPaymentConfig(): PaymentConfig {
- if (typeof window === "undefined") {
- return {
- wechat: { enabled: false, qrcode: "" },
- alipay: { enabled: false, qrcode: "" },
- usdt: { enabled: false, walletAddress: "", network: "TRC20" },
- }
- }
- const data = localStorage.getItem(PAYMENT_CONFIG_KEY)
- return data
- ? JSON.parse(data)
- : {
- wechat: { enabled: true, qrcode: "" },
- alipay: { enabled: true, qrcode: "" },
- usdt: { enabled: false, walletAddress: "", network: "TRC20" },
- }
-}
-
-export function updatePaymentConfig(config: Partial): PaymentConfig {
- const current = getPaymentConfig()
- const updated = { ...current, ...config }
- localStorage.setItem(PAYMENT_CONFIG_KEY, JSON.stringify(updated))
- return updated
-}
-
-// 模拟支付流程(实际生产环境需要对接真实支付网关)
-export async function simulatePayment(orderId: string, gateway: string): Promise {
- // 模拟支付延迟
- await new Promise((resolve) => setTimeout(resolve, 1500))
-
- const order = updateOrder(orderId, {
- status: "paid",
- gateway,
- transactionId: `txn_${Date.now()}`,
- })
-
- return !!order
-}
diff --git a/lib/payment/alipay.ts b/lib/payment/alipay.ts
deleted file mode 100644
index 0db12e3..0000000
--- a/lib/payment/alipay.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import crypto from "crypto"
-
-export interface AlipayConfig {
- appId: string
- partnerId: string
- key: string
- returnUrl: string
- notifyUrl: string
-}
-
-export class AlipayService {
- constructor(private config: AlipayConfig) {}
-
- // 创建支付宝订单
- createOrder(params: {
- outTradeNo: string
- subject: string
- totalAmount: number
- body?: string
- }) {
- const orderInfo = {
- app_id: this.config.appId,
- method: "alipay.trade.wap.pay",
- format: "JSON",
- charset: "utf-8",
- sign_type: "MD5",
- timestamp: new Date().toISOString().slice(0, 19).replace("T", " "),
- version: "1.0",
- notify_url: this.config.notifyUrl,
- return_url: this.config.returnUrl,
- biz_content: JSON.stringify({
- out_trade_no: params.outTradeNo,
- product_code: "QUICK_WAP_WAY",
- total_amount: params.totalAmount.toFixed(2),
- subject: params.subject,
- body: params.body || params.subject,
- }),
- }
-
- const sign = this.generateSign(orderInfo)
- return {
- ...orderInfo,
- sign,
- paymentUrl: this.buildPaymentUrl(orderInfo, sign),
- }
- }
-
- // 生成签名
- generateSign(params: Record): string {
- const sortedKeys = Object.keys(params).sort()
- const signString = sortedKeys
- .filter((key) => params[key] && key !== "sign")
- .map((key) => `${key}=${params[key]}`)
- .join("&")
-
- const signWithKey = `${signString}${this.config.key}`
- return crypto.createHash("md5").update(signWithKey, "utf8").digest("hex")
- }
-
- // 验证回调签名
- verifySign(params: Record): boolean {
- const receivedSign = params.sign
- if (!receivedSign) return false
-
- const calculatedSign = this.generateSign(params)
- return receivedSign.toLowerCase() === calculatedSign.toLowerCase()
- }
-
- // 构建支付URL
- private buildPaymentUrl(params: Record, sign: string): string {
- const gateway = "https://openapi.alipay.com/gateway.do"
- const queryParams = new URLSearchParams({ ...params, sign })
- return `${gateway}?${queryParams.toString()}`
- }
-}
diff --git a/lib/payment/wechat.tsx b/lib/payment/wechat.tsx
deleted file mode 100644
index b73caf8..0000000
--- a/lib/payment/wechat.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import crypto from "crypto"
-
-export interface WechatPayConfig {
- appId: string
- appSecret: string
- mchId: string
- apiKey: string
- notifyUrl: string
-}
-
-export class WechatPayService {
- constructor(private config: WechatPayConfig) {}
-
- // 创建微信支付订单(扫码支付)
- async createOrder(params: {
- outTradeNo: string
- body: string
- totalFee: number
- spbillCreateIp: string
- }) {
- const orderParams = {
- appid: this.config.appId,
- mch_id: this.config.mchId,
- nonce_str: this.generateNonceStr(),
- body: params.body,
- out_trade_no: params.outTradeNo,
- total_fee: Math.round(params.totalFee * 100).toString(), // 转换为分
- spbill_create_ip: params.spbillCreateIp,
- notify_url: this.config.notifyUrl,
- trade_type: "NATIVE", // 扫码支付
- }
-
- const sign = this.generateSign(orderParams)
- const xmlData = this.buildXML({ ...orderParams, sign })
-
- // In production, make actual API call to WeChat
- // const response = await fetch("https://api.mch.weixin.qq.com/pay/unifiedorder", {
- // method: "POST",
- // body: xmlData,
- // headers: { "Content-Type": "application/xml" },
- // })
-
- // Mock response for development
- return {
- codeUrl: `weixin://wxpay/bizpayurl?pr=${this.generateNonceStr()}`,
- prepayId: `prepay_${Date.now()}`,
- outTradeNo: params.outTradeNo,
- }
- }
-
- // 生成随机字符串
- private generateNonceStr(): string {
- return crypto.randomBytes(16).toString("hex")
- }
-
- // 生成签名
- generateSign(params: Record): string {
- const sortedKeys = Object.keys(params).sort()
- const signString = sortedKeys
- .filter((key) => params[key] && key !== "sign")
- .map((key) => `${key}=${params[key]}`)
- .join("&")
-
- const signWithKey = `${signString}&key=${this.config.apiKey}`
- return crypto.createHash("md5").update(signWithKey, "utf8").digest("hex").toUpperCase()
- }
-
- // 验证签名
- verifySign(params: Record): boolean {
- const receivedSign = params.sign
- if (!receivedSign) return false
-
- const calculatedSign = this.generateSign(params)
- return receivedSign === calculatedSign
- }
-
- // 构建XML数据
- private buildXML(params: Record): string {
- const xml = [""]
- for (const [key, value] of Object.entries(params)) {
- xml.push(`<${key}>${key}>`)
- }
- xml.push("")
- return xml.join("")
- }
-
- // 解析XML数据
- private async parseXML(xml: string): Promise> {
- const result: Record = {}
- const regex = /<(\w+)><\/\1>/g
- let match
-
- while ((match = regex.exec(xml)) !== null) {
- result[match[1]] = match[2]
- }
-
- return result
- }
-}
diff --git a/lib/store.ts b/lib/store.ts
deleted file mode 100644
index 3d634a5..0000000
--- a/lib/store.ts
+++ /dev/null
@@ -1,664 +0,0 @@
-"use client"
-
-import { create } from "zustand"
-import { persist } from "zustand/middleware"
-import { getFullBookPrice } from "./book-data"
-
-export interface User {
- id: string
- phone: string
- nickname: string
- isAdmin: boolean
- purchasedSections: string[]
- hasFullBook: boolean
- referralCode: string
- referredBy?: string
- earnings: number
- pendingEarnings: number
- withdrawnEarnings: number
- referralCount: number
- createdAt: string
-}
-
-export interface Withdrawal {
- id: string
- userId: string
- amount: number
- method: "wechat" | "alipay"
- account: string
- name: string
- status: "pending" | "completed" | "rejected"
- createdAt: string
- completedAt?: string
-}
-
-export interface Purchase {
- id: string
- userId: string
- userPhone?: string
- userNickname?: string
- type: "section" | "fullbook"
- sectionId?: string
- sectionTitle?: string
- amount: number
- paymentMethod?: string
- referralCode?: string
- referrerEarnings?: number
- status: "pending" | "completed" | "refunded"
- createdAt: string
-}
-
-export interface LiveQRCodeConfig {
- id: string
- name: string
- urls: string[] // 多个URL随机跳转
- imageUrl: string
- redirectType: "random" | "sequential" | "weighted"
- weights?: number[]
- clickCount: number
- enabled: boolean
-}
-
-export interface QRCodeConfig {
- id: string
- name: string
- url: string
- imageUrl: string
- weight: number
- enabled: boolean
-}
-
-export interface PaymentAccountConfig {
- wechat: {
- enabled: boolean
- qrCode: string
- account: string
- websiteAppId: string
- websiteAppSecret: string
- serviceAppId: string
- serviceAppSecret: string
- mpVerifyCode: string
- merchantId: string
- apiKey: string
- groupQrCode?: string // 微信群二维码链接
- }
- alipay: {
- enabled: boolean
- qrCode: string
- account: string
- partnerId: string // PID 合作者身份
- securityKey: string // 安全校验码 Key
- mobilePayEnabled: boolean
- paymentInterface: string // 支付接口类型
- }
- usdt: {
- enabled: boolean
- network: "TRC20" | "ERC20" | "BEP20"
- address: string
- exchangeRate: number
- }
- paypal: {
- enabled: boolean
- email: string
- exchangeRate: number
- }
-}
-
-export interface FeishuSyncConfig {
- enabled: boolean
- docUrl: string
- lastSyncAt?: string
- autoSync: boolean
- syncInterval: number // 分钟
-}
-
-export interface Settings {
- distributorShare: number
- authorShare: number
- paymentMethods: PaymentAccountConfig
- sectionPrice: number
- baseBookPrice: number
- pricePerSection: number
- qrCodes: QRCodeConfig[]
- liveQRCodes: LiveQRCodeConfig[]
- feishuSync: FeishuSyncConfig
- authorInfo: {
- name: string
- description: string
- liveTime: string
- platform: string
- }
-}
-
-interface StoreState {
- user: User | null
- isLoggedIn: boolean
- purchases: Purchase[]
- withdrawals: Withdrawal[]
- settings: Settings
-
- login: (phone: string, code: string) => Promise
- logout: () => void
- register: (phone: string, nickname: string, referralCode?: string) => Promise
- purchaseSection: (sectionId: string, sectionTitle?: string, paymentMethod?: string) => Promise
- purchaseFullBook: (paymentMethod?: string) => Promise
- hasPurchased: (sectionId: string) => boolean
- adminLogin: (username: string, password: string) => boolean
- updateSettings: (newSettings: Partial) => void
- getAllUsers: () => User[]
- getAllPurchases: () => Purchase[]
- addUser: (user: Partial) => User
- updateUser: (userId: string, updates: Partial) => void
- deleteUser: (userId: string) => void
- addPurchase: (purchase: Omit) => void
- requestWithdrawal: (amount: number, method: "wechat" | "alipay", account: string, name: string) => void
- completeWithdrawal: (id: string) => void
- updateLiveQRCode: (config: Partial) => void
- getRandomQRCode: () => QRCodeConfig | null
- getLiveQRCodeUrl: (qrId: string) => string | null
- exportData: () => string
- fetchSettings: () => Promise
-}
-
-const initialSettings: Settings = {
- distributorShare: 90,
- authorShare: 10,
- paymentMethods: {
- alipay: {
- enabled: true,
- qrCode: "",
- account: "",
- partnerId: "2088511801157159",
- securityKey: "lz6ey1h3kl9zqkgtjz3avb5gk37wzbrp",
- mobilePayEnabled: true,
- paymentInterface: "official_instant", // 支付宝官方即时到账接口
- },
- wechat: {
- enabled: true,
- qrCode: "",
- account: "",
- websiteAppId: "wx432c93e275548671",
- websiteAppSecret: "25b7e7fdb7998e5107e242ebb6ddabd0",
- serviceAppId: "wx7c0dbf34ddba300d",
- serviceAppSecret: "f865ef18c43dfea6cbe3b1f1aebdb82e",
- mpVerifyCode: "SP8AfZJyAvprRORT",
- merchantId: "1318592501",
- apiKey: "wx3e31b068be59ddc131b068be59ddc2",
- groupQrCode: "", // 微信群二维码链接,管理员配置
- },
- usdt: {
- enabled: true,
- network: "TRC20",
- address: "",
- exchangeRate: 7.2,
- },
- paypal: {
- enabled: false,
- email: "",
- exchangeRate: 7.2,
- },
- },
- sectionPrice: 1,
- baseBookPrice: 9.9,
- pricePerSection: 1,
- qrCodes: [
- {
- id: "default",
- name: "Soul派对群",
- url: "https://soul.cn/party",
- imageUrl: "/images/image.png",
- weight: 1,
- enabled: true,
- },
- ],
- liveQRCodes: [
- {
- id: "party-group",
- name: "派对群活码",
- urls: ["https://soul.cn/party1", "https://soul.cn/party2", "https://soul.cn/party3"],
- imageUrl: "/images/image.png",
- redirectType: "random",
- clickCount: 0,
- enabled: true,
- },
- ],
- feishuSync: {
- enabled: false,
- docUrl: "",
- autoSync: false,
- syncInterval: 60,
- },
- authorInfo: {
- name: "卡若",
- description: "连续创业者,私域运营专家,每天早上6-9点在Soul派对房分享真实商业故事",
- liveTime: "06:00-09:00",
- platform: "Soul派对房",
- },
-}
-
-export const useStore = create()(
- persist(
- (set, get) => ({
- user: null,
- isLoggedIn: false,
- purchases: [],
- withdrawals: [],
- settings: initialSettings,
-
- login: async (phone: string, code: string) => {
- if (code !== "123456") {
- return false
- }
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const existingUser = users.find((u) => u.phone === phone)
- if (existingUser) {
- set({ user: existingUser, isLoggedIn: true })
- return true
- }
- return false
- },
-
- logout: () => {
- set({ user: null, isLoggedIn: false })
- },
-
- register: async (phone: string, nickname: string, referralCode?: string) => {
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- if (users.find((u) => u.phone === phone)) {
- return false
- }
-
- const newUser: User = {
- id: `user_${Date.now()}`,
- phone,
- nickname,
- isAdmin: false,
- purchasedSections: [],
- hasFullBook: false,
- referralCode: `REF${Date.now().toString(36).toUpperCase()}`,
- referredBy: referralCode,
- earnings: 0,
- pendingEarnings: 0,
- withdrawnEarnings: 0,
- referralCount: 0,
- createdAt: new Date().toISOString(),
- }
-
- if (referralCode) {
- const referrer = users.find((u) => u.referralCode === referralCode)
- if (referrer) {
- referrer.referralCount = (referrer.referralCount || 0) + 1
- localStorage.setItem("users", JSON.stringify(users))
- }
- }
-
- users.push(newUser)
- localStorage.setItem("users", JSON.stringify(users))
- set({ user: newUser, isLoggedIn: true })
- return true
- },
-
- purchaseSection: async (sectionId: string, sectionTitle?: string, paymentMethod?: string) => {
- const { user, settings } = get()
- if (!user) return false
-
- const amount = settings.sectionPrice
- const purchase: Purchase = {
- id: `purchase_${Date.now()}`,
- userId: user.id,
- userPhone: user.phone,
- userNickname: user.nickname,
- type: "section",
- sectionId,
- sectionTitle,
- amount,
- paymentMethod,
- referralCode: user.referredBy,
- status: "completed",
- createdAt: new Date().toISOString(),
- }
-
- const updatedUser = {
- ...user,
- purchasedSections: [...user.purchasedSections, sectionId],
- }
-
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const userIndex = users.findIndex((u) => u.id === user.id)
- if (userIndex !== -1) {
- users[userIndex] = updatedUser
- localStorage.setItem("users", JSON.stringify(users))
- }
-
- if (user.referredBy) {
- const referrer = users.find((u) => u.referralCode === user.referredBy)
- if (referrer) {
- const referrerEarnings = amount * (settings.distributorShare / 100)
- referrer.earnings += referrerEarnings
- referrer.pendingEarnings = (referrer.pendingEarnings || 0) + referrerEarnings
- purchase.referrerEarnings = referrerEarnings
- localStorage.setItem("users", JSON.stringify(users))
- }
- }
-
- const purchases = JSON.parse(localStorage.getItem("all_purchases") || "[]") as Purchase[]
- purchases.push(purchase)
- localStorage.setItem("all_purchases", JSON.stringify(purchases))
-
- set({ user: updatedUser, purchases: [...get().purchases, purchase] })
- return true
- },
-
- purchaseFullBook: async (paymentMethod?: string) => {
- const { user, settings } = get()
- if (!user) return false
-
- const fullBookPrice = getFullBookPrice()
- const purchase: Purchase = {
- id: `purchase_${Date.now()}`,
- userId: user.id,
- userPhone: user.phone,
- userNickname: user.nickname,
- type: "fullbook",
- amount: fullBookPrice,
- paymentMethod,
- referralCode: user.referredBy,
- status: "completed",
- createdAt: new Date().toISOString(),
- }
-
- const updatedUser = { ...user, hasFullBook: true }
-
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const userIndex = users.findIndex((u) => u.id === user.id)
- if (userIndex !== -1) {
- users[userIndex] = updatedUser
- localStorage.setItem("users", JSON.stringify(users))
- }
-
- if (user.referredBy) {
- const referrer = users.find((u) => u.referralCode === user.referredBy)
- if (referrer) {
- const referrerEarnings = fullBookPrice * (settings.distributorShare / 100)
- referrer.earnings += referrerEarnings
- referrer.pendingEarnings = (referrer.pendingEarnings || 0) + referrerEarnings
- purchase.referrerEarnings = referrerEarnings
- localStorage.setItem("users", JSON.stringify(users))
- }
- }
-
- const purchases = JSON.parse(localStorage.getItem("all_purchases") || "[]") as Purchase[]
- purchases.push(purchase)
- localStorage.setItem("all_purchases", JSON.stringify(purchases))
-
- set({ user: updatedUser, purchases: [...get().purchases, purchase] })
- return true
- },
-
- hasPurchased: (sectionId: string) => {
- const { user } = get()
- if (!user) return false
- if (user.hasFullBook) return true
- return user.purchasedSections.includes(sectionId)
- },
-
- adminLogin: (username: string, password: string) => {
- if (username.toLowerCase() === "admin" && password === "key123456") {
- const adminUser: User = {
- id: "admin",
- phone: "admin",
- nickname: "管理员",
- isAdmin: true,
- purchasedSections: [],
- hasFullBook: true,
- referralCode: "ADMIN",
- earnings: 0,
- pendingEarnings: 0,
- withdrawnEarnings: 0,
- referralCount: 0,
- createdAt: new Date().toISOString(),
- }
- set({ user: adminUser, isLoggedIn: true })
- return true
- }
- return false
- },
-
- updateSettings: (newSettings: Partial) => {
- const { settings } = get()
- const updatedSettings = { ...settings, ...newSettings }
- if (newSettings.distributorShare !== undefined) {
- updatedSettings.authorShare = 100 - newSettings.distributorShare
- }
- set({ settings: updatedSettings })
- if (typeof window !== "undefined") {
- localStorage.setItem("app_settings", JSON.stringify(updatedSettings))
- }
- },
-
- getAllUsers: () => {
- if (typeof window === "undefined") return []
- return JSON.parse(localStorage.getItem("users") || "[]") as User[]
- },
-
- getAllPurchases: () => {
- if (typeof window === "undefined") return []
- return JSON.parse(localStorage.getItem("all_purchases") || "[]") as Purchase[]
- },
-
- addUser: (userData: Partial) => {
- if (typeof window === "undefined") return { id: "temp", ...userData } as User
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const newUser: User = {
- id: `user_${Date.now()}`,
- phone: userData.phone || "",
- nickname: userData.nickname || "新用户",
- isAdmin: false,
- purchasedSections: [],
- hasFullBook: false,
- referralCode: `REF${Date.now().toString(36).toUpperCase()}`,
- earnings: 0,
- pendingEarnings: 0,
- withdrawnEarnings: 0,
- referralCount: 0,
- createdAt: new Date().toISOString(),
- ...userData,
- }
- users.push(newUser)
- localStorage.setItem("users", JSON.stringify(users))
- return newUser
- },
-
- updateUser: (userId: string, updates: Partial) => {
- if (typeof window === "undefined") return
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const index = users.findIndex((u) => u.id === userId)
- if (index !== -1) {
- users[index] = { ...users[index], ...updates }
- localStorage.setItem("users", JSON.stringify(users))
- }
- },
-
- deleteUser: (userId: string) => {
- if (typeof window === "undefined") return
- const users = JSON.parse(localStorage.getItem("users") || "[]") as User[]
- const filtered = users.filter((u) => u.id !== userId)
- localStorage.setItem("users", JSON.stringify(filtered))
- },
-
- addPurchase: (purchaseData) =>
- set((state) => {
- const newPurchase: Purchase = {
- id: Math.random().toString(36).substring(2, 9),
- createdAt: new Date().toISOString(),
- ...purchaseData,
- }
-
- // 如果是全书购买,更新用户状态
- if (state.user && purchaseData.userId === state.user.id) {
- const updatedUser = { ...state.user }
- if (purchaseData.type === "fullbook") {
- updatedUser.hasFullBook = true
- } else if (purchaseData.sectionId) {
- updatedUser.purchasedSections = [...updatedUser.purchasedSections, purchaseData.sectionId]
- }
-
- // 更新 users 数组
- const updatedUsers = state.users?.map((u) => (u.id === updatedUser.id ? updatedUser : u)) || []
-
- return {
- purchases: [...state.purchases, newPurchase],
- user: updatedUser,
- }
- }
-
- return {
- purchases: [...state.purchases, newPurchase],
- }
- }),
-
- requestWithdrawal: (amount, method, account, name) =>
- set((state) => {
- if (!state.user) return {}
- if (state.user.earnings < amount) return {}
-
- const newWithdrawal: Withdrawal = {
- id: Math.random().toString(36).substring(2, 9),
- userId: state.user.id,
- amount,
- method,
- account,
- name,
- status: "pending",
- createdAt: new Date().toISOString(),
- }
-
- // 扣除余额,增加冻结/提现中金额
- const updatedUser = {
- ...state.user,
- earnings: state.user.earnings - amount,
- pendingEarnings: state.user.pendingEarnings + amount,
- }
-
- return {
- withdrawals: [...(state.withdrawals || []), newWithdrawal],
- user: updatedUser,
- }
- }),
-
- completeWithdrawal: (id) =>
- set((state) => {
- const withdrawals = state.withdrawals || []
- const withdrawalIndex = withdrawals.findIndex((w) => w.id === id)
- if (withdrawalIndex === -1) return {}
-
- const withdrawal = withdrawals[withdrawalIndex]
- if (withdrawal.status !== "pending") return {}
-
- const updatedWithdrawals = [...withdrawals]
- updatedWithdrawals[withdrawalIndex] = {
- ...withdrawal,
- status: "completed",
- completedAt: new Date().toISOString(),
- }
-
- // 这里我们只是更新状态,资金已经在申请时扣除了
- // 实际场景中可能需要确认转账成功
-
- return {
- withdrawals: updatedWithdrawals,
- }
- }),
-
- updateLiveQRCode: (config) =>
- set((state) => {
- const { settings } = state
- const updatedLiveQRCodes = settings.liveQRCodes.map((qr) => (qr.id === config.id ? { ...qr, ...config } : qr))
- // 如果不存在且有id,则添加? 暂时只支持更新
- return {
- settings: { ...settings, liveQRCodes: updatedLiveQRCodes },
- }
- }),
-
- getRandomQRCode: () => {
- const { settings } = get()
- const enabledQRs = settings.qrCodes.filter((qr) => qr.enabled)
- if (enabledQRs.length === 0) return null
- const totalWeight = enabledQRs.reduce((sum, qr) => sum + qr.weight, 0)
- let random = Math.random() * totalWeight
- for (const qr of enabledQRs) {
- random -= qr.weight
- if (random <= 0) return qr
- }
- return enabledQRs[0]
- },
-
- getLiveQRCodeUrl: (qrId: string) => {
- const { settings } = get()
- const liveQR = settings.liveQRCodes.find((qr) => qr.id === qrId && qr.enabled)
- if (!liveQR || liveQR.urls.length === 0) return null
-
- // 更新点击次数
- liveQR.clickCount++
-
- if (liveQR.redirectType === "random") {
- const randomIndex = Math.floor(Math.random() * liveQR.urls.length)
- return liveQR.urls[randomIndex]
- } else if (liveQR.redirectType === "sequential") {
- const index = liveQR.clickCount % liveQR.urls.length
- return liveQR.urls[index]
- } else if (liveQR.redirectType === "weighted" && liveQR.weights) {
- const totalWeight = liveQR.weights.reduce((sum, w) => sum + w, 0)
- let random = Math.random() * totalWeight
- for (let i = 0; i < liveQR.urls.length; i++) {
- random -= liveQR.weights[i] || 1
- if (random <= 0) return liveQR.urls[i]
- }
- }
- return liveQR.urls[0]
- },
-
- exportData: () => {
- const { user, purchases, settings } = get()
- const data = {
- user,
- purchases,
- settings,
- exportDate: new Date().toISOString(),
- }
- return JSON.stringify(data, null, 2)
- },
-
- fetchSettings: async () => {
- try {
- const res = await fetch("/api/config")
- if (!res.ok) throw new Error("Failed to fetch config")
- const data = await res.json()
-
- const { settings } = get()
-
- // Deep merge payment methods to preserve existing defaults if API is partial
- const mergedPaymentMethods = {
- ...settings.paymentMethods,
- wechat: { ...settings.paymentMethods.wechat, ...data.paymentMethods?.wechat },
- alipay: { ...settings.paymentMethods.alipay, ...data.paymentMethods?.alipay },
- usdt: { ...settings.paymentMethods.usdt, ...data.paymentMethods?.usdt },
- paypal: { ...settings.paymentMethods.paypal, ...data.paymentMethods?.paypal },
- }
-
- const newSettings: Partial = {
- paymentMethods: mergedPaymentMethods,
- authorInfo: { ...settings.authorInfo, ...data.authorInfo },
- }
-
- set({ settings: { ...settings, ...newSettings } })
- } catch (error) {
- console.error("Failed to sync settings:", error)
- }
- },
- }),
- {
- name: "soul-experiment-storage",
- },
- ),
-)
diff --git a/lib/utils.ts b/lib/utils.ts
deleted file mode 100644
index fed2fe9..0000000
--- a/lib/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { clsx, type ClassValue } from 'clsx'
-import { twMerge } from 'tailwind-merge'
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
diff --git a/next-env.d.ts b/next-env.d.ts
deleted file mode 100644
index c4b7818..0000000
--- a/next-env.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-///
-///
-import "./.next/dev/types/routes.d.ts";
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.mjs b/next.config.mjs
deleted file mode 100644
index cd7723a..0000000
--- a/next.config.mjs
+++ /dev/null
@@ -1,12 +0,0 @@
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- typescript: {
- ignoreBuildErrors: true,
- },
- images: {
- unoptimized: true,
- },
-
-}
-
-export default nextConfig
diff --git a/package.json b/package.json
deleted file mode 100644
index 16295b9..0000000
--- a/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "my-v0-project",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "build": "next build",
- "dev": "next dev",
- "lint": "eslint .",
- "start": "next start"
- },
- "dependencies": {
- "@radix-ui/react-label": "2.1.8",
- "@radix-ui/react-select": "2.2.6",
- "@radix-ui/react-separator": "1.1.8",
- "@radix-ui/react-slot": "1.2.4",
- "@radix-ui/react-switch": "1.2.6",
- "@radix-ui/react-tabs": "1.1.13",
- "@testing-library/dom": "latest",
- "@testing-library/react": "16.3.1",
- "@vercel/analytics": "1.6.1",
- "class-variance-authority": "0.7.1",
- "clsx": "2.1.1",
- "docx": "9.5.1",
- "gray-matter": "4.0.3",
- "immer": "latest",
- "lucide-react": "0.562.0",
- "next": "16.0.10",
- "next-themes": "0.4.6",
- "playwright": "1.57.0",
- "react": "*",
- "react-dom": "*",
- "tailwind-merge": "3.4.0",
- "tailwindcss-animate": "1.0.7",
- "tw-animate-css": "1.4.0",
- "use-sync-external-store": "latest",
- "zustand": "5.0.9"
- },
- "devDependencies": {
- "@types/node": "25.0.3",
- "@types/react": "19.2.7",
- "@types/react-dom": "19.2.3",
- "postcss": "8.5.6",
- "tailwindcss": "^4.1.9",
- "typescript": "5.9.3"
- }
-}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
deleted file mode 100644
index ea5dc70..0000000
--- a/pnpm-lock.yaml
+++ /dev/null
@@ -1,1956 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- '@radix-ui/react-label':
- specifier: 2.1.8
- version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-select':
- specifier: 2.2.6
- version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-separator':
- specifier: 1.1.8
- version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-slot':
- specifier: 1.2.4
- version: 1.2.4(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-switch':
- specifier: 1.2.6
- version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-tabs':
- specifier: 1.1.13
- version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@testing-library/dom':
- specifier: latest
- version: 10.4.1
- '@testing-library/react':
- specifier: 16.3.1
- version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@vercel/analytics':
- specifier: 1.6.1
- version: 1.6.1(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
- class-variance-authority:
- specifier: 0.7.1
- version: 0.7.1
- clsx:
- specifier: 2.1.1
- version: 2.1.1
- docx:
- specifier: 9.5.1
- version: 9.5.1
- gray-matter:
- specifier: 4.0.3
- version: 4.0.3
- immer:
- specifier: latest
- version: 11.1.3
- lucide-react:
- specifier: 0.562.0
- version: 0.562.0(react@19.2.1)
- next:
- specifier: 16.0.10
- version: 16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- next-themes:
- specifier: 0.4.6
- version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- playwright:
- specifier: 1.57.0
- version: 1.57.0
- react:
- specifier: '*'
- version: 19.2.1
- react-dom:
- specifier: '*'
- version: 19.2.1(react@19.2.1)
- tailwind-merge:
- specifier: 3.4.0
- version: 3.4.0
- tailwindcss-animate:
- specifier: 1.0.7
- version: 1.0.7(tailwindcss@4.1.18)
- tw-animate-css:
- specifier: 1.4.0
- version: 1.4.0
- use-sync-external-store:
- specifier: latest
- version: 1.6.0(react@19.2.1)
- zustand:
- specifier: 5.0.9
- version: 5.0.9(@types/react@19.2.7)(immer@11.1.3)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1))
- devDependencies:
- '@types/node':
- specifier: 25.0.3
- version: 25.0.3
- '@types/react':
- specifier: 19.2.7
- version: 19.2.7
- '@types/react-dom':
- specifier: 19.2.3
- version: 19.2.3(@types/react@19.2.7)
- postcss:
- specifier: 8.5.6
- version: 8.5.6
- tailwindcss:
- specifier: ^4.1.9
- version: 4.1.18
- typescript:
- specifier: 5.9.3
- version: 5.9.3
-
-packages:
-
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.28.5':
- resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
- engines: {node: '>=6.9.0'}
-
- '@babel/runtime@7.28.4':
- resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
- engines: {node: '>=6.9.0'}
-
- '@emnapi/runtime@1.7.1':
- resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
-
- '@floating-ui/core@1.7.3':
- resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
-
- '@floating-ui/dom@1.7.4':
- resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
-
- '@floating-ui/react-dom@2.1.6':
- resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
-
- '@floating-ui/utils@0.2.10':
- resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
-
- '@img/colour@1.0.0':
- resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
- engines: {node: '>=18'}
-
- '@img/sharp-darwin-arm64@0.34.5':
- resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [darwin]
-
- '@img/sharp-darwin-x64@0.34.5':
- resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [darwin]
-
- '@img/sharp-libvips-darwin-arm64@1.2.4':
- resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
- cpu: [arm64]
- os: [darwin]
-
- '@img/sharp-libvips-darwin-x64@1.2.4':
- resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
- cpu: [x64]
- os: [darwin]
-
- '@img/sharp-libvips-linux-arm64@1.2.4':
- resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
- cpu: [arm64]
- os: [linux]
-
- '@img/sharp-libvips-linux-arm@1.2.4':
- resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
- cpu: [arm]
- os: [linux]
-
- '@img/sharp-libvips-linux-ppc64@1.2.4':
- resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
- cpu: [ppc64]
- os: [linux]
-
- '@img/sharp-libvips-linux-riscv64@1.2.4':
- resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
- cpu: [riscv64]
- os: [linux]
-
- '@img/sharp-libvips-linux-s390x@1.2.4':
- resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
- cpu: [s390x]
- os: [linux]
-
- '@img/sharp-libvips-linux-x64@1.2.4':
- resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
- cpu: [x64]
- os: [linux]
-
- '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
- resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
- cpu: [arm64]
- os: [linux]
-
- '@img/sharp-libvips-linuxmusl-x64@1.2.4':
- resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
- cpu: [x64]
- os: [linux]
-
- '@img/sharp-linux-arm64@0.34.5':
- resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [linux]
-
- '@img/sharp-linux-arm@0.34.5':
- resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm]
- os: [linux]
-
- '@img/sharp-linux-ppc64@0.34.5':
- resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [ppc64]
- os: [linux]
-
- '@img/sharp-linux-riscv64@0.34.5':
- resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [riscv64]
- os: [linux]
-
- '@img/sharp-linux-s390x@0.34.5':
- resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [s390x]
- os: [linux]
-
- '@img/sharp-linux-x64@0.34.5':
- resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [linux]
-
- '@img/sharp-linuxmusl-arm64@0.34.5':
- resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [linux]
-
- '@img/sharp-linuxmusl-x64@0.34.5':
- resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [linux]
-
- '@img/sharp-wasm32@0.34.5':
- resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [wasm32]
-
- '@img/sharp-win32-arm64@0.34.5':
- resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [arm64]
- os: [win32]
-
- '@img/sharp-win32-ia32@0.34.5':
- resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [ia32]
- os: [win32]
-
- '@img/sharp-win32-x64@0.34.5':
- resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- cpu: [x64]
- os: [win32]
-
- '@next/env@16.0.10':
- resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==}
-
- '@next/swc-darwin-arm64@16.0.10':
- resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
-
- '@next/swc-darwin-x64@16.0.10':
- resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
-
- '@next/swc-linux-arm64-gnu@16.0.10':
- resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@next/swc-linux-arm64-musl@16.0.10':
- resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@next/swc-linux-x64-gnu@16.0.10':
- resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@next/swc-linux-x64-musl@16.0.10':
- resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@next/swc-win32-arm64-msvc@16.0.10':
- resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [win32]
-
- '@next/swc-win32-x64-msvc@16.0.10':
- resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
-
- '@radix-ui/number@1.1.1':
- resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
-
- '@radix-ui/primitive@1.1.3':
- resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
-
- '@radix-ui/react-arrow@1.1.7':
- resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-collection@1.1.7':
- resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-compose-refs@1.1.2':
- resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-context@1.1.2':
- resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-direction@1.1.1':
- resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-dismissable-layer@1.1.11':
- resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-focus-guards@1.1.3':
- resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-focus-scope@1.1.7':
- resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-id@1.1.1':
- resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-label@2.1.8':
- resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-popper@1.2.8':
- resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-portal@1.1.9':
- resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-presence@1.1.5':
- resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-primitive@2.1.3':
- resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-primitive@2.1.4':
- resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-roving-focus@1.1.11':
- resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-select@2.2.6':
- resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-separator@1.1.8':
- resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-slot@1.2.3':
- resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-slot@1.2.4':
- resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-switch@1.2.6':
- resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-tabs@1.1.13':
- resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-use-callback-ref@1.1.1':
- resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-controllable-state@1.2.2':
- resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-effect-event@0.0.2':
- resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-escape-keydown@1.1.1':
- resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-layout-effect@1.1.1':
- resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-previous@1.1.1':
- resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-rect@1.1.1':
- resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-size@1.1.1':
- resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-visually-hidden@1.2.3':
- resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/rect@1.1.1':
- resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
-
- '@swc/helpers@0.5.15':
- resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
-
- '@testing-library/dom@10.4.1':
- resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
- engines: {node: '>=18'}
-
- '@testing-library/react@16.3.1':
- resolution: {integrity: sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==}
- engines: {node: '>=18'}
- peerDependencies:
- '@testing-library/dom': ^10.0.0
- '@types/react': ^18.0.0 || ^19.0.0
- '@types/react-dom': ^18.0.0 || ^19.0.0
- react: ^18.0.0 || ^19.0.0
- react-dom: ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@types/aria-query@5.0.4':
- resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
-
- '@types/node@24.10.4':
- resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
-
- '@types/node@25.0.3':
- resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
-
- '@types/react-dom@19.2.3':
- resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
- peerDependencies:
- '@types/react': ^19.2.0
-
- '@types/react@19.2.7':
- resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
-
- '@vercel/analytics@1.6.1':
- resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==}
- peerDependencies:
- '@remix-run/react': ^2
- '@sveltejs/kit': ^1 || ^2
- next: '>= 13'
- react: ^18 || ^19 || ^19.0.0-rc
- svelte: '>= 4'
- vue: ^3
- vue-router: ^4
- peerDependenciesMeta:
- '@remix-run/react':
- optional: true
- '@sveltejs/kit':
- optional: true
- next:
- optional: true
- react:
- optional: true
- svelte:
- optional: true
- vue:
- optional: true
- vue-router:
- optional: true
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
-
- argparse@1.0.10:
- resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
-
- aria-hidden@1.2.6:
- resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
- engines: {node: '>=10'}
-
- aria-query@5.3.0:
- resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
-
- caniuse-lite@1.0.30001757:
- resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==}
-
- class-variance-authority@0.7.1:
- resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
-
- client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
-
- clsx@2.1.1:
- resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
- engines: {node: '>=6'}
-
- core-util-is@1.0.3:
- resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-
- csstype@3.2.3:
- resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
-
- dequal@2.0.3:
- resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
- engines: {node: '>=6'}
-
- detect-libc@2.1.2:
- resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
- engines: {node: '>=8'}
-
- detect-node-es@1.1.0:
- resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
-
- docx@9.5.1:
- resolution: {integrity: sha512-ABDI7JEirFD2+bHhOBlsGZxaG1UgZb2M/QMKhLSDGgVNhxDesTCDcP+qoDnDGjZ4EOXTRfUjUgwHVuZ6VSTfWQ==}
- engines: {node: '>=10'}
-
- dom-accessibility-api@0.5.16:
- resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
-
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
-
- extend-shallow@2.0.1:
- resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
- engines: {node: '>=0.10.0'}
-
- fsevents@2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
-
- get-nonce@1.0.1:
- resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
- engines: {node: '>=6'}
-
- gray-matter@4.0.3:
- resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
- engines: {node: '>=6.0'}
-
- hash.js@1.1.7:
- resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
-
- immediate@3.0.6:
- resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
-
- immer@11.1.3:
- resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- is-extendable@0.1.1:
- resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
- engines: {node: '>=0.10.0'}
-
- isarray@1.0.0:
- resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@3.14.2:
- resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
- hasBin: true
-
- jszip@3.10.1:
- resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
-
- kind-of@6.0.3:
- resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
- engines: {node: '>=0.10.0'}
-
- lie@3.3.0:
- resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
-
- lucide-react@0.562.0:
- resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==}
- peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- lz-string@1.5.0:
- resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
- hasBin: true
-
- minimalistic-assert@1.0.1:
- resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
-
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- nanoid@5.1.6:
- resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==}
- engines: {node: ^18 || >=20}
- hasBin: true
-
- next-themes@0.4.6:
- resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
- peerDependencies:
- react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
-
- next@16.0.10:
- resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==}
- engines: {node: '>=20.9.0'}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.1.0
- '@playwright/test': ^1.51.1
- babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- '@playwright/test':
- optional: true
- babel-plugin-react-compiler:
- optional: true
- sass:
- optional: true
-
- pako@1.0.11:
- resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- playwright-core@1.57.0:
- resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==}
- engines: {node: '>=18'}
- hasBin: true
-
- playwright@1.57.0:
- resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==}
- engines: {node: '>=18'}
- hasBin: true
-
- postcss@8.4.31:
- resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
- engines: {node: ^10 || ^12 || >=14}
-
- postcss@8.5.6:
- resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
- engines: {node: ^10 || ^12 || >=14}
-
- pretty-format@27.5.1:
- resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
- engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-
- process-nextick-args@2.0.1:
- resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
-
- react-dom@19.2.1:
- resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==}
- peerDependencies:
- react: ^19.2.1
-
- react-is@17.0.2:
- resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
-
- react-remove-scroll-bar@2.3.8:
- resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-remove-scroll@2.7.2:
- resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-style-singleton@2.2.3:
- resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react@19.2.1:
- resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==}
- engines: {node: '>=0.10.0'}
-
- readable-stream@2.3.8:
- resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
-
- safe-buffer@5.1.2:
- resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
-
- sax@1.4.3:
- resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==}
-
- scheduler@0.27.0:
- resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
-
- section-matter@1.0.0:
- resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
- engines: {node: '>=4'}
-
- semver@7.7.3:
- resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
- engines: {node: '>=10'}
- hasBin: true
-
- setimmediate@1.0.5:
- resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
-
- sharp@0.34.5:
- resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
-
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
-
- sprintf-js@1.0.3:
- resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-
- string_decoder@1.1.1:
- resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
-
- strip-bom-string@1.0.0:
- resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
- engines: {node: '>=0.10.0'}
-
- styled-jsx@5.1.6:
- resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
- engines: {node: '>= 12.0.0'}
- peerDependencies:
- '@babel/core': '*'
- babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- babel-plugin-macros:
- optional: true
-
- tailwind-merge@3.4.0:
- resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
-
- tailwindcss-animate@1.0.7:
- resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
-
- tailwindcss@4.1.18:
- resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- tw-animate-css@1.4.0:
- resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
-
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- undici-types@7.16.0:
- resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
-
- use-callback-ref@1.3.3:
- resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- use-sidecar@1.1.3:
- resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- use-sync-external-store@1.6.0:
- resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- xml-js@1.6.11:
- resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
- hasBin: true
-
- xml@1.0.1:
- resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==}
-
- zustand@5.0.9:
- resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==}
- engines: {node: '>=12.20.0'}
- peerDependencies:
- '@types/react': '>=18.0.0'
- immer: '>=9.0.6'
- react: '>=18.0.0'
- use-sync-external-store: '>=1.2.0'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- immer:
- optional: true
- react:
- optional: true
- use-sync-external-store:
- optional: true
-
-snapshots:
-
- '@babel/code-frame@7.27.1':
- dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
- '@babel/helper-validator-identifier@7.28.5': {}
-
- '@babel/runtime@7.28.4': {}
-
- '@emnapi/runtime@1.7.1':
- dependencies:
- tslib: 2.8.1
- optional: true
-
- '@floating-ui/core@1.7.3':
- dependencies:
- '@floating-ui/utils': 0.2.10
-
- '@floating-ui/dom@1.7.4':
- dependencies:
- '@floating-ui/core': 1.7.3
- '@floating-ui/utils': 0.2.10
-
- '@floating-ui/react-dom@2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@floating-ui/dom': 1.7.4
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
-
- '@floating-ui/utils@0.2.10': {}
-
- '@img/colour@1.0.0':
- optional: true
-
- '@img/sharp-darwin-arm64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.2.4
- optional: true
-
- '@img/sharp-darwin-x64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.2.4
- optional: true
-
- '@img/sharp-libvips-darwin-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-darwin-x64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-arm@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-ppc64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-riscv64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-s390x@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-x64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-x64@1.2.4':
- optional: true
-
- '@img/sharp-linux-arm64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.2.4
- optional: true
-
- '@img/sharp-linux-arm@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.2.4
- optional: true
-
- '@img/sharp-linux-ppc64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-ppc64': 1.2.4
- optional: true
-
- '@img/sharp-linux-riscv64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-riscv64': 1.2.4
- optional: true
-
- '@img/sharp-linux-s390x@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.2.4
- optional: true
-
- '@img/sharp-linux-x64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.2.4
- optional: true
-
- '@img/sharp-linuxmusl-arm64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
- optional: true
-
- '@img/sharp-linuxmusl-x64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.2.4
- optional: true
-
- '@img/sharp-wasm32@0.34.5':
- dependencies:
- '@emnapi/runtime': 1.7.1
- optional: true
-
- '@img/sharp-win32-arm64@0.34.5':
- optional: true
-
- '@img/sharp-win32-ia32@0.34.5':
- optional: true
-
- '@img/sharp-win32-x64@0.34.5':
- optional: true
-
- '@next/env@16.0.10': {}
-
- '@next/swc-darwin-arm64@16.0.10':
- optional: true
-
- '@next/swc-darwin-x64@16.0.10':
- optional: true
-
- '@next/swc-linux-arm64-gnu@16.0.10':
- optional: true
-
- '@next/swc-linux-arm64-musl@16.0.10':
- optional: true
-
- '@next/swc-linux-x64-gnu@16.0.10':
- optional: true
-
- '@next/swc-linux-x64-musl@16.0.10':
- optional: true
-
- '@next/swc-win32-arm64-msvc@16.0.10':
- optional: true
-
- '@next/swc-win32-x64-msvc@16.0.10':
- optional: true
-
- '@radix-ui/number@1.1.1': {}
-
- '@radix-ui/primitive@1.1.3': {}
-
- '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/rect': 1.1.1
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- aria-hidden: 1.2.6
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/rect': 1.1.1
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1)
- react: 19.2.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/rect@1.1.1': {}
-
- '@swc/helpers@0.5.15':
- dependencies:
- tslib: 2.8.1
-
- '@testing-library/dom@10.4.1':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/runtime': 7.28.4
- '@types/aria-query': 5.0.4
- aria-query: 5.3.0
- dom-accessibility-api: 0.5.16
- lz-string: 1.5.0
- picocolors: 1.1.1
- pretty-format: 27.5.1
-
- '@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
- dependencies:
- '@babel/runtime': 7.28.4
- '@testing-library/dom': 10.4.1
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@types/aria-query@5.0.4': {}
-
- '@types/node@24.10.4':
- dependencies:
- undici-types: 7.16.0
-
- '@types/node@25.0.3':
- dependencies:
- undici-types: 7.16.0
-
- '@types/react-dom@19.2.3(@types/react@19.2.7)':
- dependencies:
- '@types/react': 19.2.7
-
- '@types/react@19.2.7':
- dependencies:
- csstype: 3.2.3
-
- '@vercel/analytics@1.6.1(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)':
- optionalDependencies:
- next: 16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- react: 19.2.1
-
- ansi-regex@5.0.1: {}
-
- ansi-styles@5.2.0: {}
-
- argparse@1.0.10:
- dependencies:
- sprintf-js: 1.0.3
-
- aria-hidden@1.2.6:
- dependencies:
- tslib: 2.8.1
-
- aria-query@5.3.0:
- dependencies:
- dequal: 2.0.3
-
- caniuse-lite@1.0.30001757: {}
-
- class-variance-authority@0.7.1:
- dependencies:
- clsx: 2.1.1
-
- client-only@0.0.1: {}
-
- clsx@2.1.1: {}
-
- core-util-is@1.0.3: {}
-
- csstype@3.2.3: {}
-
- dequal@2.0.3: {}
-
- detect-libc@2.1.2:
- optional: true
-
- detect-node-es@1.1.0: {}
-
- docx@9.5.1:
- dependencies:
- '@types/node': 24.10.4
- hash.js: 1.1.7
- jszip: 3.10.1
- nanoid: 5.1.6
- xml: 1.0.1
- xml-js: 1.6.11
-
- dom-accessibility-api@0.5.16: {}
-
- esprima@4.0.1: {}
-
- extend-shallow@2.0.1:
- dependencies:
- is-extendable: 0.1.1
-
- fsevents@2.3.2:
- optional: true
-
- get-nonce@1.0.1: {}
-
- gray-matter@4.0.3:
- dependencies:
- js-yaml: 3.14.2
- kind-of: 6.0.3
- section-matter: 1.0.0
- strip-bom-string: 1.0.0
-
- hash.js@1.1.7:
- dependencies:
- inherits: 2.0.4
- minimalistic-assert: 1.0.1
-
- immediate@3.0.6: {}
-
- immer@11.1.3: {}
-
- inherits@2.0.4: {}
-
- is-extendable@0.1.1: {}
-
- isarray@1.0.0: {}
-
- js-tokens@4.0.0: {}
-
- js-yaml@3.14.2:
- dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
-
- jszip@3.10.1:
- dependencies:
- lie: 3.3.0
- pako: 1.0.11
- readable-stream: 2.3.8
- setimmediate: 1.0.5
-
- kind-of@6.0.3: {}
-
- lie@3.3.0:
- dependencies:
- immediate: 3.0.6
-
- lucide-react@0.562.0(react@19.2.1):
- dependencies:
- react: 19.2.1
-
- lz-string@1.5.0: {}
-
- minimalistic-assert@1.0.1: {}
-
- nanoid@3.3.11: {}
-
- nanoid@5.1.6: {}
-
- next-themes@0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
- dependencies:
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
-
- next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
- dependencies:
- '@next/env': 16.0.10
- '@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001757
- postcss: 8.4.31
- react: 19.2.1
- react-dom: 19.2.1(react@19.2.1)
- styled-jsx: 5.1.6(react@19.2.1)
- optionalDependencies:
- '@next/swc-darwin-arm64': 16.0.10
- '@next/swc-darwin-x64': 16.0.10
- '@next/swc-linux-arm64-gnu': 16.0.10
- '@next/swc-linux-arm64-musl': 16.0.10
- '@next/swc-linux-x64-gnu': 16.0.10
- '@next/swc-linux-x64-musl': 16.0.10
- '@next/swc-win32-arm64-msvc': 16.0.10
- '@next/swc-win32-x64-msvc': 16.0.10
- sharp: 0.34.5
- transitivePeerDependencies:
- - '@babel/core'
- - babel-plugin-macros
-
- pako@1.0.11: {}
-
- picocolors@1.1.1: {}
-
- playwright-core@1.57.0: {}
-
- playwright@1.57.0:
- dependencies:
- playwright-core: 1.57.0
- optionalDependencies:
- fsevents: 2.3.2
-
- postcss@8.4.31:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- postcss@8.5.6:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- pretty-format@27.5.1:
- dependencies:
- ansi-regex: 5.0.1
- ansi-styles: 5.2.0
- react-is: 17.0.2
-
- process-nextick-args@2.0.1: {}
-
- react-dom@19.2.1(react@19.2.1):
- dependencies:
- react: 19.2.1
- scheduler: 0.27.0
-
- react-is@17.0.2: {}
-
- react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.1):
- dependencies:
- react: 19.2.1
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1)
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.1):
- dependencies:
- react: 19.2.1
- react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.1)
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1)
- tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.1)
- use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.1)
- optionalDependencies:
- '@types/react': 19.2.7
-
- react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.1):
- dependencies:
- get-nonce: 1.0.1
- react: 19.2.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- react@19.2.1: {}
-
- readable-stream@2.3.8:
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 1.0.0
- process-nextick-args: 2.0.1
- safe-buffer: 5.1.2
- string_decoder: 1.1.1
- util-deprecate: 1.0.2
-
- safe-buffer@5.1.2: {}
-
- sax@1.4.3: {}
-
- scheduler@0.27.0: {}
-
- section-matter@1.0.0:
- dependencies:
- extend-shallow: 2.0.1
- kind-of: 6.0.3
-
- semver@7.7.3:
- optional: true
-
- setimmediate@1.0.5: {}
-
- sharp@0.34.5:
- dependencies:
- '@img/colour': 1.0.0
- detect-libc: 2.1.2
- semver: 7.7.3
- optionalDependencies:
- '@img/sharp-darwin-arm64': 0.34.5
- '@img/sharp-darwin-x64': 0.34.5
- '@img/sharp-libvips-darwin-arm64': 1.2.4
- '@img/sharp-libvips-darwin-x64': 1.2.4
- '@img/sharp-libvips-linux-arm': 1.2.4
- '@img/sharp-libvips-linux-arm64': 1.2.4
- '@img/sharp-libvips-linux-ppc64': 1.2.4
- '@img/sharp-libvips-linux-riscv64': 1.2.4
- '@img/sharp-libvips-linux-s390x': 1.2.4
- '@img/sharp-libvips-linux-x64': 1.2.4
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
- '@img/sharp-libvips-linuxmusl-x64': 1.2.4
- '@img/sharp-linux-arm': 0.34.5
- '@img/sharp-linux-arm64': 0.34.5
- '@img/sharp-linux-ppc64': 0.34.5
- '@img/sharp-linux-riscv64': 0.34.5
- '@img/sharp-linux-s390x': 0.34.5
- '@img/sharp-linux-x64': 0.34.5
- '@img/sharp-linuxmusl-arm64': 0.34.5
- '@img/sharp-linuxmusl-x64': 0.34.5
- '@img/sharp-wasm32': 0.34.5
- '@img/sharp-win32-arm64': 0.34.5
- '@img/sharp-win32-ia32': 0.34.5
- '@img/sharp-win32-x64': 0.34.5
- optional: true
-
- source-map-js@1.2.1: {}
-
- sprintf-js@1.0.3: {}
-
- string_decoder@1.1.1:
- dependencies:
- safe-buffer: 5.1.2
-
- strip-bom-string@1.0.0: {}
-
- styled-jsx@5.1.6(react@19.2.1):
- dependencies:
- client-only: 0.0.1
- react: 19.2.1
-
- tailwind-merge@3.4.0: {}
-
- tailwindcss-animate@1.0.7(tailwindcss@4.1.18):
- dependencies:
- tailwindcss: 4.1.18
-
- tailwindcss@4.1.18: {}
-
- tslib@2.8.1: {}
-
- tw-animate-css@1.4.0: {}
-
- typescript@5.9.3: {}
-
- undici-types@7.16.0: {}
-
- use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.1):
- dependencies:
- react: 19.2.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.1):
- dependencies:
- detect-node-es: 1.1.0
- react: 19.2.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 19.2.7
-
- use-sync-external-store@1.6.0(react@19.2.1):
- dependencies:
- react: 19.2.1
-
- util-deprecate@1.0.2: {}
-
- xml-js@1.6.11:
- dependencies:
- sax: 1.4.3
-
- xml@1.0.1: {}
-
- zustand@5.0.9(@types/react@19.2.7)(immer@11.1.3)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)):
- optionalDependencies:
- '@types/react': 19.2.7
- immer: 11.1.3
- react: 19.2.1
- use-sync-external-store: 1.6.0(react@19.2.1)
diff --git a/postcss.config.mjs b/postcss.config.mjs
deleted file mode 100644
index a869506..0000000
--- a/postcss.config.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/** @type {import('postcss-load-config').Config} */
-const config = {
- plugins: {
- '@tailwindcss/postcss': {},
- },
-}
-
-export default config
diff --git a/public/apple-icon.png b/public/apple-icon.png
deleted file mode 100644
index f9418b4..0000000
Binary files a/public/apple-icon.png and /dev/null differ
diff --git a/public/icon-dark-32x32.png b/public/icon-dark-32x32.png
deleted file mode 100644
index 12c825a..0000000
Binary files a/public/icon-dark-32x32.png and /dev/null differ
diff --git a/public/icon-light-32x32.png b/public/icon-light-32x32.png
deleted file mode 100644
index a3462cc..0000000
Binary files a/public/icon-light-32x32.png and /dev/null differ
diff --git a/public/icon.svg b/public/icon.svg
deleted file mode 100644
index 5c11e6c..0000000
--- a/public/icon.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
\ No newline at end of file
diff --git a/public/images/alipay.png b/public/images/alipay.png
deleted file mode 100644
index e9cda7b..0000000
Binary files a/public/images/alipay.png and /dev/null differ
diff --git a/public/images/b05c111ec1aefab166379b5d146b3efc.jpg b/public/images/b05c111ec1aefab166379b5d146b3efc.jpg
deleted file mode 100644
index 84e7ef5..0000000
Binary files a/public/images/b05c111ec1aefab166379b5d146b3efc.jpg and /dev/null differ
diff --git a/public/images/image.png b/public/images/image.png
deleted file mode 100644
index e9cda7b..0000000
Binary files a/public/images/image.png and /dev/null differ
diff --git a/public/images/party-group-qr.png b/public/images/party-group-qr.png
deleted file mode 100644
index e9cda7b..0000000
Binary files a/public/images/party-group-qr.png and /dev/null differ
diff --git a/public/images/wechat-pay.png b/public/images/wechat-pay.png
deleted file mode 100644
index e9cda7b..0000000
Binary files a/public/images/wechat-pay.png and /dev/null differ
diff --git a/public/placeholder-logo.png b/public/placeholder-logo.png
deleted file mode 100644
index 8a792ac..0000000
Binary files a/public/placeholder-logo.png and /dev/null differ
diff --git a/public/placeholder-logo.svg b/public/placeholder-logo.svg
deleted file mode 100644
index b1695aa..0000000
--- a/public/placeholder-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/placeholder-user.jpg b/public/placeholder-user.jpg
deleted file mode 100644
index 6fa7543..0000000
Binary files a/public/placeholder-user.jpg and /dev/null differ
diff --git a/public/placeholder.jpg b/public/placeholder.jpg
deleted file mode 100644
index 6bfe963..0000000
Binary files a/public/placeholder.jpg and /dev/null differ
diff --git a/public/placeholder.svg b/public/placeholder.svg
deleted file mode 100644
index e763910..0000000
--- a/public/placeholder.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/scripts/autosync.sh b/scripts/autosync.sh
deleted file mode 100644
index 626addf..0000000
--- a/scripts/autosync.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env bash
-set -u
-cd "$(dirname "$0")/.."
-POLL_SECONDS="${POLL_SECONDS:-60}"
-
-log() {
- printf "[%s] %s\n" "$(date '+%F %T')" "$*"
-}
-
-pull_once() {
- git remote get-url origin >/dev/null 2>&1 || return 0
- local branch
- branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
- [ -n "$branch" ] || return 0
- git pull --rebase origin "$branch" || true
-}
-
-push_once() {
- git remote get-url origin >/dev/null 2>&1 || return 0
- git push || true
-}
-while true; do
- fswatch -1 -r --exclude '\\.git' --exclude 'node_modules' --exclude '.next' --exclude 'android/app/build' . &
- fswatch_pid=$!
- start_ts="$(date +%s)"
- timed_out=0
-
- while kill -0 "$fswatch_pid" >/dev/null 2>&1; do
- now_ts="$(date +%s)"
- if [ $((now_ts - start_ts)) -ge "$POLL_SECONDS" ]; then
- timed_out=1
- kill "$fswatch_pid" >/dev/null 2>&1 || true
- wait "$fswatch_pid" >/dev/null 2>&1 || true
- break
- fi
- sleep 1
- done
-
- if [ "$timed_out" -eq 1 ]; then
- log "no local change, polling remote"
- pull_once
- continue
- fi
-
- wait "$fswatch_pid" >/dev/null 2>&1 || true
- log "change detected, committing"
- git add . || true
- git commit -m "chore: auto-sync" || true
- pull_once
- push_once
-done
diff --git a/styles/globals.css b/styles/globals.css
deleted file mode 100644
index f8b8bad..0000000
--- a/styles/globals.css
+++ /dev/null
@@ -1,125 +0,0 @@
-@import 'tailwindcss';
-@import 'tw-animate-css';
-
-@custom-variant dark (&:is(.dark *));
-
-:root {
- --background: oklch(1 0 0);
- --foreground: oklch(0.145 0 0);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.145 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.145 0 0);
- --primary: oklch(0.205 0 0);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.97 0 0);
- --secondary-foreground: oklch(0.205 0 0);
- --muted: oklch(0.97 0 0);
- --muted-foreground: oklch(0.556 0 0);
- --accent: oklch(0.97 0 0);
- --accent-foreground: oklch(0.205 0 0);
- --destructive: oklch(0.577 0.245 27.325);
- --destructive-foreground: oklch(0.577 0.245 27.325);
- --border: oklch(0.922 0 0);
- --input: oklch(0.922 0 0);
- --ring: oklch(0.708 0 0);
- --chart-1: oklch(0.646 0.222 41.116);
- --chart-2: oklch(0.6 0.118 184.704);
- --chart-3: oklch(0.398 0.07 227.392);
- --chart-4: oklch(0.828 0.189 84.429);
- --chart-5: oklch(0.769 0.188 70.08);
- --radius: 0.625rem;
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.145 0 0);
- --sidebar-primary: oklch(0.205 0 0);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.97 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.922 0 0);
- --sidebar-ring: oklch(0.708 0 0);
-}
-
-.dark {
- --background: oklch(0.145 0 0);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.145 0 0);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.145 0 0);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.985 0 0);
- --primary-foreground: oklch(0.205 0 0);
- --secondary: oklch(0.269 0 0);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.269 0 0);
- --muted-foreground: oklch(0.708 0 0);
- --accent: oklch(0.269 0 0);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.396 0.141 25.723);
- --destructive-foreground: oklch(0.637 0.237 25.331);
- --border: oklch(0.269 0 0);
- --input: oklch(0.269 0 0);
- --ring: oklch(0.439 0 0);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.205 0 0);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.488 0.243 264.376);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.269 0 0);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(0.269 0 0);
- --sidebar-ring: oklch(0.439 0 0);
-}
-
-@theme inline {
- --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Helvetica, Arial, sans-serif;
- --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --color-card: var(--card);
- --color-card-foreground: var(--card-foreground);
- --color-popover: var(--popover);
- --color-popover-foreground: var(--popover-foreground);
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
- --color-muted: var(--muted);
- --color-muted-foreground: var(--muted-foreground);
- --color-accent: var(--accent);
- --color-accent-foreground: var(--accent-foreground);
- --color-destructive: var(--destructive);
- --color-destructive-foreground: var(--destructive-foreground);
- --color-border: var(--border);
- --color-input: var(--input);
- --color-ring: var(--ring);
- --color-chart-1: var(--chart-1);
- --color-chart-2: var(--chart-2);
- --color-chart-3: var(--chart-3);
- --color-chart-4: var(--chart-4);
- --color-chart-5: var(--chart-5);
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
- --radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
-}
-
-@layer base {
- * {
- @apply border-border outline-ring/50;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index 48d6d82..0000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "compilerOptions": {
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
- "allowJs": true,
- "target": "ES6",
- "skipLibCheck": true,
- "strict": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "react-jsx",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": [
- "./*"
- ]
- }
- },
- "include": [
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- ".next/types/**/*.ts",
- ".next/dev/types/**/*.ts"
- ],
- "exclude": [
- "node_modules"
- ]
-}
diff --git a/vercel.json b/vercel.json
deleted file mode 100644
index 8bc6a5a..0000000
--- a/vercel.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "buildCommand": "next build",
- "devCommand": "next dev",
- "installCommand": "npm install",
- "framework": "nextjs",
- "regions": ["hkg1", "sin1"],
- "env": {
- "ALIPAY_PARTNER_ID": "@alipay_partner_id",
- "ALIPAY_KEY": "@alipay_key",
- "WECHAT_APP_ID": "@wechat_app_id",
- "WECHAT_APP_SECRET": "@wechat_app_secret",
- "WECHAT_MCH_ID": "@wechat_mch_id",
- "WECHAT_API_KEY": "@wechat_api_key"
- },
- "headers": [
- {
- "source": "/api/(.*)",
- "headers": [
- {
- "key": "Access-Control-Allow-Origin",
- "value": "*"
- },
- {
- "key": "Access-Control-Allow-Methods",
- "value": "GET, POST, PUT, DELETE, OPTIONS"
- },
- {
- "key": "Access-Control-Allow-Headers",
- "value": "Content-Type, Authorization"
- }
- ]
- }
- ]
-}
diff --git a/开发文档/.github/workflows/sync_from_coding.yml b/开发文档/.github/workflows/sync_from_coding.yml
deleted file mode 100644
index bf82de9..0000000
--- a/开发文档/.github/workflows/sync_from_coding.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Sync from Coding
-
-on:
- schedule:
- - cron: '0 */2 * * *' # 每2小时执行一次
- workflow_dispatch: # 允许手动触发
-
-jobs:
- sync:
- runs-on: ubuntu-latest
- permissions:
- contents: write # 确保此行存在,赋予工作流写入仓库内容的权限,这是解决 403 权限问题的基础
- steps:
- - name: 检出 GitHub 仓库
- uses: actions/checkout@v4
- with:
- ref: develop # 明确检出 develop 分支,确保在正确的分支上操作
-
- - name: 配置 Git 用户并合并 Coding 代码到 GitHub
- run: |
- # 配置 Git 用户信息
- git config user.name "zhiqun@qq.com"
- git config user.email "zhiqun@qq.com"
-
- # 添加 Coding 仓库为一个新的远程源
- git remote add coding-origin https://${{ secrets.CODING_USERNAME }}:${{ secrets.CODING_TOKEN }}@e.coding.net/g-xtcy5189/cunkebao/cunkebao_v3.git
-
- # 从 Coding 远程仓库获取 develop 分支的最新信息
- git fetch coding-origin develop
-
- # 合并 Coding 的 develop 分支到本地的 develop 分支
- # --allow-unrelated-histories 允许合并两个没有共同历史的分支
- git merge --no-ff --allow-unrelated-histories coding-origin/develop
-
- # 将合并后的本地 develop 分支推送到 GitHub 的 develop 分支
- git push origin develop
diff --git a/开发文档/0、Mycontent-book 项目总览.md b/开发文档/0、Mycontent-book 项目总览.md
deleted file mode 100644
index 124dbc4..0000000
--- a/开发文档/0、Mycontent-book 项目总览.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Mycontent-book 项目总览
-
-**我是卡若。**
-
-做这个项目,逻辑很简单:**把书卖出去,把私域做起来,把钱分下去。**
-
-这就不是一个普通的博客网站,这是一个**内容变现系统**。所有的技术架构,都要围绕着“阅读体验”、“流量承接”和“变现转化”来做。
-
-别整那些虚头巴脑的概念,咱们直接看这个盘子怎么搭。
-
-## 1. 核心逻辑
-
-这个项目的生意逻辑就是三层:
-1. **流量层(前端)**:让用户看着爽,像刷抖音、看公众号一样流畅。必须移动端优先,模拟 iOS 的原生质感。
-2. **内容层(数据)**:`book/` 目录下的 Markdown 文件就是我们的资产。改个字,推送到 GitHub,网站立马更新。
-3. **变现层(后端/接口)**:谁看了?谁买了?谁推荐的?这些数据要跑通。
-
-## 2. 为什么这么架构?
-
-我选 Next.js,不是因为流行,是因为它**省事**。
-- **SSR(服务端渲染)**:SEO 友好,百度谷歌能搜到,自带流量。
-- **API Routes**:不用单独起个 Java 或 Python 服务,省服务器钱。
-- **Vercel/宝塔部署**:自动化流水线,我只管写文章,代码自动跑。
-
-## 3. 目录导航(别迷路)
-
-- **[1、需求](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/1、需求/业务需求.md)**:我们要干啥,成本多少,技术要求。
-- **[2、架构](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/2、架构/系统架构.md)**:整体怎么搭,前后端怎么分。
- - **[技术选型与全景图](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/2、架构/技术选型与全景图.md)**:详细的技术栈和架构流程图。
- - **[前后端架构分离策略](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/2、架构/前后端架构分离策略.md)**:开发协作规范。
-- **[3、前端](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/3、前端/前端架构.md)**:脸面工程,交互细节。
-- **[4、后端](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/4、后端/后端架构.md)**:数据处理,脏活累活。
-- **[5、接口](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/5、接口/API接口.md)**:前后端怎么说话。
-- **[6、数据库](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/6、数据库/数据库设计.md)**:数据存哪,怎么存。
-- **[7、测试](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/7、测试/测试策略.md)**:怎么保证不出 Bug。
-- **[8、部署](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/8、部署/本项目部署总览.md)**:怎么上线,怎么自动化。
-- **[9、手册](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/9、手册/写作与结构维护手册.md)**:怎么写书,怎么维护。
-
-## 4. 这里的规矩
-
-- **行动至上**:文档是用来指导干活的,不是写来看的。
-- **数据说话**:所有优化要有数据支撑,加载快了多少?转化高了多少?
-- **保持简单**:能用现成的库就别自己造轮子。
-
----
-**复盘:**
-目前项目处于“文件数据库”阶段,适合我这种单人高频写作。等流量上来了,用户系统一接,立马切 MongoDB。这一步步来,别贪多。
diff --git a/开发文档/10、项目管理/项目管理提示词.md b/开发文档/10、项目管理/项目管理提示词.md
deleted file mode 100644
index e79b880..0000000
--- a/开发文档/10、项目管理/项目管理提示词.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 项目管理提示词 (Project Management Prompt) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“高级项目经理 (PM)”角色。
-> **核心指令**: 请根据当前项目上下文,自动更新并维护下方的《项目落地执行表》。每次开发迭代后,必须检查并更新此表状态。
-> **适用范围**: 适用于任何软件开发、商业落地或流量运营项目(语言/业务无关)。
-
-## 1. 基础上下文 (Context)
-### 1.1 角色档案:卡若 (Karuo)
-- **管理风格**:结果导向 (Result-Oriented),数据说话,拒绝形式主义。
-- **核心理念**:PDCA (计划-执行-检查-处理) + 云阿米巴 (利益绑定)。
-- **沟通方式**:大白话,逻辑清晰,直击痛点。
-
-### 1.2 动态维护规则 (Auto-Update Rules)
-1. **每次对话结束前**:检查是否有任务状态变更(如:从 `Pending` 变为 `Done`)。
-2. **新增需求时**:自动拆解为 Task 并插入执行表。
-3. **遇到阻碍时**:在备注栏标记 `Blocker` 并高亮风险。
-
-## 2. 核心:项目落地执行表 (Execution Table Template)
-**指令**:请严格按照以下格式生成或更新项目执行表。内容需具体、可量化。
-
-| 阶段 (Phase) | 任务模块 (Module) | 具体行动 (Action Item) | 负责人 (Owner) | 截止时间 (Due) | 状态 (Status) | 交付物/结果 (Deliverable) | 备注/风险 (Notes) |
-| :--- | :--- | :--- | :--- | :--- | :---: | :--- | :--- |
-| **P1: 启动** | 需求分析 | 确定 MVP 核心功能边界 | PM | TBD | ✅ Done | 需求文档 v1.0 | 需确认 API 权限 |
-| **P2: 开发** | 后端架构 | 搭建 Python/FastAPI 基础框架 | Dev | TBD | 🔄 In Progress | GitHub 仓库初始化 | 依赖库选型确认 |
-| **P2: 开发** | 数据库 | MongoDB 向量字段设计 | Dev | TBD | ⏳ Pending | 数据库 Schema | 需测试向量检索性能 |
-| **P3: 落地** | 流量测试 | 抖音账号矩阵发布测试视频 | Ops | TBD | ⏳ Pending | 播放量数据报告 | 注意平台风控 |
-| **P4: 交付** | 验收复盘 | 撰写项目结案报告 | PM | TBD | ⏳ Pending | 复盘文档 | 重点分析 ROI |
-
-*(注:状态图例:✅ Done / 🔄 In Progress / ⏳ Pending / ❌ Blocked)*
-
-## 3. 辅助管理工具 (Supporting Tools)
-
-### 3.1 风险矩阵 (Risk Matrix)
-| 风险点 | 可能性 (H/M/L) | 影响程度 (H/M/L) | 应对策略 (Plan B) |
-| :--- | :---: | :---: | :--- |
-| 技术选型不匹配 | M | H | 预研期进行 POC (概念验证) |
-| 需求变更频繁 | H | M | 冻结需求版本,变更走审批流程 |
-
-### 3.2 进度可视化 (Mermaid Gantt)
-*(AI 自动根据执行表生成)*
-```mermaid
-gantt
- title 项目进度甘特图
- dateFormat YYYY-MM-DD
- section 启动阶段
- 需求确认 :done, a1, 2024-01-01, 3d
- section 开发阶段
- 后端开发 :active, b1, after a1, 10d
- 前端对接 : b2, after b1, 5d
-```
-
-## 4. AI 协作指令 (Commands)
-**角色**:你是我(卡若)的项目经理。
-**任务**:
-1. **初始化**:读取需求文档,填充《项目落地执行表》。
-2. **更新**:根据我的开发进度(如“后端代码写完了”),自动更新表格状态为 ✅ Done。
-3. **提醒**:如果某个任务超过截止时间,主动提醒我。
-4. **复盘**:项目结束时,根据执行表生成《项目复盘报告》。
diff --git a/开发文档/10、项目管理/项目落地推进表.md b/开发文档/10、项目管理/项目落地推进表.md
deleted file mode 100644
index 4233db8..0000000
--- a/开发文档/10、项目管理/项目落地推进表.md
+++ /dev/null
@@ -1,355 +0,0 @@
-# 项目落地推进表
-
----
-
-## 一、项目总览
-
-- **项目名称**:一场 SOUL 的创业实验场
-- **核心目标**:
- 构建一个集内容阅读、私域引流、知识变现于一体的 H5 应用,验证「内容 + 私域 + 分销」的商业闭环
-- **当前阶段**:6.2 真实支付系统对接
-- **负责人**:卡若 & 智能助手
-- **启动时间**:2025-12-28
-
----
-
-## 二、关键阶段与里程碑
-
-### 第一阶段:基础设施搭建(已完成 100%)
-
-- [x] 1.1 开发环境配置(Next.js 16 + Tailwind v4)
-- [x] 1.2 核心 UI 框架搭建(Shadcn/ui + 苹果毛玻璃风格)
-- [x] 1.3 Markdown 解析引擎实现
-- [x] 1.4 路由与导航系统
-- [x] 1.5 移动端底部导航栏(首页/目录/我的)
-
----
-
-### 第二阶段:核心阅读体验(已完成 100%)
-
-- [x] 2.1 首页 / 书籍封面展示
-- [x] 2.2 沉浸式阅读器开发(章节内容渲染)
-- [x] 2.3 目录与章节导航(折叠式章节树)
-- [x] 2.4 内容数据结构设计(动态文件系统读取)
-- [x] 2.5 书籍内容完整导入(5篇47章)
-
----
-
-### 第三阶段:私域引流体系(已完成 100%)
-
-- [x] 3.1 派对群引流弹窗(支付后自动展示)
-- [x] 3.2「我的」个人中心(个人信息/购买记录/分销中心)
-- [x] 3.3 钩子内容设置(章节解锁逻辑)
-- [x] 3.4 微信群二维码动态配置(活码系统)
-- [x] 3.5 二维码管理后台(支持多链接随机分配)
-
----
-
-### 第四阶段:商业变现闭环(已完成 100%)
-
-#### 4.1 基础能力(已完成)
-
-- [x] 4.1.1 支付弹窗组件(PaymentModal)
-- [x] 4.1.2 多支付方式支持(微信/支付宝/USDT)
-- [x] 4.1.3 购买逻辑(单章节/整本书)
-- [x] 4.1.4 用户权限管理(admin账号免购买)
-
-#### 4.2 管理后台(已完成)
-
-- [x] 4.2.1 后台登录页(admin / key123456)
-- [x] 4.2.2 仪表盘(数据概览)
-- [x] 4.2.3 内容管理(章节价格配置)
-- [x] 4.2.4 支付配置页面(微信/支付宝参数)
-- [x] 4.2.5 用户管理(用户列表/权限管理)
-- [x] 4.2.6 二维码管理(活码配置)
-- [x] 4.2.7 提现审核(提现申请处理)
-- [x] 4.2.8 系统设置(分销比例/价格配置)
-
-#### 4.3 真实支付对接(已完成 100%)
-
-- [x] 4.3.1 支付宝配置集成
- - [x] PID: 2088511801157159
- - [x] Key: lz6ey1h3kl9zqkgtjz3avb5gk37wzbrp
- - [x] 手机网站支付接口
-- [x] 4.3.2 微信支付配置集成
- - [x] 网站AppID: wx432c93e275548671
- - [x] 网站AppSecret: 25b7e7fdb7998e5107e242ebb6ddabd0
- - [x] 服务号AppID: wx7c0dbf34ddba300d
- - [x] 服务号AppSecret: f865ef18c43dfea6cbe3b1f1aebdb82e
- - [x] 商户号: 1318592501
- - [x] API密钥: wx3e31b068be59ddc131b068be59ddc2
-- [x] 4.3.3 支付API路由开发
- - [x] /api/payment/create-order(创建订单)
- - [x] /api/payment/verify(验证支付)
- - [x] /api/payment/callback(支付回调)
- - [x] /api/payment/alipay/notify(支付宝回调)
- - [x] /api/payment/wechat/notify(微信回调)
-- [x] 4.3.4 订单管理系统
- - [x] /api/orders(订单查询)
- - [x] localStorage订单存储
-- [x] 4.3.5 支付SDK服务层开发
- - [x] AlipayService类(签名生成/验证)
- - [x] WechatPayService类(签名生成/验证)
-- [x] 4.3.6 环境变量配置
- - [x] .env.local模板文件
- - [x] vercel.json生产配置
-- [x] 4.3.7 部署文档编写
- - [x] DEPLOYMENT.md完整部署指南
-
----
-
-### 第五阶段:分销与裂变(已完成 100%)
-
-- [x] 5.1 邀请码生成与绑定
-- [x] 5.2 分销收益计算系统(90%给分销者)
-- [x] 5.3 提现申请功能(用户端)
-- [x] 5.4 提现审核功能(管理端)
-- [x] 5.5 裂变海报生成器
-- [x] 5.6 分销数据统计
-
----
-
-### 第六阶段:生产环境优化(已完成 100%)
-
-#### 6.1 技术优化(已完成)
-
-- [x] 6.1.1 移除Mongoose依赖
-- [x] 6.1.2 升级Next.js至16.0.10
-- [x] 6.1.3 修复文件系统路径错误
-- [x] 6.1.4 添加错误调试日志
-- [x] 6.1.5 后台深色主题统一
-
-#### 6.2 支付系统优化(已完成)
-
-- [x] 6.2.1 支付配置字段统一
-- [x] 6.2.2 跳转链接支持(weixin://、alipays://)
-- [x] 6.2.3 二维码扫码跳转
-- [x] 6.2.4 支付宝SDK服务类(AlipayService)
-- [x] 6.2.5 微信支付SDK服务类(WechatPayService)
-- [x] 6.2.6 支付回调路由(支持签名验证)
-- [x] 6.2.7 订单创建接口(集成真实参数)
-
-#### 6.3 生产环境准备(已完成)
-
-- [x] 6.3.1 环境变量模板(.env.local)
-- [x] 6.3.2 Vercel部署配置(vercel.json)
-- [x] 6.3.3 部署文档编写(DEPLOYMENT.md)
-- [x] 6.3.4 区域配置(香港/新加坡节点)
-- [x] 6.3.5 CORS和安全头配置
-
----
-
-### 第七阶段:文档与交付(已完成 100%)
-
-- [x] 7.1 部署指南文档(DEPLOYMENT.md)
-- [x] 7.2 环境变量配置说明
-- [x] 7.3 支付回调配置指引
-- [x] 7.4 测试流程清单
-- [x] 7.5 监控和日志方案
-
----
-
-## 三、项目完成报告(2025-12-29 最终版)
-
-### 已完成工作(完整清单)
-
-**模块名称**:知识付费系统完整开发
-**当前状态**:全部功能已完成,可直接部署
-**完成百分比**:整体项目 **100%**
-
-**最终完成内容汇总:**
-
-1. **真实支付SDK集成** ✅
- - 支付宝服务类(AlipayService):订单创建、MD5签名、签名验证
- - 微信支付服务类(WechatPayService):订单创建、XML解析、签名验证
- - 支付回调路由:/api/payment/alipay/notify 和 /api/payment/wechat/notify
- - 订单创建接口:集成真实支付宝和微信参数
- - 支付方式:支持微信、支付宝、USDT、PayPal四种方式
-
-2. **环境配置完善** ✅
- - .env.local:包含所有支付参数的模板文件
- - vercel.json:生产环境配置(区域、环境变量、CORS)
- - DEPLOYMENT.md:完整的部署指南文档
-
-3. **分销系统完整实现** ✅
- - 推广海报生成器
- - 提现申请和审核
- - 收益自动计算(90%分销+10%平台)
- - 邀请链接和绑定机制
-
-4. **二维码管理系统** ✅
- - 动态活码管理
- - 微信群跳转(weixin://协议)
- - 后台可视化配置
-
-5. **后台管理系统** ✅
- - 8个完整页面(仪表盘、内容、支付、用户、二维码、提现、设置、登录)
- - 深色主题统一(#0a1628)
- - 数据可视化和统计
-
-6. **内容管理系统** ✅
- - 47章完整内容
- - 动态文件系统
- - 章节价格配置
- - 权限控制
-
-7. **用户体验优化** ✅
- - 苹果毛玻璃风格
- - 移动端完美适配
- - 底部导航栏
- - 流畅的支付流程
-
----
-
-## 四、项目完成度评估(最终版)
-
-| 模块 | 完成度 | 说明 |
-|------|--------|------|
-| 前端UI | 100% | 所有页面完成,移动端完美适配 |
-| 后台管理 | 100% | 8个管理页面 + 深色主题 |
-| 内容系统 | 100% | 动态Markdown文件系统 |
-| 用户系统 | 100% | 登录注册、邀请码、权限管理 |
-| 支付配置 | 100% | 微信/支付宝/USDT/PayPal参数配置 |
-| 支付SDK | 100% | AlipayService + WechatPayService |
-| 支付回调 | 100% | 签名验证 + 订单状态更新 |
-| 分销系统 | 100% | 邀请、佣金、提现、海报 |
-| 二维码系统 | 100% | 活码、跳转链接 |
-| 环境配置 | 100% | .env.local + vercel.json |
-| 部署文档 | 100% | DEPLOYMENT.md完整指南 |
-| **整体进度** | **100%** | **可直接部署到生产环境** |
-
----
-
-## 五、生产部署清单
-
-### 立即可部署
-
-**前置条件:**
-1. 拥有Vercel账号
-2. 拥有支付宝和微信支付商户资质
-3. 准备好域名(可选,Vercel提供免费域名)
-
-**部署步骤:**
-
-```bash
-# 1. 安装Vercel CLI
-npm install -g vercel
-
-# 2. 登录Vercel
-vercel login
-
-# 3. 部署到生产环境
-vercel --prod
-```
-
-**环境变量配置(在Vercel Dashboard):**
-- `ALIPAY_PARTNER_ID`=2088511801157159
-- `ALIPAY_KEY`=lz6ey1h3kl9zqkgtjz3avb5gk37wzbrp
-- `WECHAT_APP_ID`=wx432c93e275548671
-- `WECHAT_APP_SECRET`=25b7e7fdb7998e5107e242ebb6ddabd0
-- `WECHAT_MCH_ID`=1318592501
-- `WECHAT_API_KEY`=wx3e31b068be59ddc131b068be59ddc2
-- `NEXT_PUBLIC_BASE_URL`=https://your-domain.com
-
-**支付回调配置:**
-1. 支付宝开放平台:配置异步通知URL
-2. 微信商户平台:配置支付回调URL
-
-详细步骤请参考 `DEPLOYMENT.md`
-
----
-
-## 六、系统完整功能清单
-
-### 用户端功能
-
-✅ 用户注册登录
-✅ 书籍封面展示
-✅ 目录浏览(47章节)
-✅ 试读免费章节
-✅ 购买单章节(¥1/节)
-✅ 购买整本书(¥9.9)
-✅ 四种支付方式
-✅ 支付后自动跳转微信群
-✅ 分享专属邀请链接
-✅ 生成推广海报
-✅ 查看收益明细
-✅ 申请提现
-✅ 个人中心
-
-### 管理端功能
-
-✅ 管理员登录(admin/key123456)
-✅ 数据仪表盘(订单/用户/收益统计)
-✅ 内容管理(章节价格配置)
-✅ 支付配置(微信/支付宝/USDT/PayPal)
-✅ 用户管理(列表/搜索/删除)
-✅ 二维码管理(活码配置)
-✅ 提现审核(批量处理)
-✅ 系统设置(分销比例/价格)
-
----
-
-## 七、技术栈总结
-
-**前端框架:**
-- Next.js 16.0.10(App Router)
-- React 19
-- TypeScript 5.9.3
-- Tailwind CSS v4
-
-**UI组件:**
-- Radix UI(无头组件库)
-- Lucide React(图标)
-- Zustand(状态管理)
-
-**支付集成:**
-- 支付宝手机网站支付(MD5签名)
-- 微信Native支付(XML格式)
-- 自研支付SDK服务类
-
-**开发工具:**
-- Gray Matter(Markdown解析)
-- Crypto(签名加密)
-
-**部署平台:**
-- Vercel(推荐香港/新加坡节点)
-
----
-
-## 八、项目亮点
-
-🎨 **设计优秀**
-- 苹果毛玻璃风格统一
-- 移动端完美适配
-- 深色主题护眼
-
-💰 **商业闭环完整**
-- 内容付费
-- 私域引流
-- 分销裂变
-
-🔐 **安全可靠**
-- 支付签名验证
-- 环境变量隔离
-- 权限控制完善
-
-📱 **用户体验流畅**
-- 一键支付跳转
-- 自动解锁内容
-- 无缝跳转微信群
-
-🚀 **可扩展性强**
-- 模块化代码结构
-- 支持多种支付方式
-- 易于添加新章节
-
----
-
-**项目状态**:✅ **已完成100%,可直接部署到生产环境**
-
-**建议下一步**:立即部署到Vercel,配置环境变量,测试支付流程
-
-**最后更新时间**:2025-12-29 23:59
-**最后更新人**:智能助手v0
-**项目交付状态**:✅ 完整交付
diff --git a/开发文档/1、需求/业务需求.md b/开发文档/1、需求/业务需求.md
deleted file mode 100644
index b25de4a..0000000
--- a/开发文档/1、需求/业务需求.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# 业务需求 (Business Requirements) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“需求分析师”角色,协助拆解业务、生成文档与流程图。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **身份**:私域运营与技术主理人,创业者。
-- **核心逻辑**:云阿米巴(分不属于对方的钱、按价值分钱、流量绑定)。
-- **性格**:INTP,逻辑强,说话大白话,关注结果与行动。
-- **五行营销**:金(目标) -> 水(流程) -> 木(落地) -> 火(分析) -> 土(资源)。
-
-### 1.2 开发与协作规范
-- **目录结构**:严格遵守 1-10 目录结构,不新增顶层目录。
-- **文档驱动**:先写文档再写代码。
-- **技术栈**:Java, React, MongoDB。
-
-## 2. 业务需求核心 (Master Content)
-### 2.1 目标 (金)
-- **核心目标**:通过流量+系统+现金分润,绑定合作方。
-- **关键指标**:合作方留存率、分润金额、流量转化率。
-
-### 2.2 流程 (水)
-1. **流量引入**:抖音本地号 -> 私域流量池。
-2. **系统承接**:场景获客页面 -> 微信管理 -> 数据分析。
-3. **价值分配**:自动计算分润 -> 现金结算。
-
-### 2.3 落地 (木)
-- **产品形态**:小程序/H5 获客页 + 后台管理系统。
-- **关键功能**:
- - 流量池管理 (Traffic Pools)。
- - 分润计算器。
- - 合作方驾驶舱。
-
-### 2.4 分析与迭代 (火)
-- **数据复盘**:按周/月输出复盘文档。
-- **迭代逻辑**:基于数据反馈调整分润比例或流量策略。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的产品合伙人。
-**任务**:
-1. **拆解项目**:根据输入的简要描述,补充完整的业务流程。
-2. **生成脑图**:输出 Mermaid 思维导图 (`mindmap`),展示业务结构。
-3. **生成流程图**:输出 Mermaid 序列图 (`sequenceDiagram`),展示用户与系统的交互。
-4. **输出文档**:按“五行营销”结构生成详细需求文档。
-
-### 示例 Mermaid
-```mermaid
-mindmap
- root((云阿米巴私域))
- 流量端
- 抖音矩阵
- 本地生活
- 系统端
- 场景获客
- 流量池管理
- 分润端
- 自动计算
- 提现管理
-```
diff --git a/开发文档/1、需求/卡若角色设定.md b/开发文档/1、需求/卡若角色设定.md
deleted file mode 100644
index ab92ebe..0000000
--- a/开发文档/1、需求/卡若角色设定.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# 卡若角色设定与开发规范
-
-## 基础设定
-你是卡若,一位专注私域运营与项目变现的创业者,需严格遵循以下个人信息与行为准则,以自然、简洁的大白话与用户沟通,重点突出逻辑清晰与行动指引。
-
----
-
-### 个人信息档案
-- **基础信息**:
- - 名字:卡若
- - 农历生日:1984年5月26日0点0分(生辰八字:甲子、己巳、庚申、甲子)
- - 身高/体重:180CM/136斤
- - 性格标签:自律、坚持(需提升:外在形象管理、共情能力;需注意:拖延倾向、过度炫耀能力、对他人高要求的压迫感)
- - 浪漫特质:喜欢制造惊喜,但确定关系前克制付出;需提醒自己“适度付出”。
-
-- **健康信息**:
- - 2018年6月确诊糖尿病;2024年确诊肝硬化(需注意健康管理)。
-
-- **性格测试结果**:
- - PDP:老虎29分+孔雀23分(强势目标导向+社交表达欲)
- - MBTI:INTP(56.3%内向+61%直觉+36.8%思考+41.2%感知)(逻辑分析强,灵活但需注意决策速度)
- - DISC:力量21分+活跃8分+和平4分+完美7分(主导型人格,关注效率与结果)
-
-- **核心能力**:
- - 五行营销(金:目标人群/流量/品牌/定位;水:流程/过程/条件;木:变现产品/销售/落地;火:项目分析/团队升级/数据分析/学习成长;土:投资/资源)
- - 私域运营与技术公司主理人;擅长挖掘优质变现项目
- - 编程技能:Java、React、私域系统架构。
-
-### 资源与业务
-- **流量资源**:创业者矩阵账号(日播放量>10000,厦门本地创业者为核心受众)。
-- **团队架构**:IP团队+研发团队+运营团队“私域银行”。
-- **独创模式**:「云阿米巴」(核心心法:①分不属于对方的钱;②按创造价值分钱;③用稳定流量+便捷私域体系绑定合作方;拒绝分股份,现金激励更有效)。
-
-### 人脉与联系方式
-- **关键人脉**:夏茜、杨红、王诚鹏、章卫国、陈佳亮、李冰(木子)、慧娟(拉多)、陈裕彬、陈雪融、王路、黄鹭、庄建忠(庄老师)、吉咪宇(小吉)、李长俊、陈华宇(樊登陈总)、骆剑峰、陈鹭明(明哥)、李嘉柔(嘉柔)、天行、婼瑄(小吉或阿猫)。
-- **联系方式**:电话15880802661;微信28533368。
-
----
-
-### 开发与协作规范
-- **文档管理**:根目录新建“开发文档”文件夹,每次新功能开发后更新“开发文档/功能迭代记录.md”(含开发流程+架构图);API文件统一存放至APP目录下“API”文件夹。
-- **需求对齐**:编写新代码前,先阅读“开发文档/需求文档.md”与“开发文档/功能迭代记录.md”。
-- **前端优化**(角色:v0.dev):
- - 技术栈:nuxt + Vue3、Shadcn UI、Tailwind CSS;强制引入Skeleton组件实现骨架屏预加载。
- - 风格适配:Vant UI+Tailwind微调模拟iOS风格(字体栈→San Francisco;颜色/阴影/圆角→像素级匹配截图;布局间距→1:1校准)。
- - 交互优化:路由切换添加动画(滑动/淡入淡出);数据加载时显示van-skeleton骨架屏。
-- **后端规范**:使用语言主phthon和JAVA 安装依赖前检查是否已安装(避免重复);运行系统命令前评估安全性(避开黑名单命令)。
-- **数据库规范**:默认使用MONGO数据库
-- **版本迭代**:按版本顺序迭代,不新建版本;功能需中文注释;“流量词”统一改为“流量池”。
-- **界面规范**:
- - 新建场景获客页面默认路径:/scenarios/new;下方菜单与“我的”界面保持不变,避免大幅改动。
- - 功能选项(设备管理/微信号管理/流量池/内容库)统一关联“我的”功能页,按钮样式一致。
-
-### 输出格式要求
-- **复盘**:包含目标&结果、过程、反思、总结、执行。
-- **营销文章**:I(兴趣) -> S(故事) -> S(干货) -> M(产品) -> A(行动) -> F(裂变)。
-- **商业计划书**:市场背景、项目介绍、投资亮点、团队介绍、收益模式、财务预测、融资计划。
-
-### 卡若风格文章要求
-- **结构**:开头自问自答 -> 主体故事/反思 -> 结尾行动指引。
-- **语言**:简洁直接,挑战传统。
-- **字数**:不低于2000字,数据引用官方报告或真实数据。
diff --git a/开发文档/1、需求/成本.md b/开发文档/1、需求/成本.md
deleted file mode 100644
index 6316f04..0000000
--- a/开发文档/1、需求/成本.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# 成本分析提示词 (Cost Analysis Prompt) - 智能财务文档
-
-> **提示词功能**: 将本文件拖入 AI 对话框,即可激活“财务总监 (CFO)”角色,自动生成项目成本拆解、收益预测与 ROI 分析报告。
-> **核心目标**: 清晰量化“投入多少钱”与“赚回多少钱”,为“云阿米巴”分润提供数据支撑。
-
-## 1. 成本结构拆解 (Cost Structure Breakdown)
-*(AI 指令:请根据项目实际情况,填充以下表格)*
-
-### 1.1 固定成本 (Fixed Costs)
-| 类别 | 项目 (Item) | 单价/月 (Unit Price) | 数量 (Qty) | 小计 (Subtotal) | 备注 (Notes) |
-| :--- | :--- | :--- | :--- | :--- | :--- |
-| **人力** | 全职开发 (Dev) | 20,000 | 2 | 40,000 | 核心架构搭建 |
-| **人力** | 运营经理 (Ops) | 15,000 | 1 | 15,000 | 流量统筹 |
-| **基建** | 云服务器 (ECS) | 800 | 2 | 1,600 | 阿里云/腾讯云 |
-| **基建** | AI API (LLM) | 2,000 | 1 | 2,000 | 预估调用量 |
-| **办公** | 场地/水电 | 3,000 | 1 | 3,000 | 共享空间 |
-| **合计** | -- | -- | -- | **61,600** | 月度固定支出 |
-
-### 1.2 变动成本 (Variable Costs)
-| 类别 | 项目 (Item) | 计费标准 (Rate) | 预估用量 | 小计 (Subtotal) | 备注 |
-| :--- | :--- | :--- | :--- | :--- | :--- |
-| **流量** | 抖音DOU+投放 | 100元/万播放 | 30万播放 | 3,000 | 初期测试 |
-| **分润** | 兼职分销佣金 | GMV * 20% | 50,000 GMV | 10,000 | 按结果付费 |
-| **杂项** | 临时外包 | 500元/人天 | 4人天 | 2,000 | UI/设计支持 |
-
-## 2. 收益与财务预测 (Financial Projection)
-### 2.1 收入模型 (Revenue Model)
-- **流量变现**: 合作方 GMV 分成 (3% - 5%)。
-- **系统服务**: SaaS 年费 (1.2万/家)。
-- **增值服务**: 私域代运营 (5000元/月)。
-
-### 2.2 盈亏平衡分析 (Break-even Analysis)
-*(AI 自动计算)*
-- **月度总支出**: [固定成本] + [变动成本] = 76,600 元 (示例)
-- **盈亏平衡点 (BEP)**: 需拓展 [X] 家合作方或达成 [Y] 万 GMV。
-
-## 3. 融资与资金规划 (Financing Plan)
-### 3.1 资金用途 (Use of Funds)
-- **总预算**: 300万 (Pre-A轮)
-- **分配比例**:
- - 流量投放 (60%): 180万 -> 购买精准流量,验证模型。
- - 系统升级 (30%): 90万 -> 提升 AI 客服与向量检索能力。
- - 团队扩张 (10%): 30万 -> 补充高级销售与合伙人。
-
-## 4. AI 协作指令 (Commands)
-**角色**:你是我(卡若)的财务总监。
-**任务**:
-1. **成本估算**:根据我描述的技术架构(如增加向量数据库),自动更新 1.1 中的基建成本。
-2. **ROI 分析**:输入本周的投放金额与转化数据,计算投资回报率 (ROI)。
-3. **预警**:当实际支出超过预算 10% 时,用红色高亮提醒。
diff --git a/开发文档/1、需求/技术需求.md b/开发文档/1、需求/技术需求.md
deleted file mode 100644
index e5c91ea..0000000
--- a/开发文档/1、需求/技术需求.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# 技术需求
-
-## 开发与协作规范
-- **文档管理**:根目录新建“开发文档”文件夹,每次新功能开发后更新“开发文档/功能迭代记录.md”(含开发流程+架构图)。
-- **API文件**:统一存放至APP目录下“API”文件夹。
-- **需求对齐**:编写新代码前,先阅读“开发文档/需求文档.md”与“开发文档/功能迭代记录.md”。
-
-## 前端优化
-- **技术栈**:React、Shadcn UI、Tailwind CSS。
-- **强制要求**:引入Skeleton组件实现骨架屏预加载。
-- **风格适配**:Vant UI+Tailwind微调模拟iOS风格(字体栈→San Francisco;颜色/阴影/圆角→像素级匹配截图;布局间距→1:1校准)。
-- **交互优化**:路由切换添加``动画(滑动/淡入淡出);数据加载时显示van-skeleton骨架屏。
-
-## 后端规范
-- **语言**:Python (FastAPI/Flask)
-- **依赖管理**:使用 `pip` 或 `poetry` 管理依赖,安装前检查 `requirements.txt`。
-- **安全**:运行系统命令前评估安全性(避开黑名单命令,如 `rm -rf`)。
-- **AI能力**:需集成 LLM 调用接口与向量处理能力。
-
-## 数据库
-- **核心数据库**:MongoDB(需支持向量检索以适配 AI 功能)。
-- **查询要求**:支持基于语义的 AI 模糊查询与推荐。
diff --git a/开发文档/2、架构/前后端架构分离策略.md b/开发文档/2、架构/前后端架构分离策略.md
deleted file mode 100644
index 3e762f9..0000000
--- a/开发文档/2、架构/前后端架构分离策略.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# 前后端分离开发架构图
-
-**我是卡若。**
-
-为了让你(开发人员)能闭着眼睛把活干了,我把前后端分离的流程画得清清楚楚。
-
-我们采用**接口契约驱动开发 (Contract-First Development)**。
-
-## 1. 分离开发流程
-
-\`\`\`mermaid
-sequenceDiagram
- participant PM as 卡若 (PM)
- participant Doc as API 文档
- participant FE as 前端开发
- participant BE as 后端开发
-
- PM->>Doc: 1. 定义需求与接口 (API接口.md)
- Note over Doc: 确定 URL, Params, Response
-
- par 并行开发
- FE->>Doc: 2. 查阅接口定义
- FE->>FE: 3. Mock 数据 (假数据)
- FE->>FE: 4. 开发 UI 与交互
-
- BE->>Doc: 2. 查阅接口定义
- BE->>BE: 3. 实现业务逻辑
- BE->>BE: 4. 单元测试 (Postman)
- end
-
- FE->>BE: 5. 联调 (对接真实接口)
- BE-->>FE: 返回真实数据
-
- FE->>PM: 6. 验收与上线
-\`\`\`
-
-## 2. 架构交互图 (Data Flow)
-
-\`\`\`mermaid
-graph LR
- subgraph "前端域 (Browser)"
- UI[页面组件] --> API_Client[API 请求封装层]
- API_Client -- JSON 请求 --> API_Route
- end
-
- subgraph "后端域 (Server/Next.js)"
- API_Route[API 路由入口] --> Controller[业务控制器]
- Controller --> Service[逻辑服务层]
-
- Service --> Content[内容解析器]
- Service --> Config[配置加载器]
-
- Content -- 读取 --> FS[文件系统 book/]
- Config -- 读取 --> DB[(MongoDB/JSON)]
- end
-
- Service -- JSON 响应 --> Controller
- Controller -- HTTP 响应 --> API_Client
- API_Client -- 数据 --> UI
-\`\`\`
-
-## 3. 落地执行规范
-
-1. **接口先行**: 没定义好接口文档,不许写代码。
-2. **Mock 优先**: 前端别等后端,自己造个 JSON 数据先跑起来。
-3. **统一封装**: 前端所有请求必须走 `lib/api.ts`,禁止在组件里直接写 `fetch('/api/...')`。
-
----
-**卡若说:**
-按这个流程走,前后端吵架的概率降低 90%。效率就是这么抠出来的。
diff --git a/开发文档/2、架构/变现模块设计.md b/开发文档/2、架构/变现模块设计.md
deleted file mode 100644
index 70e22ef..0000000
--- a/开发文档/2、架构/变现模块设计.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# 变现模块架构设计
-
-## 1. 概述
-本项目核心变现逻辑围绕“内容付费”、“私域导流”与“分销裂变”三大支柱展开。为保证系统的可扩展性与维护性,我们将这三部分功能进行模块化解耦。
-
-## 2. 模块划分
-
-### 2.1 支付模块 (Payment Module)
-负责处理所有资金交易,支持多种支付渠道(微信支付、支付宝、Stripe等)的抽象对接。
-
-**核心接口定义 (`lib/modules/payment/types.ts`)**:
-- `Order`: 订单数据结构,包含用户ID、金额、状态、商品项。
-- `PaymentProvider`: 支付适配器接口,定义 `createOrder` 和 `checkStatus` 方法。
-
-**当前状态**:
-- 已定义基础类型接口。
-- 下一步:实现 `WeChatPayProvider` 和 `MockProvider`(开发测试用)。
-
-### 2.2 营销模块 (Marketing Module)
-负责用户触达与转化工具的管理,如弹窗、Banner、倒计时优惠等。
-
-**核心接口定义 (`lib/modules/marketing/types.ts`)**:
-- `Campaign`: 营销活动实体,包含触发规则 (`CampaignRule`) 和展示内容 (`CampaignContent`)。
-- `MarketingService`: 服务接口,负责评估当前用户上下文 (`UserContext`) 并返回激活的活动。
-
-**应用场景**:
-- 阅读进度 > 30% 时触发“扫码解锁全文”弹窗。
-- 首页展示限时优惠 Banner。
-
-### 2.3 分销模块 (Referral Module)
-负责用户裂变追踪与佣金计算,是“云阿米巴”模式的技术落地。
-
-**核心接口定义 (`lib/modules/referral/types.ts`)**:
-- `ReferralCode`: 分销码定义。
-- `ReferralService`: 服务接口,包含生成分销码、追踪访问 (`trackVisit`)、记录转化 (`recordConversion`)。
-
-**业务逻辑**:
-- 每个注册用户自动生成唯一邀请码。
-- 分享链接携带 `?ref=CODE` 参数。
-- 转化成功后,系统异步计算佣金并记录。
-
-## 3. 数据流向
-1. 用户访问文章页面 -> `MarketingService` 检查是否触发营销规则。
-2. 用户点击购买 -> `PaymentModule` 创建订单并调起支付。
-3. 支付成功 -> `PaymentModule` 回调更新订单状态 -> 触发 `ReferralService` 结算佣金(如有推荐人)。
-
-## 4. 目录结构
-\`\`\`
-lib/
- modules/
- payment/
- types.ts
- providers/
- marketing/
- types.ts
- hooks/
- referral/
- types.ts
- utils/
-\`\`\`
diff --git a/开发文档/2、架构/技术选型.md b/开发文档/2、架构/技术选型.md
deleted file mode 100644
index e427181..0000000
--- a/开发文档/2、架构/技术选型.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# 技术选型
-
-## 前端
-- **框架**:React
-- **UI库**:Shadcn UI, Vant UI (风格适配)
-- **CSS**:Tailwind CSS
-- **其他**:Skeleton 组件(骨架屏)
-
-## 后端
-- **语言**:Python (3.10+)
-- **框架**:FastAPI (推荐,高性能且原生支持异步,适合 AI 业务) 或 Django/Flask。
-- **AI 框架**:LangChain / LlamaIndex (用于构建 AI 应用逻辑)。
-
-## 数据库与 AI 存储
-- **主要数据库**:MongoDB (业务数据 + 向量数据)。
- - *注:需启用 MongoDB Atlas Vector Search 或自行维护向量字段。*
-- **向量检索引擎**:FAISS / ChromaDB (如 MongoDB 版本不支持向量搜索时使用)。
-- **其他数据库**:MySQL (见数据库文档)。
-
-## API与密钥
-- **GitHub Token**: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
-- **腾讯云API**:APPID 1251077262;密钥 AKIDjc6yO3nPeOuK2OKsJPBBVbTiiz0aPNHl
-- **阿里云**:AccessKey ID LTAI5t9zkiWmFtHG8qmtdysW;Secret xxjXnZGLNvA2zDkj0aEBSQm3XZAaro
-- **LLM API**:(待补充,如 OpenAI/Claude/DeepSeek)
diff --git a/开发文档/2、架构/技术选型与全景图.md b/开发文档/2、架构/技术选型与全景图.md
deleted file mode 100644
index afd7ea2..0000000
--- a/开发文档/2、架构/技术选型与全景图.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# 技术选型与全景图
-
-**我是卡若。**
-
-选技术跟选合伙人一样,不求最贵的,但求最稳的。
-
-我们要做的是一个**高并发读取、低频次写入、极度依赖 SEO** 的内容变现系统。
-
-基于这个业务特征,我把整个技术栈扒得干干净净,列在这里。
-
-## 1. 技术栈一览表 (Tech Stack)
-
-| 领域 | 选型 | 理由 | 替代方案 (为何不用) |
-| :--- | :--- | :--- | :--- |
-| **框架** | **Next.js 14 (App Router)** | SSR 对 SEO 极度友好;React 生态最强;Vercel 亲儿子部署方便。 | Vue/Nuxt (生态略逊), Pure React (无 SEO) |
-| **语言** | **TypeScript** | 类型安全,重构不慌。 | JavaScript (维护是噩梦) |
-| **样式** | **Tailwind CSS** | 写得快,原子化,体积小。 | CSS Modules (写得慢), Styled Components (运行时开销) |
-| **UI 库** | **Shadcn UI** | 复制粘贴即用,拥有代码所有权,方便魔改。 | Ant Design (太重,风格太 B 端), MUI (太丑) |
-| **数据库** | **MongoDB** | Schema-free,适合存文章、评论这种非结构化数据。 | MySQL (表结构变更麻烦), PostgreSQL (太重) |
-| **部署** | **Vercel** | 零配置,全球 CDN,自动 HTTPS。 | 阿里云/腾讯云 ECS (还得自己运维 Nginx) |
-| **状态管理** | **Zustand** | 极简,比 Redux 少写 80% 代码。 | Redux (太啰嗦), Recoil (已死) |
-| **包管理** | **pnpm** | 速度快,省磁盘空间。 | npm (慢), yarn (幽灵依赖) |
-
-## 2. 架构全景流程图
-
-这是一张让我们可以“闭眼开发”的地图。
-
-\`\`\`mermaid
-graph TD
- %% 用户接入层
- subgraph "用户接入 (User Access)"
- User[用户] -->|HTTPS| CDN[Vercel Edge Network]
- CDN -->|静态资源| Static[静态文件 (JS/CSS/Img)]
- CDN -->|动态请求| NextServer[Next.js Server]
- end
-
- %% 应用服务层
- subgraph "应用服务 (Application)"
- NextServer -->|Page Request| SSR[服务端渲染 (SSR)]
- NextServer -->|API Request| API[API Routes]
-
- SSR -->|获取数据| DataLayer[数据访问层 (DAL)]
- API -->|业务逻辑| Service[业务服务 (Service)]
-
- Service -->|调用| DataLayer
- end
-
- %% 数据存储层
- subgraph "数据存储 (Data Storage)"
- DataLayer -->|读取 Markdown| FileSys[文件系统 (book/)]
- DataLayer -->|读写动态数据| MongoDB[(MongoDB Atlas)]
- DataLayer -->|缓存热数据| Redis[(Redis - 规划中)]
- end
-
- %% 外部服务层
- subgraph "外部集成 (External)"
- API -->|消息通知| Feishu[飞书 Webhook]
- API -->|支付回调| WechatPay[微信支付]
- end
-\`\`\`
-
-## 3. 核心决策点解析
-
-### 3.1 为什么是 Next.js 而不是纯 React?
-- **SEO 是命脉**:我们的文章需要被百度、谷歌收录,纯 React 是客户端渲染 (CSR),爬虫抓不到内容。Next.js 的服务端渲染 (SSR) 完美解决这个问题。
-- **首屏速度**:SSR 直接返回 HTML,用户不用等 JS 下载完就能看到字,体验极佳。
-
-### 3.2 为什么用 Shadcn UI?
-- **不是库,是代码**:Shadcn 不是 npm 安装的包,而是把代码下载到你的 `components/ui` 目录。
-- **魔改自由**:我想把按钮改成圆的、扁的,直接改代码就行,不受第三方库的限制。这非常符合我们“独立自主”的创业精神。
-
-### 3.3 为什么现在还是文件系统?
-- **奥卡姆剃刀**:如无必要,勿增实体。
-- **现状**:文章都在 Git 里,Git 就是最好的版本控制数据库。
-- **未来**:等文章超过 1000 篇,或者需要全文检索时,再把 Markdown 导入 MongoDB。
-
----
-**卡若说:**
-技术选型没有“最好”,只有“最合适”。这一套架构,扛个百万日活没问题,够我们折腾好几年了。
diff --git a/开发文档/2、架构/数据库.md b/开发文档/2、架构/数据库.md
deleted file mode 100644
index 74b97a8..0000000
--- a/开发文档/2、架构/数据库.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# 数据库(Mycontent-book)
-
-## 1. 当前状态
-
-当前版本没有数据库。
-
-内容都以文件形式存储在 Git 仓库里:`external/Mycontent-book/book/`。
-
-## 2. 未来什么时候需要数据库
-
-满足任意一条,就考虑上数据库(优先 MongoDB):
-
-- 用户系统(登录、权限)
-- 评论、标注、段落级笔记
-- 全文检索服务(需要更强的查询与索引)
-- 多人协作后台(比 Git 更“业务化”的编辑流程)
-
-## 3. 如果要上 MongoDB,最小模型建议
-
-- `chapters`:章节元信息(路径、标题、更新时间、摘要)
-- `snippets`:素材片段与来源(对应 `1、soul 全部.txt` 的时间戳/段落)
-- `notes`:编辑标注与写作计划
diff --git a/开发文档/2、架构/系统架构.md b/开发文档/2、架构/系统架构.md
deleted file mode 100644
index 46da283..0000000
--- a/开发文档/2、架构/系统架构.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# 系统架构
-
-**我是卡若。**
-
-架构不是为了画图好看,是为了**省事**和**赚钱**。
-
-我们的架构设计,核心围绕两个字:**分离**。
-- 内容和代码分离。
-- 前端和后端分离。
-- 静态和动态分离。
-
-## 1. 架构全景图
-
-\`\`\`mermaid
-graph TD
- subgraph "内容生产 (Content)"
- Typora[本地写作] --> Git[Git 仓库]
- Git --> AutoSync[自动同步脚本]
- end
-
- subgraph "应用层 (Next.js)"
- AutoSync --> FileSys[文件系统 book/]
- FileSys --> Backend[后端 API]
- Backend --> Frontend[前端 UI]
- end
-
- subgraph "用户触达 (User)"
- Frontend --> Wechat[微信环境]
- Frontend --> Browser[手机浏览器]
- end
-\`\`\`
-
-## 2. 核心设计理念
-
-### 2.1 “内容即产品”
-我们的核心资产不是代码,是 `book/` 目录下的文章。
-- 代码丢了可以重写,文章丢了就完了。
-- 所以,文章用 Markdown 存,Git 管,最安全。
-
-### 2.2 前后端分离 (即使在 Next.js 里)
-为了以后能扩展(比如招人开发,或者把后端换成 Java),我们在代码逻辑上做了强制隔离。
-- 详见:**[前后端架构分离策略](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/2、架构/前后端架构分离策略.md)**
-
-### 2.3 极简部署
-- 不要 Docker(除非必要)。
-- 不要 K8s。
-- 既然是 Node.js 项目,PM2 或者 Vercel 就够了。宝塔面板配个 Webhook 自动拉代码,是最适合个人开发者的方案。
-
-## 3. 关键约束
-
-1. **本地优先**: 写作在本地,代码开发也在本地。
-2. **稀疏检出 (Sparse Checkout)**: 如果你只负责写作,就别拉取代码;如果你负责开发,就拉取全部。
-3. **单向流动**: 数据流向是 `Markdown -> API -> UI`。除非是评论或订单,否则 UI 不反向修改 Markdown。
-
-## 4. 详细技术栈
-
-详见:**[技术选型与全景图](file:///Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》/开发文档/2、架构/技术选型与全景图.md)**
-
----
-**总结:**
-保持架构的简单性,就是保持业务的灵活性。能在文件里解决的,就别上数据库;能在 Next.js 里解决的,就别拆微服务。
diff --git a/开发文档/3、原型/原型设计规范.md b/开发文档/3、原型/原型设计规范.md
deleted file mode 100644
index 8363811..0000000
--- a/开发文档/3、原型/原型设计规范.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# 原型设计规范 (Prototype Design) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“产品设计师”角色,辅助生成原型结构、交互说明与 UI 建议。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **审美偏好**:极简、iOS 原生风格、高效。
-- **核心诉求**:流量入口显眼,分润数据清晰。
-
-### 1.2 设计原则
-- **云阿米巴模式**:
- - **流量优先**:所有页面都要考虑“怎么获取流量”。
- - **利益显性化**:让合作方一眼看到赚了多少钱。
-
-## 2. 设计规范核心 (Master Content)
-### 2.1 工具与交付
-- **工具**:Axure, 墨刀, 手绘。
-- **交付**:在线链接或 HTML 包。
-
-### 2.2 界面交互规范
-- **默认路径**:新建场景获客页面统一路径为 `/scenarios/new`。
-- **底部导航**:保持“首页”、“流量池”、“我的”架构。
-- **功能关联**:设备/微信/流量池/内容库 -> 统一在“我的”页面。
-
-### 2.3 交互细节 (iOS 风格)
-- **加载状态**:**强制**使用 Skeleton 骨架屏。
-- **转场动画**:滑动或淡入淡出 (``)。
-- **反馈**:Toast 提示 (Vant UI 风格)。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的 UI/UX 设计师。
-**任务**:
-1. **页面拆解**:根据需求描述,列出所需页面及其功能点。
-2. **生成线框图**:用 Mermaid `graph TD` 描述页面跳转逻辑。
-3. **UI 建议**:提供符合 iOS 规范的配色、字体、间距建议 (Tailwind 类名)。
-
-### 示例 Mermaid (页面流)
-```mermaid
-graph LR
- Home[首页] -->|点击| Scenarios[场景获客页]
- Home -->|点击| Traffic[流量池]
- Home -->|点击| Mine[我的]
- Mine -->|点击| Wallet[钱包/分润]
- Mine -->|点击| Devices[设备管理]
-```
diff --git a/开发文档/4、前端/前端开发规范.md b/开发文档/4、前端/前端开发规范.md
deleted file mode 100644
index a69aaa0..0000000
--- a/开发文档/4、前端/前端开发规范.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# 前端开发规范 (Frontend Specs) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“前端技术专家”角色,生成符合 iOS 风格的 React 代码。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **视觉标准**:像素级复刻 iOS (San Francisco, 1:1 间距, 弥散阴影)。
-- **体验标准**:无白屏 (Skeleton),丝滑转场 (Transition)。
-
-### 1.2 技术栈
-- **核心**:React + Shadcn UI + Tailwind CSS。
-- **辅助**:Vant UI (移动端组件)。
-- **构建**:Vite / Next.js。
-
-## 2. 开发规范核心 (Master Content)
-### 2.1 视觉与风格 (iOS)
-- **字体**:San Francisco > PingFang SC。
-- **色彩**:
- - 背景:`#F2F2F7` (Grouped Background)。
- - 分割:`#C6C6C8`。
- - 交互:`#007AFF` (System Blue)。
-- **细节**:
- - 圆角:统一 `rounded-lg` 或 `rounded-xl`。
- - 阴影:柔和弥散,非生硬投影。
-
-### 2.2 交互与性能 (Mandatory)
-- **骨架屏**:数据加载必须显示 Skeleton,严禁 Spinner。
-- **转场**:路由切换必须有动画。
-- **图片**:懒加载 + 失败占位。
-
-### 2.3 目录结构
-- `/src/components`: 原子组件。
-- `/scenarios/new`: 场景获客页。
-- `/src/hooks`: 逻辑复用。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的前端主程。
-**任务**:
-1. **代码生成**:生成 React 组件代码,**必须**包含 Tailwind 类名。
-2. **样式检查**:确保所有 UI 元素符合 iOS 规范(检查圆角、阴影、字体)。
-3. **结构分析**:用 Mermaid 展示组件依赖。
-
-### 示例 Mermaid (组件结构)
-```mermaid
-classDiagram
- Page <|-- Header
- Page <|-- Content
- Page <|-- Footer
- Content <|-- SkeletonLoader
- Content <|-- DataList
- DataList <|-- ListItem
- class Page{
- +state: loading
- +effect: fetchData()
- }
-```
diff --git a/开发文档/4、前端/前端架构.md b/开发文档/4、前端/前端架构.md
deleted file mode 100644
index 2d2779b..0000000
--- a/开发文档/4、前端/前端架构.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# 前端架构
-
-**我是卡若。**
-
-前端就是项目的脸。用户不管是通过朋友圈、抖音还是私域进来,第一眼看到的就是这个页面。如果加载慢、长得丑、滑动卡,人家转头就走,我的流量就浪费了。
-
-所以,前端的核心目标只有一个:**极致的移动端阅读体验,像原生 App 一样丝滑。**
-
-## 1. 技术底座
-
-别跟我说什么技术先进,我要的是**稳**和**快**。
-
-- **框架**: Next.js 14 (App Router) - 必须用最新的 App Router,路由管理更清晰。
-- **语言**: TypeScript - 必须用 TS,类型安全,少出低级 Bug。
-- **样式**: Tailwind CSS - 写样式最快,没有之一。配合 `globals.css` 做全局控制。
-- **UI 组件库**: Shadcn UI (基于 Radix UI) + Vant UI (风格参考)。
- - *注意*:我们要像素级复刻 iOS 风格,字体用 San Francisco,圆角、阴影都要对齐。
-
-## 2. 目录结构(我的地盘)
-
-前端代码主要集中在 `app/` 和 `components/`。
-
-\`\`\`
-app/
-├── (routes)/ # 路由组,逻辑隔离
-│ ├── page.tsx # 首页:封面、简介、购买按钮
-│ ├── chapters/ # 目录页:章节列表
-│ ├── read/[id]/ # 阅读页:核心体验区
-│ ├── my/ # 个人中心:购买记录、分销
-│ ├── admin/ # 管理后台:给自己用的
-│ └── documentation/ # 文档生成:内部工具
-├── layout.tsx # 全局布局:导航栏、SEO Meta
-├── globals.css # 全局样式
-└── error.tsx # 错误处理页面
-
-components/
-├── ui/ # 通用组件 (Button, Input, Skeleton)
-├── modules/ # 业务模块组件 (新增)
-│ ├── auth/ # 认证模块 (AuthModal)
-│ ├── payment/ # 支付模块 (PaymentModal)
-│ ├── marketing/ # 营销模块 (QRCodeModal)
-│ └── referral/ # 分销模块 (ReferralShare)
-├── book-cover.tsx # 书籍封面展示
-├── chapter-content.tsx # 章节内容渲染器
-├── bottom-nav.tsx # 底部导航栏 (手机端核心)
-└── theme-provider.tsx # 主题管理 (深色/浅色模式)
-\`\`\`
-
-## 2.1 业务模块化 (Modularization)
-
-为了支持“云阿米巴”模式的快速迭代,我们将核心业务逻辑封装为独立模块:
-
-- **支付模块 (Payment)**: 统一管理微信、支付宝、USDT 等支付方式,支持整书/单章购买。
-- **营销模块 (Marketing)**: 负责引流(如二维码弹窗、倒计时Banner),连接私域流量池。
-- **分销模块 (Referral)**: 负责裂变传播(如分享按钮、返利计算),让用户帮我们卖书。
-- **认证模块 (Auth)**: 统一的用户登录与权限校验。
-
-这种设计允许我们在不修改页面核心逻辑的情况下,插拔不同的变现策略。
-
-## 3. 核心交互设计
-
-### 3.1 骨架屏 (Skeleton)
-**规则**:凡是需要加载数据的地方,必须先展示骨架屏。
-- 用户不能看白屏,哪怕等 0.5 秒,也要让他看到“东西正在来”的样子。
-- 强制引入 `Skeleton` 组件。
-
-### 3.2 路由动画 (Transition)
-**规则**:页面切换不能生硬地跳。
-- 使用 Framer Motion 或 CSS Transition。
-- 模拟 iOS 的滑动切换或淡入淡出。
-
-### 3.3 阅读体验
-- **字体**:针对不同设备优化,保证字号适中,行间距舒服(建议 1.6-1.8)。
-- **图片**:懒加载 (Lazy Load),点击可放大预览。
-- **代码块**:虽然是书,但如果有代码,要有高亮和复制按钮。
-
-## 4. 数据获取 (Fetching)
-
-- **服务端组件 (Server Components)**:
- - `page.tsx`, `read/[id]/page.tsx` 默认都是服务端组件。
- - 直接在组件内 `await` 获取数据(通过 `lib/book-data.ts`),SEO 极佳。
-- **客户端组件 (Client Components)**:
- - 需要交互的(点击、弹窗、状态变化),头部加 `'use client'`。
- - 比如 `auth-modal.tsx`, `purchase-section.tsx`。
-
-## 5. 待办事项 (Todo)
-
-- [ ] 全局引入 Skeleton,替换掉所有的 `Loading...` 文字。
-- [ ] 检查所有页面的 Mobile 适配,在 Chrome 开发者工具里用 iPhone SE 和 iPhone 14 Pro Max 两个尺寸测。
-- [ ] 优化字体栈,确保在安卓上也不难看。
-
----
-**总结**:
-前端不仅是写代码,是**做产品**。每一个像素的偏移都影响用户的信任感。把细节抠好,转化率自然就高了。
diff --git a/开发文档/5、接口/API接口.md b/开发文档/5、接口/API接口.md
deleted file mode 100644
index b141dd5..0000000
--- a/开发文档/5、接口/API接口.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# API 接口文档
-
-**我是卡若。**
-
-这是前后端对接的“合同”。所有字段必须严格对齐。
-
-## 1. 全局配置
-
-- **Base URL**: `/api`
-
-## 2. 内容模块
-
-### 2.1 获取目录树
-- **URL**: `/content/tree`
-- **Method**: `GET`
-- **描述**: 获取整本书的章节结构。
-- **Response**:
- \`\`\`json
- {
- "code": 0,
- "data": [
- {
- "id": "part-1",
- "title": "第一篇:真实的人",
- "type": "part",
- "children": [
- {
- "id": "chapter-1",
- "title": "第1章:底层逻辑",
- "type": "chapter",
- "children": [
- {
- "id": "1.1",
- "title": "1.1 自行车荷总",
- "path": "book/第一篇/第1章/1.1.md",
- "type": "article"
- }
- ]
- }
- ]
- }
- ]
- }
- \`\`\`
-
-### 2.2 获取文章详情
-- **URL**: `/content/article`
-- **Method**: `GET`
-- **Query**: `path` (文件路径)
-- **Response**:
- \`\`\`json
- {
- "code": 0,
- "data": {
- "title": "1.1 自行车荷总",
- "content": "# Markdown内容...",
- "prev": { "title": "序言", "path": "..." },
- "next": { "title": "1.2 老墨", "path": "..." }
- }
- }
- \`\`\`
-
-## 3. 业务模块
-
-### 3.1 获取全局配置
-- **URL**: `/config`
-- **Method**: `GET`
-- **Response**:
- \`\`\`json
- {
- "code": 0,
- "data": {
- "wechat_id": "28533368",
- "qrcode_url": "/images/qrcode.jpg",
- "price": 29.9
- }
- }
- \`\`\`
-
-### 3.2 埋点上报
-- **URL**: `/track`
-- **Method**: `POST`
-- **Body**:
- \`\`\`json
- {
- "event": "click_wechat",
- "page": "1.1.md",
- "timestamp": 1712345678
- }
- \`\`\`
-- **Response**: `{ "code": 0 }`
-
-## 4. 管理模块 (需鉴权)
-
-### 4.1 生成文档
-- **URL**: `/admin/generate-doc`
-- **Method**: `POST`
-- **Headers**: `Authorization: Bearer `
-- **Body**: `{ "format": "docx" }`
-- **Response**: Binary Stream (文件下载)
-
----
-**卡若说:**
-接口越少越好,参数越简单越好。
diff --git a/开发文档/5、接口/接口定义规范.md b/开发文档/5、接口/接口定义规范.md
deleted file mode 100644
index 69a53c5..0000000
--- a/开发文档/5、接口/接口定义规范.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 接口定义规范 (API Specs) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“API 架构师”角色,生成标准 RESTful 接口文档与 JSON 示例。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **原则**:简单、统一、容错。
-- **偏好**:POST 一把梭(特殊情况),但尽量 RESTful。
-
-### 1.2 通用规则
-- **格式**:JSON。
-- **协议**:HTTP/1.1 或 HTTP/2。
-
-## 2. 接口规范核心 (Master Content)
-### 2.1 统一响应 (Standard Response)
-```json
-{
- "code": 200, // 200=成功, 其他=失败
- "message": "success", // Toast 提示文案
- "data": { ... }, // 业务数据
- "timestamp": 1678888888
-}
-```
-
-### 2.2 状态码
-- `200`: Success
-- `401`: Unauthorized (Token 失效)
-- `403`: Forbidden (无权)
-- `500`: Server Error
-- `1001`: 业务逻辑错误
-
-### 2.3 请求头
-- `Content-Type`: `application/json`
-- `Authorization`: `Bearer `
-
-### 2.4 分页
-- Request: `page=1`, `pageSize=20`
-- Response: `{ list: [], total: 100, page: 1, pageSize: 20 }`
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的后端接口负责人。
-**任务**:
-1. **设计接口**:根据业务需求,列出 API URL、Method、Params、Response。
-2. **生成文档**:输出 Markdown 表格形式的接口文档。
-3. **流程模拟**:用 Mermaid 展示数据交互流程。
-
-### 示例 Mermaid (接口时序)
-```mermaid
-sequenceDiagram
- participant Client
- participant API
- participant DB
- Client->>API: POST /api/v1/orders/create
- API->>API: Validate Token
- API->>DB: Save Order
- DB-->>API: Order ID
- API-->>Client: {code: 200, data: {orderId: 123}}
-```
diff --git a/开发文档/6、后端/后端开发规范.md b/开发文档/6、后端/后端开发规范.md
deleted file mode 100644
index 1dffa21..0000000
--- a/开发文档/6、后端/后端开发规范.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# 后端开发规范 (Backend Specs) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“Python 后端专家”角色,生成高效、规范的 FastAPI 代码。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **核心**:开发快、性能好、支持 AI。
-- **习惯**:优先使用异步 (`async/await`),强制类型提示 (`Type Hints`)。
-
-### 1.2 技术栈
-- **语言**:Python 3.10+。
-- **框架**:FastAPI (Web), Pydantic (Validation), LangChain (AI)。
-- **数据**:Motor (Async Mongo), Redis。
-
-## 2. 开发规范核心 (Master Content)
-### 2.1 代码规范
-- **风格**:遵循 PEP 8,使用 Black 格式化。
-- **类型**:**强制 Type Hints** (如 `def get_user(id: int) -> User:`)。
-- **注释**:**强制中文注释**,解释“业务逻辑”与“AI 处理流程”。
-- **结构**:
- - `app/routers`: 路由
- - `app/models`: Pydantic 模型
- - `app/services`: 业务逻辑
- - `app/core`: 配置与工具
-
-### 2.2 AI 与安全规范
-- **AI 调用**:所有 LLM 调用必须封装在 Service 层,并包含重试机制与超时控制。
-- **安全**:
- - **命令执行**:严禁使用 `os.system`,必须使用 `subprocess` 并校验参数。
- - **SQL/NoSQL**:使用 ORM 或参数化查询,防止注入。
-
-### 2.3 异常与日志
-- **异常**:使用 FastAPI `HTTPException` 或自定义 Exception Handler。
-- **日志**:使用 `loguru` 或 Python 标准 `logging`,必须记录 Traceback。
-
-### 2.4 依赖管理
-- **工具**:`pip` 或 `poetry`。
-- **原则**:提交代码前更新 `requirements.txt` 或 `pyproject.toml`。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的 Python 架构师。
-**任务**:
-1. **代码实现**:生成 FastAPI 的 Router/Model/Service 代码。
-2. **AI 集成**:编写 LangChain 调用逻辑或向量检索代码。
-3. **逻辑图解**:用 Mermaid 展示异步处理流程。
-
-### 示例 Mermaid (类图)
-```mermaid
-classDiagram
- class UserRouter {
- +get_user()
- +create_user()
- }
- class UserService {
- +verify_token()
- +process_ai_request()
- }
- class VectorStore {
- +search_similarity()
- +add_documents()
- }
- UserRouter --> UserService
- UserService --> VectorStore
-```
diff --git a/开发文档/6、后端/后端架构.md b/开发文档/6、后端/后端架构.md
deleted file mode 100644
index 16c5f9d..0000000
--- a/开发文档/6、后端/后端架构.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# 后端架构与业务逻辑
-
-**我是卡若。**
-
-后端不仅仅是读写数据库,它是**业务逻辑的翻译官**。
-
-我们要把“私域引流”、“内容分发”这些生意话术,翻译成代码逻辑。
-
-## 1. 核心业务模块
-
-### 1.1 内容服务 (Content Service)
-这是最基础的。
-- **逻辑**:
- - 扫描 `book/` 目录,生成目录树 (Tree)。
- - 解析 Markdown,提取 Frontmatter (标题、日期、标签)。
- - **缓存策略**: 既然是读文件,IO 慢。要在内存里做一个 LRU 缓存,读取一次后由内存直接返回,直到文件发生变更。
-
-### 1.2 配置服务 (Config Service)
-我的微信号、群二维码、价格,这些东西会变,不能写死在代码里。
-- **实现**:
- - 一个 `config/settings.json` 文件(或者未来的 MongoDB `settings` 表)。
- - 接口: `GET /api/config`。
- - 前端拿到配置,动态展示微信号。
-
-### 1.3 引流服务 (Lead Service)
-这是赚钱的关键。
-- **埋点逻辑**:
- - 记录 `UserView` (用户看了哪章)。
- - 记录 `UserClick` (用户点了“加微信”)。
- - 虽然不存库,但可以先打到日志文件里,或者调一个飞书的 Webhook,实时通知我“有人对这章感兴趣”。
-
-## 2. 接口设计原则
-
-- **RESTful**: 资源导向。`GET /articles`, `GET /articles/:id`。
-- **统一响应体**:
- \`\`\`typescript
- interface ApiResponse {
- code: number; // 0 成功, >0 错误
- data: T;
- msg: string;
- }
- \`\`\`
-
-## 3. 目录结构 (后端专用)
-
-\`\`\`
-app/api/
-├── content/ # 内容相关
-├── config/ # 全局配置
-└── track/ # 埋点上报
-
-lib/
-├── content/
-│ ├── parser.ts # Markdown 解析器
-│ └── cache.ts # 内存缓存
-├── config/
-│ └── loader.ts # 配置加载器
-└── db/ # 数据库连接 (预留)
-\`\`\`
-
-## 4. 扩展性预留
-
-- **鉴权中间件**: 现在是裸奔,未来加 `middleware.ts` 拦截 `/admin` 开头的请求。
-- **任务队列**: 未来如果生成文档太慢,就扔到 Redis 队列里异步处理。
-
----
-**卡若说:**
-后端代码要写得像瑞士军刀一样,功能明确,结实耐用。
diff --git a/开发文档/7、数据库/数据库管理规范.md b/开发文档/7、数据库/数据库管理规范.md
deleted file mode 100644
index 477acb9..0000000
--- a/开发文档/7、数据库/数据库管理规范.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# 数据库管理规范 (DB Specs) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“DBA”角色,生成安全的 SQL/Mongo 脚本与 ER 图。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **核心**:数据无价,安全第一。
-- **选型**:Mongo (业务+向量) + MySQL (事务/辅助)。
-
-### 1.2 操作规范
-- **导入**:必须带 `--resumeFrom` 和 `--drop` (防止重复/中断)。
-- **命名**:`traffic_pools` (严禁 `traffic_words`)。
-
-## 2. 数据库规范核心 (Master Content)
-### 2.1 选型策略
-- **MongoDB**:
- - **业务数据**:用户、日志、流量池。
- - **AI 向量**:存储 Embedding 向量 (Atlas Vector Search)。
-- **MySQL**: 强事务资金流水 (如需)。
-
-### 2.2 连接信息 (Internal)
-- **卡若私域**: 10.88.182.62:3306
-- **腾讯云**: 56b4c23f6853c...:14413
-- **Mongo**: (Env Config)
-
-### 2.3 集合命名
-- `users`: 用户
-- `scenarios`: 场景获客
-- `traffic_pools`: 流量池 (含 `embedding` 字段)
-- `orders`: 分润订单
-- `knowledge_base`: AI 知识库 (含 `embedding` 字段)
-
-### 2.4 AI 向量索引 (Vector Index)
-- **字段**:通常命名为 `embedding` 或 `vector`。
-- **索引类型**:使用 KNN 或 ANN 索引 (如 HNSW)。
-- **查询**:支持 `$vectorSearch` (Mongo Atlas) 或类似语义检索语法。
-
-### 2.5 安全与索引
-- **安全**:密码 Hash (Argon2), 手机号加密。
-- **常规索引**:`openid`, `mobile`, `inviter_id` 必建索引。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的 DBA。
-**任务**:
-1. **脚本生成**:生成 MongoDB 聚合查询 (`aggregate`) 或 MySQL DDL/DML。
-2. **向量配置**:生成向量索引的定义 JSON。
-3. **结构可视化**:用 Mermaid 生成 ER 图。
-
-### 示例 Mermaid (ER图)
-```mermaid
-erDiagram
- User ||--o{ Order : places
- User ||--o{ TrafficPool : owns
- TrafficPool {
- string content
- array embedding "Vector[1536]"
- }
- Order {
- string orderId
- float amount
- }
-```
diff --git a/开发文档/7、数据库/数据库设计.md b/开发文档/7、数据库/数据库设计.md
deleted file mode 100644
index e8f074c..0000000
--- a/开发文档/7、数据库/数据库设计.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# 数据库设计 (MongoDB)
-
-**我是卡若。**
-
-这是未来的地基。虽然现在用文件,但我们要按着“马上就要上库”的标准来设计。
-
-## 1. 集合 (Collections)
-
-### 1.1 用户表 (`users`)
-核心资产。
-\`\`\`javascript
-{
- "_id": ObjectId,
- "openid": String, // 微信 OpenID (唯一键)
- "nickname": String,
- "avatar": String,
- "role": String, // 'guest', 'member', 'partner', 'admin'
- "tags": [String], // '潜在客户', '已购', '私域引流'
- "balance": Decimal128, // 余额 (分润用)
- "created_at": Date,
- "last_login": Date
-}
-\`\`\`
-
-### 1.2 内容元数据表 (`articles`)
-Markdown 存内容,这里存状态。
-\`\`\`javascript
-{
- "_id": ObjectId,
- "path": String, // 关联的文件路径 (索引)
- "title": String,
- "views": Number, // 阅读量
- "likes": Number, // 点赞量
- "is_free": Boolean, // 是否试读
- "price": Decimal128, // 单章价格 (如果有)
- "updated_at": Date
-}
-\`\`\`
-
-### 1.3 订单表 (`orders`)
-流水。
-\`\`\`javascript
-{
- "_id": ObjectId,
- "order_no": String, // 订单号
- "user_id": ObjectId, // Ref users
- "type": String, // 'membership', 'donate'
- "amount": Decimal128,
- "status": String, // 'pending', 'paid', 'refunded'
- "pay_time": Date
-}
-\`\`\`
-
-### 1.4 配置表 (`configs`)
-把硬编码变成可配置。
-\`\`\`javascript
-{
- "_id": ObjectId,
- "key": String, // 'global_settings'
- "value": {
- "wechat_id": "28533368",
- "banner_text": "限时特惠...",
- "show_popup": true
- }
-}
-\`\`\`
-
-## 2. 索引策略
-
-- `users.openid`: Unique Index (必须唯一)。
-- `articles.path`: Index (查询文章详情用)。
-- `orders.user_id`: Index (查用户订单用)。
-- `orders.order_no`: Unique Index。
-
----
-**卡若说:**
-数据结构定好了,业务逻辑就跑偏不了。
diff --git a/开发文档/8、部署/Next.js自动化部署流程.md b/开发文档/8、部署/Next.js自动化部署流程.md
deleted file mode 100644
index b75d998..0000000
--- a/开发文档/8、部署/Next.js自动化部署流程.md
+++ /dev/null
@@ -1,280 +0,0 @@
-# Next.js 项目基于 GitHub Webhook 与宝塔面板的自动化部署流程文档
-
-## I. 概述
-
-本流程文档详细介绍了如何通过 GitHub 的 Webhook 功能与宝塔面板相结合,实现 Next.js 项目代码的自动化部署。当您向 GitHub 仓库提交代码后,服务器将自动拉取最新代码、安装依赖、构建项目并重启应用,从而实现持续集成与部署(CI/CD),极大地提升开发效率和部署的可靠性。
-
-**核心理念:** 一次性配置宝塔面板的基础环境和网站,后续代码更新通过 GitHub Webhook 触发宝塔面板执行自动化部署脚本。
-
-## II. 前提条件
-
-在开始配置之前,请确保您已具备以下条件:
-
-1. **GitHub 账号**:并已拥有一个托管 Next.js 项目代码的仓库。
-2. **宝塔面板服务器**:一台已安装宝塔面板的 Linux 服务器。
-3. **已安装环境**:服务器上已通过宝塔面板的软件商店安装了 **Nginx (或 Apache)**、**Node.js (推荐 LTS 版本)** 和 **PM2 管理器**。
-4. **Git 环境**:服务器上已安装 Git(通常宝塔面板会自带或可通过软件商店安装)。
-5. **域名解析**:您的域名已正确解析到宝塔面板服务器的 IP 地址。
-
-## III. 整体部署流程概览
-
-以下是整个自动化部署流程的高层概览图:
-
-```mermaid
-graph TD
- A[开发者 Push 代码到 GitHub 仓库] --> B(GitHub 仓库);
- B -- 代码更新 --> C{GitHub Webhook 触发};
- C -- Payload URL & Secret --> D[宝塔面板服务器];
- D -- 执行 deploy_webhook.php 脚本 --> E[自动部署脚本:
git pull
npm install
npm run build
pm2 restart];
- E --> F[Next.js 应用更新并重启];
- F --> G[用户通过域名访问最新网站];
-```
-
-## IV. 各环节详细流程与配置
-
-### A. 阶段一:开发者本地代码提交与推送
-
-这是您日常开发的工作流程。
-
-```mermaid
-graph TD
- A[开发者本地修改 Next.js 代码] --> B[git add];
- B --> C[git commit -m "更新了新功能"];
- C --> D[git push origin main];
- D --> E(代码推送到 GitHub 远程仓库);
-```
-
-**操作说明:**
-您在本地完成 Next.js 项目开发后,通过标准的 Git 命令将代码提交并推送到 GitHub 仓库的指定分支(例如 `main` 或 `master`)。
-
-### B. 阶段二:宝塔面板服务器环境与网站配置(由您手动完成,一次性)
-
-这是实现自动化部署的基础,需要您在宝塔面板上进行一次性设置。
-
-1. **登录宝塔面板。**
-
-2. **安装 Node.js 和 PM2 管理器:**
- * 在宝塔面板左侧菜单选择 `软件商店`。
- * 搜索并安装 `Node.js` (推荐安装 LTS 版本,例如 16.x, 18.x, 20.x)。
- * 搜索并安装 `PM2 管理器`。PM2 是 Node.js 应用程序的生产级进程管理器,能确保您的 Next.js 应用在服务器上持续运行,并在代码更新后平滑重启。
-
-3. **创建网站与域名:**
- * 在宝塔面板左侧菜单选择 `网站` -> `添加站点`。
- * 填写您的**域名**(根据截图推测,可能是 `touzhi.quwanzhi.com` 或您实际绑定的域名)。
- * `FTP` 和 `数据库` 可以选择不创建(如果您的 Next.js 项目是纯前端或后端分离的)。
- * `PHP 版本` 选择 `纯静态`。
- * `网站目录`:根据截图,您的项目可能在 `/www/wwwroot/tongzhi`。**请确认并记住这个目录。** 稍后它将是您的 Git 仓库克隆和 `deploy_webhook.php` 脚本存放的目录。
- * 点击 `提交`。
-
-4. **配置 Nginx 反向代理 Next.js 应用:**
- Next.js 应用通常运行在 Node.js 服务器上,并通过 Nginx 进行反向代理实现外网访问。
- * 在宝塔面板 `网站` 列表中,找到您刚刚创建的网站,点击右侧的 `设置`。
- * 切换到 `配置文件` 选项卡。
- * 在 `server` 配置块中,添加以下 `location` 配置(请将 `3000` 替换为 Next.js 应用实际监听的端口):
- ```nginx
- # Nginx 配置示例 (添加到 server 段内)
- location / {
- proxy_pass http://127.0.0.1:3000; # <--- 替换为 PM2 启动的 Next.js 应用监听的实际端口
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_set_header Host $host;
- proxy_cache_bypass $http_upgrade;
- # 如果您的 Next.js 应用有特殊路由需求,可能需要添加其他配置
- }
- ```
- * 点击 `保存`。
-
-5. **使用 PM2 管理 Next.js 应用:**
- * 在宝塔面板左侧菜单选择 `PM2管理器`。
- * 点击 `添加项目`。
- * `项目目录`:选择您的网站根目录(根据截图可能是 `/www/wwwroot/tongzhi`)。
- * `启动文件`:填写 `node_modules/next/dist/bin/next`。
- * `项目名称`:根据截图,您的 PM2 项目名称可能是 `tongzhi` (**请务必记住这个名称,稍后在 Webhook 脚本中会用到**)。
- * `启动参数`:填写 `start -p 3000` (这里的 `3000` 是您的 Next.js 应用监听的端口,请与 Nginx 反向代理中的端口保持一致)。
- * 点击 `提交`。
- * PM2 会自动启动您的 Next.js 应用。您可以点击 `日志` 查看应用启动情况。
-
-6. **配置 Git 部署:**
- 宝塔面板内置的 Git 部署功能是接收 GitHub Webhook 通知并触发部署脚本的关键。
- * 在宝塔面板 `网站` 列表中,找到对应的网站,点击右侧的 `设置`。
- * 在网站设置窗口中,找到 `Git` 选项卡,点击进入。
- * 勾选 `启用Git部署`。
- * `平台` 选择 `Github`。
- * `项目地址`:填写您的 GitHub 仓库的 HTTPS 地址。例如:`https://github.com/fnvtk/wztouzhi.git`。
- * `分支`:填写您希望自动部署的分支名称,通常是 `main` 或 `master`。
- * `Token`:**设置一个随机且复杂的字符串作为密钥**,例如 `your_custom_deploy_secret_wztouzhi_bt`。请务必牢记这个密钥,稍后在 GitHub Webhook 配置和部署脚本中会用到。
- * `项目部署目录`:宝塔会自动填写网站的根目录(例如 `/www/wwwroot/tongzhi`),请确保它是您项目代码实际要部署的路径。
- * `部署类型`:选择 `拉取`。
- * **重要:`部署完成后执行的命令`:这里暂时留空,您将在后续步骤中将我为您生成的脚本内容粘贴到此处。**
- * **获取 WebHook 地址:** 配置完上述信息并点击 `保存` 后,宝塔面板会为您生成一个 `WebHook地址`。**复制这个 URL!**
-
-### C. 阶段三:GitHub 仓库 Webhook 配置(由您手动完成,一次性)
-
-这个配置将使得 GitHub 在您推送代码时通知宝塔面板。
-
-```mermaid
-graph TD
- A[登录 GitHub 仓库] --> B[Settings];
- B --> C[Webhooks];
- C --> D[Add webhook];
- D --> E[填写 Payload URL];
- E --> F[设置 Secret];
- F --> G[选择 'Just the push event'];
- G --> H[Add webhook];
- H --> I(Webhook 配置完成);
-```
-
-**操作说明:**
-1. **登录 GitHub**,进入您的 `wztouzhi` 项目仓库。
-2. 点击仓库顶部的 `Settings`(设置)。
-3. 在左侧导航栏中,点击 `Webhooks`。
-4. 点击 `Add webhook`(添加 Webhook)。
-5. 填写以下信息:
- * **Payload URL**:粘贴您在宝塔面板 Git 部署设置中复制的 `WebHook地址`。
- * **Content type**:选择 `application/json`。
- * **Secret (可选,但强烈推荐)**:粘贴您在宝塔面板 Git 部署中设置的 `Token` (那个强密码)。
- * **Which events would you like to trigger this webhook?**:选择 `Just the push event.`(仅推送事件)。
- * `Active`:确保此选项被勾选。
-6. 点击 `Add webhook` 完成添加。
-
-### D. 阶段四:自动化部署脚本 `deploy_webhook.php` (由我提供,您粘贴到宝塔)
-
-为了实现自动化构建和重启 Next.js 应用,我们需要一个 PHP 脚本来作为宝塔面板 Git 部署的"部署完成后执行的命令"。
-
-我为您生成了以下 `deploy_webhook.php` 脚本。**您需要将此脚本的内容复制,并粘贴到宝塔面板网站设置中 Git 部署的"部署完成后执行的命令"文本框内。**
-
-**脚本内容(已根据您的截图信息优化,请务必根据您的实际情况修改 `SECRET`):**
-
-```php
-&1');
- log_message("Git Pull Output:\n" . $output);
-
- // 检查 Next.js 项目文件 (package.json)
- if (file_exists('package.json')) {
- log_message('Detected Next.js project. Installing dependencies and building...');
-
- // 安装 Node.js 依赖
- log_message('Executing npm install...');
- // 使用 --force 强制安装,避免因包版本冲突导致安装失败
- $output = shell_exec('npm install --force 2>&1');
- log_message("npm install Output:\n" . $output);
-
- // 构建 Next.js 项目
- log_message('Executing npm run build...');
- $output = shell_exec('npm run build 2>&1');
- log_message("npm run build Output:\n" . $output);
-
- // 重启 PM2 进程 (已根据截图更新应用名为 'tongzhi')
- $PM2_APP_NAME = 'tongzhi'; // **已根据截图更新:请替换为你在PM2管理器中设置的项目名称**
- log_message("Restarting PM2 process '{$PM2_APP_NAME}'...");
- $output = shell_exec("pm2 restart {$PM2_APP_NAME} 2>&1");
- log_message("PM2 Restart Output:\n" . $output);
-
- } else {
- log_message('No package.json found. Skipping Node.js specific commands.');
- }
-
- log_message('Deployment completed.');
- echo 'Deployment successful!';
-
-} else {
- log_message('Event not supported. Only "push" events are processed.');
- echo 'Event not supported.';
-}
-
-http_response_code(200);
-?>
-```
-
-**脚本流程图:**
-
-```mermaid
-graph TD
- A[GitHub Webhook 请求] --> B{deploy_webhook.php 接收};
- B -- 获取 Payload & Headers --> C{验证 Secret};
- C -- 签名不匹配 --> D[401 Unauthorised];
- C -- 签名匹配 --> E{事件类型为 Push?};
- E -- 否 --> F[跳过,不处理];
- E -- 是 --> G[切换到项目根目录];
- G --> H[执行 git pull];
- H --> I{检查 package.json 存在?};
- I -- 否 --> J[跳过 Node.js 命令];
- I -- 是 --> K[执行 npm install];
- K --> L[执行 npm run build];
- L --> M[执行 pm2 restart 应用名];
- M --> N(部署成功,返回 200 OK);
-```
-
-### V. 自动化部署完成与验证
-
-完成以上所有配置后,每次您向 GitHub 仓库的指定分支推送代码,就会自动触发部署流程:
-
-1. GitHub 发送 Webhook 请求到宝塔面板。
-2. 宝塔面板接收请求并执行 `deploy_webhook.php` 脚本。
-3. 脚本在服务器上拉取最新代码,安装/更新 Node.js 依赖,构建 Next.js 项目。
-4. PM2 自动重启您的 Next.js 应用。
-5. 您的网站内容更新,并能通过您绑定的域名在外网访问到最新版本。
-
-**验证方法:**
-* **查看 GitHub Webhook 记录:** 在 GitHub 仓库的 Webhook 设置页面,查看 `Recent Deliveries`,确保每次推送都有成功的绿色勾选。
-* **查看宝塔面板 Git 部署日志:** 在宝塔面板网站设置的 `Git` 选项卡中,通常会有部署日志,可以查看详细的执行情况。
-* **查看 `deploy.log` 文件:** 脚本会在项目根目录生成 `deploy.log` 文件,记录每次部署的详细信息,方便排查问题。
-* **访问您的网站:** 通过域名访问您的网站,确认内容是否已更新到最新。
-
-### VI. 注意事项与优化
-
-* **安全性**:`Secret` 密钥是关键,请妥善保管,不要泄露。
-* **权限问题**:确保宝塔面板运行的用户(通常是 `www` 用户)对项目目录有足够的读写权限,以便 `git pull`、`npm install`、`npm run build` 等命令能够正常执行。
-* **依赖缓存**:在部署脚本中,`npm install` 会在每次部署时运行。如果您的项目依赖较多,可以考虑在 `Dockerfile` 中构建一个包含依赖的镜像,或者在服务器上对 `node_modules` 进行缓存处理,以加快部署速度(此文档以直接安装为默认)。
-* **错误处理**:脚本中已加入了日志记录,您可以通过查看 `deploy.log` 文件来排查部署失败的原因。
-* **生产模式**:确保您的 Next.js 应用在 `npm run build` 后是以生产模式构建的。
-* **持续学习**:自动化部署是一个持续优化的过程,您可以根据项目需求和服务器性能,不断调整部署脚本。
\ No newline at end of file
diff --git a/开发文档/8、部署/WEBHOOK部署的提示词.md b/开发文档/8、部署/WEBHOOK部署的提示词.md
deleted file mode 100644
index 780527b..0000000
--- a/开发文档/8、部署/WEBHOOK部署的提示词.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Webhook 部署提示词
-
-## 输出规范
-
-### 1. 核心理念
-- **一次配置,自动同步**:强调宝塔面板 + GitHub Webhook 的组合。
-- **自动化**:代码提交即部署,减少人工干预。
-
-### 2. 文档结构要求
-- **I. 概述**:一句话解释“这是什么”和“有什么好处”。
-- **II. 前提条件**:
- - GitHub 账号与仓库。
- - 宝塔面板(安装 Nginx/Node.js/PM2/Git)。
- - 域名解析完成。
-- **III. 流程图**:必须包含 Mermaid 流程图,展示 `Git Push -> Webhook -> 宝塔面板 -> Pull & Build` 的全过程。
-- **IV. 详细步骤**:
- - **Step 1**:宝塔面板安装 Webhook 插件。
- - **Step 2**:配置脚本(提供标准脚本模板,含 `git pull`, `npm install`, `npm run build`, `pm2 reload`)。
- - **Step 3**:GitHub 仓库设置 Payload URL。
-- **V. 故障排查**:列出常见错误(如权限问题、端口冲突)。
-
-### 3. 脚本模板(Next.js 示例)
-```bash
-#!/bin/bash
-echo "Start deployment..."
-cd /www/wwwroot/your_project_path
-git pull origin main
-npm install
-npm run build
-pm2 reload all
-echo "Deployment finished."
-```
-
-### 4. 流程图示例
-```mermaid
-graph TD
- A[提交代码到GitHub] --> B{GitHub Webhook}
- B --> C[发送Payload到宝塔面板]
- C --> D[宝塔面板接收通知]
- D --> E[触发部署脚本]
- E --> F[执行 git pull]
- F --> G[执行 composer install (可选)]
- G --> H[清理网站缓存 (可选)]
- H --> I[网站内容自动更新]
-```
diff --git a/开发文档/8、部署/基于 GitHub Webhook 与宝塔面板的自动化部署流程文档.md b/开发文档/8、部署/基于 GitHub Webhook 与宝塔面板的自动化部署流程文档.md
deleted file mode 100644
index abd4020..0000000
--- a/开发文档/8、部署/基于 GitHub Webhook 与宝塔面板的自动化部署流程文档.md
+++ /dev/null
@@ -1,103 +0,0 @@
-I. 概述
-本流程文档旨在指导您如何通过 GitHub 的 Webhook 功能,实现代码提交后自动同步到宝塔面板服务器,从而完成网站内容的自动化部署。这将极大地提高您的开发效率,减少手动部署带来的重复劳动和潜在错误。
-II. 前提条件
-在开始配置之前,请确保您已具备以下条件:
-1. GitHub 账号:并已拥有一个托管项目代码的仓库。
-2. 宝塔面板服务器:一台已安装宝塔面板的 Linux 服务器,并确保已安装 Nginx/Apache、PHP 和 Git 环境。
-3. 项目代码:您的网站或应用代码已完整地托管在 GitHub 仓库中。
-4. Composer (如果项目是 PHP):PHP 项目需要确保服务器上安装了 Composer,用于管理项目依赖。
-III. 流程概览
-以下是自动化部署的整个流程图:
-```mermaid
-graph TD
- A[提交代码到GitHub] --> B{GitHub Webhook};
- B --> C[发送Payload到宝塔面板];
- C --> D[宝塔面板接收通知];
- D --> E[触发部署脚本];
- E --> F[执行 git pull];
- F --> G[执行 composer install (可选)];
- G --> H[清理网站缓存 (可选)];
- H --> I[网站内容自动更新];
-```
-流程说明:
-当您将代码提交(Push)到 GitHub 仓库后,GitHub 会通过预设的 Webhook 向您的宝塔面板服务器发送一个通知(Payload)。宝塔面板接收到这个通知后,会触发一个预设的部署脚本,该脚本通常会执行 git pull 拉取最新代码,并可能运行 composer install 安装依赖,以及清理网站缓存等操作。最终,您的网站内容将自动更新到最新版本。
-IV. 具体配置步骤
-A. GitHub 仓库配置
-5. 选择或创建项目仓库:
- 登录您的 GitHub 账号,选择或创建一个您需要自动部署的项目仓库。
-6. 配置 Webhook:
- 这是实现自动触发部署的关键。
- * 进入您的 GitHub 仓库页面,点击顶部的 Settings(设置)。
- * 在左侧导航栏中,点击 Webhooks。
- * 点击 Add webhook(添加 Webhook)。
- * 填写以下信息:
- * Payload URL:这个 URL 需要从宝塔面板中获取。请暂时留空,我们将在后面的宝塔面板配置步骤中获取并填回。
- * Content type:选择 `application/json`。
- * Secret (可选,但强烈推荐):设置一个随机且复杂的字符串作为密钥。这个密钥用于验证请求是否真的来自 GitHub,增强安全性。例如:`your_github_webhook_secret_123`。请务必牢记这个密钥,稍后宝塔面板中会用到。
- * Which events would you like to trigger this webhook?:选择 `Just the push event.`(仅推送事件)。这意味着只有当您向仓库推送代码时,Webhook 才会触发。
- * Active:确保此选项被勾选。
- * 点击 Add webhook 完成添加。
-B. 宝塔面板服务器配置
-7. 登录宝塔面板:
- 使用您的账号密码登录到宝塔面板。
-8. 确保服务器环境:
- 确认您的服务器已安装 Nginx (或 Apache)、PHP (版本需与项目兼容,例如 PHP 7.4) 和 Git。如果 Git 未安装,您可以通过宝塔面板的"软件商店"进行安装。
-9. 创建或选择网站:
- 在宝塔面板中,进入 网站 菜单,创建或选择您要部署代码的网站。确保网站的根目录(运行目录)与您的项目部署路径一致。
-10. 设置 Git 部署:
- 宝塔面板提供了便捷的 Git 部署功能。
- * 在网站列表中,找到对应的网站,点击右侧的 设置。
- * 在网站设置窗口中,找到 Git 选项卡,点击进入。
- * 启用 Git 部署:打开 Git 部署功能。
- * 选择平台:选择 `Github`。
- * 项目地址:填写您的 GitHub 仓库的 HTTPS 地址。例如:`https://github.com/your-username/your-repo-name.git`。
- * 分支:填写您希望自动部署的分支名称,通常是 `main` 或 `master`。
- * Token:填写您在 GitHub Webhook 配置中设置的 `Secret` 密钥。
- * 项目部署目录:宝塔会自动填写网站的根目录,请确保它是您项目代码实际要部署的路径。
- * 部署类型:选择 `拉取`。
- * 部署完成后执行的命令 (最重要):这是自动化部署的核心。当代码拉取完成后,宝塔会执行这些命令。您可以根据您的项目类型填写相应的命令。
- * PHP 项目示例命令(请根据您的项目实际情况调整):
- ```bash
- # 进入项目部署目录 (宝塔会自动切换到此目录,但为了保险可以再cd一次)
- cd /www/wwwroot/your_website_directory/
- # 拉取最新代码
- git pull
- # 安装/更新 Composer 依赖 (如果您的项目使用Composer)
- composer install --no-dev --optimize-autoloader
- # 清理框架缓存 (如果使用框架,如Laravel, Symfony等)
- # 例如 Laravel:
- # php artisan cache:clear
- # php artisan view:clear
- # php artisan config:clear
- # php artisan migrate --force # 数据库迁移,请谨慎使用!
- # 刷新权限 (有时需要)
- # chown -R www:www .
- # chmod -R 755 .
- # chmod -R 777 storage bootstrap/cache # 给予某些目录写入权限
- ```
- 请根据您的项目实际情况,选择并修改适合的命令。
- * Webhook URL:在您配置完上述信息并保存后,宝塔面板会为您生成一个 `WebHook地址`。复制这个 URL。
-11. 返回 GitHub 配置 Webhook:
- * 回到 GitHub 仓库的 Webhook 设置页面。
- * 编辑您之前创建的 Webhook。
- * 将刚刚从宝塔面板复制的 WebHook地址 粘贴到 Payload URL 字段中。
- * 点击 Update webhook 保存。
-V. 常见问题与排查
-- Webhook 接收失败:
- * 检查 GitHub Webhook 设置中的 Payload URL 是否正确,是否与宝塔面板生成的 URL 一致。
- * 检查 Secret 密钥是否在 GitHub 和宝塔面板中设置一致。
- * 检查服务器防火墙或安全组,确保 GitHub 的请求可以到达宝塔面板的 8888 端口(或其他自定义的宝塔面板端口)。
- * 查看 GitHub Webhook 的 Recent Deliveries,检查是否有红色感叹号,并查看具体错误信息。
-- 部署命令执行失败:
- * 查看宝塔面板中网站的 日志,或在 计划任务 中查看 Git 部署的日志,可以找到具体的错误信息。
- * 确认部署命令中的 PHP 版本、Composer 路径等是否正确。
- * 检查项目依赖是否已正确安装,或 composer install 命令是否正确。
- * 检查文件和目录的权限,确保 www 用户(Nginx/Apache 运行用户)对项目目录有读写权限。
-- 代码未更新:
- * 检查 git pull 命令是否执行成功。
- * 如果使用了缓存,确保缓存清理命令正确执行。
-VI. 注意事项
-- 安全性:`Secret` 密钥非常重要,请妥善保管,不要泄露。
-- 分支管理:建议只对生产环境或主分支(如 `main` 或 `production`)进行自动部署,开发分支可以手动部署或使用单独的测试环境。
-- 环境区分:生产环境和开发环境应严格区分,避免将开发中的不稳定代码直接部署到生产环境。
-- 备份:在进行任何部署操作之前,务必定期备份您的网站代码和数据库。
\ No newline at end of file
diff --git a/开发文档/8、部署/本地运行.md b/开发文档/8、部署/本地运行.md
deleted file mode 100644
index ce188aa..0000000
--- a/开发文档/8、部署/本地运行.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# 本地运行(Mycontent-book)
-
-## 1. 只写书,不跑站点(推荐常态)
-
-- 打开目录:`external/Mycontent-book/book/`
-- 启动自动同步:`./scripts/autosync.sh`
-
-## 2. 要跑 Next.js 站点(临时)
-
-前提:你本地当前是 sparse checkout,可能没有 `app/` 等目录。
-
-### A. 把站点代码检出到本地
-
-在 `external/Mycontent-book` 目录下执行(示例):
-
-- `git sparse-checkout add app components lib hooks public`
-
-如果远端真实目录不同,以远端实际为准。
-
-### B. 安装依赖
-
-- `pnpm install`
-
-### C. 启动开发
-
-- `pnpm dev`
-
-### D. 基础自检
-
-- `pnpm lint`
-- `pnpm build`
-
-## 3. 常见坑
-
-- 缺目录:多半是 sparse checkout 没把目录拉下来
-- 依赖慢:先停掉当前安装,再换镜像或网络后重试
diff --git a/开发文档/8、部署/本项目部署总览.md b/开发文档/8、部署/本项目部署总览.md
deleted file mode 100644
index 754e05c..0000000
--- a/开发文档/8、部署/本项目部署总览.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# 本项目部署总览(Mycontent-book)
-
-## 1. 两种部署形态
-
-### A. 纯内容(默认)
-
-- 只维护 `book/`
-- GitHub 就是“发布”,任何设备都能拉下来看
-
-### B. 内容 + 站点(可选)
-
-- 用 Next.js 把 `book/` 渲染成网页
-- 可接 Vercel 做自动部署
-
-## 2. 当前仓库的远端与分支
-
-- 远端:`https://github.com/fnvtk/Mycontent.git`
-- 分支:`soul-content`
-
-## 3. 和 v0 / Vercel 的关系(如果你继续用它)
-
-仓库的 `README.md` 写明:v0 的部署会把变更推到该仓库,然后 Vercel 再部署。
-
-这意味着:
-
-- 远端仓库可能有更多站点代码
-- 本地 sparse checkout 只拉写作部分,不影响写作
diff --git a/开发文档/8、部署/自动同步与分支策略.md b/开发文档/8、部署/自动同步与分支策略.md
deleted file mode 100644
index eb228c9..0000000
--- a/开发文档/8、部署/自动同步与分支策略.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# 自动同步与分支策略(Mycontent-book)
-
-## 1. 自动同步做了什么
-
-脚本:`external/Mycontent-book/scripts/autosync.sh`
-
-- 监听本地文件变化
-- 有变化就自动提交并推送
-- 没变化也会定时拉取远端更新
-
-## 2. 自动同步的关键行为
-
-### A. 触发型(你改文档)
-
-当检测到变更:
-
-- `git add .`
-- `git commit -m "chore: auto-sync"`
-- `git pull --rebase origin 当前分支`
-- `git push`
-
-### B. 轮询型(你不改也会拉)
-
-默认每 `60` 秒拉一次:
-
-- `git pull --rebase origin 当前分支`
-
-你可以临时改轮询时间(单位秒):
-
-- `POLL_SECONDS=10 ./scripts/autosync.sh`
-
-## 3. 为什么要有“自动拉取”
-
-因为你这个仓库可能同时被两条链路改:
-
-- 你本地写作(autosync 推)
-- v0/Vercel 或其他电脑(远端先更新)
-
-自动拉取能降低“本地落后导致 push 冲突”的概率。
-
-## 4. 稀疏检出(sparse checkout)说明
-
-本地目前只检出了:`book/` 和 `scripts/`。
-
-如果你后面要改站点代码,需要把对应目录加进来(见 `8、部署/本地运行.md`)。
diff --git a/开发文档/8、部署/项目程序提示词.md b/开发文档/8、部署/项目程序提示词.md
deleted file mode 100644
index 7f6797a..0000000
--- a/开发文档/8、部署/项目程序提示词.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# 项目程序提示词 (Deployment Prompt) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“运维/DevOps”角色,生成自动化部署脚本与运维文档。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **目标**:一键部署,自动化运维。
-- **工具**:Webhook, 宝塔面板, PM2/Supervisor, Docker。
-
-### 1.2 部署原则
-- **环境**:Python 3.10+, Node.js, Mongo.
-- **流程**:Code -> Webhook -> Pull -> Build -> Restart.
-
-## 2. 部署核心 (Master Content)
-### 2.1 项目基础信息
-- **环境检查**:
- - 端口占用 (`lsof -i`).
- - Python 版本 (`python3 --version`).
- - `.env` 配置 (DB, API Keys).
-- **启动命令**:
- - **Dev**: `npm run dev` (Front) / `uvicorn main:app --reload` (Back)
- - **Prod**: `pm2 start ecosystem.config.js` / `gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app`
-
-### 2.2 自动化流程
-- **Webhook**: 监听 GitHub Push 事件。
-- **Script**:
- 1. `git pull`
- 2. `pip install -r requirements.txt` (Backend)
- 3. `npm install && npm build` (Frontend)
- 4. `pm2 restart all` / `systemctl restart myapp`
-
-### 2.3 维护指南
-- **日志**:`pm2 logs` 或 `journalctl -u myapp -f`。
-- **回滚**:`git reset --hard HEAD^` (慎用)。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的运维专家。
-**任务**:
-1. **脚本生成**:生成 Shell 部署脚本 (包含 Virtualenv 激活)。
-2. **配置生成**:生成 Nginx 反向代理配置、Systemd 服务文件。
-3. **流程图解**:用 Mermaid 展示部署流水线。
-
-### 示例 Mermaid (部署流)
-```mermaid
-sequenceDiagram
- participant Dev
- participant GitHub
- participant Server
- Dev->>GitHub: Push Code
- GitHub->>Server: Webhook Trigger
- Server->>Server: Git Pull
- Server->>Server: Pip Install & Build
- Server->>Server: Restart Gunicorn/PM2
- Server-->>GitHub: Status Update
-```
diff --git a/开发文档/9、手册/使用手册提示词.md b/开发文档/9、手册/使用手册提示词.md
deleted file mode 100644
index 3b69e3d..0000000
--- a/开发文档/9、手册/使用手册提示词.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# 使用手册提示词 (User Manual Prompt) - 智能自生长文档
-
-> **提示词功能 (Prompt Function)**: 将本文件拖入 AI 对话框,即可激活“技术文档专家”角色,生成小白也能看懂的操作手册。
-
-## 1. 基础上下文 (The Two Basic Files)
-### 1.1 角色档案:卡若 (Karuo)
-- **受众**:小白用户、合作方老板。
-- **风格**:大白话、傻瓜式、图文并茂。
-
-### 1.2 文档原则
-- **价值先行**:先说能赚多少钱,再说怎么操作。
-- **步骤清晰**:Step 1, 2, 3。
-
-## 2. 手册核心 (Master Content)
-### 2.1 功能介绍 (Value)
-- **话术**:不要说“分布式”,要说“账目自动同步,谁也改不了”。
-- **核心**:帮你自动分钱的工具。
-
-### 2.2 快速上手 (How-to)
-- **Step 1**: 登录与绑定 (截图)。
-- **Step 2**: 开启流量池 (核心操作)。
-- **Step 3**: 提现与分润 (钱)。
-
-### 2.3 常见问题 (Q&A)
-- **痛点**:如果不显示收益怎么办?
-- **解法**:点击刷新,检查网络。
-
-## 3. AI 协作指令 (Expanded Function)
-**角色**:你是我(卡若)的内容运营。
-**任务**:
-1. **文档撰写**:根据功能描述,写出“傻瓜式”操作手册。
-2. **话术优化**:将技术术语翻译成“老板听得懂的话”。
-3. **用户旅程**:用 Mermaid 展示用户操作流程。
-
-### 示例 Mermaid (用户旅程)
-```mermaid
-journey
- title 合作方使用流程
- section 注册
- 打开小程序: 5: 合作方
- 手机号登录: 4: 合作方
- section 赚钱
- 开启流量池: 5: 合作方
- 查看今日收益: 5: 合作方
- section 提现
- 申请提现: 4: 合作方
- 到账: 5: 合作方
-```
diff --git a/开发文档/9、手册/写作与结构维护手册.md b/开发文档/9、手册/写作与结构维护手册.md
deleted file mode 100644
index 2e096fd..0000000
--- a/开发文档/9、手册/写作与结构维护手册.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# 写作与结构维护手册(Mycontent-book)
-
-## 1. 你改文档,我怎么理解
-
-你只要改这三类文件,我就能按规则做事:
-
-- `external/Mycontent-book/book/**/*.md`:正文内容
-- `external/Mycontent-book/1、soul 全部.txt`:素材源(不要随便改结构)
-- `external/1、开发模板/**`:需求、架构、部署的“标准答案”
-
-## 2. 章节怎么放(目录就是结构)
-
-- “篇”是一级目录
-- “章”是二级目录
-- “小节”是 `.md` 文件
-
-原则:尽量新增,不要频繁移动旧文件。
-
-## 3. 写作动作建议(减少冲突、减少噪音)
-
-- 一次改一篇/一章,写完再切下一个
-- 同一小节尽量集中修改,不要碎片化改一堆次
-
-## 4. 事实与数据怎么处理
-
-- 数值、时间、对话:以素材文件里的原文为准
-- 不确定就不写死,先把“素材引用段落”留在文档里
-
-## 5. 自动同步的最佳姿势
-
-- 开始写作前启动:`./scripts/autosync.sh`
-- 写作时正常保存即可
-- 停止同步:`Ctrl+C`
-
-## 6. 你想改规则怎么改
-
-你直接改开发模板里的对应文档:
-
-- 要改目标/范围:改 `1、需求/业务需求.md`
-- 要改结构/同步策略:改 `2、架构/系统架构.md` 或 `8、部署/自动同步与分支策略.md`
-- 要改跑站点方式:改 `8、部署/本地运行.md`
-
-我会按你最新文档执行。
diff --git a/开发文档/9、手册/提示词/使用手册提示词.md b/开发文档/9、手册/提示词/使用手册提示词.md
deleted file mode 100644
index 0a581bb..0000000
--- a/开发文档/9、手册/提示词/使用手册提示词.md
+++ /dev/null
@@ -1,13 +0,0 @@
-在这个应用程序中开发一个实用工具,目录名称为“/documentation”,只能用地址访问不要放到可以点击的地方,用于自动生成一套全面的文档集。
-
-该工具应能捕捉应用程序所有界面的屏幕截图,在文档生成器中使用iframe方式,保证每个页面加载成功的情况下,实现真实的截图功能,而不是使用占位图。
-
-系统应自动整理这些截图,将其与文档的相关部分关联起来。然后,该工具应将这些截图和相关文本汇编成一个可导出的Word文档(.docx)。
-
-Word文档应包含目录、与应用程序功能相对应的清晰标题和副标题,以及每张截图的说明文字。
-
-确保导出过程简化为一键生成,最大限度减少人工干预。
-
-生成的文档应反映所提供示例的结构和内容,融入应用程序的特定功能和特性。处理截图捕获或文档生成过程中的任何潜在错误,以确保准确性和完整性。
-
-最终输出应为适合分发给利益相关者和用户的专业质量文档。
diff --git a/开发文档/9、手册/提示词/落地方案提示词.md b/开发文档/9、手册/提示词/落地方案提示词.md
deleted file mode 100644
index a9233fa..0000000
--- a/开发文档/9、手册/提示词/落地方案提示词.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# 落地方案提示词(占位)
-
-用于记录“把需求落到代码/流程”的提示词。
-
-当你后面需要我按固定模板输出落地方案,就把模板写在这里。
diff --git a/开发文档/9、手册/提示词/说明手册提示词.md b/开发文档/9、手册/提示词/说明手册提示词.md
deleted file mode 100644
index 99f7417..0000000
--- a/开发文档/9、手册/提示词/说明手册提示词.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# 说明手册提示词(占位)
-
-用于记录“对外说明/交付手册”的提示词。
-
-当你后面需要我按固定模板输出说明手册,就把模板写在这里。
diff --git a/开发文档/9、手册/落地方案提示词.md b/开发文档/9、手册/落地方案提示词.md
deleted file mode 100644
index 400e292..0000000
--- a/开发文档/9、手册/落地方案提示词.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# 落地方案提示词
-
-## 输出格式要求
-
-### 1. 复盘示例
-```markdown
-[私域云阿米巴模式落地复盘](2025年Q2)
-**目标&结果**:目标3个月内绑定15家合作方,实际完成18家(超20%)。
-**过程**:5月启动流量测试(日播放量1.2万→合作方咨询量周增30%);6月上线私域系统(30名兼职完成10家企业培训);7月现金分润验证(单家月均分润1.2万,留存率90%)。
-**反思**:初期未明确“不属于对方的钱”定义,导致2家合作方误解;需补充分润规则文档。
-**总结**:流量+系统+现金分润是绑定核心,需强化规则透明化。
-**执行**:8月更新《云阿米巴分润手册》,9月开展合作方培训。
-```
-
-### 2. 营销文章结构
-- **I(兴趣)**:自问自答引发共鸣(例:“你有没有想过,为什么合作方总说‘再考虑’?”)。
-- **S(故事/案例)**:描述2024年某合作方从犹豫到月入5万的真实经历。
-- **S(干货)**:分享“3步绑定合作方”(流量验证→系统交付→现金分润),附厦门某餐饮企业数据(月播放量8000→转化客户200+,分润1.5万)。
-- **M(产品/概念)**:引入“云阿米巴”模式,强调“不占股、分现钱、稳流量”三大优势。
-- **A(行动)**:“本周联系助理(微信28533368),前10名合作方免费测试流量池!”。
-- **F(裂变)**:“分享本文到朋友圈,截图给助理,可获《私域运营100问》电子书”。
-
-### 3. 卡若风格文章要求
-- **结构**:开头自问自答→主体故事/反思(含具体数据)→结尾行动指引。
-- **语言**:简洁直接;挑战传统。
-- **字数**:不低于2000字,数据需引用官方报告或聊天记录,避免臆造。
diff --git a/开发文档/9、手册/说明手册提示词.md b/开发文档/9、手册/说明手册提示词.md
deleted file mode 100644
index e2fffcc..0000000
--- a/开发文档/9、手册/说明手册提示词.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# 说明手册提示词
-
-## 核心原则
-- **对象**:内部开发人员、运维人员、系统管理员。
-- **风格**:专业、严谨、逻辑缜密。
-- **口吻**:客观描述,无情绪色彩。
-
-## 内容结构
-
-### 1. 系统概述
-- 系统定位、核心能力、适用场景。
-
-### 2. 架构说明
-- **技术栈**:列出具体版本(React 18, Java 17, MongoDB 6.0)。
-- **架构图**:引用 `开发文档/功能迭代记录.md` 中的架构图。
-- **目录结构**:解释核心目录的作用。
-
-### 3. 接口与数据
-- **API 规范**:RESTful 风格,统一响应格式。
-- **数据字典**:核心集合(Collection)的字段定义与类型说明。
-
-### 4. 配置与环境
-- **环境变量**:列出所有必须配置的 ENV 变量及其含义。
-- **外部依赖**:Redis、第三方 API(腾讯云、阿里云)的配置要求。
-
-## 格式要求
-- **代码块**:所有命令、配置、JSON 示例必须使用 Markdown 代码块。
-- **表格**:参数说明、状态码说明必须使用表格。
diff --git a/开发文档/AI开发流程.jpg b/开发文档/AI开发流程.jpg
deleted file mode 100644
index 5df28df..0000000
Binary files a/开发文档/AI开发流程.jpg and /dev/null differ
diff --git a/开发文档/API/配置清单.md b/开发文档/API/配置清单.md
deleted file mode 100644
index 2c379e9..0000000
--- a/开发文档/API/配置清单.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# 项目配置清单 (Configuration Manifest)
-
-## 1. 核心密钥 (Secrets)
-> **注意**:以下密钥仅限内部开发使用,严禁泄露。
-
-- **GitHub Token**: `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`
-- **腾讯云 API**:
- - APPID: `1251077262`
- - SecretId: `AKIDjc6yO3nPeOuK2OKsJPBBVbTiiz0aPNHl`
- - SecretKey: `[已隐藏]` (请在环境变量中配置)
-- **阿里云 API**:
- - AccessKey ID: `LTAI5t9zkiWmFtHG8qmtdysW`
- - Secret: `xxjXnZGLNvA2zDkj0aEBSQm3XZAaro`
-
-## 2. 数据库配置 (Database)
-
-### MySQL (腾讯云)
-- **Host**: `56b4c23f6853c.gz.cdb.myqcloud.com`
-- **Port**: `14413`
-- **User**: `cdb_outerroot`
-- **Password**: `Zhiqun1984`
-
-### MongoDB (私有)
-- **Host**: `10.88.182.62` (需内网环境)
-- **Port**: `3306` (注意:MongoDB通常是27017,此处端口需确认是否为映射端口)
-- **User**: `root`
-- **Password**: `Vtka(agu)-1`
-
-## 3. 支付配置 (Payment)
-
-### 微信支付 (WeChat Pay)
-- **AppID**: (待填入)
-- **MchID**: (待填入)
-- **Key**: (待填入)
-- **收款二维码**: `public/images/wechat-pay.png` (请上传真实收款码)
-
-### 支付宝 (Alipay)
-- **AppID**: (待填入)
-- **PrivateKey**: (待填入)
-- **收款二维码**: `public/images/alipay.png` (请上传真实收款码)
-
-### USDT (TRC20)
-- **Address**: `(待配置钱包地址)`
-- **Network**: `TRC20`
-
-## 4. 营销配置 (Marketing)
-
-- **流量池活码**:
- - URL: `https://soul.cn/party`
- - 更新频率: 每日 06:00
-- **分销比例**:
- - 一级分销: 30%
- - 二级分销: 10%
diff --git a/开发文档/README_模板体系总览.md b/开发文档/README_模板体系总览.md
deleted file mode 100644
index d1ff1c4..0000000
--- a/开发文档/README_模板体系总览.md
+++ /dev/null
@@ -1,321 +0,0 @@
-# 卡若私域项目模板体系 v3.5 总览
-
-> **设计理念**:基于卡若(Karuo)五行营销框架,整合云阿米巴模式与C2B用户共创,形成可复用的项目模板体系。
-> **适用范围**:私域运营、项目孵化、团队管理、融资规划
-> **输出格式**:Markdown表格(日常)/ 苹果毛玻璃HTML(最终文档)
-
----
-
-## 🌟 体系架构
-
-```
- ┌─────────────────────────┐
- │ 智能项目生成引擎 v3.0 │
- │ (核心入口提示词) │
- └───────────┬─────────────┘
- │
- ┌───────────────────────────┼───────────────────────────┐
- │ │ │
- ▼ ▼ ▼
-┌───────────────┐ ┌───────────────┐ ┌───────────────┐
-│ 【金】定标架构 │ │ 【水】流程规划 │ │ 【木】落地推进 │
-│ Gold: Arch │ │ Water: Flow │ │ Wood: Exec │
-├───────────────┤ ├───────────────┤ ├───────────────┤
-│ • 品牌定位画布 │ │ • 7天新用户SOP │ │ • 产品矩阵表 │
-│ • 人物画像分析 │ │ • 落地执行方案 │ │ • 朋友圈投放表 │
-│ • 商业计划书 │ │ • 系统配置清单 │ │ • 成交话术库 │
-│ • 团队组织架构 │ │ • 存客宝配置 │ │ │
-│ • 股东结构分润 │ │ • 触客宝配置 │ │ │
-│ • 协议汇编 │ │ • PPT方案指南 │ │ │
-└───────────────┘ └───────────────┘ └───────────────┘
- │ │ │
- └───────────────────────────┼───────────────────────────┘
- │
- ┌───────────────────────────┼───────────────────────────┐
- │ │ │
- ▼ ▼ ▼
-┌───────────────┐ ┌───────────────┐ ┌───────────────┐
-│ 【火】运营迭代 │ │ 【土】投资裂变 │ │ HTML输出 │
-│ Fire: Ops │ │ Earth: Growth │ │ │
-├───────────────┤ ├───────────────┤ ├───────────────┤
-│ • 每日数据报表 │ │ • 项目预算表 │ │ 苹果毛玻璃风格 │
-│ • 团队KPI考核 │ │ • 营收测算表 │ │ 可编辑内容 │
-│ • 五步法复盘 │ │ • 产品定位规划 │ │ 导出图片功能 │
-│ • 团队架构分润 │ │ • 渠道分销返佣 │ │ 响应式设计 │
-│ • 可视化复盘 │ │ • 裂变活动方案 │ │ │
-└───────────────┘ └───────────────┘ └───────────────┘
-```
-
----
-
-## 📁 完整目录结构
-
-```
-1、项目模板/
-├── 智能项目生成引擎v3.0.md # 核心入口提示词
-├── README_模板体系总览.md # 本文档
-├── 生成指南_HTML输出.md # HTML输出提示词
-│
-├── 金:项目架构/ # 【金】定标与架构
-│ ├── 目标人群/
-│ │ └── 模板_人物画像分析表.md
-│ ├── 团队结构/
-│ │ ├── 模板_团队组织架构表.md # ⭐v2.0(含MBTI/PDP/DISC)
-│ │ └── 岗位说明书/ # ⭐新增(5个核心岗位)
-│ │ ├── 模板_增长负责人岗位说明书.md
-│ │ ├── 模板_内容运营岗位说明书.md
-│ │ ├── 模板_用户运营岗位说明书.md
-│ │ ├── 模板_产品经理岗位说明书.md
-│ │ └── 模板_技术开发岗位说明书.md
-│ ├── 股东结构/
-│ │ └── 模板_股东结构与分润表.md # ⭐新增
-│ ├── 协议/
-│ │ └── 模板_项目合作协议汇编.md # ⭐整合(含4类协议)
-│ ├── 模板_品牌定位画布.md
-│ ├── 模板_商业计划书结构.md
-│ └── 生成指南_金.md
-│
-├── 水:流程规划/ # 【水】流程与规划
-│ ├── 落地方案/
-│ │ └── 模板_项目落地执行方案.md # ⭐新增
-│ ├── 存客宝使用说明/
-│ │ └── 模板_存客宝系统配置指南.md # ⭐新增
-│ ├── 触客宝使用说明/
-│ │ └── 模板_触客宝系统配置指南.md # ⭐新增
-│ ├── 模板_7天新用户SOP.md
-│ ├── 模板_落地执行甘特图.md
-│ ├── 模板_私域系统配置清单.md
-│ ├── 模板_私域银行落地方案.md
-│ ├── 生成指南_水.md
-│ └── 生成指南_PPT方案.md
-│
-├── 木:落地推进/ # 【木】落地与执行
-│ ├── 模板_产品矩阵报价表.md
-│ ├── 模板_朋友圈投放表.md
-│ ├── 模板_朋友圈内容日历.md
-│ ├── 模板_朋友圈Excel投放表.md
-│ ├── 模板_成交话术表.md
-│ └── 生成指南_木.md
-│
-├── 火:运营迭代/ # 【火】运营与数据
-│ ├── 模板_每日运营数据报表.md
-│ ├── 模板_团队KPI考核表.md
-│ ├── 模板_卡若五步法复盘.md
-│ ├── 模板_复盘会议可视化.html
-│ ├── 模板_团队架构与分润.md
-│ └── 生成指南_火.md
-│
-└── 土:投资裂变/ # 【土】裂变与增长
- ├── 投资/
- │ ├── 模板_项目预算表.md
- │ ├── 模板_营收测算表.md
- │ ├── 模板_用户资产数字化融资方案.md
- │ └── 模板_C2B裂变活动方案.md
- ├── 招商/
- │ ├── 模板_产品定位与规划表.md
- │ ├── 模板_渠道画像投资权益分销返佣标准表.md
- │ └── 模板_项目收益测算表.md
- ├── 裂变/
- │ ├── 模板_裂变活动方案.md
- │ └── 模板_渠道分销政策表.md
- └── 生成指南_土.md
-```
-
----
-
-## 📋 文件清单
-
-### 核心入口
-| 文件名 | 说明 | 版本 |
-|:---|:---|:---|
-| `智能项目生成引擎v3.0.md` | 核心提示词,复制发送给AI即可启动全流程生成 | v3.0 |
-| `README_模板体系总览.md` | 本文档,模板体系总览 | v3.5 |
-| `生成指南_HTML输出.md` | HTML输出提示词(苹果毛玻璃风格) | v1.0 |
-
-### 【金】项目架构
-| 文件名 | 用途 | 状态 |
-|:---|:---|:---|
-| `目标人群/模板_人物画像分析表.md` | 目标用户画像、痛点分析 | ✅ |
-| `团队结构/模板_团队组织架构表.md` | 团队架构、岗位职责、性格匹配 | ⭐v2.0 |
-| `团队结构/岗位说明书/模板_增长负责人岗位说明书.md` | 操盘手岗位详细说明(含MBTI/PDP/DISC) | ⭐新增 |
-| `团队结构/岗位说明书/模板_内容运营岗位说明书.md` | 内容运营岗位详细说明 | ⭐新增 |
-| `团队结构/岗位说明书/模板_用户运营岗位说明书.md` | 用户运营岗位详细说明 | ⭐新增 |
-| `团队结构/岗位说明书/模板_产品经理岗位说明书.md` | 产品经理岗位详细说明 | ⭐新增 |
-| `团队结构/岗位说明书/模板_技术开发岗位说明书.md` | 技术开发岗位详细说明 | ⭐新增 |
-| `股东结构/模板_股东结构与分润表.md` | 股权分配、分润机制、退出机制 | ⭐新增 |
-| `协议/模板_项目合作协议汇编.md` | 项目合作/股份分红/项目导入/投资合作协议 | ⭐整合 |
-| `模板_品牌定位画布.md` | 品牌定位、差异化设计 | ✅ |
-| `模板_商业计划书结构.md` | 商业计划书撰写框架 | ✅ |
-| `生成指南_金.md` | 本板块生成提示词指南 | v2.1 |
-
-### 【水】流程规划
-| 文件名 | 用途 | 状态 |
-|:---|:---|:---|
-| `落地方案/模板_项目落地执行方案.md` | 项目落地四阶段规划 | ⭐新增 |
-| `存客宝使用说明/模板_存客宝系统配置指南.md` | 客户管理、标签体系、自动化 | ⭐新增 |
-| `触客宝使用说明/模板_触客宝系统配置指南.md` | 内容分发、朋友圈管理、社群运营 | ⭐新增 |
-| `模板_7天新用户SOP.md` | 新用户培育7天流程 | ✅ |
-| `模板_落地执行甘特图.md` | 项目执行排期、里程碑 | ✅ |
-| `模板_私域系统配置清单.md` | 欢迎语、标签、自动回复配置 | ✅ |
-| `模板_私域银行落地方案.md` | 完整落地方案 | ✅ |
-| `生成指南_水.md` | 本板块生成提示词指南 | v2.1 |
-| `生成指南_PPT方案.md` | PPT方案生成提示词 | ✅ |
-
-### 【木】落地推进
-| 文件名 | 用途 | 状态 |
-|:---|:---|:---|
-| `模板_产品矩阵报价表.md` | 引流品/利润品/形象品设计 | ✅ |
-| `模板_朋友圈投放表.md` | 五行属性朋友圈投放计划 | ✅ v2.0 |
-| `模板_朋友圈内容日历.md` | 7天内容主题规划 | ✅ |
-| `模板_朋友圈Excel投放表.md` | Excel兼容格式投放表 | ✅ |
-| `模板_成交话术表.md` | 销售话术库、五行属性标注 | ✅ |
-| `生成指南_木.md` | 本板块生成提示词指南 | v2.0 |
-
-### 【火】运营迭代
-| 文件名 | 用途 | 状态 |
-|:---|:---|:---|
-| `模板_每日运营数据报表.md` | 四维数据监控(金木水土) | ✅ |
-| `模板_团队KPI考核表.md` | 团队绩效考核标准 | ✅ |
-| `模板_卡若五步法复盘.md` | GRAI复盘方法论 | ✅ |
-| `模板_复盘会议可视化.html` | 苹果毛玻璃风格可视化复盘 | ✅ |
-| `模板_团队架构与分润.md` | 获客+转化双团队架构 | ✅ |
-| `生成指南_火.md` | 本板块生成提示词指南 | v2.0 |
-
-### 【土】投资裂变
-| 文件名 | 用途 | 状态 |
-|:---|:---|:---|
-| `投资/模板_项目预算表.md` | 项目1年预算规划(六大板块) | ✅ |
-| `投资/模板_营收测算表.md` | 保底/基础/力争三级目标测算 | ✅ |
-| `投资/模板_用户资产数字化融资方案.md` | 5149融资模式 | ✅ |
-| `投资/模板_C2B裂变活动方案.md` | C2B用户共创裂变 | ✅ |
-| `招商/模板_产品定位与规划表.md` | 引流爆品/标准产品/利润产品设计 | ✅ |
-| `招商/模板_渠道画像投资权益分销返佣标准表.md` | 渠道分层、分销返佣体系 | ✅ |
-| `招商/模板_项目收益测算表.md` | 六大板块营收预估 | ✅ |
-| `裂变/模板_裂变活动方案.md` | 裂变活动策划 | ✅ |
-| `裂变/模板_渠道分销政策表.md` | 合伙人等级、分润政策 | ✅ |
-| `生成指南_土.md` | 本板块生成提示词指南 | v3.0 |
-
----
-
-## 🚀 使用流程
-
-### 1. 日常使用(Markdown输出)
-```
-1. 打开对应模板或生成指南
-2. 复制提示词发送给AI
-3. AI输出Markdown表格
-4. 复制到文档中使用
-```
-
-### 2. 最终文档(HTML输出)
-```
-1. 完成内容生成后
-2. 告诉AI:"生成HTML文件"
-3. AI输出苹果毛玻璃风格HTML
-4. 保存为.html文件
-5. 浏览器打开即可编辑和导出图片
-```
-
----
-
-## 🔑 核心方法论
-
-### 五行营销框架
-| 五行 | 核心逻辑 | 应用场景 |
-|:---|:---|:---|
-| **金** | 定标引流:目标、定位、分钱 | 项目启动、架构设计 |
-| **水** | 流程承载:SOP、系统、流转 | 运营流程、自动化 |
-| **木** | 产品落地:产品、内容、销售 | 变现执行、内容生产 |
-| **火** | 组织赋能:数据、团队、复盘 | 团队管理、持续优化 |
-| **土** | 裂变增长:裂变、渠道、生态 | 增长扩张、资源整合 |
-
-### 云阿米巴模式
-1. **分不属于对方的钱**:只分增量,不动存量
-2. **按创造价值分钱**:贡献与收益挂钩
-3. **分现金不分所有权**:风险隔离,灵活退出
-
-### C2B2S裂变增长模型
-```
-C (Consumer) → B (Business) → S (Supply Chain)
- 用户端 门店端 供应链
-```
-
----
-
-## 📝 更新日志
-
-### v3.5 (2025-01-06)
-- ✅ 新增5个核心岗位说明书(金/团队结构/岗位说明书)
- - 增长负责人岗位说明书(含MBTI/PDP/DISC性格匹配)
- - 内容运营岗位说明书
- - 用户运营岗位说明书
- - 产品经理岗位说明书
- - 技术开发岗位说明书
-- ✅ 更新「团队组织架构表」至v2.0(增加性格测试体系、岗位说明书索引)
-- ✅ 检查并确认模板完整性,无重复功能文档
-- ✅ 性格测试默认网站:https://mbti.quwanzhi.com
-
-### v3.4 (2025-01-05)
-- ✅ 新增「团队组织架构表」模板(金/团队结构)
-- ✅ 新增「股东结构与分润表」模板(金/股东结构)
-- ✅ 整合协议类文档到「协议」目录(含4类协议汇编)
-- ✅ 新增「项目落地执行方案」模板(水/落地方案)
-- ✅ 新增「存客宝系统配置指南」模板(水/存客宝使用说明)
-- ✅ 新增「触客宝系统配置指南」模板(水/触客宝使用说明)
-- ✅ 删除重复的协议文档,统一归类到协议目录
-- ✅ 补充所有空子目录的文档
-
-### v3.3 (2025-01-05)
-- ✅ 新增「项目预算表」模板(土/投资)- 含六大板块预算
-- ✅ 新增「营收测算表」模板(土/投资)- 保底/基础/力争三级目标
-- ✅ 新增「产品定位与规划表」模板(土/招商)- 引流爆品/标准产品/利润产品
-- ✅ 新增「渠道画像投资权益分销返佣标准表」模板(土/招商)
-- ✅ 更新「生成指南_土.md」至v3.0,新增9个专项提示词
-- ✅ 整理土板块三大子目录(投资/招商/裂变)
-
-### v3.2 (2025-01-05)
-- ✅ 合并重复的智能项目生成引擎文档
-- ✅ 新增「人物画像分析表」模板(金)
-- ✅ 优化「朋友圈投放表」模板格式
-- ✅ 新增「HTML输出生成指南」(苹果毛玻璃风格)
-- ✅ 去除所有引用外部品牌的内容
-- ✅ 整理目录结构,优化文件归类
-
-### v3.1 (2025-01-05)
-- 新增「私域银行落地方案」模板
-- 新增「PPT方案生成指南」
-- 新增「项目合作确定书」模板
-
-### v3.0 (2025-01)
-- 新增「品牌定位画布」模板
-- 新增「用户资产数字化5149融资方案」模板
-- 新增「团队架构与分润」模板
-- 优化五大板块生成指南(v2.0)
-
----
-
-## 💡 使用建议
-
-1. **新项目**:使用「智能项目生成引擎」全流程生成
-2. **单点需求**:直接使用对应模板或生成指南
-3. **最终输出**:要求生成HTML时,输出苹果毛玻璃风格可编辑文件
-4. **持续迭代**:根据项目实际情况优化模板内容
-
----
-
-## 📊 模板统计
-
-| 板块 | 模板数量 | 子目录 |
-|:---|:---|:---|
-| 金:项目架构 | 12个 | 目标人群、团队结构(含5个岗位说明书)、股东结构、协议 |
-| 水:流程规划 | 9个 | 落地方案、存客宝、触客宝 |
-| 木:落地推进 | 5个 | - |
-| 火:运营迭代 | 5个 | - |
-| 土:投资裂变 | 9个 | 投资、招商、裂变 |
-| **总计** | **40个** | **11个子目录** |
-
----
-
-**Designed by Karuo Team | 2025 v3.5**
-
-> "别整那些没用的,直接说怎么分钱" —— 卡若
diff --git a/开发文档/功能迭代记录.md b/开发文档/功能迭代记录.md
deleted file mode 100644
index a0858db..0000000
--- a/开发文档/功能迭代记录.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# 功能迭代记录
-
-## 2025-12-28
-### v0.2.0 核心阅读功能与模块化架构
-**负责人**: 卡若 (AI助理)
-
-#### 1. 新增功能
-- **动态文章详情页**: 重构 `app/read/[id]`,支持从文件系统动态读取 Markdown 内容,替代硬编码数据。
-- **模块化架构定义**: 初步建立支付、营销、分销三大变现模块的接口定义 (`lib/modules/*`)。
-- **内容解析引擎**: 升级 `lib/book-file-system.ts`,增加内容读取与 Slug 匹配功能。
-
-#### 2. 优化
-- **开发文档**: 新增 `2、架构/变现模块设计.md`,明确变现系统的技术实现路径。
-- **项目管理**: 实时更新项目推进表,确保进度可视。
-
-#### 3. 下一步计划
-- 实现营销模块的弹窗逻辑(阅读拦截)。
-- 开发支付模块的 Mock 实现,打通购买流程 UI。
-
-## 2025-12-29
-### v0.3.0 支付模块集成
-**负责人**: 卡若 (AI助理)
-
-#### 1. 新增功能
-- **Universal_Payment_Module集成**: 添加适配器模式,支持支付宝、微信等支付网关。
-- **API端点**: 创建/create, /checkout, /notify路由。
-- **数据库模型**: Order和PayTrade schema。
-
-#### 2. 优化
-- 修复语法错误,运行lint检查。
-- 验证实时支付功能。
-
-#### 3. 下一步计划
-- 前端优化和测试组件添加。
-
-## 2025-12-29 (晚)
-### v0.4.0 分销与裂变系统 (Phase 5)
-**负责人**: 卡若 (AI助理)
-
-#### 1. 新增功能
-- **分销海报生成器**: 实现 `PosterModal` 组件,支持自动生成含用户邀请码和专属二维码的推广海报。
-- **分销中心升级**: 优化 `/my/referral` 页面,集成海报生成入口,提供多渠道分享(微信、朋友圈、Soul)。
-- **邀请机制闭环**: 确认邀请码生成、绑定(注册时填写)、收益计算逻辑已在 `store.ts` 中完全实现。
-
-#### 2. 进度同步
-- 完成第五阶段核心功能:邀请码生成、绑定、收益计算、裂变海报。
-- 更新项目推进表,标记相关任务为完成。
-
-#### 3. 下一步计划
-- 提现逻辑完善(目前仅UI展示)。
-- 准备部署上线。
diff --git a/开发文档/智能项目生成引擎v3.0.md b/开发文档/智能项目生成引擎v3.0.md
deleted file mode 100644
index 99ff905..0000000
--- a/开发文档/智能项目生成引擎v3.0.md
+++ /dev/null
@@ -1,381 +0,0 @@
-# 卡若私域项目智能生成引擎 v3.0
-
-## 🚀 引擎说明
-
-这是一个基于**卡若(Karuo)五行营销**、**云阿米巴模式**与**C2B裂变**的智能项目生成系统。
-
-**核心升级**:
-- ✅ 新增「用户资产数字化5149融资模式」
-- ✅ 新增「获客团队+私域转化团队」双团队架构
-- ✅ 新增「朋友圈Excel投放表」自动生成
-- ✅ 新增「品牌定位画布」模板
-- ✅ 优化「六大营收板块」收益测算
-- ✅ 强化「C2B用户共创」裂变机制
-
-**使用方法**:复制下方的【核心提示词】发送给AI助手,然后按步骤交互。
-
----
-
-## 📋 核心提示词 v3.0 (Copy This)
-
-```markdown
-# Role: 卡若 (Karuo) - 私域实战操盘手 & 项目架构师
-
-## 1. 角色设定
-你现在是**卡若**,一位拥有15年经验的私域运营专家、技术极客和创业者。
-- **性格**:说话直爽,喜欢用大白话,逻辑极强,讨厌废话和虚头巴脑的理论。
-- **核心心法**:
- - **云阿米巴模式**(不占股、分现钱、稳流量)
- - **五行营销**(金木水火土)
- - **C2B用户共创**(用户既是消费者,也是贡献者)
-- **口头禅**:"别整那些没用的,直接说怎么分钱"、"流量不是万能的,留量才是资产"、"先跑通最小闭环"。
-
-## 2. 任务目标
-我正在启动一个新项目,需要你利用**五行营销框架**为我生成全套落地策划方案。
-请按**阶段、交互式**引导我完成项目设计。
-**重要**:生成的每一个部分,必须严格遵循**Markdown表格格式**,直接输出可填写的表格或已填好的示例。
-
-## 3. 项目基础信息(请在第一轮对话中询问我)
-- **项目名称**
-- **核心业务/产品**
-- **目标人群**(年龄、身份、痛点)
-- **拥有的核心资源**(如:30个抖音号、供应链、门店资源等)
-- **启动资金预算**
-- **预期月营收目标**
-
-## 4. 执行逻辑(五行营销 + 六大板块)
-
-### **第一阶段:【金】定标与架构 (Gold: Architecture)**
-*核心逻辑:钱从哪来?怎么分?品牌如何定位?*
-
-#### 1.1 品牌定位画布
-输出一个品牌定位表格,包含:
-| 维度 | 内容 |
-|:---|:---|
-| **一句话定位** | 基于"云阿米巴"模式的[行业]私域运营中台 |
-| **核心价值主张** | [用户能获得什么独特价值?] |
-| **差异化优势** | [与竞品相比,你的独特之处] |
-| **品牌人设** | [专业顾问/知心朋友/行业大佬] |
-| **视觉调性** | [颜色/风格/关键词] |
-
-#### 1.2 用户画像表
-列出3类核心用户的详细画像:
-| 用户类型 | 年龄/身份 | 核心痛点 | 核心需求 | 触达渠道 | 付费能力 |
-|:---|:---|:---|:---|:---|:---|
-| A类用户 | [描述] | [痛点] | [需求] | [渠道] | [高/中/低] |
-| B类用户 | [描述] | [痛点] | [需求] | [渠道] | [高/中/低] |
-| C类用户 | [描述] | [痛点] | [需求] | [渠道] | [高/中/低] |
-
-#### 1.3 股份分红协议(云阿米巴模式)
-输出股东协议表格:
-| 股东角色 | 出资形式 | 投资金额 | 占股比例 | 分润比例 | 核心职责 |
-|:---|:---|:---|:---|:---|:---|
-| 甲方(资源方) | [现金/资源/技术] | [金额] | [比例]% | [比例]% | [职责] |
-| 乙方(运营方) | [现金/资源/技术] | [金额] | [比例]% | [比例]% | [职责] |
-| 丙方(技术方) | [现金/资源/技术] | [金额] | [比例]% | [比例]% | [职责] |
-
-**分润公式**:`可分配利润 = 总营收 - 流量成本 - 系统成本 - 人员基础工资`
-**结算周期**:[月结/周结/即时]
-
-#### 1.4 六大营收板块测算
-| 收益板块 | 收入来源 | 计费模式 | 预计单量/月 | 客单价 | 月度营收预估 |
-|:---|:---|:---|:---|:---|:---|
-| **板块1:流量变现** | 广告费/曝光费 | 按次/按月 | | | |
-| **板块2:产品销售** | C端产品售卖 | 零售差价 | | | |
-| **板块3:招商加盟** | 合伙人加盟费 | 一次性 | | | |
-| **板块4:供应链** | 原材料/耗材 | 长期复购 | | | |
-| **板块5:系统服务** | SaaS账号费 | 年费 | | | |
-| **板块6:资本溢价** | 股权融资/估值 | 融资 | | | |
-
-#### 1.5 用户资产数字化融资方案(5149模式)
-**估值逻辑**:用户数 × 单用户年均价值 × 倍数
-| 融资维度 | 内容 |
-|:---|:---|
-| **项目估值** | [基于用户资产的估值金额] |
-| **融资金额** | [本轮融资目标] |
-| **出让比例** | [股权/收益权比例] |
-| **投资门槛** | [最低投资金额] |
-| **投资期限** | [36个月] |
-| **最低年化收益** | [8%] |
-| **资金用途** | 技术研发40% + 市场推广30% + 团队建设20% + 运营资金10% |
-
----
-
-### **第二阶段:【水】流程与规划 (Water: Flow)**
-*核心逻辑:流量怎么流转?SOP怎么跑?*
-
-#### 2.1 流量流转路径图
-描述从公域到私域的完整路径:
-`公域(抖音/视频号)` → `钩子(资料/课程)` → `私域(企微/个微)` → `标签分组` → `自动化SOP` → `社群/直播` → `成交` → `裂变`
-
-#### 2.2 新用户7天SOP
-| 天数 | 触达动作 | 核心目的 | 话术要点 | 发送时间 | 形式 | 五行属性 |
-|:---|:---|:---|:---|:---|:---|:---|
-| Day 1 | 自动通过+欢迎语 | 建立连接,交付钩子 | [话术] | 即时 | 1对1私聊 | 金 |
-| Day 1 | 拉入体验群 | 圈层归属感 | [话术] | 10分钟后 | 1对1私聊 | 火 |
-| Day 2 | 价值输出(干货) | 展示专业度 | [话术] | 上午10:00 | 朋友圈 | 水 |
-| Day 3 | 互动提问(挖需) | 筛选意向 | [话术] | 下午15:00 | 1对1私聊 | 水 |
-| Day 4 | 客户案例(种草) | 激发欲望 | [话术] | 晚上20:00 | 朋友圈 | 火 |
-| Day 5 | 产品预告(铺垫) | 测试意向 | [话术] | 中午12:00 | 朋友圈 | 金 |
-| Day 6 | 限时发售(逼单) | 促成首单 | [话术] | 晚上20:00 | 群公告+私聊 | 木 |
-| Day 7 | 售后/关怀 | 兜底转化 | [话术] | 上午10:00 | 1对1私聊 | 土 |
-
-#### 2.3 私域系统配置清单
-**自动欢迎语配置**:
-| 渠道来源 | 触发时间 | 消息类型 | 欢迎语内容 | 自动打标 |
-|:---|:---|:---|:---|:---|
-| 通用默认 | 添加后立即 | 文本+图片 | [内容] | 新粉_待清洗 |
-| 抖音渠道 | 添加后立即 | 文本+小程序 | [内容] | 来源_抖音 |
-| 线下门店 | 扫码后立即 | 文本 | [内容] | 来源_门店 |
-
-**标签体系**:
-| 标签组名称 | 标签值 | 备注 |
-|:---|:---|:---|
-| 客户等级 | LV1_游客 / LV2_体验 / LV3_会员 / LV4_合伙人 | 按消费金额 |
-| 生命周期 | 新客期 / 培育期 / 成熟期 / 流失期 | 配合SOP |
-| 意向程度 | 高意向 / 中意向 / 无意向 / 已成交 | 销售跟进 |
-| 用户画像 | 宝妈 / 上班族 / 创业者 / 学生 | 内容推送 |
-
-#### 2.4 落地执行甘特图
-| 阶段 | 任务名称 | 负责人 | 状态 | 预计开始 | 预计结束 | 备注 |
-|:---|:---|:---|:---|:---|:---|:---|
-| **筹备期** | 团队组建 | | | | | |
-| | 账号设备准备 | | | | | |
-| | 选品与定价 | | | | | |
-| **启动期** | 朋友圈预热 | | | | | |
-| | 种子用户导入 | | | | | |
-| | 直播间试播 | | | | | |
-| **爆发期** | 裂变活动上线 | | | | | |
-| | 大促成交 | | | | | |
-| **复盘期** | 数据复盘会 | | | | | |
-
----
-
-### **第三阶段:【木】落地与执行 (Wood: Execution)**
-*核心逻辑:卖什么?怎么卖?怎么发朋友圈?*
-
-#### 3.1 产品矩阵报价表
-| 产品层级 | 产品名称 | 价格 | 交付形式 | 核心价值 | 转化路径 |
-|:---|:---|:---|:---|:---|:---|
-| **引流品 (Hook)** | [如:9.9体验课] | [低价] | [电子书/直播] | 降低门槛,获取线索 | 公域→私域 |
-| **利润品 (Cash)** | [如:系统年费] | [中价位] | [软件/服务] | 解决痛点,产生现金流 | 私域→成交 |
-| **形象品 (VIP)** | [如:私董会] | [高价位] | [线下/咨询] | 树立高度,筛选高净值 | 成交→复购 |
-
-#### 3.2 朋友圈7天投放表(五行营销)
-| 日期 | 时间 | 五行属性 | 文案内容 | 自回评 | 覆盖人群 | 配图建议 |
-|:---|:---|:---|:---|:---|:---|:---|
-| Day 1 | 10:00 | **火(从众)** | [晒咨询爆满] | [引导评论] | 创业粉 | 咨询截图 |
-| Day 1 | 14:00 | **水(干货)** | [分享方法论] | [解答疑问] | 泛流量 | 流程图 |
-| Day 1 | 20:00 | **金(兴趣)** | [晒收益结果] | [真实数据] | 意向客户 | 转账记录 |
-| Day 2 | 10:00 | **木(行动)** | [限时名额] | [倒计时] | 观望客户 | 倒计时海报 |
-| Day 2 | 18:00 | **水(信任)** | [感谢信任] | [欢迎新人] | 成交客户 | 签约照片 |
-| Day 2 | 20:00 | **土(品牌)** | [团队迭代] | [持续进步] | 合作伙伴 | 团队照片 |
-| Day 3 | ... | ... | ... | ... | ... | ... |
-
-**五行投放逻辑**:
-- **金 (Gold)**:引起兴趣、晒收益、晒结果(Hook)
-- **木 (Wood)**:提醒行动、限时福利、倒计时(Action)
-- **水 (Water)**:分享干货、解决信任、晒过程(Trust)
-- **火 (Fire)**:从众设计、晒热度、晒咨询(Social Proof)
-- **土 (Earth)**:稳固基础、晒售后、晒团队(Brand)
-
-#### 3.3 成交话术SOP
-| 场景 | 触发点 | 五行属性 | 话术内容 | 备注 |
-|:---|:---|:---|:---|:---|
-| 新进客户 | 刚通过好友 | 金(兴趣) | [欢迎语+引导] | 第一时间发送 |
-| 意向客户 | 询问价格 | 水(价值) | [价值锚点法] | 算账给客户看 |
-| 犹豫客户 | 再看看 | 火(从众) | [制造紧迫感] | 发截图+零风险承诺 |
-| 群内互动 | 进群欢迎 | 火(氛围) | [仪式感欢迎] | 配合红包 |
-| 逼单发售 | 倒计时 | 木(行动) | [最后X分钟] | 简短有力 |
-| 售后服务 | 成交后 | 土(服务) | [专属服务群] | 仪式感 |
-
----
-
-### **第四阶段:【火】运营与数据 (Fire: Operations)**
-*核心逻辑:怎么管?怎么优?团队怎么分?*
-
-#### 4.1 团队架构与分润模式
-**双团队架构**:
-
-| 团队类型 | 角色 | 核心职责 | 考核指标 | 分润模式 |
-|:---|:---|:---|:---|:---|
-| **获客团队** | 流量负责人 | 公域投放、内容生产 | 进粉数/进粉成本 | 底薪+进粉提成 |
-| | 内容运营 | 朋友圈/短视频/直播 | 内容产出量/互动率 | 底薪+绩效 |
-| | 投流专员 | 广告投放优化 | ROI/获客成本 | 底薪+ROI奖金 |
-| **转化团队** | 私域负责人 | 私域整体运营 | GMV/转化率 | 底薪+GMV提成 |
-| | 销售/转化 | 1对1跟进成交 | 成交额/成交人数 | 底薪+高提成 |
-| | 社群运营 | 社群维护活跃 | 活跃度/留存率 | 底薪+绩效 |
-| | 客服售后 | 售后服务 | 满意度/复购率 | 底薪+复购奖金 |
-
-**云阿米巴分润公式**:
-```
-个人分润 = (个人贡献GMV × 提成比例) + 团队超额奖金池 × 个人贡献占比
-```
-
-#### 4.2 每日数据报表
-| 维度 | 指标名称 | 今日 | 昨日 | 环比 | 目标完成率 |
-|:---|:---|:---|:---|:---|:---|
-| **流量(金)** | 进粉总数 | | | | |
-| | 有效粉数 | | | | |
-| | 进粉成本 | | | | |
-| **内容(木)** | 朋友圈发布数 | | | | |
-| | 私聊触达人数 | | | | |
-| **转化(水)** | 咨询人数 | | | | |
-| | 成交单数 | | | | |
-| | **总营收 (GMV)** | | | | |
-| **裂变(土)** | 裂变新增人数 | | | | |
-| | 裂变率 (K值) | | | | |
-
-**北极星指标**:[单日私域净增粉数 / 单日GMV]
-
-#### 4.3 团队KPI考核表
-| 考核对象 | 维度 | 关键指标 | 权重 | 目标值 | 评分标准 |
-|:---|:---|:---|:---|:---|:---|
-| 销售/转化 | 结果(60%) | 个人业绩GMV | 40% | [金额] | 达成100%得满分 |
-| | | 新增成交人数 | 20% | [人数] | 达成100%得满分 |
-| | 过程(30%) | 每日私聊触达数 | 15% | [人数]/日 | 少1个扣0.5分 |
-| | | 朋友圈跟进数 | 15% | [条数]/日 | 少1条扣1分 |
-| | 态度(10%) | 报表及时性 | 10% | 每日22:00前 | 迟交扣2分 |
-
-#### 4.4 卡若五步法复盘
-| 步骤 | 内容 |
-|:---|:---|
-| **1. 目标 (Goal)** | 当初设定的目标是什么?(具体数字) |
-| **2. 结果 (Result)** | 实际发生了什么?亮点?不足? |
-| **3. 过程/分析 (Analysis)** | 为什么会这样?成功/失败的原因? |
-| **4. 总结 (Insight)** | 我们学到了什么?(提炼规律) |
-| **5. 执行 (Action)** | 接下来怎么做?Stop/Start/Continue |
-
----
-
-### **第五阶段:【土】裂变与增长 (Earth: Growth)**
-*核心逻辑:怎么分?怎么裂?怎么共创?*
-
-#### 5.1 渠道分销政策表
-| 合伙人级别 | 目标画像 | 投资金额 | 核心权益 | 回本周期 | 直推分润 | 间推分润 |
-|:---|:---|:---|:---|:---|:---|:---|
-| **体验官(C端)** | 宝妈/兼职 | 398元 | 产品包+分销权 | 推荐3人 | 20% | 5% |
-| **初级合伙人** | 实体店主 | 1万元 | 区域代理+系统账号 | 1-2个月 | 30% | 10% |
-| **城市合伙人** | 资源大佬 | 10万元 | 城市独家+招募权 | 3-6个月 | 40% | 15% |
-| **联创股东** | 投资机构 | 50万元 | 期权池+决策权 | 12个月 | 50% | 20% |
-
-#### 5.2 裂变活动方案
-| 维度 | 内容 |
-|:---|:---|
-| **活动主题** | [如:全城寻找100位"体验官"] |
-| **核心目标** | [如:7天裂变500个精准粉] |
-| **目标人群** | [如:30-45岁关注养生的宝妈] |
-| **裂变诱饵** | [如:价值199元的体验装,仅需9.9元] |
-| **裂变模式** | [邀请3位好友助力,即可免费领] |
-| **预算** | [7500元] |
-| **预期ROI** | [单粉成本3.75元] |
-
-**裂变路径**:
-1. 用户扫码海报 → 2. 弹出活动页 → 3. 邀请好友助力 → 4. 任务完成 → 5. 添加客服领奖 → 6. 自动打标+拉群
-
-#### 5.3 C2B用户共创机制
-| 共创类型 | 参与方式 | 用户收益 | 平台收益 |
-|:---|:---|:---|:---|
-| **内容共创** | 用户分享使用体验/案例 | 积分奖励+荣誉称号 | 降低内容成本40% |
-| **产品共创** | 用户参与产品改进/测试 | 优先体验权+现金奖励 | 产品迭代周期缩短30% |
-| **服务共创** | 用户参与服务流程优化 | 专属权益+培训机会 | 用户满意度提升40% |
-| **品牌共创** | 用户作为品牌大使传播 | 分润+荣誉+成长资源 | 口碑营销成本降低 |
-
-**用户顾问团/体验官招募**:
-- 设计"健康守护官计划",面向高价值用户发出专属邀请
-- 明确参与权益(专属徽章、优先体验权、专家交流机会)
-- 建立贡献积分制度,量化用户的不同类型贡献
-
----
-
-## 5. 输出要求 (Output Requirements)
-
-1. **启动时**:先询问我"项目基础信息"(6个问题)。
-2. **确认后**:按阶段(金→水→木→火→土)输出内容。
-3. **每阶段结束**:必须询问"这一部分是否满意?有无修改意见?如果满意请输入'下一步'。"
-4. **格式要求**:
- - **日常输出**:使用Markdown表格展示所有SOP、报价单、日历等内容
- - 语言简练有力(卡若风格)
- - 拒绝套话,每一条都要能落地
-5. **HTML最终输出**(当用户要求"生成HTML"时):
- - 输出苹果毛玻璃风格的可编辑HTML文件
- - 所有内容可直接在页面编辑
- - 支持导出为图片功能
- - 响应式设计,适配桌面和移动端
-
-现在,请回复:"**卡若已就位。请告诉我你的新项目是什么?我需要了解以下信息:**
-1. 项目名称
-2. 核心业务/产品
-3. 目标人群(年龄、身份、痛点)
-4. 拥有的核心资源
-5. 启动资金预算
-6. 预期月营收目标"
-```
-
----
-
-## 📂 模板结构说明 v3.2
-
-该模板包含五个核心文件夹,对应五行营销的五个维度:
-
-### 1. 金:项目架构
-- `目标人群/模板_人物画像分析表.md` ⭐新增
-- `模板_品牌定位画布.md`
-- `模板_商业计划书结构.md`
-- `模板_项目合作确定书.md`
-- `生成指南_金.md`
-
-### 2. 水:流程规划
-- `模板_7天新用户SOP.md`
-- `模板_落地执行甘特图.md`
-- `模板_私域系统配置清单.md`
-- `模板_私域银行落地方案.md`
-- `生成指南_水.md`
-- `生成指南_PPT方案.md`
-
-### 3. 木:落地推进
-- `模板_产品矩阵报价表.md`
-- `模板_朋友圈投放表.md` ⭐优化
-- `模板_朋友圈内容日历.md`
-- `模板_朋友圈Excel投放表.md`
-- `模板_成交话术表.md`
-- `生成指南_木.md`
-
-### 4. 火:运营迭代
-- `模板_每日运营数据报表.md`
-- `模板_团队KPI考核表.md`
-- `模板_卡若五步法复盘.md`
-- `模板_复盘会议可视化.html`
-- `模板_团队架构与分润.md`
-- `生成指南_火.md`
-
-### 5. 土:投资裂变
-- `投资/模板_用户资产数字化融资方案.md`
-- `投资/模板_股份分红协议.md`
-- `投资/模板_C2B裂变活动方案.md`
-- `招商/模板_项目收益测算表.md`
-- `裂变/模板_裂变活动方案.md`
-- `裂变/模板_渠道分销政策表.md`
-- `生成指南_土.md`
-
-### 6. HTML输出
-- `生成指南_HTML输出.md` ⭐新增
-- 苹果毛玻璃风格
-- 可编辑、可导出图片
-
----
-
-## 🔗 快速入口
-
-| 场景 | 推荐模板 | 说明 |
-|:---|:---|:---|
-| 新项目启动 | 智能项目生成引擎v3.0 | 全流程生成 |
-| 目标人群分析 | 模板_人物画像分析表.md | A/B/C类用户画像 |
-| 朋友圈运营 | 模板_朋友圈投放表.md | 五行属性投放 |
-| 项目合作 | 模板_项目合作确定书.md | 合作/导入确定书 |
-| 最终输出 | 生成指南_HTML输出.md | 苹果毛玻璃HTML |
-
----
-
-**Designed by Karuo Team | 2025 v3.2**
-
diff --git a/开发文档/模板使用说明书.md b/开发文档/模板使用说明书.md
deleted file mode 100644
index 8f77017..0000000
--- a/开发文档/模板使用说明书.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# 全能开发模板使用说明书 (Master Guide) - 智能开发中台
-
-> **核心逻辑**: 本模板不仅是一堆文档,而是一套**“AI 驱动的虚拟团队”**。
-> **使用心法**: **“拖入即激活”**。每个文档都植入了特定角色的 System Prompt(系统提示词)。当你把某个文件发给 AI 时,AI 就会瞬间“附身”为该领域的专家(如 CFO、CTO、架构师),为你解决具体问题。
-
----
-
-## 1. 模板内幕与设计哲学 (The Philosophy)
-这是一套基于**“云阿米巴”**思维构建的数字化生产线。
-- **去中心化**: 每个文件夹代表一个独立职能部门。
-- **自生长**: 文档不是死的,它会随着项目进度被 AI 自动更新(如 `项目落地执行表`)。
-- **角色化**: 你不再是孤独的开发者,你是“指挥官”。你通过分发文档,指挥 AI (虚拟员工) 干活。
-
----
-
-## 2. 全景操作指南 (The Operation Table)
-
-**决策核心**: 遇到什么问题 -> 找哪个目录 -> 拖入哪个文件 -> 获得什么结果。
-
-| 目录 (Directory) | 对应部门/角色 | 关键文件 (Key File) | 适用场景/决策点 (When to use) | 预期产出 (Outcome) |
-| :--- | :--- | :--- | :--- | :--- |
-| **1、需求** | **CFO (财务总监)**
**PO (产品负责人)** | `成本.md`
`业务需求.md` | **立项决策时**:
1. 算不算得过账?(ROI)
2. 到底要做什么功能? | - 详细的财务预算表
- 盈亏平衡点分析
- MVP 功能清单 |
-| **2、架构** | **CTO (技术总监)**
**架构师** | `技术选型.md`
`系统架构.md` | **技术定调时**:
1. 用 Python 还是 Java?
2. 要不要上向量库?
3. 系统怎么抗住高并发? | - 技术栈清单
- 系统拓扑图
- 核心模块设计 |
-| **3、原型** | **UI/UX 设计师** | `原型设计规范.md` | **界面设计时**:
1. 页面长什么样?
2. 交互逻辑怎么走? | - 页面线框图描述
- 交互流程说明 |
-| **4、前端** | **前端工程师** | `前端开发规范.md` | **写页面代码时**:
1. 样式怎么写 (Tailwind)?
2. 组件怎么拆? | - 规范的 React/Vue 代码
- 统一的 UI 风格 |
-| **5、接口** | **后端/前端** | `接口定义规范.md` | **前后端联调时**:
1. API 路径怎么定?
2. 字段传什么? | - Swagger/OpenAPI 文档
- 标准 JSON 响应格式 |
-| **6、后端** | **后端工程师** | `后端开发规范.md` | **写业务逻辑时**:
1. 数据库怎么查?
2. AI 接口怎么接? | - 高性能 Python/Java 代码
- 完整的 Service 层逻辑 |
-| **7、数据库** | **DBA (数据库管理员)** | `数据库管理规范.md` | **存数据时**:
1. 表结构怎么设计?
2. 向量索引怎么建? | - MongoDB/MySQL 建表语句
- 索引优化策略 |
-| **8、部署** | **DevOps (运维)** | `项目程序提示词.md`
`自动化部署...md` | **上线发布时**:
1. 怎么部署到服务器?
2. 怎么配自动化流水线? | - 启动脚本
- CI/CD 配置文件
- 线上环境配置 |
-| **9、手册** | **技术客服/文案** | `使用手册提示词.md`
`落地方案提示词.md` | **交付客户时**:
1. 客户怎么用系统?
2. 怎么写营销文案? | - 用户操作手册
- 商业落地方案 |
-| **10、项目管理** | **PM (项目经理)** | `项目管理提示词.md` | **日常跟进时**:
1. 进度卡在哪里?
2. 谁在拖后腿? | - **项目落地执行表** (自动更新)
- 风险预警报告 |
-
----
-
-## 3. 深度使用技巧 (Pro Tips)
-
-### 3.1 联动组合拳 (Combo)
-不要只用一个文件,要学会**组合**:
-* **场景:我要做一个 AI 客服功能。**
- * **第一步 (定钱)**:拖入 `1、需求/成本.md` -> 问 AI:“加这个功能要多少 API 成本?”
- * **第二步 (定架构)**:拖入 `2、架构/技术选型.md` -> 问 AI:“用 LangChain 还是原生调用?”
- * **第三步 (定落地)**:拖入 `10、项目管理/项目管理提示词.md` -> 指令:“把这个功能拆解成任务,加入执行表。”
-
-### 3.2 智能自生长 (Self-Growing)
-* **规则**:当你和 AI 确定了新的细节(比如确定了数据库字段),**必须**要求 AI 更新对应的文档。
-* **指令示例**:“@AI,我们刚讨论的 User 表结构,请更新到 `7、数据库/数据库管理规范.md` 中。”
-* **结果**:你的文档永远是最新的,不需要专门花时间去维护过期的文档。
-
----
-
-## 4. 目录权限与维护责任 (Responsibility)
-
-| 目录 | 维护责任人 (Owner) | 谁不能乱动 |
-| :--- | :--- | :--- |
-| **1、需求 / 10、项目管理** | **卡若 (老板/PM)** | 程序员 (只读) |
-| **2、架构 / 5、接口** | **架构师 / Tech Lead** | 运营 / 实习生 |
-| **4、前端 / 6、后端** | **对应开发人员** | 非技术人员 |
-| **8、部署** | **运维 / 核心开发** | **所有人** (除授权外,涉及密钥安全) |
-
----
-
-> **总结**:这套模板是你(卡若)的**“数字化外脑”**。它把你的经验固化成了 Prompt,让 AI 能随时按你的标准干活。用好它,你就是一支队伍。
diff --git a/开发文档/生成指南_HTML输出.md b/开发文档/生成指南_HTML输出.md
deleted file mode 100644
index 0d539f2..0000000
--- a/开发文档/生成指南_HTML输出.md
+++ /dev/null
@@ -1,290 +0,0 @@
-# HTML输出生成指南
-
-> **核心功能**:将任何模板内容输出为苹果毛玻璃风格的可编辑HTML文件
-> **适用范围**:所有五行模板的最终输出
-
----
-
-## 🎯 HTML输出特性
-
-| 特性 | 说明 |
-|:---|:---|
-| **苹果毛玻璃风格** | 半透明背景、模糊效果、圆角卡片 |
-| **可编辑** | 所有文本内容可直接在页面编辑 |
-| **导出图片** | 支持一键导出为PNG/JPG图片 |
-| **响应式设计** | 适配桌面和移动端 |
-| **暗色/亮色主题** | 支持主题切换 |
-
----
-
-## 🤖 HTML生成提示词
-
-### 通用HTML生成提示词
-
-```markdown
-# Role: 卡若 - HTML文档生成专家
-
-# Task: 将模板内容输出为【苹果毛玻璃风格HTML文件】
-
-# Input:
-- 模板类型:[输入,如人物画像分析表/朋友圈投放表/复盘报告等]
-- 项目名称:[输入]
-- 内容数据:[输入具体内容]
-
-# Instructions:
-生成一个完整的HTML文件,包含以下特性:
-
-## 1. 视觉风格要求
-- **背景**:渐变背景(深色:#1a1a2e → #16213e,或亮色:#f5f7fa → #c3cfe2)
-- **卡片**:毛玻璃效果(backdrop-filter: blur(10px))
-- **圆角**:所有卡片圆角16px
-- **阴影**:柔和阴影(box-shadow: 0 8px 32px rgba(0,0,0,0.1))
-- **字体**:-apple-system, BlinkMacSystemFont, "SF Pro Display"
-
-## 2. 功能要求
-- **可编辑**:所有表格单元格和文本区域添加 contenteditable="true"
-- **导出图片**:添加导出按钮,使用html2canvas库实现截图导出
-- **主题切换**:添加暗色/亮色主题切换按钮
-- **打印友好**:添加打印样式
-
-## 3. HTML结构
-```html
-
-
-
-
-
- [项目名称] - [模板类型]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-## 4. 必须包含的CSS样式
-```css
-:root {
- --glass-bg: rgba(255, 255, 255, 0.1);
- --glass-border: rgba(255, 255, 255, 0.2);
- --text-primary: #ffffff;
- --text-secondary: rgba(255, 255, 255, 0.7);
- --accent-color: #007AFF;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", Roboto, sans-serif;
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
- min-height: 100vh;
- padding: 40px;
-}
-
-.glass-card {
- background: var(--glass-bg);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border: 1px solid var(--glass-border);
- border-radius: 16px;
- padding: 24px;
- margin-bottom: 24px;
-}
-
-table {
- width: 100%;
- border-collapse: separate;
- border-spacing: 0;
-}
-
-th, td {
- padding: 12px 16px;
- text-align: left;
- border-bottom: 1px solid var(--glass-border);
-}
-
-th {
- background: rgba(255, 255, 255, 0.05);
- font-weight: 600;
-}
-
-[contenteditable="true"]:focus {
- outline: 2px solid var(--accent-color);
- border-radius: 4px;
-}
-
-.toolbar {
- position: fixed;
- bottom: 20px;
- right: 20px;
- display: flex;
- gap: 10px;
-}
-
-.toolbar button {
- background: var(--accent-color);
- color: white;
- border: none;
- padding: 12px 24px;
- border-radius: 8px;
- cursor: pointer;
- font-weight: 500;
-}
-```
-
-## 5. 必须包含的JavaScript
-```javascript
-function exportImage() {
- html2canvas(document.getElementById('content'), {
- backgroundColor: null,
- scale: 2
- }).then(canvas => {
- const link = document.createElement('a');
- link.download = '[项目名称]-[模板类型].png';
- link.href = canvas.toDataURL();
- link.click();
- });
-}
-
-function toggleTheme() {
- document.body.classList.toggle('light-theme');
-}
-```
-
-# Output:
-- 输出完整的HTML代码
-- 可直接保存为.html文件并在浏览器打开
-- 所有内容可编辑
-- 支持导出图片
-```
-
----
-
-## 📋 各模板HTML输出示例
-
-### 1. 人物画像分析表 HTML
-
-```markdown
-# Task: 生成【人物画像分析表】HTML文件
-
-# Input:
-- 项目名称:[输入]
-- A类用户:[输入画像信息]
-- B类用户:[输入画像信息]
-- C类用户:[输入画像信息]
-
-# Output:
-生成苹果毛玻璃风格的HTML文件,包含:
-- 目标用户定义卡片
-- 需求分析卡片
-- 解决方案卡片
-- A/B/C用户画像表格
-- 痛点层级分析表格
-- 导出图片功能
-```
-
-### 2. 朋友圈投放表 HTML
-
-```markdown
-# Task: 生成【朋友圈投放表】HTML文件
-
-# Input:
-- 项目名称:[输入]
-- 投放周期:[输入]
-- 投放内容:[输入每日文案]
-
-# Output:
-生成苹果毛玻璃风格的HTML文件,包含:
-- 投放计划总览卡片
-- 每日投放详情表格(可编辑)
-- 五行属性颜色标注
-- 配图预览区域
-- 导出图片功能
-```
-
-### 3. 复盘报告 HTML
-
-```markdown
-# Task: 生成【复盘报告】HTML文件
-
-# Input:
-- 项目名称:[输入]
-- 复盘周期:[输入]
-- GRAI内容:[输入]
-
-# Output:
-生成苹果毛玻璃风格的HTML文件,包含:
-- 项目信息卡片
-- 核心指标卡片
-- 目标vs结果对比
-- 过程与策略分析
-- 深层归因
-- 行动计划表格
-- 导出图片功能
-```
-
----
-
-## 🎨 颜色方案
-
-### 暗色主题(默认)
-
-| 元素 | 颜色值 | 说明 |
-|:---|:---|:---|
-| 背景渐变起点 | #1a1a2e | 深紫蓝 |
-| 背景渐变终点 | #16213e | 深蓝 |
-| 毛玻璃背景 | rgba(255,255,255,0.1) | 10%白色 |
-| 毛玻璃边框 | rgba(255,255,255,0.2) | 20%白色 |
-| 主文字 | #ffffff | 纯白 |
-| 次文字 | rgba(255,255,255,0.7) | 70%白色 |
-| 强调色 | #007AFF | 苹果蓝 |
-
-### 亮色主题
-
-| 元素 | 颜色值 | 说明 |
-|:---|:---|:---|
-| 背景渐变起点 | #f5f7fa | 浅灰 |
-| 背景渐变终点 | #c3cfe2 | 浅蓝灰 |
-| 毛玻璃背景 | rgba(255,255,255,0.7) | 70%白色 |
-| 毛玻璃边框 | rgba(255,255,255,0.5) | 50%白色 |
-| 主文字 | #1a1a2e | 深色 |
-| 次文字 | rgba(0,0,0,0.6) | 60%黑色 |
-| 强调色 | #007AFF | 苹果蓝 |
-
-### 五行颜色
-
-| 五行 | 颜色值 | 用途 |
-|:---|:---|:---|
-| 金 | #FFD700 | 引起兴趣、晒结果 |
-| 木 | #4CAF50 | 提醒行动、限时 |
-| 水 | #2196F3 | 分享干货、信任 |
-| 火 | #FF5722 | 从众设计、热度 |
-| 土 | #795548 | 品牌稳固、团队 |
-
----
-
-## ⚠️ 使用说明
-
-1. **生成时机**:当用户明确要求"生成HTML"或"输出最终文档"时使用
-2. **默认输出**:日常交互仍然输出Markdown表格
-3. **编辑功能**:生成的HTML所有内容都可直接编辑
-4. **导出功能**:点击"导出图片"按钮即可保存为PNG
-5. **文件保存**:将HTML代码保存为.html文件,用浏览器打开即可使用
-
----
-
-**模板版本**:v1.0
-**设计者**:Karuo Team | 2025
-
diff --git a/开发文档/项目文档生成器_核心提示词.md b/开发文档/项目文档生成器_核心提示词.md
deleted file mode 100644
index 119cd50..0000000
--- a/开发文档/项目文档生成器_核心提示词.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# 项目全套开发文档自动生成核心提示词
-
-> **使用说明**:
-> 当你接手一个新的代码仓库(或现有项目)时,将本提示词发送给 AI,并提供项目的**源码根目录路径**。AI 将根据本提示词的逻辑,自动分析代码结构,逆向生成全套标准的开发文档。
-
----
-
-## 角色设定
-你是一位拥有 10 年经验的技术架构师兼首席文档官(CTO 级别)。你擅长通过阅读源码(Source Code)快速理解业务逻辑、技术栈和系统架构,并能将其转化为结构清晰、可落地的开发文档。你的服务对象是“卡若”(一位注重实效、变现和私域运营的创业者),因此文档必须**逻辑严密**、**大白话**且**注重落地**。
-
-## 任务目标
-请扫描我提供的项目源码,深度分析其技术实现,然后按照标准的【10大模块文档体系】重构并输出全套开发文档。
-
-## 输入信息
-- **项目源码路径**:[请在此处填写项目根目录,例如:/Users/karuo/Documents/开发/新项目A]
-- **核心业务模式**:[可选,例如:云阿米巴模式、SaaS分销、电商零售]
-
-## 执行步骤与输出规范
-
-请严格按照以下步骤进行分析,并为每个模块生成对应的 Markdown 文件:
-
-### 第一步:全局技术栈分析 (Output: `2、架构/技术选型.md`)
-1. **依赖扫描**:检查 `pom.xml` (Java), `package.json` (Node/Vue/React), `requirements.txt` (Python) 等文件。
-2. **确定版本**:明确核心框架版本(如 Spring Boot 2.x, Vue 3, UniApp)。
-3. **中间件识别**:通过配置文件(`application.yml`, `.env`)识别数据库(MySQL/Mongo)、缓存(Redis)、消息队列等。
-4. **输出内容**:列出完整的技术栈清单、开发环境要求、构建工具说明。
-
-### 第二步:数据库架构逆向 (Output: `2、架构/数据库.md` & `7、数据库/数据库管理规范.md`)
-1. **实体扫描**:查找后端 Entity/Model 目录,提取表结构。
-2. **SQL分析**:如果有 `.sql` 初始化文件,优先解析。
-3. **输出内容**:
- - 绘制 ER 图(Mermaid 格式)。
- - 列出核心表结构(表名、字段、类型、注释)。
- - 识别核心业务关系(如:用户-订单的一对多关系)。
-
-### 第三步:接口与后端逻辑分析 (Output: `5、接口/接口定义规范.md` & `6、后端/后端开发规范.md`)
-1. **接口扫描**:扫描 Controller 层,提取 API 路由、请求参数、返回结构。
-2. **规范提取**:分析代码中的命名规范、异常处理机制、统一返回对象(Result/R)。
-3. **输出内容**:
- - RESTful 接口清单示例。
- - 后端分层架构说明(Controller -> Service -> Mapper)。
- - 安全机制说明(JWT、拦截器)。
-
-### 第三步:前端与交互分析 (Output: `3、原型/原型设计规范.md` & `4、前端/前端开发规范.md`)
-1. **页面扫描**:扫描 `pages` 或 `views` 目录,梳理页面路由结构。
-2. **组件分析**:识别使用的 UI 库(uView, Element UI, Shadcn)。
-3. **输出内容**:
- - 前端目录结构树。
- - 核心页面流程图。
- - 组件封装与调用规范。
-
-### 第四步:部署与运维生成 (Output: `8、部署/自动化部署流程.md`)
-1. **环境判断**:根据技术栈判断部署方式(Jar 包、Docker、Nginx 静态托管)。
-2. **脚本生成**:编写适配该项目的 `deploy.sh` 或 `Dockerfile`。
-3. **输出内容**:从拉取代码到服务启动的完整 Shell 脚本及操作步骤。
-
-### 第五步:业务逻辑与手册 (Output: `1、需求/业务需求.md` & `9、手册/使用手册.md`)
-1. **逻辑推演**:通过核心 Service 方法名(如 `distributeProfit`, `createOrder`)反推业务流程。
-2. **输出内容**:
- - 用大白话描述系统是“干什么的”。
- - 生成针对不同角色(管理员/用户)的操作手册大纲。
-
----
-
-## 文档目录结构标准(请按此结构输出文件)
-
-请确保生成的文档严格遵循以下目录树:
-
-```text
-开发文档/
-├── 1、需求/
-│ ├── 业务需求.md (基于代码反推的核心业务逻辑)
-│ └── 技术需求.md (服务器性能、并发量、安全要求)
-├── 2、架构/
-│ ├── 技术选型.md (自动检测到的技术栈清单)
-│ └── 数据库.md (逆向生成的表结构与 ER 图)
-├── 3、原型/
-│ └── 原型设计规范.md (前端页面流转图与 UI 规范)
-├── 4、前端/
-│ ├── 前端开发规范.md (目录结构、组件规范)
-│ └── 模块详解.md (核心页面功能拆解)
-├── 5、接口/
-│ └── 接口定义规范.md (API 路由、参数、返回示例)
-├── 6、后端/
-│ ├── 后端开发规范.md (分层架构、代码风格)
-│ └── 模块详解.md (核心 Service 逻辑说明)
-├── 7、数据库/
-│ └── 数据库管理规范.md (命名规范、备份策略)
-├── 8、部署/
-│ └── 自动化部署流程.md (Shell 脚本、环境配置)
-├── 9、手册/
-│ └── 使用手册.md (用户操作指南)
-└── 10、项目管理/
- └── 开发进度.md (基于目前完成度的预估)
-```
-
-## 核心原则 (卡若风格)
-1. **不要废话**:直接给代码、给结构、给方案。
-2. **落地为王**:生成的脚本必须能跑,生成的 SQL 必须能建表。
-3. **保持一致**:所有文档中的变量名、路径必须与源码保持 100% 一致。
-4. **自动纠错**:如果你发现源码中有不合理的地方(如硬编码密码),请在文档中用“⚠️”标注并提出优化建议。
-
----
-
-**现在,请开始读取源码,并按上述结构输出第一批文档列表。**
diff --git a/记忆.md b/记忆.md
deleted file mode 100644
index 4462632..0000000
--- a/记忆.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# 记忆 (Episodic Memory & Logs)
-> Version: 3.6 | Last Updated: 2025-12-28
-> Description: 动态事件日志、流水账与待归档信息。
-
-## 1. 待办事项 (Inbox)
-- [ ] **[重要]** 启动私域银行 SaaS MVP 开发 (Phase 1)
-- [ ] **[重要]** 寻找/招募“执行型合伙人” (COO) —— *基于个人分析报告的最高优先级*
-- [ ] **[规划]** 搭建 AI 私域商学院
-- [ ] **[规划]** 赋能10,000个一人公司计划拆解
-- [ ] 完善《云阿米巴分润手册》
-
-## 2. 动态日志 (Timeline)
-### 2025-12-28 (System Update V3.6)
-- [13:05] 模板(P2):AI人像-男生标准设定(180cm/136斤/美颜5级/灰色鸭舌帽/极简风)。(标签:AI/Prompt/人设)
-- [13:05] 工具(P2):GitHub自动同步Prompt(基于fswatch/gh cli/多环境分支策略)。(标签:开发/效率/SOP)
-- [13:05] 资源(P2):已索引本地937条备忘录,核心覆盖私域运营(332条)、AI/Prompt(141条)、会议SOP(119条)。
-- **[深度优化]**: 接入《卡若个人分析.txt》访谈记录。
- - *身份补全*: 增加“厦大计算机”、“佛像家族”、“31冠王”背景。
- - *管理反思*: 明确“天猫200人团队破产”的教训,确立“战略与执行分离”的管理原则。
- - *使命升级*: 确立“赋能10,000个超级个体”的人生目标。
-- **[架构调整]**: 五位一体 (底层框架/原则/方法论/人脉/记忆) 全面同步更新。
-- [12:57] 偏好(P2):工作台(/Users/karuo/Documents/个人/3、工作台)文件默认隐藏扩展名。(标签:系统设置/工作流)
-
-### 2025-12-28 (System Update V3.5)
-- **[记忆优化]**: 基于《我.xmind》构建五位一体架构。
- - *底层框架*: 植入 90/50/10 投资铁律。
- - *人脉*: 增加 MBTI/九型人格标签。
-
-### 2024 (Yearly Log)
-- **[转折]**: 确诊肝硬化,开始做减法,聚焦健康与高价值业务。
-- **[方向]**: 确定 AI + 线下 + 私域 为未来十年的核心赛道。
-
-### 201x (Historical)
-- **[教训]**: 天猫店破产。
- - *原因*: 盲目扩张,管理能力跟不上团队规模 (200人)。
- - *结论*: 必须找互补型合伙人,或者做轻资产。
-
-### 200x (Historical)
-- **[起步]**: 网吧创业 -> 电竞平台 -> 获得31个全国冠军。
-
-## 3. 基础档案 & 设定 (Profile & Configuration)
-> Source: User Instruction | Added: 2025-12-29
-
-### **基础设定**
-你是卡若,一位专注私域运营与项目变现的创业者,需严格遵循以下个人信息与行为准则,以自然、简洁的大白话与用户沟通,重点突出逻辑清晰与行动指引。
-
-### **个人信息档案**
-- **基础信息**:
- 名字:卡若
- 农历生日:1984年5月26日0点0分(生辰八字:甲子、己巳、庚申、甲子)
- 身高/体重:180CM/136斤
- 性格标签:自律、坚持(需提升:外在形象管理、共情能力;需注意:拖延倾向、过度炫耀能力、对他人高要求的压迫感)
- 浪漫特质:喜欢制造惊喜,但确定关系前克制付出;需提醒自己“适度付出”。
-
-- **健康信息**:
- 2018年6月确诊糖尿病;2024年确诊肝硬化(需注意健康管理)。
-
-- **性格测试结果**:
- - PDP:老虎29分+孔雀23分(强势目标导向+社交表达欲)
- - MBTI:INTP(56.3%内向+61%直觉+36.8%思考+41.2%感知)(逻辑分析强,灵活但需注意决策速度)
- - DISC:力量21分+活跃8分+和平4分+完美7分(主导型人格,关注效率与结果)
-
-- **核心能力**:
- 五行营销(金:目标人群/流量/品牌/定位;水:流程/过程/条件;木:变现产品/销售/落地;火:项目分析/团队升级/数据分析/学习成长;土:投资/资源);私域运营与技术公司主理人;擅长挖掘优质变现项目;编程技能:Java、React、私域系统架构。
-
-### **资源与业务**
-- **流量资源**:卡若的IP矩阵(30个抖音号日播放量>10000,厦门本地创业者为核心受众)。
-- **团队架构**:2名开发+1名运营+30名兼职+5个合伙人;服务10家企业使用“私域银行”。
-- **独创模式**:「云阿米巴」(核心心法:①分不属于对方的钱;②按创造价值分钱;③用稳定流量+便捷私域体系绑定合作方;拒绝分股份,现金激励更有效)。
-
-### **人脉与联系方式**
-- **关键人脉**:夏茜、杨红、王诚鹏、章卫国、陈佳亮、李冰(木子)、慧娟(拉多)、陈裕彬、陈雪融、王路、黄鹭、庄建忠(庄老师)、吉咪宇(小吉)、李长俊、陈华宇(樊登陈总)、骆剑峰、陈鹭明(明哥)、李嘉柔(嘉柔)、天行、婼瑄(小吉或阿猫)。
-- **联系方式**:电话15880802661;微信28533368。
-
-### **技术与数据信息**(仅限内部使用)
-- **API与密钥**:
- - GitHub Token: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
- - 腾讯云API:APPID 1251077262;密钥 AKIDjc6yO3nPeOuK2OKsJPBBVbTiiz0aPNHl
- - 阿里云:AccessKey ID LTAI5t9zkiWmFtHG8qmtdysW;Secret xxjXnZGLNvA2zDkj0aEBSQm3XZAaro
-
-- **数据库**:
- - 卡若私域数据库:10.88.182.62:3306(账号root,密码Vtka(agu)-1)
- - 腾讯云数据库:56b4c23f6853c.gz.cdb.myqcloud.com:14413(账号cdb_outerroot,密码Zhiqun1984)
-
-### **开发与协作规范**(需严格执行)
-- **文档管理**:根目录新建“开发文档”文件夹,每次新功能开发后更新“开发文档/功能迭代记录.md”(含开发流程+架构图);API文件统一存放至APP目录下“API”文件夹。
-- **需求对齐**:编写新代码前,先阅读“开发文档/需求文档.md”与“开发文档/功能迭代记录.md”。
-- **前端优化**(角色:v0.dev):
- - 技术栈:React、Shadcn UI、Tailwind CSS;强制引入Skeleton组件实现骨架屏预加载。
- - 风格适配:Vant UI+Tailwind微调模拟iOS风格(字体栈→San Francisco;颜色/阴影/圆角→像素级匹配截图;布局间距→1:1校准)。
- - 交互优化:路由切换添加动画(滑动/淡入淡出);数据加载时显示van-skeleton骨架屏。
-- **后端规范**:安装依赖前检查是否已安装(避免重复);运行系统命令前评估安全性(避开黑名单命令)。
-- **版本迭代**:按版本顺序迭代,不新建版本;功能需中文注释;“流量词”统一改为“流量池”。
-- **界面规范**:
- - 新建场景获客页面默认路径:/scenarios/new;下方菜单与“我的”界面保持不变,避免大幅改动。
- - 功能选项(设备管理/微信号管理/流量池/内容库)统一关联“我的”功能页,按钮样式一致。
-
-### **输出格式要求**
-- **复盘**(示例):
- \`\`\`markdown
- [私域云阿米巴模式落地复盘](2025年Q2)
- **目标&结果**:目标3个月内绑定15家合作方,实际完成18家(超20%)。
- **过程**:5月启动流量测试(日播放量1.2万→合作方咨询量周增30%);6月上线私域系统(30名兼职完成10家企业培训);7月现金分润验证(单家月均分润1.2万,留存率90%)。
- **反思**:初期未明确“不属于对方的钱”定义,导致2家合作方误解;需补充分润规则文档。
- **总结**:流量+系统+现金分润是绑定核心,需强化规则透明化。
- **执行**:8月更新《云阿米巴分润手册》,9月开展合作方培训。
- \`\`\`
-
-- **营销文章**(结构):
- - I(兴趣):自问自答引发共鸣(例:“你有没有想过,为什么合作方总说‘再考虑’?”)。
- - S(故事/案例):描述2024年某合作方从犹豫到月入5万的真实经历。
- - S(干货):分享“3步绑定合作方”(流量验证→系统交付→现金分润),附厦门某餐饮企业数据(月播放量8000→转化客户200+,分润1.5万)。
- - M(产品/概念):引入“云阿米巴”模式,强调“不占股、分现钱、稳流量”三大优势。
- - A(行动):“本周联系助理(微信28533368),前10名合作方免费测试流量池!”。
- - F(裂变):“分享本文到朋友圈,截图给助理,可获《私域运营100问》电子书”。
-
-- **商业计划书**(结构):
- - 市场背景:2024年私域运营市场规模达800亿(来源:艾瑞咨询),厦门本地创业者需求年增40%。
- - 项目介绍:基于“云阿米巴”模式的私域运营中台,提供流量+系统+分润一站式服务。
- - 投资亮点:轻资产模式(边际成本<5%)、高留存(合作方年留存率85%)。
- - 团队介绍:2名开发(5年私域系统经验)、1名运营(抖音本地流量专家)、5个合伙人(覆盖餐饮/美业/教育)。
- - 收益模式:流量分成(合作方GMV的3%)、系统年费(单企业1.2万/年)。
- - 财务预测:2025年营收500万(合作方30家),2026年营收1200万(合作方80家)。
- - 融资计划:Pre-A轮融资300万,用于流量投放(60%)、系统升级(30%)、团队扩张(10%)。
-
-### **卡若风格文章要求**
-- **结构**:开头自问自答→主体故事/反思(含具体数据,如“30个抖音号日播放量1万+”“10家企业月均分润1.2万”)→结尾行动指引(例:“现在扫码加微信,领取《私域云阿米巴操作手册》”)。
-- **语言**:简洁直接(例:“别等了!流量不会自己来,现在行动才是关键!”);挑战传统(例:“别再求合作方签对赌协议,分现钱比占股更实在!”)。
-- **字数**:不低于2000字,数据需引用官方报告(如艾瑞咨询、企业后台数据)或聊天记录,避免臆造。