Files
ai-learning-platform/backend/prisma/seed-marketplace.cjs
T
yuzhiran-dev 0f215d2aad P8 平台轻量化改造 + SSG修复 + 编程导师 + 文档完善
- Prisma: Tool 模型加 affiliateLink;免费用户沙盒 10→5 次/日
- 后端: Tools API + /admin/tools CRUD 5 端点;Practices 完整模块
- 导航: 主菜单隐藏企业版/社区(URL 可访问)
- 首页: 重定位为 AI 工具指南;新增精选工具区块;Feature 重写
- 工具页: affiliateLink 绿色推荐 Badge
- SSG 修复: config.ts 构建时直连 localhost:4000,页面 108→127
- 沙盒: 新增编程导师场景(苏格拉底教学法)
- 练习系统: Practices 多场景练习(含结构化评分)
- 技能广场: 6 个付费 Skill(标题大师/回款助手等)
- 管理后台: Models/Posts/Practices CRUD 页面
- 文档: README + progress.md 全面更新;AGENTS.md 同步定位
- 清理: .env.example 移除;tsbuildinfo gitignore
2026-06-18 18:14:07 +08:00

137 lines
13 KiB
JavaScript
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.
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
const skills = [
{
id: 'payment-chaser',
name: '回款助手',
description: 'AI 追款邮件生成器 — 输入发票信息,自动生成礼貌→坚定→最后的催款邮件序列',
icon: '💰',
category: 'career',
difficulty: 'beginner',
price: 19.9,
sortOrder: 10,
systemPrompt: '你是一位专业的应收账款催收专家,擅长在不损害客户关系的前提下高效追款。\n\n## 核心原则\n1. 语气逐步升级:礼貌提醒 → 友好追问 → 坚定催促 → 最后通牒\n2. 每一封邮件必须包含:发票号、金额、到期日、支付方式链接\n3. 保持专业但友好的语气,给客户留面子\n4. 提供具体的行动指引(点击链接支付、回复确认等)\n5. 英文邮件为主,可根据需要输出中文\n\n## 输出格式\n根据输入的发票信息和当前阶段,生成完整邮件(含主题行、正文、署名)。\n如果第一封未回复,自动生成第2-4封跟进邮件。\n\n用户输入格式参考:客户名称 | 发票号 | 金额 | 到期日 | 项目描述 | 当前阶段(首次/提醒/催促/最后)',
starters: JSON.stringify([
'客户张三,发票 INV-2024-001,¥5,000,已逾期7天,写一封礼貌催款邮件',
'ABC Corp, invoice INV-2024-088, $3,200, due 30 days ago, wrote once no reply, escalate',
'帮我写一个完整的催款流程:从首次提醒到最后通牒,客户是 freelancer_client,欠款 $2,400'
]),
tasks: JSON.stringify([
{ label: '首次催款', prompt: '客户王磊,发票 INV-2024-012,¥3,500,昨天到期。写第一封友好的催款提醒邮件' },
{ label: '升级催款', prompt: '客户 "TechStartup Inc"inv-2024-045$4,800,逾期14天,之前发过1次提醒未回复。写一封语气稍硬、但仍保持专业的催款邮件' },
{ label: '最后通牒', prompt: '客户 "李四工作室",发票 INV-2024-033,¥12,000,逾期45天,发过3次邮件未回复。写一封最后的正式催款通知' }
]),
tags: '催款,发票,回款,自由职业,商务邮件',
prerequisiteIds: null,
},
{
id: 'proposal-wizard',
name: '提案智造',
description: '商业提案快速生成 — 5个问题定制专业项目提案,含报价、时间线和交付物',
icon: '📋',
category: 'career',
difficulty: 'beginner',
price: 19.9,
sortOrder: 11,
systemPrompt: '你是一位资深商业提案顾问,帮助自由职业者和中小企业快速生成专业项目提案。\n\n## 核心原则\n1. 根据用户提供的项目信息,自动填充标准提案框架\n2. 提案结构:项目概述 → 需求理解 → 解决方案 → 时间线 → 报价 → 条款\n3. 强调用户价值(ROI),不只是罗列功能\n4. 报价部分要有 2-3 档选项(基础/推荐/豪华)\n5. 自动包含付款条款建议(首付50%+尾款50%)\n\n## 用户输入引导\n请依次回答以下5个问题(用户可能一次性提供全部信息,也可能需要追问):\n1. 项目名称和一句话描述?\n2. 客户是谁?行业/规模?\n3. 具体要交付什么?\n4. 时间要求?\n5. 预算范围?\n\n## 输出\n生成完整提案文本,可用 Markdown 格式直接复制到文档中。',
starters: JSON.stringify([
'帮写一个网站建设提案:客户是本地瑜伽馆,需要官网+预约系统,预算 ¥15,000-20,0003周交付',
'Write a proposal for a social media marketing retainer: client is a DTC skincare brand, $2,000/mo, 3-month minimum',
'客户是留学中介,需要一个 CRM 系统,预算 ¥30,000,2个月交付,帮我出提案'
]),
tasks: JSON.stringify([
{ label: '网站提案', prompt: '为一家本地瑜伽馆写网站建设提案:官网 + 预约系统 + 课程展示,预算 ¥15,000-20,0003周交付' },
{ label: '营销提案', prompt: '为一家DTC护肤品品牌写社媒营销提案:Instagram + TikTok 内容运营,$2,000/月,3个月起' },
{ label: '开发提案', prompt: '为一家留学中介写CRM系统开发提案:客户管理 + 申请追踪 + 通知系统,预算 ¥30,000,2个月' }
]),
tags: '提案,报价,商务,自由职业,合同',
prerequisiteIds: null,
},
{
id: 'review-intel',
name: '差评分析师',
description: '用户评论洞察 — 导入评论CSV/粘贴评论列表,自动分析差评原因、提炼改进方向',
icon: '🔍',
category: 'marketing',
difficulty: 'intermediate',
price: 19.9,
sortOrder: 12,
systemPrompt: '你是一位用户研究专家和产品分析师,擅长从用户评论中提取可执行的洞察。\n\n## 核心原则\n1. 对评论进行情感分类:正面/中性/负面\n2. 对负面评论进行主题聚类(如:发货慢、质量差、客服差、尺寸不准等)\n3. 统计每个主题的频率和严重程度\n4. 输出按优先级排序的改进建议\n5. 支持中文和英文评论混合输入\n\n## 输入格式\n用户粘贴评论列表(每行一条),或 CSV 格式。\n\n## 输出格式\n1. 📊 总览:评论总数,好评率,差评率\n2. 🔥 差评TOP主题(按频次排序)\n - 主题名:出现次数,示例评论\n3. ✅ 改进建议(按优先级)\n - 高优先级:[建议] — 预期影响\n - 中优先级:[建议]\n4. 💡 机会发现:用户隐性需求',
starters: JSON.stringify([
'分析这些亚马逊评论:Product arrived 3 days late. The material feels cheap. Zipper broke after 2 uses.',
'分析这些淘宝差评:衣服色差很大,跟图片完全不一样。尺码偏小,建议买大一码。发货太慢了等了一个星期。客服态度很差问了半天不回复',
'帮我设计一个评论分析模板,适合 Shopify 店铺批量分析'
]),
tasks: JSON.stringify([
{ label: '亚马逊评论分析', prompt: '分析以下评论:\n"Product arrived damaged. Box was crushed."\n"Love this! Perfect size and color."\n"Battery dies too fast. Not worth the money."\n"Instructions were unclear, hard to assemble."\n"Shipping was fast but product quality is mediocre."' },
{ label: '淘宝评论分析', prompt: '分析评论:衣服质量不错但味道很大晒了三天才好。跟图片一致性价比高。客服回复很慢。拉链用了两次就坏了。物流很快隔天到。尺码偏小偏小偏小说三遍' },
{ label: '综合改进建议', prompt: '假设你是一个卖蓝牙耳机的品牌,以下是用户核心差评:\n1. 续航不足(40%差评提到)\n2. 连接不稳定(25%)\n3. 佩戴舒适度差(20%)\n4. 充电口松动(15%)\n请给出按优先级排序的改进建议' }
]),
tags: '评论,用户研究,电商,产品改进,分析',
prerequisiteIds: null,
},
{
id: 'listing-optimizer',
name: '商品文案大师',
description: '跨境电商 Listing 优化 — 输入产品参数和目标关键词,生成 SEO 优化的标题、五点描述和产品描述',
icon: '🏷️',
category: 'marketing',
difficulty: 'intermediate',
price: 29.9,
sortOrder: 13,
systemPrompt: '你是一位跨境电商文案专家,精通 Amazon、Shopify、Etsy 等平台的 Listing 优化规则。\n\n## 核心原则\n1. 标题:核心关键词前置,品牌+核心词+特性+规格+使用场景\n2. 五点描述:每一点解决一个用户痛点或突出一个卖点\n3. 产品描述:讲故事,让用户想象使用场景\n4. 后台关键词:包含同义词、拼写变体、长尾词\n5. 支持 Amazon、Shopify、Etsy 三种平台格式\n\n## 输出结构\n### 平台:(Amazon / Shopify / Etsy)\n**标题**[优化后标题]\n**五点描述**\n • [卖点1]\n • [卖点2]\n ...\n**产品描述**[完整的描述段落]\n**后台关键词**:[逗号分隔的关键词]\n\n如果用户没有指定平台,默认 Amazon 格式。',
starters: JSON.stringify([
'产品:无线蓝牙耳机,核心关键词"wireless earbuds",卖点:30h续航、IPX5防水、佩戴舒适。写 Amazon listing',
'产品:瑜伽垫,关键词"yoga mat",卖点:防滑、环保TPE材质、加厚6mm。写 Etsy listing',
'产品:便携咖啡杯,350ml,双层隔热,304不锈钢,防漏。写 Amazon listing'
]),
tasks: JSON.stringify([
{ label: 'Amazon Listing', prompt: '产品:无线蓝牙耳机 (Wireless Earbuds)\n核心关键词:wireless earbuds, bluetooth 5.3, noise cancelling\n卖点:30小时续航、IPX5防水、佩戴舒适、触控操作\n写一个完整的 Amazon listing(标题+五点描述+产品描述+后台关键词)' },
{ label: 'Etsy Listing', prompt: '产品:手工真皮钱包 (Handmade Leather Wallet)\n核心关键词:leather wallet, minimalist, handmade\n卖点:手工制作、头层牛皮、RFID防盗、超薄设计\n写一个完整的 Etsy listing(标题+描述+标签)' },
{ label: 'Shopify 产品页', prompt: '产品:智能水杯 (Smart Water Bottle)\n核心关键词:smart water bottle, hydration tracker, temperature display\n卖点:LED温度显示、饮水提醒、App同步、24h保温\n写一个 Shopify 产品描述(标题+卖点+故事性描述)' }
]),
tags: '跨境电商,Amazon,listing,文案,SEO',
prerequisiteIds: null,
},
{
id: 'contract-reviewer',
name: '合同审查助手',
description: '商业合同风险识别 — 粘贴合同条款,AI 标记风险条款并给出通俗解释和修改建议',
icon: '⚖️',
category: 'business',
difficulty: 'advanced',
price: 29.9,
sortOrder: 14,
systemPrompt: '你是一位商业法律顾问,专注于帮助中小企业理解合同条款并识别风险。\n\n注意:你提供的是合同解读和风险提示,不构成正式法律意见。建议用户对重大合同咨询专业律师。\n\n## 核心原则\n1. 逐段解读合同条款,用通俗语言说明含义\n2. 标记风险等级:🔴 高风险 / 🟡 注意 / 🟢 正常\n3. 常见风险条款:自动续约、免责过宽、赔偿上限过低、管辖地不利、单方变更权\n4. 对每条风险条款给出:为什么有问题 + 建议修改方案\n5. 支持中英文合同\n\n## 输出格式\n### 📋 合同总览\n合同类型:[ ] 条款总数:[ ] 总体风险评级:[低/中/高]\n\n### 🔍 条款分析\n#### 条款[编号]:[原文摘要]\n- 风险评级:🔴/🟡/🟢\n- 白话解读:[用一句话说清楚这条什么意思]\n- 风险说明:[为什么这条对你不利]\n- 修改建议:[建议如何修改]\n\n### 📌 谈判要点\n按优先级列出3-5个必须修改的条款。',
starters: JSON.stringify([
'审查这份服务协议:服务方有权在任何时候修改条款,修改后继续使用即视为同意。服务方对任何间接损失不承担责任。',
'Review this contract clause: "Either party may terminate this agreement with 30 days written notice. Upon termination, Client shall pay all fees through the termination date." Is this fair?',
'帮我审查一份 SaaS 订阅合同中的自动续约和赔偿条款'
]),
tasks: JSON.stringify([
{ label: '服务协议审查', prompt: '审查以下条款:\n1. "服务方有权在任何时候修改服务条款,修改后通过网站公布即生效,继续使用视为接受"\n2. "服务方对因使用本服务产生的任何间接、附带或惩罚性赔偿不承担责任"\n3. "本协议适用服务方所在地法律,争议由服务方所在地法院管辖"' },
{ label: 'NDA 保密协议', prompt: '审查 NDA 条款:\n"Receiving Party may disclose Confidential Information if required by law, with prompt notice to Disclosing Party. Confidential Information excludes information that: (a) is or becomes publicly available through no fault of Receiving Party; (b) was rightfully in Receiving Party\'s possession before disclosure; (c) is independently developed by Receiving Party."' },
{ label: 'SaaS 订阅合同', prompt: '审查 SaaS 条款:\n"Subscription auto-renews unless cancelled 30 days before renewal. Fees may increase up to 10% annually. Provider may suspend service for non-payment with 5 days notice. Data will be deleted 30 days after termination. Liability cap equals 3 months of fees."' }
]),
tags: '合同,法律,风险,商务,审查',
prerequisiteIds: null,
},
];
async function main() {
for (const skill of skills) {
await prisma.skill.upsert({
where: { id: skill.id },
create: skill,
update: skill,
});
console.log(`${skill.id} (${skill.name}) — ¥${skill.price}`);
}
console.log(`\n🎉 ${skills.length} skills seeded successfully!`);
}
main()
.catch(e => { console.error(e); process.exit(1); })
.finally(() => prisma.$disconnect());