/** * Prisma 种子脚本 · 把 36 位真实艺人 + 活动配置写入 DB * * 数据来源:src/lib/artist-bios.ts (从《36 位虚拟艺人人物小传.docx》提取) * 这份文件同时是前端 SSG 的静态源 + DB 的 seed 源,双写但单一来源, * 改人物字段时只需要改 artist-bios.ts,然后重跑 seed。 * * 运行:pnpm db:seed * * 注意:portrait / videoUrl 等 TOS URL 不写入 DB —— 前端从 NEXT_PUBLIC_TOS_DOMAIN * 自动拼接,DB 字段保留为 NULL (灵活度高,换桶不需要重跑 seed)。 */ import { PrismaClient, Prisma } from "@prisma/client"; import { ARTIST_SEEDS } from "../src/lib/artist-bios"; const prisma = new PrismaClient(); async function main() { console.log("🌱 开始 seed 数据库..."); // 1. 活动配置 (upsert: 第一次创建, 后续仅延长 endAt) const now = new Date(); const endAt = new Date(now); endAt.setDate(endAt.getDate() + 30); // 默认活动期 30 天 await prisma.activityConfig.upsert({ where: { id: 1 }, create: { id: 1, startAt: now, endAt, voteEnabled: true, dailyQuota: 10, perArtistLimit: 0, // 不限单艺人 paidVoteEnabled: false, }, update: { endAt, voteEnabled: true, dailyQuota: 10, perArtistLimit: 0, }, }); console.log(" ✓ 活动配置已写入 (dailyQuota=10, voteEnabled=true)"); // 2. 36 位艺人 (upsert: 若 DB 里有旧 seed 的假数据, 覆盖为真实姓名/简介) let created = 0; let updated = 0; for (const seed of ARTIST_SEEDS) { const existing = await prisma.artist.findUnique({ where: { id: seed.no } }); const data = { no: seed.no, name: seed.name, enName: seed.enName, bio: seed.bio, height: seed.height, age: seed.age, gender: seed.gender, motto: seed.motto ?? null, personality: seed.personality ?? null, catchphrase: seed.catchphrase ?? null, skills: seed.skills ?? null, track: seed.track ?? null, tags: seed.tags as unknown as Prisma.InputJsonValue, }; if (existing) { await prisma.artist.update({ where: { id: seed.no }, data, }); updated++; } else { await prisma.artist.create({ data: { id: seed.no, ...data, status: "ACTIVE", voteCount: 0, currentRank: parseInt(seed.no, 10), }, }); created++; } } console.log( ` ✓ 36 人 seed 完成 (新建 ${created}, 更新 ${updated})`, ); // 3. 报告 DB 当前状态 const stats = { artists: await prisma.artist.count({ where: { status: "ACTIVE" } }), users: await prisma.user.count(), votes: await prisma.vote.count(), config: await prisma.activityConfig.count(), }; console.log("📊 DB 当前状态:", stats); console.log("✅ Seed 完成"); } main() .catch((e) => { console.error("❌ Seed 失败:", e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });