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
+25 -18
View File
@@ -1,7 +1,8 @@
import { createError, defineEventHandler, getQuery } from 'h3'
import { db } from '~/drizzle/db'
import { schedules, semesters, songBlacklists, songs, users } from '~/drizzle/schema'
import { and, count, eq, gte, lt, ne } from 'drizzle-orm'
import { and, count, eq, gte, lt } from 'drizzle-orm'
import { cacheService } from '../../services/cacheService'
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc.js'
import timezone from 'dayjs/plugin/timezone.js'
@@ -14,7 +15,7 @@ const BEIJING_TIMEZONE = 'Asia/Shanghai'
export default defineEventHandler(async (event) => {
// 检查认证和权限
const user = event.context.user
if (!user || !['SONG_ADMIN', 'ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
throw createError({
statusCode: 403,
message: '需要管理员权限'
@@ -25,6 +26,12 @@ export default defineEventHandler(async (event) => {
const semester = query.semester as string
try {
// 尝试从缓存获取数据
const cachedStats = await cacheService.getAdminStats(semester)
if (cachedStats) {
console.log('[Cache] 管理员统计数据缓存命中')
return cachedStats
}
// 获取当前时间相关的日期
const now = new Date()
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
@@ -69,12 +76,9 @@ export default defineEventHandler(async (event) => {
return result[0].count
})(),
// 总用户数(排除待审核用户)
// 总用户数
(async () => {
const result = await db
.select({ count: count() })
.from(users)
.where(ne(users.status, 'pending'))
const result = await db.select({ count: count() }).from(users)
return result[0].count
})(),
@@ -170,27 +174,21 @@ export default defineEventHandler(async (event) => {
return result[0].count
})(),
// 本周新增用户(排除待审核)
// 本周新增用户
(async () => {
const result = await db
.select({ count: count() })
.from(users)
.where(and(gte(users.createdAt, weekAgo), ne(users.status, 'pending')))
.where(gte(users.createdAt, weekAgo))
return result[0].count
})(),
// 上周新增用户(排除待审核)
// 上周新增用户
(async () => {
const result = await db
.select({ count: count() })
.from(users)
.where(
and(
gte(users.createdAt, twoWeeksAgo),
lt(users.createdAt, weekAgo),
ne(users.status, 'pending')
)
)
.where(and(gte(users.createdAt, twoWeeksAgo), lt(users.createdAt, weekAgo)))
return result[0].count
})(),
@@ -264,7 +262,7 @@ export default defineEventHandler(async (event) => {
const result = await db
.select({ count: count() })
.from(users)
.where(and(gte(users.createdAt, startOfDay), lt(users.createdAt, endOfDay), ne(users.status, 'pending')))
.where(and(gte(users.createdAt, startOfDay), lt(users.createdAt, endOfDay)))
const countValue = result[0].count
trends.push({
@@ -355,6 +353,15 @@ export default defineEventHandler(async (event) => {
requestsTrend: trendData[3]
}
// 缓存结果
await cacheService.setAdminStats(semester, result)
// 只在Redis可用时显示缓存提示
const { isRedisReady } = await import('../../utils/redis')
if (isRedisReady()) {
console.log('[Cache] 管理员统计数据已缓存')
}
return result
} catch (error) {
console.error('获取统计数据失败:', error)