chenpei 4e89b57798 feat(upload): optimize upload UI and performance
- Expand batch upload list area and optimize preview image layout
- Improve upload speed tracking and display (server-side & client-side)
- Reduce network detection log noise
- Optimize Docker build process (caching, env validation)
- Add shadow environment deployment support
2026-01-28 15:07:50 +08:00

67 lines
1.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import { exec } from 'child_process'
import { promisify } from 'util'
const execAsync = promisify(exec)
/**
* 获取系统日志(仅管理员)
* 用于调试和监控系统状态
*/
export async function GET(request: NextRequest) {
try {
// 验证管理员权限
const session = await getServerSession(authOptions)
if (!session || !(session.user as any).id) {
return NextResponse.json({ error: '未登录' }, { status: 401 })
}
const user = await prisma?.user.findUnique({
where: { id: (session.user as any).id },
select: { role: true, isSuperAdmin: true }
})
if (!user?.isSuperAdmin && user?.role !== 'ADMIN') {
return NextResponse.json({ error: '无权限访问' }, { status: 403 })
}
// 获取查询参数
const searchParams = request.nextUrl.searchParams
const lines = parseInt(searchParams.get('lines') || '100')
const keyword = searchParams.get('keyword') || ''
// 读取最近的日志
let cmd = `docker logs --tail ${lines} youyidian-3d-material 2>&1`
if (keyword) {
cmd += ` | grep -i "${keyword}" || docker logs --tail ${lines} youyidian-3d-material 2>&1`
}
const { stdout, stderr } = await execAsync(cmd, {
maxBuffer: 10 * 1024 * 1024, // 10MB
timeout: 10000,
})
const logs = stdout || stderr
return NextResponse.json({
success: true,
lines: logs.split('\n').length,
logs: logs.substring(0, 50000), // 限制返回大小
truncated: logs.length > 50000,
})
} catch (error) {
console.error('[SystemLogs] Error:', error)
return NextResponse.json(
{
error: error instanceof Error ? error.message : '获取日志失败',
logs: '',
},
{ status: 500 }
)
}
}