| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- generator client {
- provider = "prisma-client-js"
- }
- datasource db {
- provider = "mysql"
- url = env("DATABASE_URL")
- }
- model User {
- id Int @id @default(autoincrement())
- phone String? @unique
- openid String? @unique
- nickname String @default("用户")
- avatar String @default("")
- memberLevel Int @default(0)
- memberExpireAt DateTime?
- dailyUsage Int @default(0)
- lastUsageDate String @default("")
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-
- audios Audio[]
- orders Order[]
- playRecords PlayRecord[]
- preferences UserPreference?
- favorites Favorite[]
- comments Comment[]
-
- @@index([phone])
- @@index([openid])
- }
- model Audio {
- id Int @id @default(autoincrement())
- userId Int?
- title String
- text String @db.Text
- summary String? @db.Text
- tags String? @db.Text // JSON 字符串存储数组
- audioUrl String @db.Text
- audioDuration Int @default(0)
- audioSize Int @default(0)
- wordCount Int
- voiceId String
- voiceParams String? @db.Text // JSON 存储 {speed, pitch, volume}
- status String @default("processing")
- isFavorite Boolean @default(false)
- categoryId Int?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-
- user User? @relation(fields: [userId], references: [id])
- category Category? @relation("CategoryAudios", fields: [categoryId], references: [id])
-
- playRecords PlayRecord[]
- favorites Favorite[]
- comments Comment[]
-
- @@index([userId, createdAt])
- @@index([userId, isFavorite])
- @@index([categoryId])
- }
- model Order {
- id Int @id @default(autoincrement())
- userId Int
- orderNo String @unique
- productType String // monthly 或 yearly
- amount Decimal @db.Decimal(10, 2)
- status String @default("pending")
- paymentMethod String?
- paidAt DateTime?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-
- user User @relation(fields: [userId], references: [id])
-
- @@index([userId, createdAt])
- @@index([orderNo])
- }
- model PlayRecord {
- id Int @id @default(autoincrement())
- userId Int
- audioId Int
- progress Float @default(0) // 播放进度(秒)
- duration Float @default(0) // 总时长
- updatedAt DateTime @updatedAt
- createdAt DateTime @default(now())
-
- user User @relation(fields: [userId], references: [id])
- audio Audio @relation(fields: [audioId], references: [id])
-
- @@unique([userId, audioId])
- @@index([userId])
- @@index([audioId])
- }
- model UserPreference {
- id Int @id @default(autoincrement())
- userId Int @unique
- playSpeed Float @default(1.0)
- quality String @default("standard") // standard, high
- theme String @default("light")
- updatedAt DateTime @updatedAt
- createdAt DateTime @default(now())
-
- user User @relation(fields: [userId], references: [id])
- }
- model Favorite {
- id Int @id @default(autoincrement())
- userId Int
- audioId Int
- createdAt DateTime @default(now())
-
- user User @relation(fields: [userId], references: [id])
- audio Audio @relation(fields: [audioId], references: [id])
-
- @@unique([userId, audioId])
- @@index([userId])
- }
- model Category {
- id Int @id @default(autoincrement())
- name String
- icon String @default("")
- sort Int @default(0)
- createdAt DateTime @default(now())
-
- audios Audio[] @relation("CategoryAudios")
- }
- model Comment {
- id Int @id @default(autoincrement())
- userId Int
- audioId Int
- content String @db.Text
- rating Int // 1-5星
- createdAt DateTime @default(now())
- user User @relation(fields: [userId], references: [id])
- audio Audio @relation(fields: [audioId], references: [id])
- @@index([audioId])
- @@index([userId])
- }
- model Notification {
- id String @id @default(uuid())
- userId String
- title String
- content String @db.Text
- isRead Boolean @default(false)
- createdAt DateTime @default(now())
- }
|