WuYongJie 5f2ba48532
Some checks failed
CI Check / check (push) Has been cancelled
优化模板管理器拖拽交互体验
- 移除高亮卡片效果,避免与虚位卡片视觉重复
- 松开鼠标后立即更新布局,不再等待动画完成
- 优化拖拽动画效果,使用弹性缓动函数
- 更新 CHANGELOG.md 记录本次优化
2025-11-20 11:24:25 +08:00

51 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextResponse } from 'next/server'
import { prisma } from '@/lib/prisma'
export const dynamic = 'force-dynamic'
// Get material statistics (total count and monthly breakdown)
// 优化:使用SQL聚合查询,避免加载所有数据到内存
export async function GET() {
try {
// 并行查询总数和按月统计
const [total, monthlyStats] = await Promise.all([
prisma.material.count(),
prisma.$queryRaw<Array<{
year: number
month: number
count: bigint
}>>`
SELECT
EXTRACT(YEAR FROM created_at)::int as year,
EXTRACT(MONTH FROM created_at)::int as month,
COUNT(*)::bigint as count
FROM materials
GROUP BY EXTRACT(YEAR FROM created_at), EXTRACT(MONTH FROM created_at)
ORDER BY year DESC, month DESC
`
])
// 格式化月份数据
const months = monthlyStats.map(item => {
const monthKey = `${item.year}-${String(item.month).padStart(2, '0')}`
return {
value: monthKey,
label: `${item.year}年${item.month}月`,
count: Number(item.count)
}
})
return NextResponse.json({
total,
months
})
} catch (error) {
console.error('[MaterialStats] Get error:', error)
return NextResponse.json(
{ error: '获取统计数据失败' },
{ status: 500 }
)
}
}