chenpei cd6e40d9d2 优化:网络传输性能和稳定性 - TCP缓冲区+并发控制优化
主要改动:
1. TCP缓冲区优化(16MB)- 解决公网上传速度慢问题
2. 并发数降低到1-3 - 避免4并发导致ERR_CONNECTION_RESET
3. 动态并发控制 - 根据网络环境自动调整
4. Nginx超时增加到120s - 支持大分片上传
5. 上传进度修复 - 修复剩余时间计算
6. 新增任务-页面上传器和详情组件
7. 统一部署文档为deploy-remote-build.ps1

问题修复:
- 公网用户上传从200-900KB/s提升到预期3-5MB/s
- 内网用户上传更稳定,无连接重置错误
- UploadProgress组件剩余时间计算修正

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-27 09:33:09 +08:00

105 lines
3.2 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 { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
// POST - 初始化任务-页面素材记录
export async function POST(request: NextRequest) {
try {
const session = await getServerSession(authOptions);
if (!session) {
return NextResponse.json({ error: '请先登录' }, { status: 401 });
}
const body = await request.json();
const { taskNo, productModel, categoryName, sceneName, platformName, productCategoryName } = body;
// 验证必填字段
if (!productModel || !categoryName || !sceneName) {
return NextResponse.json(
{ error: '缺少必填字段' },
{ status: 400 }
);
}
// 验证任务号格式(如果提供)
if (taskNo) {
const taskNoRegex = /^TASK\d{12,18}(-\d{2})*$/;
if (!taskNoRegex.test(taskNo)) {
return NextResponse.json(
{ error: '任务号格式错误' },
{ status: 400 }
);
}
// 检查任务号是否已存在(排除已删除的素材)
const existingMaterial = await prisma.material.findFirst({
where: {
taskNo,
deletedAt: null, // 只检查未删除的素材
},
select: { id: true, productModel: true, materialType: true },
});
if (existingMaterial) {
return NextResponse.json(
{ error: `任务号 ${taskNo} 已存在,对应素材:${existingMaterial.productModel}(${existingMaterial.materialType})` },
{ status: 400 }
);
}
}
// 获取用户信息
const user = await prisma.user.findUnique({
where: { id: (session.user as any).id },
select: { username: true },
});
if (!user) {
return NextResponse.json(
{ error: '用户不存在' },
{ status: 404 }
);
}
// 创建素材记录(使用临时预览图)
const material = await prisma.material.create({
data: {
materialType: '任务-页面',
productModel,
categoryName,
sceneName,
platformName: platformName || '',
productCategoryName: productCategoryName || '',
authorName: user.username,
userId: (session.user as any).id,
previewUrl: '', // 临时空值,完成上传时更新
zipFilePath: '', // 临时空值,完成上传时更新
zipFileName: '', // 临时空值,完成上传时更新
renderer: '', // 任务-页面不需要渲染器
taskNo: taskNo || null, // 任务号(可选)
},
});
return NextResponse.json({
success: true,
materialId: material.id,
});
} catch (error: any) {
console.error('[Task Page Init Error]', error);
// 捕获 Prisma 唯一约束错误(任务号重复)
if (error?.code === 'P2002' && error?.meta?.target?.includes('task_no')) {
return NextResponse.json(
{ error: `任务号已被使用,请检查是否重复提交` },
{ status: 400 }
);
}
return NextResponse.json(
{ error: error.message || '初始化失败' },
{ status: 500 }
);
}
}