// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id // 使用Supabase用户ID,不再自动生成 email String @unique username String? @unique // 允许为空,因为有些用户可能没有设置用户名 avatar String? bio String? language String @default("en") isAdmin Boolean @default(false) // 管理员标记 versionLimit Int @default(3) // 用户自定义版本数量限制,不能超过套餐限制 // 新的订阅系统字段 subscriptionPlanId String @default("free") // 关联的订阅套餐ID // 旧的订阅系统字段(保留用于迁移,后期会移除) subscribePlan String @default("free") // 订阅计划: "free", "pro" maxVersionLimit Int @default(3) // 基于订阅的最大版本限制 promptLimit Int? // 提示词数量限制(已弃用,忽略此字段) creditBalance Float @default(0.0) // 信用余额,移除默认值 stripeCustomerId String? @unique // Stripe 客户 ID createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // 关联关系 subscriptionPlan SubscriptionPlan @relation(fields: [subscriptionPlanId], references: [id]) prompts Prompt[] credits Credit[] @@map("users") } // 订阅套餐模型 model SubscriptionPlan { id String @id // "free", "pro" 等 name String // 套餐名称 displayName String // 显示名称(支持国际化) description String? // 套餐描述 price Float @default(0) // 价格(美元) currency String @default("usd") // 货币 interval String @default("month") // 计费周期: "month", "year" stripePriceId String? @unique // Stripe 价格 ID isActive Boolean @default(true) // 是否激活 sortOrder Int @default(0) // 排序顺序 // 权益配置 (JSON 格式存储) features Json // 功能特性配置 limits Json // 限制配置 createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // 关联关系 users User[] @@map("subscription_plans") } model Prompt { id String @id @default(cuid()) name String content String description String? isPublic Boolean @default(false) // 保留用于向后兼容 permissions String @default("private") // "private" | "public" visibility String? // "under_review" | "published" | null createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) tags PromptTag[] versions PromptVersion[] album PromptAlbum? @relation(fields: [albumId], references: [id]) albumId String? tests PromptTestRun[] stats PromptStats? @@map("prompts") } model PromptVersion { id String @id @default(cuid()) version Int content String changelog String? createdAt DateTime @default(now()) promptId String prompt Prompt @relation(fields: [promptId], references: [id], onDelete: Cascade) @@unique([promptId, version]) @@map("prompt_versions") } model PromptTag { id String @id @default(cuid()) name String @unique color String @default("#3B82F6") prompts Prompt[] @@map("prompt_tags") } model PromptAlbum { id String @id @default(cuid()) name String description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt prompts Prompt[] @@map("prompt_albums") } model PromptTestRun { id String @id @default(cuid()) input String output String? success Boolean @default(false) error String? createdAt DateTime @default(now()) promptId String prompt Prompt @relation(fields: [promptId], references: [id], onDelete: Cascade) @@map("prompt_test_runs") } model PromptStats { id String @id @default(cuid()) promptId String @unique viewCount Int @default(0) // 浏览计数 likeCount Int @default(0) // 点赞计数 rating Float? // 平均评分 ratingCount Int @default(0) // 评分数量 createdAt DateTime @default(now()) updatedAt DateTime @updatedAt prompt Prompt @relation(fields: [promptId], references: [id], onDelete: Cascade) @@map("prompt_stats") } model Credit { id String @id @default(cuid()) userId String amount Float // 信用额度数量 type String // "system_gift", "subscription_monthly", "user_purchase" note String? // 备注说明 expiresAt DateTime? // 过期时间,null表示永久有效 isActive Boolean @default(true) // 是否激活状态 createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("credits") }