schema.prisma 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. albumSubscriptions AlbumSubscription[]
  27. @@index([phone])
  28. @@index([openid])
  29. }
  30. model Audio {
  31. id Int @id @default(autoincrement())
  32. userId Int?
  33. title String
  34. text String @db.Text
  35. summary String? @db.Text
  36. tags String? @db.Text // JSON 字符串存储数组
  37. audioUrl String @db.Text
  38. audioDuration Int @default(0)
  39. audioSize Int @default(0)
  40. wordCount Int
  41. voiceId String
  42. voiceParams String? @db.Text // JSON 存储 {speed, pitch, volume}
  43. status String @default("processing")
  44. isFavorite Boolean @default(false)
  45. categoryId Int?
  46. albumId Int? // 专辑ID,没有则归入默认专辑
  47. createdAt DateTime @default(now())
  48. updatedAt DateTime @updatedAt
  49. user User? @relation(fields: [userId], references: [id])
  50. category Category? @relation("CategoryAudios", fields: [categoryId], references: [id])
  51. album Album? @relation(fields: [albumId], references: [id])
  52. playRecords PlayRecord[]
  53. favorites Favorite[]
  54. comments Comment[]
  55. albumAudios AlbumAudio[]
  56. @@index([userId, createdAt])
  57. @@index([userId, isFavorite])
  58. @@index([categoryId])
  59. @@index([albumId])
  60. }
  61. model Order {
  62. id Int @id @default(autoincrement())
  63. userId Int
  64. orderNo String @unique
  65. productType String // monthly 或 yearly
  66. amount Decimal @db.Decimal(10, 2)
  67. status String @default("pending")
  68. paymentMethod String?
  69. paidAt DateTime?
  70. createdAt DateTime @default(now())
  71. updatedAt DateTime @updatedAt
  72. user User @relation(fields: [userId], references: [id])
  73. @@index([userId, createdAt])
  74. @@index([orderNo])
  75. }
  76. model PlayRecord {
  77. id Int @id @default(autoincrement())
  78. userId Int
  79. audioId Int
  80. progress Float @default(0) // 播放进度(秒)
  81. duration Float @default(0) // 总时长
  82. updatedAt DateTime @updatedAt
  83. createdAt DateTime @default(now())
  84. user User @relation(fields: [userId], references: [id])
  85. audio Audio @relation(fields: [audioId], references: [id])
  86. @@unique([userId, audioId])
  87. @@index([userId])
  88. @@index([audioId])
  89. }
  90. model UserPreference {
  91. id Int @id @default(autoincrement())
  92. userId Int @unique
  93. playSpeed Float @default(1.0)
  94. quality String @default("standard") // standard, high
  95. theme String @default("light")
  96. updatedAt DateTime @updatedAt
  97. createdAt DateTime @default(now())
  98. user User @relation(fields: [userId], references: [id])
  99. }
  100. model Favorite {
  101. id Int @id @default(autoincrement())
  102. userId Int
  103. audioId Int
  104. createdAt DateTime @default(now())
  105. user User @relation(fields: [userId], references: [id])
  106. audio Audio @relation(fields: [audioId], references: [id])
  107. @@unique([userId, audioId])
  108. @@index([userId])
  109. }
  110. model Category {
  111. id Int @id @default(autoincrement())
  112. name String
  113. icon String @default("")
  114. sort Int @default(0)
  115. createdAt DateTime @default(now())
  116. audios Audio[] @relation("CategoryAudios")
  117. }
  118. model Comment {
  119. id Int @id @default(autoincrement())
  120. userId Int
  121. audioId Int
  122. content String @db.Text
  123. rating Int // 1-5星
  124. createdAt DateTime @default(now())
  125. user User @relation(fields: [userId], references: [id])
  126. audio Audio @relation(fields: [audioId], references: [id])
  127. @@index([audioId])
  128. @@index([userId])
  129. }
  130. model Notification {
  131. id String @id @default(uuid())
  132. userId String
  133. title String
  134. content String @db.Text
  135. isRead Boolean @default(false)
  136. createdAt DateTime @default(now())
  137. }
  138. model Album {
  139. id Int @id @default(autoincrement())
  140. name String
  141. description String? @db.Text
  142. coverUrl String?
  143. userId Int?
  144. isDefault Boolean @default(false) // 是否是默认专辑
  145. createdAt DateTime @default(now())
  146. updatedAt DateTime @updatedAt
  147. albumAudios AlbumAudio[]
  148. subscriptions AlbumSubscription[]
  149. audios Audio[]
  150. @@index([userId])
  151. @@index([createdAt])
  152. }
  153. model AlbumAudio {
  154. id Int @id @default(autoincrement())
  155. albumId Int
  156. audioId Int
  157. order Int @default(0)
  158. addedAt DateTime @default(now())
  159. album Album @relation(fields: [albumId], references: [id], onDelete: Cascade)
  160. audio Audio @relation(fields: [audioId], references: [id], onDelete: Cascade)
  161. @@unique([albumId, audioId])
  162. @@index([albumId])
  163. @@index([audioId])
  164. }
  165. model AlbumSubscription {
  166. id Int @id @default(autoincrement())
  167. userId Int
  168. albumId Int
  169. createdAt DateTime @default(now())
  170. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  171. album Album @relation(fields: [albumId], references: [id], onDelete: Cascade)
  172. @@unique([userId, albumId])
  173. @@index([userId])
  174. @@index([albumId])
  175. }