初次提交
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import { createError, defineEventHandler } from 'h3'
|
||||
import { and, count, db, eq, exists, schedules, semesters, songs, votes } from '~/drizzle/db'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
// 检查认证和权限
|
||||
const user = event.context.user
|
||||
if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
message: '需要管理员权限'
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取所有学期
|
||||
const semesterList = await db.select().from(semesters).orderBy(semesters.createdAt)
|
||||
|
||||
// 获取每个学期的统计数据
|
||||
const semesterStats = await Promise.all(
|
||||
semesterList.map(async (semester) => {
|
||||
// 统计该学期的歌曲数量
|
||||
const [totalSongsResult, totalSchedulesResult, totalRequestsResult] = await Promise.all([
|
||||
db
|
||||
.select({ count: count() })
|
||||
.from(songs)
|
||||
.where(eq(songs.semester, semester.name)),
|
||||
|
||||
// 统计该学期的排期数量(通过关联歌曲)
|
||||
db
|
||||
.select({ count: count() })
|
||||
.from(schedules)
|
||||
.innerJoin(songs, eq(schedules.songId, songs.id))
|
||||
.where(eq(songs.semester, semester.name)),
|
||||
|
||||
// 统计该学期有投票的歌曲数量
|
||||
db
|
||||
.select({ count: count() })
|
||||
.from(songs)
|
||||
.where(
|
||||
and(
|
||||
eq(songs.semester, semester.name),
|
||||
exists(db.select().from(votes).where(eq(votes.songId, songs.id)))
|
||||
)
|
||||
)
|
||||
])
|
||||
|
||||
const [totalSongs, totalSchedules, totalRequests] = [
|
||||
totalSongsResult[0]?.count || 0,
|
||||
totalSchedulesResult[0]?.count || 0,
|
||||
totalRequestsResult[0]?.count || 0
|
||||
]
|
||||
|
||||
return {
|
||||
semester: semester.name,
|
||||
totalSongs,
|
||||
totalSchedules,
|
||||
totalRequests,
|
||||
isActive: semester.isActive
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
return semesterStats
|
||||
} catch (error) {
|
||||
console.error('获取学期对比数据失败:', error)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
message: '获取学期对比数据失败'
|
||||
})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user