001project_wildgrowth/backend/prisma/seed.ts

700 lines
31 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

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

import { 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();
});