feat: 迁移自定义功能至 1.5.9.9 版本

包含音乐源限制、CI 防 OOM 优化、数据库连接池优化、管理端权限及 UI 细节定制等功能
This commit is contained in:
2026-09-12 19:26:42 +08:00
parent 34f0679117
commit 1106aeea6c
161 changed files with 18963 additions and 27900 deletions
+6 -85
View File
@@ -4,8 +4,6 @@ import {
apiKeys,
apiKeyPermissions,
apiLogs,
cardCodeRedeemLogs,
cardCodes,
collaborationLogs,
emailTemplates,
notifications,
@@ -13,7 +11,6 @@ import {
playTimes,
requestTimes,
schedules,
scheduleSongPool,
semesters,
songBlacklists,
songCollaborators,
@@ -23,10 +20,8 @@ import {
users,
userIdentities,
userStatusLogs,
gradeClass,
votes
} from '~/drizzle/schema'
import { inArray } from 'drizzle-orm'
import { promises as fs } from 'fs'
import path from 'path'
@@ -34,17 +29,15 @@ export default defineEventHandler(async (event) => {
try {
// 验证管理员权限
const user = event.context.user
if (!user || user.role !== 'SUPER_ADMIN') {
if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
throw createError({
statusCode: 403,
message: '只有超级管理员可以导出备份'
statusMessage: '权限不足'
})
}
const body = await readBody(event)
const { tables = 'all' } = body
const includeSystemData =
typeof body.includeSystemData === 'boolean' ? body.includeSystemData : tables !== 'users'
const { tables = 'all', includeSystemData = true } = body
console.log('开始创建数据库备份...')
@@ -107,53 +100,6 @@ export default defineEventHandler(async (event) => {
},
description: '歌曲数据'
},
cardCodes: {
query: async () => {
const codesData = await db.select().from(cardCodes)
const usersData = await db
.select({
id: users.id,
username: users.username,
name: users.name
})
.from(users)
return codesData.map((code) => ({
...code,
lockedByUser: code.lockedBy ? usersData.find((user) => user.id === code.lockedBy) : null,
redeemedByUser: code.redeemedBy ? usersData.find((user) => user.id === code.redeemedBy) : null
}))
},
description: '点歌券数据'
},
cardCodeRedeemLogs: {
query: async () => {
const logsData = await db.select().from(cardCodeRedeemLogs)
const codesData = await db.select({ id: cardCodes.id, code: cardCodes.code }).from(cardCodes)
const songsData = await db
.select({
id: songs.id,
title: songs.title,
artist: songs.artist
})
.from(songs)
const usersData = await db
.select({
id: users.id,
username: users.username,
name: users.name
})
.from(users)
return logsData.map((log) => ({
...log,
cardCode: codesData.find((code) => code.id === log.cardCodeId),
redeemer: usersData.find((user) => user.id === log.redeemedBy),
song: log.songId ? songsData.find((song) => song.id === log.songId) : null
}))
},
description: '点歌券日志'
},
votes: {
query: async () => {
const votesData = await db.select().from(votes)
@@ -180,24 +126,6 @@ export default defineEventHandler(async (event) => {
},
description: '投票数据'
},
scheduleSongPool: {
query: async () => {
const poolData = await db.select().from(scheduleSongPool)
if (poolData.length === 0) return []
const poolSongIds = poolData.map((row) => row.songId)
const songsData = await db.select({
id: songs.id,
title: songs.title,
artist: songs.artist
}).from(songs).where(inArray(songs.id, poolSongIds))
const songsMap = new Map(songsData.map((s) => [s.id, s]))
return poolData.map((row) => ({
...row,
song: songsMap.get(row.songId) || null
}))
},
description: '排期备选池'
},
schedules: {
query: async () => {
const schedulesData = await db.select().from(schedules)
@@ -294,10 +222,6 @@ export default defineEventHandler(async (event) => {
},
description: '用户状态变更日志'
},
gradeClass: {
query: () => db.select().from(gradeClass),
description: '年级班级配置'
},
userIdentities: {
query: async () => {
const identitiesData = await db.select().from(userIdentities)
@@ -426,10 +350,7 @@ export default defineEventHandler(async (event) => {
// 如果包含系统数据,添加系统设置表
if (includeSystemData) {
tablesToBackup.systemSettings = {
query: async () => {
const settings = await db.select().from(systemSettings)
return settings
},
query: () => db.select().from(systemSettings),
description: '系统设置'
}
}
@@ -519,7 +440,7 @@ export default defineEventHandler(async (event) => {
console.error(`备份表 ${tableName} 失败:`, error)
throw createError({
statusCode: 500,
message: `备份表 ${tableName} 失败:${error.message}`
statusMessage: `备份表 ${tableName} 失败: ${error.message}`
})
}
}
@@ -612,7 +533,7 @@ export default defineEventHandler(async (event) => {
console.error('创建数据库备份失败:', error)
throw createError({
statusCode: error.statusCode || 500,
message: error.message || '创建数据库备份失败'
statusMessage: error.statusMessage || '创建数据库备份失败'
})
}
})