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
+18 -46
View File
@@ -1,5 +1,6 @@
import { createError, defineEventHandler } from 'h3'
import { db } from '~/drizzle/db'
import { CacheService } from '../../../services/cacheService'
import {
apiKeyPermissions,
apiKeys,
@@ -24,29 +25,6 @@ import {
} from '~/drizzle/schema'
import { ne, sql } from 'drizzle-orm'
function getFirstRow<T>(result: any): T | undefined {
return result?.rows?.[0] ?? result?.[0]
}
function quoteIdentifierPart(value: string) {
const normalized =
value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1).replace(/""/g, '"') : value
return `"${normalized.replace(/"/g, '""')}"`
}
function toQualifiedIdentifier(value: string) {
return sql.raw(value.split('.').map(quoteIdentifierPart).join('.'))
}
function toPgRelationName(value: string) {
return value.split('.').map(quoteIdentifierPart).join('.')
}
function toRegclass(value: string) {
return sql.raw(`'${value.replace(/'/g, "''")}'::regclass`)
}
// 重置所有表的自增序列
async function resetAutoIncrementSequences() {
const tables = [
@@ -71,31 +49,15 @@ async function resetAutoIncrementSequences() {
for (const table of tables) {
try {
// 获取表的最大ID
const maxIdResult = await db.execute(
sql`SELECT MAX(id) as max_id FROM ${toQualifiedIdentifier(table.dbName)}`
)
const maxId = Number(
getFirstRow<{ max_id: number | string | null }>(maxIdResult)?.max_id || 0
)
// 获取序列名称
const sequenceNameResult = await db.execute(
sql`SELECT pg_get_serial_sequence(${toPgRelationName(table.dbName)}, 'id') as sequence_name`
sql.raw(`SELECT pg_get_serial_sequence('"${table.dbName}"', 'id') as sequence_name`)
)
const sequenceName = getFirstRow<{ sequence_name: string | null }>(
sequenceNameResult
)?.sequence_name
const sequenceName = (sequenceNameResult as any)[0]?.sequence_name
if (sequenceName) {
if (maxId === 0) {
await db.execute(
sql`ALTER SEQUENCE ${toQualifiedIdentifier(sequenceName)} RESTART WITH 1`
)
} else {
const newSequenceValue = maxId
await db.execute(sql`SELECT setval(${toRegclass(sequenceName)}, ${newSequenceValue})`)
}
// 重置序列值到 1
await db.execute(sql.raw(`ALTER SEQUENCE ${sequenceName} RESTART WITH 1`))
results.push({ table: table.name, success: true })
} else {
results.push({ table: table.name, success: false, message: 'Sequence not found' })
@@ -115,7 +77,7 @@ export default defineEventHandler(async (event) => {
if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
throw createError({
statusCode: 403,
message: '权限不足'
statusMessage: '权限不足'
})
}
@@ -264,11 +226,21 @@ export default defineEventHandler(async (event) => {
// 重置自增序列
const sequenceResults = await resetAutoIncrementSequences()
resetResults.details.sequencesReset = sequenceResults.filter((r) => r.success).length
// 清除缓存
try {
const cacheService = CacheService.getInstance()
await cacheService.clearAllCache()
} catch (error) {
console.warn('清除缓存失败:', error)
resetResults.details.warnings = resetResults.details.warnings || []
resetResults.details.warnings.push('清除缓存失败')
}
} catch (error) {
console.error('重置数据库失败:', error)
throw createError({
statusCode: 500,
message: `重置数据库失败:${error.message}`
statusMessage: `重置数据库失败: ${error.message}`
})
}
@@ -276,7 +248,7 @@ export default defineEventHandler(async (event) => {
} catch (error) {
throw createError({
statusCode: error.statusCode || 500,
message: error.message || '服务器内部错误'
statusMessage: error.statusMessage || '服务器内部错误'
})
}
})