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])
|
|||
|
|
}
|