import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function main() { console.log('🌱 开始创建测试用户数据...'); // 创建测试用户1:非会员用户(内购未解锁) const user1 = await prisma.user.upsert({ where: { phone: '13800000001' }, update: { isPro: false }, create: { phone: '13800000001', nickname: '测试用户1', agreementAccepted: true, isPro: false, settings: { create: { pushNotification: true, }, }, }, include: { settings: true, }, }); console.log('✅ 创建测试用户1(非会员):', user1.id); // 创建测试用户2:非会员用户(内购未解锁) const user2 = await prisma.user.upsert({ where: { phone: '13800000002' }, update: { isPro: false }, create: { phone: '13800000002', nickname: '测试用户2', agreementAccepted: true, isPro: false, settings: { create: { pushNotification: true, }, }, }, include: { settings: true, }, }); console.log('✅ 创建测试用户2(非会员):', user2.id); // 创建测试用户3:非会员用户(内购未解锁) const user3 = await prisma.user.upsert({ where: { phone: '13800000003' }, update: { isPro: false }, create: { phone: '13800000003', nickname: '测试用户3', agreementAccepted: true, isPro: false, settings: { create: { pushNotification: true, }, }, }, include: { settings: true, }, }); console.log('✅ 创建测试用户3(非会员):', user3.id); // 创建测试用户4:非会员用户(内购未解锁) const user4 = await prisma.user.upsert({ where: { phone: '13800000004' }, update: { isPro: false }, create: { phone: '13800000004', nickname: '测试用户4', agreementAccepted: true, isPro: false, settings: { create: { pushNotification: true, }, }, }, include: { settings: true, }, }); console.log('✅ 创建测试用户4(非会员):', user4.id); // ========== 清理所有课程数据 ========== console.log('\n📚 开始创建课程测试数据...'); await prisma.nodeSlide.deleteMany({}); await prisma.userLearningProgress.deleteMany({}); await prisma.courseNode.deleteMany({}); await prisma.courseChapter.deleteMany({}); await prisma.course.deleteMany({}); // ========== 课程数据定义 ========== const coursesData = [ { id: 'course_001', title: '认知觉醒', subtitle: '开启你的元认知之旅', description: '情绪急救与心理复原力构建。通过系统化的认知训练,帮助你重新认识大脑,掌握潜意识的智慧。', coverImage: 'brain.head.profile', chapters: [ { id: 'c001_ch01', title: '第一章:重新认识大脑', nodes: [ { id: 'c001_n01', title: '我们为什么会痛苦?', subtitle: '理解痛苦的根源', duration: 5 }, { id: 'c001_n02', title: '大脑的节能机制', subtitle: '认识大脑的工作原理', duration: 6 }, { id: 'c001_n03', title: '认知偏差的陷阱', subtitle: '识别认知陷阱', duration: 7 }, { id: 'c001_n04', title: '情绪的本质', subtitle: '理解情绪机制', duration: 8 }, { id: 'c001_n05', title: '思维的惯性', subtitle: '打破思维定式', duration: 9 }, ], }, { id: 'c001_ch02', title: '第二章:潜意识的智慧', nodes: [ { id: 'c001_n06', title: '潜意识的运作', subtitle: '探索潜意识', duration: 5 }, { id: 'c001_n07', title: '直觉与理性', subtitle: '平衡直觉与理性', duration: 6 }, { id: 'c001_n08', title: '内在对话', subtitle: '倾听内在声音', duration: 7 }, { id: 'c001_n09', title: '自我觉察', subtitle: '培养觉察力', duration: 8 }, { id: 'c001_n10', title: '潜意识的力量', subtitle: '释放潜意识', duration: 9 }, ], }, ], }, { id: 'course_002', title: '社会化指南', subtitle: '从小镇i人到社交达人', description: '专为内向女孩打造的社会化成长指南。从理解社交本质到建立自信,从克服社交恐惧到建立深度连接,一步步走出舒适圈。', coverImage: 'person.2.fill', chapters: [ { id: 'c002_ch01', title: '第一章:理解社交的本质', nodes: [ { id: 'c002_n01', title: '为什么社交让我感到疲惫?', subtitle: '理解内向者的社交特点', duration: 6 }, { id: 'c002_n02', title: '社交不是表演,是连接', subtitle: '重新定义社交的意义', duration: 7 }, { id: 'c002_n03', title: 'i人与e人的社交差异', subtitle: '认识自己的社交风格', duration: 5 }, { id: 'c002_n04', title: '社交能量管理', subtitle: '如何保护自己的能量', duration: 6 }, { id: 'c002_n05', title: '从被动到主动', subtitle: '改变社交心态', duration: 8 }, ], }, { id: 'c002_ch02', title: '第二章:克服社交恐惧', nodes: [ { id: 'c002_n06', title: '社交焦虑的根源', subtitle: '理解恐惧背后的心理', duration: 6 }, { id: 'c002_n07', title: '小步快跑策略', subtitle: '渐进式社交练习', duration: 7 }, { id: 'c002_n08', title: '准备你的社交工具箱', subtitle: '实用的社交技巧', duration: 8 }, { id: 'c002_n09', title: '处理尴尬时刻', subtitle: '如何应对社交失误', duration: 6 }, { id: 'c002_n10', title: '从失败中学习', subtitle: '把挫折变成成长', duration: 7 }, ], }, { id: 'c002_ch03', title: '第三章:建立深度连接', nodes: [ { id: 'c002_n11', title: '倾听的艺术', subtitle: '如何真正听懂别人', duration: 6 }, { id: 'c002_n12', title: '分享你的故事', subtitle: '建立信任的技巧', duration: 7 }, { id: 'c002_n13', title: '找到共同话题', subtitle: '如何开启对话', duration: 5 }, { id: 'c002_n14', title: '维护长期关系', subtitle: '让友谊持续升温', duration: 8 }, { id: 'c002_n15', title: '建立你的社交圈', subtitle: '从一个人到一群人', duration: 7 }, ], }, { id: 'c002_ch04', title: '第四章:在不同场景中社交', nodes: [ { id: 'c002_n16', title: '聚会中的i人', subtitle: '如何在聚会中自在', duration: 6 }, { id: 'c002_n17', title: '一对一深度交流', subtitle: 'i人的优势场景', duration: 5 }, { id: 'c002_n18', title: '网络社交的智慧', subtitle: '线上社交的技巧', duration: 7 }, { id: 'c002_n19', title: '拒绝的艺术', subtitle: '保护自己的边界', duration: 6 }, { id: 'c002_n20', title: '成为更好的自己', subtitle: '持续成长的力量', duration: 8 }, ], }, ], }, { id: 'course_003', title: '如何谈恋爱', subtitle: 'i人女孩的恋爱成长课', description: '从理解自己到理解对方,从建立关系到维护关系。专为内向女孩打造的恋爱指南,帮你找到属于自己的爱情节奏。', coverImage: 'heart.fill', chapters: [ { id: 'c003_ch01', title: '第一章:认识自己的恋爱模式', nodes: [ { id: 'c003_n01', title: 'i人在恋爱中的优势', subtitle: '发现你的独特魅力', duration: 6 }, { id: 'c003_n02', title: '理解你的情感需求', subtitle: '什么让你感到被爱', duration: 7 }, { id: 'c003_n03', title: '恋爱中的能量管理', subtitle: '如何保持平衡', duration: 5 }, { id: 'c003_n04', title: '从暗恋到行动', subtitle: '如何表达你的心意', duration: 8 }, { id: 'c003_n05', title: '识别对的人', subtitle: '找到适合你的伴侣', duration: 6 }, ], }, { id: 'c003_ch02', title: '第二章:建立连接', nodes: [ { id: 'c003_n06', title: '第一次约会指南', subtitle: '如何度过尴尬期', duration: 7 }, { id: 'c003_n07', title: '深度对话的技巧', subtitle: '建立情感连接', duration: 6 }, { id: 'c003_n08', title: '分享你的内心世界', subtitle: '如何打开心扉', duration: 8 }, { id: 'c003_n09', title: '理解对方的信号', subtitle: '读懂他的心意', duration: 5 }, { id: 'c003_n10', title: '处理不确定感', subtitle: '恋爱中的焦虑管理', duration: 7 }, ], }, { id: 'c003_ch03', title: '第三章:维护关系', nodes: [ { id: 'c003_n11', title: '沟通的艺术', subtitle: '如何表达你的需求', duration: 6 }, { id: 'c003_n12', title: '处理冲突', subtitle: '当意见不合时', duration: 7 }, { id: 'c003_n13', title: '保持独立空间', subtitle: '恋爱中的边界', duration: 5 }, { id: 'c003_n14', title: '共同成长', subtitle: '让关系持续升温', duration: 8 }, { id: 'c003_n15', title: '处理分手', subtitle: '如何优雅地告别', duration: 6 }, ], }, ], }, { id: 'course_004', title: '如何职场社交', subtitle: 'i人女孩的职场生存指南', description: '从面试到升职,从同事关系到领导沟通。帮助内向女孩在职场中找到自己的位置,建立专业形象,获得认可。', coverImage: 'briefcase.fill', chapters: [ { id: 'c004_ch01', title: '第一章:职场中的i人优势', nodes: [ { id: 'c004_n01', title: '内向者的职场优势', subtitle: '发现你的独特价值', duration: 6 }, { id: 'c004_n02', title: '建立专业形象', subtitle: '如何展现你的能力', duration: 7 }, { id: 'c004_n03', title: '深度工作者的优势', subtitle: '专注力的力量', duration: 5 }, { id: 'c004_n04', title: '倾听者的价值', subtitle: '如何成为好的倾听者', duration: 6 }, { id: 'c004_n05', title: '从幕后到台前', subtitle: '如何展示你的成果', duration: 8 }, ], }, { id: 'c004_ch02', title: '第二章:建立职场关系', nodes: [ { id: 'c004_n06', title: '与同事建立信任', subtitle: '如何建立良好关系', duration: 6 }, { id: 'c004_n07', title: '与领导沟通', subtitle: '如何向上管理', duration: 7 }, { id: 'c004_n08', title: '参与团队讨论', subtitle: '如何在会议中发言', duration: 5 }, { id: 'c004_n09', title: '建立你的职场网络', subtitle: '拓展人脉的技巧', duration: 8 }, { id: 'c004_n10', title: '处理职场冲突', subtitle: '如何应对矛盾', duration: 6 }, ], }, { id: 'c004_ch03', title: '第三章:职场进阶', nodes: [ { id: 'c004_n11', title: '主动争取机会', subtitle: '如何表达你的意愿', duration: 7 }, { id: 'c004_n12', title: '展示你的价值', subtitle: '让成果被看见', duration: 6 }, { id: 'c004_n13', title: '建立个人品牌', subtitle: '打造你的专业形象', duration: 8 }, { id: 'c004_n14', title: '处理职场压力', subtitle: '如何保持平衡', duration: 5 }, { id: 'c004_n15', title: '持续成长', subtitle: '职场中的学习路径', duration: 7 }, ], }, { id: 'c004_ch04', title: '第四章:特殊场景应对', nodes: [ { id: 'c004_n16', title: '面试中的表现', subtitle: '如何展现你的优势', duration: 6 }, { id: 'c004_n17', title: '公开演讲', subtitle: '克服演讲恐惧', duration: 7 }, { id: 'c004_n18', title: '职场社交活动', subtitle: '如何在聚会中自在', duration: 5 }, { id: 'c004_n19', title: '拒绝不合理要求', subtitle: '保护自己的边界', duration: 6 }, { id: 'c004_n20', title: '成为职场中的自己', subtitle: '保持真实的自我', duration: 8 }, ], }, ], }, { id: 'course_005', title: '如何不焦虑', subtitle: 'i人女孩的情绪管理课', description: '从理解焦虑到管理情绪,从自我关怀到建立安全感。帮助内向女孩建立内心的平静,找到属于自己的节奏。', coverImage: 'leaf.fill', chapters: [ { id: 'c005_ch01', title: '第一章:理解焦虑', nodes: [ { id: 'c005_n01', title: '焦虑从何而来?', subtitle: '理解焦虑的根源', duration: 6 }, { id: 'c005_n02', title: 'i人的焦虑特点', subtitle: '内向者的情绪模式', duration: 7 }, { id: 'c005_n03', title: '过度思考的陷阱', subtitle: '如何停止内耗', duration: 5 }, { id: 'c005_n04', title: '完美主义的负担', subtitle: '放下过高的期待', duration: 6 }, { id: 'c005_n05', title: '社交焦虑的本质', subtitle: '理解你的恐惧', duration: 8 }, ], }, { id: 'c005_ch02', title: '第二章:情绪管理技巧', nodes: [ { id: 'c005_n06', title: '呼吸练习', subtitle: '快速缓解焦虑', duration: 5 }, { id: 'c005_n07', title: '正念冥想', subtitle: '回到当下', duration: 7 }, { id: 'c005_n08', title: '情绪日记', subtitle: '记录你的感受', duration: 6 }, { id: 'c005_n09', title: '身体扫描', subtitle: '连接身体与情绪', duration: 5 }, { id: 'c005_n10', title: '建立情绪工具箱', subtitle: '实用的情绪管理方法', duration: 8 }, ], }, { id: 'c005_ch03', title: '第三章:建立安全感', nodes: [ { id: 'c005_n11', title: '自我关怀', subtitle: '如何善待自己', duration: 6 }, { id: 'c005_n12', title: '建立支持系统', subtitle: '找到你的后盾', duration: 7 }, { id: 'c005_n13', title: '设定合理边界', subtitle: '保护你的能量', duration: 5 }, { id: 'c005_n14', title: '接受不完美', subtitle: '允许自己犯错', duration: 6 }, { id: 'c005_n15', title: '建立日常仪式', subtitle: '创造稳定感', duration: 8 }, ], }, { id: 'c005_ch04', title: '第四章:长期成长', nodes: [ { id: 'c005_n16', title: '改变思维模式', subtitle: '从消极到积极', duration: 7 }, { id: 'c005_n17', title: '建立自信', subtitle: '相信自己的力量', duration: 6 }, { id: 'c005_n18', title: '处理压力', subtitle: '如何应对生活压力', duration: 5 }, { id: 'c005_n19', title: '寻找意义', subtitle: '找到生活的方向', duration: 8 }, { id: 'c005_n20', title: '持续成长', subtitle: '成为更好的自己', duration: 7 }, ], }, ], }, { id: 'course_006', title: '如何建立自信', subtitle: 'i人女孩的自信成长课', description: '从理解自己到接纳自己,从建立自信到展现魅力。帮助内向女孩找到内在的力量,成为自信的自己。', coverImage: 'star.fill', chapters: [ { id: 'c006_ch01', title: '第一章:理解自信', nodes: [ { id: 'c006_n01', title: '什么是真正的自信?', subtitle: '重新定义自信', duration: 6 }, { id: 'c006_n02', title: '自信与自负的区别', subtitle: '理解自信的本质', duration: 5 }, { id: 'c006_n03', title: 'i人的自信优势', subtitle: '发现你的独特魅力', duration: 7 }, { id: 'c006_n04', title: '自信的障碍', subtitle: '什么在阻止你自信', duration: 6 }, { id: 'c006_n05', title: '从自卑到自信', subtitle: '改变的起点', duration: 8 }, ], }, { id: 'c006_ch02', title: '第二章:建立内在自信', nodes: [ { id: 'c006_n06', title: '认识你的优势', subtitle: '发现自己的闪光点', duration: 6 }, { id: 'c006_n07', title: '接受不完美', subtitle: '允许自己犯错', duration: 5 }, { id: 'c006_n08', title: '建立自我价值感', subtitle: '相信自己的价值', duration: 7 }, { id: 'c006_n09', title: '停止自我批评', subtitle: '如何善待自己', duration: 6 }, { id: 'c006_n10', title: '培养自我肯定', subtitle: '每天给自己鼓励', duration: 8 }, ], }, { id: 'c006_ch03', title: '第三章:展现自信', nodes: [ { id: 'c006_n11', title: '身体语言的力量', subtitle: '如何展现自信', duration: 6 }, { id: 'c006_n12', title: '声音的力量', subtitle: '如何自信地说话', duration: 7 }, { id: 'c006_n13', title: '眼神交流', subtitle: '建立连接的方式', duration: 5 }, { id: 'c006_n14', title: '表达你的观点', subtitle: '如何自信地发言', duration: 8 }, { id: 'c006_n15', title: '处理质疑', subtitle: '如何应对挑战', duration: 6 }, ], }, { id: 'c006_ch04', title: '第四章:持续成长', nodes: [ { id: 'c006_n16', title: '从小事开始', subtitle: '建立自信的日常', duration: 5 }, { id: 'c006_n17', title: '走出舒适圈', subtitle: '挑战自己的边界', duration: 7 }, { id: 'c006_n18', title: '从失败中学习', subtitle: '把挫折变成成长', duration: 6 }, { id: 'c006_n19', title: '建立支持系统', subtitle: '找到你的后盾', duration: 8 }, { id: 'c006_n20', title: '成为自信的自己', subtitle: '持续成长的力量', duration: 7 }, ], }, ], }, { id: 'course_007', title: '如何拒绝他人', subtitle: 'i人女孩的边界建立课', description: '从理解边界到建立边界,从学会拒绝到维护关系。帮助内向女孩建立健康的边界,保护自己的能量。', coverImage: 'hand.raised.fill', chapters: [ { id: 'c007_ch01', title: '第一章:理解边界', nodes: [ { id: 'c007_n01', title: '什么是边界?', subtitle: '理解边界的概念', duration: 5 }, { id: 'c007_n02', title: '为什么边界很重要', subtitle: '边界对i人的意义', duration: 6 }, { id: 'c007_n03', title: '边界与自私的区别', subtitle: '理解健康的边界', duration: 7 }, { id: 'c007_n04', title: 'i人为什么难以拒绝', subtitle: '理解你的困难', duration: 6 }, { id: 'c007_n05', title: '边界的好处', subtitle: '建立边界后的改变', duration: 8 }, ], }, { id: 'c007_ch02', title: '第二章:学会说"不"', nodes: [ { id: 'c007_n06', title: '拒绝的艺术', subtitle: '如何优雅地拒绝', duration: 6 }, { id: 'c007_n07', title: '拒绝的句式', subtitle: '实用的拒绝技巧', duration: 5 }, { id: 'c007_n08', title: '不需要解释', subtitle: '拒绝不需要理由', duration: 7 }, { id: 'c007_n09', title: '处理对方的反应', subtitle: '如何应对压力', duration: 6 }, { id: 'c007_n10', title: '坚持你的决定', subtitle: '如何不被说服', duration: 8 }, ], }, { id: 'c007_ch03', title: '第三章:不同场景的拒绝', nodes: [ { id: 'c007_n11', title: '拒绝工作请求', subtitle: '职场中的边界', duration: 6 }, { id: 'c007_n12', title: '拒绝社交邀请', subtitle: '保护你的能量', duration: 5 }, { id: 'c007_n13', title: '拒绝借钱', subtitle: '财务边界', duration: 7 }, { id: 'c007_n14', title: '拒绝情感绑架', subtitle: '情感边界', duration: 6 }, { id: 'c007_n15', title: '拒绝不合理要求', subtitle: '维护你的权利', duration: 8 }, ], }, { id: 'c007_ch04', title: '第四章:维护边界', nodes: [ { id: 'c007_n16', title: '建立边界后的关系', subtitle: '如何维护关系', duration: 6 }, { id: 'c007_n17', title: '处理边界冲突', subtitle: '当边界被挑战时', duration: 7 }, { id: 'c007_n18', title: '重新建立边界', subtitle: '如何修复边界', duration: 5 }, { id: 'c007_n19', title: '边界与同理心', subtitle: '保持善良与边界', duration: 8 }, { id: 'c007_n20', title: '成为边界的主人', subtitle: '持续维护的力量', duration: 7 }, ], }, ], }, { id: 'course_008', title: '如何独处', subtitle: 'i人女孩的独处智慧课', description: '从理解独处到享受独处,从孤独到自由。帮助内向女孩发现独处的美好,建立与自己的深度连接。', coverImage: 'moon.stars.fill', chapters: [ { id: 'c008_ch01', title: '第一章:理解独处', nodes: [ { id: 'c008_n01', title: '独处与孤独的区别', subtitle: '理解独处的本质', duration: 6 }, { id: 'c008_n02', title: 'i人为什么需要独处', subtitle: '独处对i人的意义', duration: 7 }, { id: 'c008_n03', title: '独处的心理益处', subtitle: '独处带来的好处', duration: 5 }, { id: 'c008_n04', title: '社会对独处的误解', subtitle: '打破刻板印象', duration: 6 }, { id: 'c008_n05', title: '独处的不同形式', subtitle: '找到你的独处方式', duration: 8 }, ], }, { id: 'c008_ch02', title: '第二章:享受独处', nodes: [ { id: 'c008_n06', title: '独处的活动清单', subtitle: '一个人可以做什么', duration: 6 }, { id: 'c008_n07', title: '独处时的自我关怀', subtitle: '如何善待自己', duration: 7 }, { id: 'c008_n08', title: '独处与创造力', subtitle: '激发你的灵感', duration: 5 }, { id: 'c008_n09', title: '独处与反思', subtitle: '深入思考的时间', duration: 6 }, { id: 'c008_n10', title: '独处与成长', subtitle: '自我提升的时光', duration: 8 }, ], }, { id: 'c008_ch03', title: '第三章:独处的挑战', nodes: [ { id: 'c008_n11', title: '处理独处的焦虑', subtitle: '如何克服不安', duration: 6 }, { id: 'c008_n12', title: '独处与社交的平衡', subtitle: '找到你的节奏', duration: 7 }, { id: 'c008_n13', title: '独处时的情绪管理', subtitle: '如何处理情绪', duration: 5 }, { id: 'c008_n14', title: '独处与外界压力', subtitle: '如何应对质疑', duration: 6 }, { id: 'c008_n15', title: '从独处到连接', subtitle: '独处后的社交', duration: 8 }, ], }, { id: 'c008_ch04', title: '第四章:独处的智慧', nodes: [ { id: 'c008_n16', title: '独处与自我认知', subtitle: '了解真实的自己', duration: 6 }, { id: 'c008_n17', title: '独处与内心平静', subtitle: '找到内心的宁静', duration: 7 }, { id: 'c008_n18', title: '独处与决策', subtitle: '独立思考的力量', duration: 5 }, { id: 'c008_n19', title: '独处与目标', subtitle: '规划你的未来', duration: 8 }, { id: 'c008_n20', title: '成为独处的自己', subtitle: '享受独处的自由', duration: 7 }, ], }, ], }, ]; // ========== 创建所有课程 ========== const createdCourses = []; for (const courseData of coursesData) { // 计算总节点数 const totalNodes = courseData.chapters.reduce((sum, ch) => sum + ch.nodes.length, 0); const course = await prisma.course.upsert({ where: { id: courseData.id }, update: { title: courseData.title, subtitle: courseData.subtitle, description: courseData.description, coverImage: courseData.coverImage || null, totalNodes, }, create: { id: courseData.id, title: courseData.title, subtitle: courseData.subtitle, description: courseData.description, coverImage: courseData.coverImage || null, totalNodes, }, }); createdCourses.push(course); console.log(`✅ 创建课程: ${course.title} (${totalNodes} 个节点)`); // 创建章节和节点 let globalNodeOrder = 1; const allNodes = []; for (let chapterIndex = 0; chapterIndex < courseData.chapters.length; chapterIndex++) { const chapterData = courseData.chapters[chapterIndex]; const chapterOrder = chapterIndex + 1; // 创建章节 const chapter = await prisma.courseChapter.upsert({ where: { courseId_orderIndex: { courseId: course.id, orderIndex: chapterOrder, }, }, update: { title: chapterData.title, }, create: { id: chapterData.id, courseId: course.id, title: chapterData.title, orderIndex: chapterOrder, }, }); // 创建节点 for (const nodeData of chapterData.nodes) { const node = await prisma.courseNode.upsert({ where: { id: nodeData.id }, update: { title: nodeData.title, subtitle: nodeData.subtitle, duration: nodeData.duration, orderIndex: globalNodeOrder, chapterId: chapter.id, }, create: { id: nodeData.id, courseId: course.id, chapterId: chapter.id, title: nodeData.title, subtitle: nodeData.subtitle, duration: nodeData.duration, orderIndex: globalNodeOrder++, }, }); allNodes.push(node); } } // 为所有节点创建基础幻灯片 for (const node of allNodes) { const slides = [ { id: `${node.id}_slide_01`, nodeId: node.id, slideType: 'text', orderIndex: 1, content: { title: node.title, paragraphs: [ `欢迎学习:${node.title}`, node.subtitle || '开始你的成长之旅', '让我们深入探索这个主题,理解其中的智慧。', ], }, effect: 'fade_in', }, { id: `${node.id}_slide_02`, nodeId: node.id, slideType: 'text', orderIndex: 2, content: { title: '核心概念', paragraphs: [ '每一个成长节点,都蕴含着深刻的洞察。', '通过系统化的学习,我们可以逐步提升自己的能力。', '关键是要保持开放的心态,持续学习和反思。', ], }, effect: 'fade_in', }, { id: `${node.id}_slide_03`, nodeId: node.id, slideType: 'text', orderIndex: 3, content: { title: '实践要点', paragraphs: [ '1. 理解核心概念', '2. 应用到实际场景', '3. 持续反思和优化', ], }, effect: 'fade_in', }, { id: `${node.id}_slide_04`, nodeId: node.id, slideType: 'text', orderIndex: 4, content: { title: '本节小结', paragraphs: [ `你已经完成了「${node.title}」的学习。`, '记住:成长是一个持续的过程,', '每天进步一点点,最终会带来巨大的改变。', ], }, effect: 'fade_in', }, ]; for (const slideData of slides) { await prisma.nodeSlide.upsert({ where: { id: slideData.id }, update: { slideType: slideData.slideType, orderIndex: slideData.orderIndex, content: slideData.content as any, effect: slideData.effect, }, create: { id: slideData.id, nodeId: slideData.nodeId, slideType: slideData.slideType, orderIndex: slideData.orderIndex, content: slideData.content as any, effect: slideData.effect, }, }); } } console.log(`✅ 为课程 ${course.title} 创建了 ${allNodes.length} 个节点和 ${allNodes.length * 4} 个幻灯片`); } // ========== 清理所有学习进度数据 ========== console.log('\n📊 清理所有学习进度数据...'); await prisma.userLearningProgress.deleteMany({}); console.log('✅ 已清理所有学习进度数据,所有节点回到初始状态(未开始/锁定)'); console.log('\n🎉 所有课程测试数据创建完成!'); console.log('\n📝 测试账号(所有账号验证码均为: 123456):'); console.log(' 测试用户1(非会员,未内购): 13800000001'); console.log(' 测试用户2(非会员,未内购): 13800000002'); console.log(' 测试用户3(非会员,未内购): 13800000003'); console.log(' 测试用户4(非会员,未内购): 13800000004'); console.log('\n📚 创建的课程:'); for (const course of createdCourses) { console.log(` - ${course.title}: ${course.totalNodes} 个节点`); } console.log('\n💡 状态说明:'); console.log(' - 所有用户都是非会员(isPro = false)'); console.log(' - 所有学习进度已清空'); console.log(' - 每个课程的前 2 个节点可访问(not_started 状态)'); console.log(' - 第 3 个节点开始锁定(locked 状态,需要会员)'); } main() .catch((e) => { console.error('❌ Seed 执行失败:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });