|
|
@ -768,37 +768,48 @@ app.post('/api/supplies/create', async (req, res) => { |
|
|
// 生成唯一的productId
|
|
|
// 生成唯一的productId
|
|
|
const productId = `product_${Date.now()}_${Math.floor(Math.random() * 1000)}`; |
|
|
const productId = `product_${Date.now()}_${Math.floor(Math.random() * 1000)}`; |
|
|
|
|
|
|
|
|
// 处理图片上传
|
|
|
// 处理媒体文件上传(图片和视频)
|
|
|
let uploadedImageUrls = []; |
|
|
let uploadedImageUrls = []; |
|
|
if (Array.isArray(imageUrls) && imageUrls.length > 0) { |
|
|
if (Array.isArray(imageUrls) && imageUrls.length > 0) { |
|
|
console.log('开始处理图片上传,共', imageUrls.length, '张图片'); |
|
|
console.log('开始处理媒体文件上传,共', imageUrls.length, '个文件'); |
|
|
|
|
|
|
|
|
for (const imageUrl of imageUrls) { |
|
|
for (const mediaUrl of imageUrls) { |
|
|
if (imageUrl.startsWith('data:image/')) { |
|
|
if (mediaUrl.startsWith('data:image/') || mediaUrl.startsWith('data:video/')) { |
|
|
// 处理DataURL
|
|
|
// 处理DataURL
|
|
|
const base64Data = imageUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); |
|
|
let base64Data, ext, fileType; |
|
|
|
|
|
if (mediaUrl.startsWith('data:image/')) { |
|
|
|
|
|
// 图片类型
|
|
|
|
|
|
base64Data = mediaUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); |
|
|
|
|
|
ext = mediaUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; |
|
|
|
|
|
fileType = 'image'; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 视频类型
|
|
|
|
|
|
base64Data = mediaUrl.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); |
|
|
|
|
|
ext = mediaUrl.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; |
|
|
|
|
|
fileType = 'video'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
let buffer = Buffer.from(base64Data, 'base64'); |
|
|
let buffer = Buffer.from(base64Data, 'base64'); |
|
|
const ext = imageUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; |
|
|
|
|
|
const filename = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; |
|
|
const filename = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
// 不再添加水印,前端已处理
|
|
|
// 不再添加水印,前端已处理
|
|
|
console.log('【水印处理】前端已添加水印,跳过后端水印处理'); |
|
|
console.log('【水印处理】前端已添加水印,跳过后端水印处理'); |
|
|
|
|
|
|
|
|
// 使用OSS上传带水印的图片
|
|
|
// 使用OSS上传媒体文件
|
|
|
const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, 'image'); |
|
|
const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, fileType); |
|
|
uploadedImageUrls.push(ossUrl); |
|
|
uploadedImageUrls.push(ossUrl); |
|
|
console.log('图片上传成功:', ossUrl); |
|
|
console.log(`${fileType}上传成功:`, ossUrl); |
|
|
} catch (uploadError) { |
|
|
} catch (uploadError) { |
|
|
console.error('图片上传失败:', uploadError.message); |
|
|
console.error(`${fileType}上传失败:`, uploadError.message); |
|
|
// 继续上传其他图片,不中断流程
|
|
|
// 继续上传其他文件,不中断流程
|
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
// 已经是URL,直接使用
|
|
|
// 已经是URL,直接使用
|
|
|
uploadedImageUrls.push(imageUrl); |
|
|
uploadedImageUrls.push(mediaUrl); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
console.log('图片处理完成,成功上传', uploadedImageUrls.length, '张图片'); |
|
|
console.log('媒体文件处理完成,成功上传', uploadedImageUrls.length, '个文件'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 创建商品数据
|
|
|
// 创建商品数据
|
|
|
@ -883,16 +894,86 @@ app.post('/api/supplies/create', async (req, res) => { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
// 图片上传API - /api/upload-image
|
|
|
// 媒体文件上传API - /api/upload-media
|
|
|
|
|
|
console.log('正在注册媒体文件上传API路由: /api/upload-media'); |
|
|
|
|
|
app.post('/api/upload-media', async (req, res) => { |
|
|
|
|
|
console.log('收到媒体文件上传请求:', req.body); |
|
|
|
|
|
try { |
|
|
|
|
|
const { fileData, fileName, folder = 'general' } = req.body; |
|
|
|
|
|
|
|
|
|
|
|
// 验证参数
|
|
|
|
|
|
if (!fileData) { |
|
|
|
|
|
return sendResponse(res, false, null, '文件数据不能为空'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let base64Data, ext, fileType; |
|
|
|
|
|
if (fileData.startsWith('data:image/')) { |
|
|
|
|
|
// 图片类型
|
|
|
|
|
|
base64Data = fileData.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); |
|
|
|
|
|
ext = fileData.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; |
|
|
|
|
|
fileType = 'image'; |
|
|
|
|
|
} else if (fileData.startsWith('data:video/')) { |
|
|
|
|
|
// 视频类型
|
|
|
|
|
|
base64Data = fileData.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); |
|
|
|
|
|
ext = fileData.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; |
|
|
|
|
|
fileType = 'video'; |
|
|
|
|
|
} else { |
|
|
|
|
|
return sendResponse(res, false, null, '不支持的文件类型'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let buffer = Buffer.from(base64Data, 'base64'); |
|
|
|
|
|
const filename = fileName || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
// 使用OSS上传媒体文件
|
|
|
|
|
|
const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `uploads/${folder}`, fileType); |
|
|
|
|
|
console.log(`${fileType}上传成功:`, ossUrl); |
|
|
|
|
|
|
|
|
|
|
|
sendResponse(res, true, { |
|
|
|
|
|
url: ossUrl, |
|
|
|
|
|
fileType: fileType, |
|
|
|
|
|
message: `${fileType}上传成功` |
|
|
|
|
|
}, `${fileType}上传成功`); |
|
|
|
|
|
} catch (uploadError) { |
|
|
|
|
|
console.error(`${fileType}上传失败:`, uploadError.message); |
|
|
|
|
|
sendResponse(res, false, null, `${fileType}上传失败: ${uploadError.message}`); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error('媒体文件上传API错误:', error.message); |
|
|
|
|
|
sendResponse(res, false, null, `媒体文件上传失败: ${error.message}`); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 图片上传API - /api/upload-image(兼容旧接口)
|
|
|
console.log('正在注册图片上传API路由: /api/upload-image'); |
|
|
console.log('正在注册图片上传API路由: /api/upload-image'); |
|
|
app.post('/api/upload-image', async (req, res) => { |
|
|
app.post('/api/upload-image', async (req, res) => { |
|
|
console.log('收到图片上传请求'); |
|
|
console.log('收到图片上传请求,转发到媒体文件上传API'); |
|
|
// 注意:这里需要实现实际的图片上传逻辑,包括OSS配置
|
|
|
// 将请求转发到媒体文件上传API
|
|
|
// 由于当前缺少OSS配置,返回模拟数据
|
|
|
const uploadMediaHandler = app._router.stack.find(layer => |
|
|
sendResponse(res, true, { |
|
|
layer.route && layer.route.path === '/api/upload-media' && layer.route.methods['post'] |
|
|
imageUrl: 'https://example.com/image.jpg', |
|
|
); |
|
|
message: '图片上传成功' |
|
|
|
|
|
}, '图片上传成功'); |
|
|
if (uploadMediaHandler && uploadMediaHandler.route && uploadMediaHandler.route.stack[0]) { |
|
|
|
|
|
return uploadMediaHandler.route.stack[0].handle(req, res); |
|
|
|
|
|
} else { |
|
|
|
|
|
sendResponse(res, false, null, '图片上传API内部错误'); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 视频上传API - /api/upload-video(专门的视频上传接口)
|
|
|
|
|
|
console.log('正在注册视频上传API路由: /api/upload-video'); |
|
|
|
|
|
app.post('/api/upload-video', async (req, res) => { |
|
|
|
|
|
console.log('收到视频上传请求,转发到媒体文件上传API'); |
|
|
|
|
|
// 将请求转发到媒体文件上传API
|
|
|
|
|
|
const uploadMediaHandler = app._router.stack.find(layer => |
|
|
|
|
|
layer.route && layer.route.path === '/api/upload-media' && layer.route.methods['post'] |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (uploadMediaHandler && uploadMediaHandler.route && uploadMediaHandler.route.stack[0]) { |
|
|
|
|
|
return uploadMediaHandler.route.stack[0].handle(req, res); |
|
|
|
|
|
} else { |
|
|
|
|
|
sendResponse(res, false, null, '视频上传API内部错误'); |
|
|
|
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
// 获取审核失败原因API - /api/supplies/:id/reject-reason
|
|
|
// 获取审核失败原因API - /api/supplies/:id/reject-reason
|
|
|
@ -1089,6 +1170,53 @@ app.put('/api/supplies/:id/edit', async (req, res) => { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
<<<<<<< Updated upstream |
|
|
|
|
|
======= |
|
|
|
|
|
// 处理媒体文件上传(图片和视频)
|
|
|
|
|
|
let uploadedImageUrls = []; |
|
|
|
|
|
if (Array.isArray(imageUrls) && imageUrls.length > 0) { |
|
|
|
|
|
console.log('开始处理编辑媒体文件上传,共', imageUrls.length, '个文件'); |
|
|
|
|
|
|
|
|
|
|
|
for (const mediaUrl of imageUrls) { |
|
|
|
|
|
if (mediaUrl.startsWith('data:image/') || mediaUrl.startsWith('data:video/')) { |
|
|
|
|
|
// 处理DataURL
|
|
|
|
|
|
let base64Data, ext, fileType; |
|
|
|
|
|
if (mediaUrl.startsWith('data:image/')) { |
|
|
|
|
|
// 图片类型
|
|
|
|
|
|
base64Data = mediaUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); |
|
|
|
|
|
ext = mediaUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; |
|
|
|
|
|
fileType = 'image'; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 视频类型
|
|
|
|
|
|
base64Data = mediaUrl.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); |
|
|
|
|
|
ext = mediaUrl.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; |
|
|
|
|
|
fileType = 'video'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let buffer = Buffer.from(base64Data, 'base64'); |
|
|
|
|
|
const filename = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
// 不再添加水印,前端已处理
|
|
|
|
|
|
console.log('【水印处理】前端已添加水印,跳过后端水印处理'); |
|
|
|
|
|
|
|
|
|
|
|
// 使用OSS上传媒体文件
|
|
|
|
|
|
const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, fileType); |
|
|
|
|
|
uploadedImageUrls.push(ossUrl); |
|
|
|
|
|
console.log(`${fileType}上传成功:`, ossUrl); |
|
|
|
|
|
} catch (uploadError) { |
|
|
|
|
|
console.error(`${fileType}上传失败:`, uploadError.message); |
|
|
|
|
|
// 继续上传其他文件,不中断流程
|
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
// 已经是URL,直接使用
|
|
|
|
|
|
uploadedImageUrls.push(mediaUrl); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
console.log('媒体文件处理完成,成功上传', uploadedImageUrls.length, '个文件'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
>>>>>>> Stashed changes |
|
|
// 更新货源信息
|
|
|
// 更新货源信息
|
|
|
const updateQuery = ` |
|
|
const updateQuery = ` |
|
|
UPDATE products |
|
|
UPDATE products |
|
|
|