schema.prisma 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. generator client {
  2. provider = "prisma-client-js"
  3. }
  4. datasource db {
  5. provider = "mysql"
  6. url = env("DATABASE_URL")
  7. }
  8. model User {
  9. id Int @id @default(autoincrement())
  10. phone String? @unique
  11. openid String? @unique
  12. nickname String @default("用户")
  13. avatar String @default("")
  14. memberLevel Int @default(0)
  15. memberExpireAt DateTime?
  16. dailyUsage Int @default(0)
  17. lastUsageDate String @default("")
  18. createdAt DateTime @default(now())
  19. updatedAt DateTime @updatedAt
  20. audios Audio[]
  21. orders Order[]
  22. playRecords PlayRecord[]
  23. preferences UserPreference?
  24. favorites Favorite[]
  25. comments Comment[]
  26. @@index([phone])
  27. @@index([openid])
  28. }
  29. model Audio {
  30. id Int @id @default(autoincrement())
  31. userId Int?
  32. title String
  33. text String @db.Text
  34. summary String? @db.Text
  35. tags String? @db.Text // JSON 字符串存储数组
  36. audioUrl String @db.Text
  37. audioDuration Int @default(0)
  38. audioSize Int @default(0)
  39. wordCount Int
  40. voiceId String
  41. voiceParams String? @db.Text // JSON 存储 {speed, pitch, volume}
  42. status String @default("processing")
  43. isFavorite Boolean @default(false)
  44. categoryId Int?
  45. createdAt DateTime @default(now())
  46. updatedAt DateTime @updatedAt
  47. user User? @relation(fields: [userId], references: [id])
  48. category Category? @relation("CategoryAudios", fields: [categoryId], references: [id])
  49. playRecords PlayRecord[]
  50. favorites Favorite[]
  51. comments Comment[]
  52. @@index([userId, createdAt])
  53. @@index([userId, isFavorite])
  54. @@index([categoryId])
  55. }
  56. model Order {
  57. id Int @id @default(autoincrement())
  58. userId Int
  59. orderNo String @unique
  60. productType String // monthly 或 yearly
  61. amount Decimal @db.Decimal(10, 2)
  62. status String @default("pending")
  63. paymentMethod String?
  64. paidAt DateTime?
  65. createdAt DateTime @default(now())
  66. updatedAt DateTime @updatedAt
  67. user User @relation(fields: [userId], references: [id])
  68. @@index([userId, createdAt])
  69. @@index([orderNo])
  70. }
  71. model PlayRecord {
  72. id Int @id @default(autoincrement())
  73. userId Int
  74. audioId Int
  75. progress Float @default(0) // 播放进度(秒)
  76. duration Float @default(0) // 总时长
  77. updatedAt DateTime @updatedAt
  78. createdAt DateTime @default(now())
  79. user User @relation(fields: [userId], references: [id])
  80. audio Audio @relation(fields: [audioId], references: [id])
  81. @@unique([userId, audioId])
  82. @@index([userId])
  83. @@index([audioId])
  84. }
  85. model UserPreference {
  86. id Int @id @default(autoincrement())
  87. userId Int @unique
  88. playSpeed Float @default(1.0)
  89. quality String @default("standard") // standard, high
  90. theme String @default("light")
  91. updatedAt DateTime @updatedAt
  92. createdAt DateTime @default(now())
  93. user User @relation(fields: [userId], references: [id])
  94. }
  95. model Favorite {
  96. id Int @id @default(autoincrement())
  97. userId Int
  98. audioId Int
  99. createdAt DateTime @default(now())
  100. user User @relation(fields: [userId], references: [id])
  101. audio Audio @relation(fields: [audioId], references: [id])
  102. @@unique([userId, audioId])
  103. @@index([userId])
  104. }
  105. model Category {
  106. id Int @id @default(autoincrement())
  107. name String
  108. icon String @default("")
  109. sort Int @default(0)
  110. createdAt DateTime @default(now())
  111. audios Audio[] @relation("CategoryAudios")
  112. }
  113. model Comment {
  114. id Int @id @default(autoincrement())
  115. userId Int
  116. audioId Int
  117. content String @db.Text
  118. rating Int // 1-5星
  119. createdAt DateTime @default(now())
  120. user User @relation(fields: [userId], references: [id])
  121. audio Audio @relation(fields: [audioId], references: [id])
  122. @@index([audioId])
  123. @@index([userId])
  124. }
  125. model Notification {
  126. id String @id @default(uuid())
  127. userId String
  128. title String
  129. content String @db.Text
  130. isRead Boolean @default(false)
  131. createdAt DateTime @default(now())
  132. }