326 lines
8.3 KiB
Plaintext
326 lines
8.3 KiB
Plaintext
// Prisma Schema for HYW & Koneko 音源管理后台
|
||
//
|
||
// 合作开发: MistAperio Studio × Macrohard Studio
|
||
// 编写人: 雾启工作室@云汀 (Cloudwhisper/Miao-moe), Macrohard Studio@Ryn磷熠 (Macrohard0001)
|
||
//
|
||
// 旧版后台由 Macrohard Studio 开发,编写人 @Macrohard0001
|
||
|
||
generator client {
|
||
provider = "prisma-client-js"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "sqlite"
|
||
url = "file:./data.db"
|
||
}
|
||
|
||
// ============================================
|
||
// 用户与认证相关
|
||
// ============================================
|
||
|
||
/// 用户表 - 用于自建登录系统或对接 auth.shiqianjiang.cn
|
||
model User {
|
||
id String @id @default(uuid())
|
||
email String @unique
|
||
username String?
|
||
passwordHash String? // 仅自建登录时使用
|
||
displayName String?
|
||
avatar String?
|
||
role String @default("user") // user, vip, admin
|
||
status String @default("active") // active, banned, inactive
|
||
|
||
// 第三方认证信息
|
||
authProvider String? // local, auth.shiqianjiang.cn
|
||
authId String? // 第三方平台的用户ID
|
||
|
||
// 权限配置
|
||
permissions String? // JSON: 允许的音质、平台等
|
||
|
||
// 时间戳
|
||
lastLoginAt DateTime?
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
// 关联
|
||
apiKeys ApiKey[]
|
||
sessions Session[]
|
||
logs RequestLog[]
|
||
|
||
@@index([email])
|
||
@@index([authProvider, authId])
|
||
}
|
||
|
||
/// API 密钥表
|
||
model ApiKey {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
key String @unique
|
||
name String?
|
||
permissions String? // JSON: 允许的权限
|
||
rateLimit Int @default(100) // 每分钟限制
|
||
dailyLimit Int @default(10000) // 每日限制
|
||
|
||
// 统计
|
||
usedCount Int @default(0)
|
||
lastUsedAt DateTime?
|
||
|
||
// 状态
|
||
expiresAt DateTime?
|
||
status String @default("active") // active, revoked, expired
|
||
createdAt DateTime @default(now())
|
||
|
||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([key])
|
||
@@index([userId])
|
||
}
|
||
|
||
/// 会话表
|
||
model Session {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
token String @unique
|
||
userAgent String?
|
||
ipAddress String?
|
||
expiresAt DateTime
|
||
createdAt DateTime @default(now())
|
||
|
||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([token])
|
||
@@index([userId])
|
||
}
|
||
|
||
// ============================================
|
||
// 音源管理相关
|
||
// ============================================
|
||
|
||
/// 音源脚本表 - 支持 LX Music、澜音、QZ Music 格式
|
||
model SourceScript {
|
||
id String @id @default(uuid())
|
||
name String
|
||
description String?
|
||
version String @default("1.0.0")
|
||
author String?
|
||
|
||
// 脚本类型
|
||
format String @default("lx") // lx, lanyin, qzmusic
|
||
|
||
// 脚本内容
|
||
scriptContent String // 完整脚本代码
|
||
scriptHash String // 内容哈希,用于检测变更
|
||
|
||
// 平台与音质
|
||
platforms String // JSON: ["kw", "kg", "tx", "wy", "mg"]
|
||
qualities String // JSON: ["128k", "320k", "flac", ...]
|
||
|
||
// 状态
|
||
enabled Boolean @default(true)
|
||
status String @default("active") // active, error, deprecated
|
||
|
||
// 优先级与权重
|
||
priority Int @default(0)
|
||
weight Int @default(100)
|
||
|
||
// 统计
|
||
successCount Int @default(0)
|
||
failCount Int @default(0)
|
||
avgResponseTime Int @default(0)
|
||
lastError String?
|
||
lastUsedAt DateTime?
|
||
|
||
// 元数据
|
||
homepage String?
|
||
license String?
|
||
tags String? // JSON: ["独家", "高音质", ...]
|
||
|
||
// 时间戳
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@index([format])
|
||
@@index([enabled])
|
||
@@index([scriptHash])
|
||
}
|
||
|
||
/// 音源文件表 - 存储大型脚本文件
|
||
model SourceFile {
|
||
id String @id @default(uuid())
|
||
sourceId String @unique
|
||
filePath String
|
||
fileSize Int
|
||
fileHash String
|
||
createdAt DateTime @default(now())
|
||
}
|
||
|
||
// ============================================
|
||
// 卡密系统
|
||
// ============================================
|
||
|
||
/// 卡密表
|
||
model CardKey {
|
||
id String @id @default(uuid())
|
||
key String @unique
|
||
type String @default("normal") // normal, vip, admin
|
||
|
||
// 状态
|
||
status String @default("active") // active, used, expired, disabled
|
||
|
||
// 使用限制
|
||
maxUses Int @default(-1) // -1 表示无限制
|
||
usedCount Int @default(0)
|
||
dailyLimit Int @default(100)
|
||
rateLimit Int @default(10) // 每分钟
|
||
|
||
// 权限配置
|
||
allowedQualities String? // JSON: 允许的音质列表
|
||
allowedPlatforms String? // JSON: 允许的平台列表
|
||
|
||
// 有效期
|
||
expireAt DateTime?
|
||
|
||
// 绑定信息
|
||
bindIP String?
|
||
bindDevice String?
|
||
|
||
// 备注
|
||
remark String?
|
||
|
||
// 关联脚本
|
||
scriptId String?
|
||
scriptName String?
|
||
|
||
// 时间戳
|
||
lastUsedAt DateTime?
|
||
createdAt DateTime @default(now())
|
||
|
||
// 关联
|
||
logs CardKeyLog[]
|
||
|
||
@@index([key])
|
||
@@index([type])
|
||
@@index([status])
|
||
}
|
||
|
||
/// 卡密使用日志
|
||
model CardKeyLog {
|
||
id String @id @default(uuid())
|
||
cardKeyId String
|
||
key String
|
||
ip String?
|
||
action String // verify, use
|
||
success Boolean
|
||
error String?
|
||
userAgent String?
|
||
createdAt DateTime @default(now())
|
||
|
||
cardKey CardKey @relation(fields: [cardKeyId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([cardKeyId])
|
||
@@index([key])
|
||
}
|
||
|
||
// ============================================
|
||
// 系统配置与日志
|
||
// ============================================
|
||
|
||
/// 系统配置表
|
||
model SystemConfig {
|
||
id String @id @default("system")
|
||
|
||
// 服务状态
|
||
serviceStatus String @default("running") // running, stopped, maintenance
|
||
maintenanceMessage String?
|
||
|
||
// 频率限制配置
|
||
globalQPS Int @default(100)
|
||
singleIPQPS Int @default(10)
|
||
singleIPPerMinute Int @default(60)
|
||
banThreshold Int @default(100)
|
||
banDuration Int @default(3600) // 秒
|
||
|
||
// 执行模式
|
||
executionMode String @default("hybrid") // simplified, full, hybrid
|
||
|
||
// 主题配置
|
||
defaultTheme String @default("default")
|
||
|
||
// 其他配置
|
||
extraConfig String? // JSON: 其他扩展配置
|
||
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
|
||
/// IP 规则表
|
||
model IPRule {
|
||
id String @id @default(uuid())
|
||
ip String // IP 或 CIDR
|
||
type String // whitelist, blacklist
|
||
reason String?
|
||
expiresAt DateTime?
|
||
createdAt DateTime @default(now())
|
||
|
||
@@index([ip])
|
||
@@index([type])
|
||
}
|
||
|
||
/// 请求日志表
|
||
model RequestLog {
|
||
id String @id @default(uuid())
|
||
userId String?
|
||
|
||
// 请求信息
|
||
platform String?
|
||
songId String?
|
||
quality String?
|
||
source String? // 使用的音源
|
||
|
||
// 响应信息
|
||
success Boolean
|
||
responseTime Int // 毫秒
|
||
errorMessage String?
|
||
|
||
// 客户端信息
|
||
ip String?
|
||
userAgent String?
|
||
cardKey String?
|
||
|
||
// 时间戳
|
||
createdAt DateTime @default(now())
|
||
|
||
user User? @relation(fields: [userId], references: [id])
|
||
|
||
@@index([createdAt])
|
||
@@index([platform])
|
||
@@index([success])
|
||
}
|
||
|
||
/// 主题配置表
|
||
model Theme {
|
||
id String @id @default(uuid())
|
||
name String @unique
|
||
displayName String
|
||
description String?
|
||
|
||
// 主题类型
|
||
type String @default("custom") // preset, custom
|
||
|
||
// 主题配置
|
||
config String // JSON: 完整主题配置
|
||
|
||
// 元数据
|
||
author String?
|
||
preview String? // 预览图URL
|
||
tags String? // JSON
|
||
|
||
// 状态
|
||
isDefault Boolean @default(false)
|
||
enabled Boolean @default(true)
|
||
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@index([type])
|
||
@@index([enabled])
|
||
}
|