From 5ddd7e3a822da92f31431a4555eef0d7a64d5d10 Mon Sep 17 00:00:00 2001 From: TradeMate Dev Date: Tue, 23 Jun 2026 21:23:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E5=B1=82=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20=E2=80=94=20=E6=96=B0=E5=A2=9E=E5=9B=BD=E5=86=85?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=A7=8D=E5=AD=90=E8=84=9A=E6=9C=AC=20+=20sc?= =?UTF-8?q?hema=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schema.prisma: Prompt.content 改为 @db.Text 支持长文本 - seed-enrich.ts: deleteMany()→upsert by name 防止重跑时清除数据 - seed-expand.ts: 扩展 prompts 至 35 条 + 课程章节扩充 - seed-tools-affiliate.ts: 新增 8 个国内 AI 工具(豆包/通义千问/文心一言/ WPS AI/Canva/腾讯元宝/讯飞星火/剪映),5 个带返佣链接 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- backend/prisma/schema.prisma | 2 +- backend/prisma/seed-enrich.ts | 12 ++- backend/prisma/seed-expand.ts | 131 +++++++++++++++++++++++++ backend/prisma/seed-tools-affiliate.ts | 111 +++++++++++++++++++++ 4 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 backend/prisma/seed-expand.ts create mode 100644 backend/prisma/seed-tools-affiliate.ts diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 83d5dba..0eba6e2 100755 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -170,7 +170,7 @@ model LearnRecord { model Prompt { id Int @id @default(autoincrement()) title String - content String + content String @db.Text description String? categoryId Int? tags String? diff --git a/backend/prisma/seed-enrich.ts b/backend/prisma/seed-enrich.ts index d1d3f96..541c55c 100644 --- a/backend/prisma/seed-enrich.ts +++ b/backend/prisma/seed-enrich.ts @@ -339,9 +339,8 @@ async function main() { } console.log(` ✓ ${banners.length} banners`); - // ===== 6. More Tools (6 more) ===== - console.log('Seeding additional tools...'); - await prisma.tool.deleteMany(); + // ===== 6. Tools (6 flagship, upsert by name) ===== + console.log('Seeding tools...'); const tools = [ { name: 'DeepSeek', description: '深度求索开发的 AI 大模型,中文能力突出,API 价格极低。支持开源模型私有化部署,适合数据敏感场景。', url: 'https://chat.deepseek.com', categoryId: defaultCatIds['ai-tools'], tags: '对话,开源,中文,低成本', isFeatured: true, status: 'PUBLISHED' as const }, { name: 'Midjourney', description: '领先的 AI 图像生成工具,以高质量艺术风格著称。支持文本生成图像、图像变体、风格迁移等。', url: 'https://midjourney.com', categoryId: defaultCatIds['ai-tools'], tags: '图像,创意,设计', isFeatured: true, status: 'PUBLISHED' as const }, @@ -351,7 +350,12 @@ async function main() { { name: 'Runway Gen-4', description: '领先的 AI 视频生成工具,支持文本生成视频、图像生成视频、视频编辑等。好莱坞级视频制作能力。', url: 'https://runwayml.com', categoryId: defaultCatIds['ai-tools'], tags: '视频,创意,生成', status: 'PUBLISHED' as const }, ]; for (const t of tools) { - await prisma.tool.create({ data: t }); + const existing = await prisma.tool.findFirst({ where: { name: t.name } }); + if (existing) { + await prisma.tool.update({ where: { id: existing.id }, data: t }); + } else { + await prisma.tool.create({ data: t }); + } } console.log(` ✓ ${tools.length} tools`); diff --git a/backend/prisma/seed-expand.ts b/backend/prisma/seed-expand.ts new file mode 100644 index 0000000..1011ced --- /dev/null +++ b/backend/prisma/seed-expand.ts @@ -0,0 +1,131 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('Expanding content...\n'); + + // ===== 1. Add more prompts (to reach 30+) ===== + console.log('Seeding additional prompts...'); + + const catIds: Record = {}; + const cats = await prisma.category.findMany(); + for (const c of cats) { + catIds[c.slug] = c.id; + } + + const additionalPrompts = [ + // Creative Design + { title: 'Logo 设计需求说明生成', content: '请帮我生成一份 AI Logo 设计需求说明。\n\n品牌名称:[品牌名]\n行业:[行业]\n品牌调性:[现代/传统/科技/自然]\n偏好颜色:[颜色/风格]\n\n请输出:\n1. 3 个设计方向关键词\n2. 详细的设计需求描述(供设计师/Midjourney 使用)\n3. 参考风格建议\n4. 避免的设计风格', description: '用 AI 生成专业的 Logo 设计需求说明', categoryId: catIds['creative-design'], tags: '设计,Logo,品牌', model: '通用', status: 'PUBLISHED' as const }, + { title: '视频脚本生成器', content: '请为我生成一个短视频脚本。\n\n主题:[视频主题]\n目标受众:[描述受众]\n视频时长:[15秒/30秒/60秒]\n风格:[教育/搞笑/感人/促销]\n平台:[抖音/小红书/YouTube Shorts]\n\n脚本结构:\n1. 前 3 秒钩子(吸引注意力)\n2. 正文内容(3-5 个要点)\n3. 结尾 Call-to-Action\n4. 画面描述和字幕建议', description: 'AI 帮你写短视频脚本', categoryId: catIds['creative-design'], tags: '视频,脚本,短视频,抖音', model: 'GPT-5', status: 'PUBLISHED' as const }, + { title: '配色方案生成器', content: '请根据以下信息生成配色方案。\n\n品牌/项目:[名称]\n行业:[行业]\n基调:[活泼/专业/奢华/清新]\n主要受众:[用户群体]\n\n请生成:\n1. 主色(1 个 HEX 色值)\n2. 辅助色(2-3 个)\n3. 强调色(1-2 个)\n4. 背景色(1-2 个)\n5. 文字色(深色/浅色各 1 个)\n6. 这套方案的心理学依据', description: 'AI 帮你设计配色方案', categoryId: catIds['creative-design'], tags: '设计,配色,UI', model: '通用', status: 'PUBLISHED' as const }, + + // Office Productivity + { title: '会议议程生成器', content: '请帮我制定一个[会议主题]的议程。\n\n会议主题:[描述]\n参会人员:[角色列表]\n会议时长:[多少分钟]\n会议目标:[要达成的目标]\n\n请输出:\n1. 会议目标(清晰可衡量)\n2. 时间分配表(每个环节的时长和负责人)\n3. 前置准备工作\n4. 预期产出\n5. 跟进方式', description: 'AI 帮你制定高效的会议议程', categoryId: catIds['office-productivity'], tags: '会议,效率,办公', model: '通用', status: 'PUBLISHED' as const }, + { title: 'OKR 制定助手', content: '请帮我制定 OKR(目标和关键结果)。\n\n团队/个人:[名称]\n周期:[2026 Q3/Q4/年度]\n公司目标:[如是团队 OKR,需对齐的上级目标]\n\n请输出:\n1. 2-3 个 Objectives(目标,有挑战性但可达)\n2. 每个 O 下 3-4 个 Key Results(可量化)\n3. 每个 KR 的信心指数(5/10 → 10/10)\n4. KR 的衡量标准', description: 'AI 辅助制定 OKR', categoryId: catIds['office-productivity'], tags: 'OKR,目标管理,效率', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: '项目复盘模板', content: '请根据以下信息生成项目复盘报告模板。\n\n项目名称:[项目名]\n项目周期:[起止时间]\n团队成员:[角色列表]\n\n请按以下结构输出复盘框架:\n1. 项目概况(目标、范围、里程碑)\n2. 数据回顾(完成度、进度偏差、质量指标)\n3. 亮点(What went well)\n4. 改进点(What could be improved)\n5. 行动计划(具体负责人和截止时间)\n6. 经验沉淀(可复用的最佳实践)', description: 'AI 帮你做项目复盘', categoryId: catIds['office-productivity'], tags: '项目,复盘,管理', model: '通用', status: 'PUBLISHED' as const }, + + // Programming + { title: 'Python 脚本生成助手', content: '请帮我写一个 Python 脚本来完成以下任务。\n\n任务描述:[详细描述]\n输入格式:[CSV/JSON/...]\n输出格式:[CSV/JSON/打印/...]\n依赖要求:[允许/不允许使用哪些库]\n\n请生成:\n1. 完整的 Python 脚本\n2. 使用方法和参数说明\n3. 错误处理逻辑\n4. 测试用例示例', description: 'AI 帮你写 Python 工具脚本', categoryId: catIds['programming'], tags: 'Python,脚本,自动化', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: 'React 组件生成器', content: '请帮我生成一个 React 组件。\n\n组件描述:[组件功能]\nProps:[输入参数列表]\nUI 框架:[shadcn/ui / Material UI / Antd / 无]\n状态管理:[useState / zustand / redux / 无]\n\n请生成:\n1. 完整的组件代码(TypeScript)\n2. Props 类型定义\n3. 使用示例\n4. 边缘情况处理', description: 'AI 帮你生成 React 组件', categoryId: catIds['programming'], tags: 'React,组件,前端,TypeScript', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: 'Git 命令顾问', content: '请告诉我如何用 Git 完成以下操作。\n\n我需要:[描述你要用 Git 做什么,如:撤销上 3 次提交但保留工作区修改]\n\n请给出:\n1. 具体的 Git 命令序列\n2. 每个命令的作用\n3. 是否有风险(如:会丢失未提交的修改)\n4. 更安全的替代方案(如果有)', description: 'AI Git 命令顾问', categoryId: catIds['programming'], tags: 'Git,版本控制,开发', model: '通用', status: 'PUBLISHED' as const }, + + // Prompt Engineering + { title: 'Prompt 优化器', content: '请帮我优化以下提示词,使其效果更好。\n\n原始提示词:\n[粘贴你的原始提示词]\n\n使用场景:[描述你用它做什么]\n目前问题:[效果不好/结果不稳定/格式不对]\n\n请输出:\n1. 优化后的提示词\n2. 做了哪些改进(角色设定/格式约束/示例添加等)\n3. 为什么这样改有效\n4. 备选方案', description: 'AI 帮你优化提示词', categoryId: catIds['prompt-engineering'], tags: 'Prompt,提示词,优化', model: 'GPT-5', status: 'PUBLISHED' as const }, + { title: '结构化输出生成器', content: '请生成一个提示词模板,让 AI 总是按指定结构输出。\n\n任务:[AI 要完成的任务]\n输出字段:\n- [字段1]:[类型和说明]\n- [字段2]:[类型和说明]\n- [字段3]:[类型和说明]\n\n请生成:\n1. 完整的系统提示词(System Prompt)\n2. 输出格式定义(JSON Schema 或 Markdown 模板)\n3. 示例输出\n4. 处理 AI 不遵循格式的降级策略', description: 'AI 帮你设计结构化输出模板', categoryId: catIds['prompt-engineering'], tags: 'Prompt,结构化,JSON,输出', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: 'Prompt 链设计器', content: '请帮我设计一个多步骤的 Prompt 链(Chain of Prompts)。\n\n最终目标:[描述最终要完成的任务]\n\n请设计:\nStep 1: [分析/理解] - 提示词 + 预期输出\nStep 2: [规划/构思] - 提示词 + 预期输出\nStep 3: [生成/执行] - 提示词 + 预期输出\nStep 4: [优化/完善] - 提示词 + 预期输出\n\n每个 Step 包含:\n- 提示词内容\n- 输入来源(上一步的输出)\n- 输出格式\n- 质量检查方式', description: 'AI 设计多步骤 Prompt 工作流', categoryId: catIds['prompt-engineering'], tags: 'Prompt链,工作流,高级', model: 'GPT-5', status: 'PUBLISHED' as const }, + + // AI Basics category + { title: 'AI 工具选型指南', content: '请帮我选择最适合的 AI 工具。\n\n使用场景:[描述你要用 AI 做什么]\n预算:[每月预算]\n技术能力:[无/基础/中级/高级]\n主要需求:[功能列表]\n\n请推荐:\n1. 最佳选择(推荐工具 + 理由)\n2. 性价比选择(如果预算有限)\n3. 免费替代方案\n4. 多工具组合建议', description: 'AI 帮你选合适的 AI 工具', categoryId: catIds['ai-basics'], tags: 'AI,选型,工具推荐', model: '通用', status: 'PUBLISHED' as const }, + { title: 'AI 风险自查表', content: '请帮我评估使用 [AI 工具/模型] 的潜在风险。\n\n使用的 AI:\n用途:\n涉及数据类型:[公开/内部/机密/个人隐私]\n\n请评估以下风险:\n1. 数据隐私风险(数据是否会上传到第三方)\n2. 输出可靠性风险(幻觉倾向)\n3. 合规风险(是否符合行业法规)\n4. 供应商锁定风险\n5. 降低风险的措施建议', description: 'AI 使用风险评估', categoryId: catIds['ai-basics'], tags: 'AI,风险,安全,合规', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: 'AI 学习路径规划', content: '请帮我制定一个 AI 学习路径。\n\n当前水平:[零基础/有编程基础/有 ML 基础]\n学习目标:[想成为 AI 产品经理/AI 工程师/AI 应用开发者]\n可用时间:[每周多少小时]\n学习周期:[几个月]\n\n请输出:\n1. 按月划分的学习路线图\n2. 每月核心学习目标\n3. 推荐课程/资源(优先免费)\n4. 实践项目建议\n5. 常见误区提醒', description: 'AI 帮你规划 AI 学习路径', categoryId: catIds['ai-basics'], tags: 'AI,学习,路径,教程', model: '通用', status: 'PUBLISHED' as const }, + + // Education + { title: '教案生成助手', content: '请帮我生成一份教案。\n\n课程主题:[主题]\n适用年级/对象:[年级或人群]\n课时长度:[多少分钟]\n学生基础:[已有知识]\n\n教案结构:\n1. 教学目标(知识/技能/素养三个维度)\n2. 教学重难点\n3. 教学过程(导入→新授→练习→总结,含时间分配)\n4. 教学资源清单\n5. 评价方式\n6. 备选活动(如果时间有余)', description: 'AI 帮你写教案', categoryId: catIds['education'], tags: '教育,教案,教学', model: 'GPT-5', status: 'PUBLISHED' as const }, + { title: '考试题生成器', content: '请根据以下内容生成考试题目。\n\n知识点:[列出知识点]\n题型:[选择题/填空题/简答题/编程题]\n难度:[简单/中等/困难]\n题量:[多少道]\n对象:[学生/求职者/培训学员]\n\n要求:\n1. 每道题附参考答案\n2. 选择题需 4 个选项\n3. 标明每题考察的知识点\n4. 简单:中等:困难 = 3:5:2 的比例', description: 'AI 自动生成考试题目', categoryId: catIds['education'], tags: '教育,考试,题目', model: 'Claude 4', status: 'PUBLISHED' as const }, + { title: '论文摘要改写', content: '请帮我改写/润色以下论文摘要。\n\n原文摘要:\n[粘贴摘要]\n\n目标期刊:[期刊名称/风格]\n字数限制:[多少字]\n是否需要突出创新点:[是/否]\n\n请输出:\n1. 改写后的摘要\n2. 改写说明(改了什么、为什么改)\n3. 关键词建议(3-5 个)\n4. 投稿建议', description: 'AI 帮你改写论文摘要', categoryId: catIds['education'], tags: '论文,学术,写作', model: 'GPT-5', status: 'PUBLISHED' as const }, + ]; + + for (const p of additionalPrompts) { + await prisma.prompt.create({ data: p }); + } + console.log(` ✓ ${additionalPrompts.length} additional prompts created`); + + // ===== 2. Expand courses to match descriptions ===== + console.log('\nSeeding additional course chapters & lessons...'); + + const [course1, course2, course3] = await prisma.course.findMany({ orderBy: { id: 'asc' } }); + + // Course 1: Prompt Engineering - Add practice chapters + const course1Ch1 = await prisma.chapter.findFirst({ where: { courseId: course1.id, sortOrder: 1 } }); + const course1Ch2 = await prisma.chapter.findFirst({ where: { courseId: course1.id, sortOrder: 2 } }); + + if (course1Ch2) { + // Add Chapter 3: 实战案例(写作场景) + const ch3 = await prisma.chapter.create({ + data: { courseId: course1.id, title: '第三章:写作场景实战', sortOrder: 3, lessons: { create: [ + { title: 'AI 辅助博客文章写作', content: '# AI 辅助博客文章写作\n\n## 场景描述\n作为技术博主,每周需要产出 2-3 篇高质量文章。AI 可以帮助你完成选题、提纲、初稿和润色全流程。\n\n## Prompt 模板\n\n```\n你是一位资深技术博主,擅长用通俗易懂的语言解释复杂概念。\n\n请帮我写一篇关于[主题]的博客文章。\n\n目标读者:[描述读者背景]\n文章目的:[教学/观点/教程]\n字数:约 1500 字\n\n要求:\n1. 开头用一个引人入胜的问题或故事\n2. 正文分 3-4 个小节,每节有小标题\n3. 包含实际的代码/案例\n4. 结尾有总结和行动建议\n```\n\n## 实战技巧\n\n1. **选题阶段**:让 AI 帮你想 10 个选题,选最有共鸣的\n2. **提纲阶段**:先让 AI 出提纲,你调整后再写正文\n3. **润色阶段**:完成初稿后,让 AI 优化可读性和 SEO\n\n## 练习\n\n用上面的模板,让 AI 写一篇"2026 年 AI 编程工具对比"的博客文章。', sortOrder: 1, status: 'PUBLISHED' as const }, + { title: 'AI 辅助营销文案写作', content: '# AI 辅助营销文案写作\n\n## 场景描述\n营销文案的 ROI 直接取决于文案质量。AI 可以帮助你快速生成 A/B 测试文案、优化转化率。\n\n## 核心框架:AIDA\n\n- **Attention**(注意):吸引眼球的标题\n- **Interest**(兴趣):让读者产生兴趣\n- **Desire**(欲望):激发购买欲望\n- **Action**(行动):明确的 Call-to-Action\n\n## Prompt 模板\n\n```\n你是一位资深文案撰稿人,擅长 AIDA 框架。\n\n产品:[产品名]\n目标用户:[用户画像]\n核心卖点:[3 个卖点]\n\n请用 AIDA 框架写一篇推广文案:\n1. 3 个备选标题(制造好奇或紧迫感)\n2. 正文(200 字,引发情感共鸣)\n3. 行动号召(紧迫感 + 低门槛)\n```\n\n## 练习\n\n选择一款你熟悉的产品,用 AIDA 框架让 AI 生成 3 版不同风格的推广文案。', sortOrder: 2, status: 'PUBLISHED' as const }, + ]}}, + }); + console.log(` ✓ Added chapter "写作场景实战" to "${course1.title}"`); + + // Chapter 4: 实战案例(编程与分析) + const ch4 = await prisma.chapter.create({ + data: { courseId: course1.id, title: '第四章:编程与分析场景实战', sortOrder: 4, lessons: { create: [ + { title: 'AI 辅助代码生成与调试', content: '# AI 辅助代码生成与调试\n\n## 场景描述\nAI 编程助手已成为 2026 年开发者的标配工具。掌握与 AI 协作编程的技巧,可以提升 2-3 倍开发效率。\n\n## Prompt 模式\n\n### 模式 1:从零生成\n```\n请用 [语言] 写一个 [功能]。[详细描述输入输出和约束]\n```\n\n### 模式 2:调试错误\n```\n以下代码报错 [错误信息],请帮我找出原因并修复:\n[粘贴代码]\n```\n\n### 模式 3:代码优化\n```\n请优化以下代码的性能和可读性:\n[粘贴代码]\n要求:[性能/可读性/安全性]\n```\n\n## 实战技巧\n\n1. **小步迭代**:每次只让 AI 写一个函数,而不是整个系统\n2. **明确约束**:说明语言版本、框架、性能要求\n3. **审查输出**:AI 代码不是 100% 可靠,必须审查\n\n## 练习\n\n让 AI 写一个 Python 函数:从 CSV 文件读取销售数据,按月份汇总,输出为 JSON 格式。', sortOrder: 1, status: 'PUBLISHED' as const }, + { title: 'AI 辅助数据分析报告', content: '# AI 辅助数据分析报告\n\n## 场景描述\n数据分析是 AI 最擅长的领域之一。用自然语言就能完成过去需要半天才能完成的数据分析工作。\n\n## 工作流\n\n1. **数据导入**:上传 CSV/Excel 或粘贴数据\n2. **AI 探索**:"分析这份数据的总体趋势"、"找出异常值"\n3. **深度分析**:"按地区分组计算增长率"\n4. **可视化**:"生成趋势图,按季度分面"\n5. **报告生成**:"写一份数据分析报告,包含关键发现和建议"\n\n## Prompt 模板\n\n```\n你是一位数据分析师。以下是 [数据集描述] 的数据:\n\n[粘贴数据或描述]\n\n请帮我:\n1. 数据概览(行数、列数、缺失值、基本统计量)\n2. 发现 3 个最重要的洞察\n3. 给出 2 个可执行的建议\n4. 如果要可视化,推荐哪种图表类型\n```\n\n## 练习\n\n找一份你手头的数据集,让 AI 生成分析报告。注意对比 AI 的分析结果和你的直觉判断是否一致。', sortOrder: 2, status: 'PUBLISHED' as const }, + ]}}, + }); + console.log(` ✓ Added chapter "编程与分析场景实战" to "${course1.title}"`); + } + + // Course 2: AI Office - Add missing meeting & email chapters + const course2Ch2 = await prisma.chapter.findFirst({ where: { courseId: course2.id, sortOrder: 2 } }); + + if (course2Ch2) { + // Add Chapter 3: 会议管理 + const ch3 = await prisma.chapter.create({ + data: { courseId: course2.id, title: '第三章:会议管理', sortOrder: 3, lessons: { create: [ + { title: 'AI 辅助会前准备', content: '# AI 辅助会前准备\n\n## 场景描述\n低效的会议是职场最大的时间杀手。AI 可以帮助你做好会前准备,让会议时间减半、效率翻倍。\n\n## Prompt 模板:生成会议议程\n\n```\n请为以下会议生成议程:\n\n会议主题:[主题]\n参会人:[角色列表]\n时长:[例如 60 分钟]\n目标:[例如:确定 Q3 产品路线图]\n\n议程要求:\n1. 每个环节标注时间(含 buffer)\n2. 标注每个环节的负责人\n3. 标注前置准备工作\n4. 标注期望产出\n```\n\n## 其他会前任务\n\n1. **背景资料总结**:让 AI 总结上次会议的纪要\n2. **参会人角色分析**:让 AI 分析各参会人的立场和关注点\n3. **问题预演**:让 AI 模拟可能的质疑和提问\n\n## 练习\n\n用模板为你的下一次团队周会生成议程,然后对比实际会议效果。', sortOrder: 1, status: 'PUBLISHED' as const }, + { title: 'AI 会中记录与会后跟进', content: '# AI 会中记录与会后跟进\n\n## 场景描述\n好的会议记录是团队执行力的保障。AI 可以将会议录音转文字、提取行动项、自动生成会议纪要。\n\n## Prompt 模板:会议纪要生成\n\n```\n以下是本次会议的讨论内容,请帮我整理成结构化的会议纪要:\n\n[粘贴会议记录/讨论要点]\n\n请按以下结构输出:\n1. 会议信息(时间、参会人、主题)\n2. 关键讨论(每个议题的讨论摘要)\n3. 达成的共识(各方一致同意的结论)\n4. 行动项(负责人、截止时间、交付物)\n5. 下次会议计划(时间、议题)\n```\n\n## 跟进技巧\n\n1. 会后 24 小时内发出纪要\n2. 行动项标注优先级(P0/P1/P2)\n3. 下次会议前回顾上次行动项的完成情况\n\n## 练习\n\n在你下次会议后,用 AI 生成会议纪要,看是否比你手写的更完整。', sortOrder: 2, status: 'PUBLISHED' as const }, + ]}}, + }); + console.log(` ✓ Added chapter "会议管理" to "${course2.title}"`); + + // Chapter 4: 邮件处理 + const ch4 = await prisma.chapter.create({ + data: { courseId: course2.id, title: '第四章:邮件处理', sortOrder: 4, lessons: { create: [ + { title: 'AI 辅助邮件撰写与回复', content: '# AI 辅助邮件撰写与回复\n\n## 场景描述\n职场人每天平均花 2.5 小时处理邮件。AI 可以帮助你将邮件处理时间缩短 50% 以上。\n\n## Prompt 模板\n\n### 写邮件\n```\n请帮我写一封 [目的] 邮件。\n\n收件人:[角色/姓名]\n关系:[客户/同事/上级]\n核心内容:[要说什么]\n期望结果:[希望对方做什么]\n语气:[正式/半正式/友好]\n```\n\n### 回复邮件\n```\n请帮我回复以下邮件:\n\n原文:[粘贴收到的邮件]\n\n我的态度:[同意/婉拒/需要更多信息]\n额外要说的:[补充信息]\n语气:[正式/友好]\n```\n\n## 原则\n\n1. **明确主题行**:让收件人一眼知道邮件核心\n2. **结论先行**:第一句就说重点\n3. **行动项清晰**:明确告诉对方下一步\n4. **简洁**:能用 5 句说清不用 10 句', sortOrder: 1, status: 'PUBLISHED' as const }, + { title: 'AI 辅助邮件批量处理与分类', content: '# AI 辅助邮件批量处理与分类\n\n## 场景描述\n每天收到几十封邮件,哪些需要立即回复?哪些可以稍后处理?AI 可以帮助你分类和排序。\n\n## 分类 Prompt\n\n```\n请帮我分类以下邮件,标注优先级(紧急/重要/普通/可忽略)和需要的处理时间:\n\n[粘贴多封邮件内容]\n```\n\n## 批量处理工作流\n\n1. **批量分类**:让 AI 按紧急度排序所有未读邮件\n2. **自动起草**:让 AI 为每个分类生成回复草稿\n3. **人工审核**:只需要审核关键邮件,其余直接发送\n\n## 邮件自动化技巧\n\n1. 创建常用回复模板(请假、感谢、确认等)\n2. 让 AI 学习你的回复风格,保持一致性\n3. 用 AI 检查邮件语气,避免误发敏感内容\n\n## 练习\n\n整理你本周收到的 10 封邮件,让 AI 分类并排序,看是否符合你的判断。', sortOrder: 2, status: 'PUBLISHED' as const }, + ]}}, + }); + console.log(` ✓ Added chapter "邮件处理" to "${course2.title}"`); + } + + // Course 3: AI Programming - Add advanced practice chapter + const course3Ch1 = await prisma.chapter.findFirst({ where: { courseId: course3.id, sortOrder: 1 } }); + + if (course3Ch1) { + const ch2 = await prisma.chapter.create({ + data: { courseId: course3.id, title: '第二章:AI 编程高级实战', sortOrder: 2, lessons: { create: [ + { title: 'AI Agent 辅助编程——从单文件到多文件重构', content: '# AI Agent 辅助编程\n\n## 2026 年 AI 编程新范式\n\n传统 AI 编程助手是"单文件补全",2026 年的 AI Agent 能完成跨文件的重构和功能实现。\n\n## Cursor Composer(多文件编辑)\n\n在 Cursor 中按 `Ctrl+I` 打开 Composer,可以一次描述跨多个文件的改动:\n\n> "将用户模块的验证逻辑提取到独立的 `validate.ts` 文件中,更新所有引用"\n\nComposer 会自动:\n1. 创建新文件\n2. 修改引用文件\n3. 保持类型安全\n\n## Agent Mode 使用技巧\n\n1. **任务拆分**:把一个功能拆成 3-5 个原子任务\n2. **逐步确认**:每完成一个任务检查结果\n3. **上下文控制**:只给 AI 需要的文件,避免干扰\n\n## 练习\n\n选一个你项目中的模块,让 Cursor 的 Composer 将其重构为更合理的结构。', sortOrder: 1, status: 'PUBLISHED' as const }, + { title: 'AI 测试生成与代码审查', content: '# AI 测试生成与代码审查\n\n## AI 生成单元测试\n\n这是提升代码质量的杀手级应用。AI 可以自动生成的测试覆盖边界情况和异常流程。\n\n## Prompt 模板\n\n```\n请为以下函数生成全面的单元测试:\n\n[粘贴函数代码]\n\n要求:\n1. 测试正常路径\n2. 测试边界条件(空值、极限值)\n3. 测试错误处理\n4. 使用 [Jest/Vitest] 框架\n5. 包含 mock 外部依赖\n```\n\n## AI 代码审查\n\nGitHub Copilot 和 Cursor 都支持 AI 代码审查:\n\n**审查维度**:\n- 潜在 Bug 和安全漏洞\n- 性能瓶颈\n- 可读性和维护性\n- 测试覆盖率\n- 是否符合团队规范\n\n## 练习\n\n拿出你最近写的一段复杂代码,用 AI 生成测试,然后让 AI 做代码审查。对比 AI 发现的你和 AI 自己错过的点。', sortOrder: 2, status: 'PUBLISHED' as const }, + ]}}, + }); + console.log(` ✓ Added chapter "AI 编程高级实战" to "${course3.title}"`); + } + + // ===== 3. Summary ===== + const [promptCount, lessonCount, chapterCount] = await Promise.all([ + prisma.prompt.count(), + prisma.lesson.count(), + prisma.chapter.count(), + ]); + console.log(`\n✓ Expansion complete!`); + console.log(` Total prompts: ${promptCount}`); + console.log(` Total chapters: ${chapterCount}`); + console.log(` Total lessons: ${lessonCount}`); +} + +main().catch((e) => { console.error(e); process.exit(1); }); diff --git a/backend/prisma/seed-tools-affiliate.ts b/backend/prisma/seed-tools-affiliate.ts new file mode 100644 index 0000000..b41b2e1 --- /dev/null +++ b/backend/prisma/seed-tools-affiliate.ts @@ -0,0 +1,111 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('Seeding domestic AI tools with affiliate links...\n'); + + const toolsCat = await prisma.category.findUnique({ where: { slug: 'ai-tools' } }); + if (!toolsCat) { + console.error('Category "ai-tools" not found — run seed-enrich first.'); + process.exit(1); + } + const categoryId = toolsCat.id; + + const tools = [ + { + name: '豆包', + description: '字节跳动推出的 AI 对话助手,国内用户量最大的 AI 应用之一。支持文本生成、图像理解、语音对话等多种交互方式,深度整合抖音生态。', + url: 'https://www.doubao.com', + tags: '对话,中文,字节,免费', + affiliateLink: null, // 豆包暂无公开联盟计划,用普通链接 + isFeatured: true, + }, + { + name: '通义千问', + description: '阿里云推出的 AI 大模型,中文理解和生成能力领先。深度整合阿里云生态(钉钉、淘宝、阿里云控制台),提供企业级 API 服务。', + url: 'https://tongyi.aliyun.com', + tags: '中文,阿里云,企业级,API', + affiliateLink: 'https://www.aliyun.com/minisite/goods?userCode=yuzhiran', // 阿里云云大使 + isFeatured: true, + }, + { + name: '文心一言', + description: '百度最新版文心大模型,深度整合百度搜索和知识图谱。在中文知识问答和内容生成方面有独特优势,支持插件生态。', + url: 'https://yiyan.baidu.com', + tags: '中文,百度,搜索,知识', + affiliateLink: 'https://cloud.baidu.com/?from=yuzhiran', // 百度智能云推广大使 + isFeatured: true, + }, + { + name: 'WPS AI', + description: '金山办公推出的 AI 办公助手,深度集成在 WPS Office 中。支持 AI 写文档、做 PPT、分析表格、生成会议纪要等办公场景。', + url: 'https://ai.wps.cn', + tags: '办公,文档,PPT,效率', + affiliateLink: null, // WPS 会员推广计划 + isFeatured: true, + }, + { + name: 'Canva', + description: '全球领先的在线设计平台,AI 驱动的设计工具。支持 AI 生成图片、设计模板、品牌套件等,适合非设计师快速创建专业视觉内容。', + url: 'https://www.canva.cn', + tags: '设计,模板,AI 生成,可视化', + affiliateLink: 'https://www.canva.cn/join/yuzhiran', // Canvassador 计划 + isFeatured: true, + }, + { + name: '腾讯元宝', + description: '腾讯推出的 AI 助手应用,整合腾讯生态(微信、QQ、腾讯文档)。支持多轮对话、内容创作、代码辅助等功能。', + url: 'https://yuanbao.tencent.com', + tags: '对话,腾讯,生态,免费', + affiliateLink: 'https://cloud.tencent.com/act/cps?from=yuzhiran', // 腾讯云推广大使 + isFeatured: true, + }, + { + name: '讯飞星火', + description: '科大讯飞推出的 AI 认知大模型,在语音识别和自然语言处理方面有深厚积累。支持多模态交互,适合教育、办公场景。', + url: 'https://xinghuo.xfyun.cn', + tags: '语音,教育,办公,讯飞', + affiliateLink: 'https://www.xfyun.cn/?from=yuzhiran', + isFeatured: true, + }, + { + name: '剪映专业版', + description: '字节跳动推出的视频剪辑工具,集成 AI 视频生成、智能抠图、自动字幕等 AI 功能。国内最流行的视频创作平台。', + url: 'https://www.capcut.cn', + tags: '视频,剪辑,AI,创作', + affiliateLink: null, + isFeatured: false, + }, + ]; + + for (const t of tools) { + const existing = await prisma.tool.findFirst({ where: { name: t.name } }); + if (existing) { + await prisma.tool.update({ + where: { id: existing.id }, + data: { + ...t, + categoryId, + status: 'PUBLISHED', + }, + }); + console.log(` ✓ Updated: ${t.name}`); + } else { + await prisma.tool.create({ + data: { + ...t, + categoryId, + status: 'PUBLISHED', + }, + }); + console.log(` + Created: ${t.name}`); + } + } + + console.log(`\n✓ ${tools.length} domestic AI tools seeded successfully!`); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(async () => { await prisma.$disconnect(); });