feat: 迁移自定义功能至 1.5.9.9 版本
包含音乐源限制、CI 防 OOM 优化、数据库连接池优化、管理端权限及 UI 细节定制等功能
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user