|
|
|
@ -36,6 +36,46 @@ async function testDbConnection() { |
|
|
|
testDbConnection(); |
|
|
|
|
|
|
|
const server = http.createServer(async (req, res) => { |
|
|
|
// 健康检查端点
|
|
|
|
if (req.method === 'GET' && req.url === '/health') { |
|
|
|
try { |
|
|
|
// 测试数据库连接
|
|
|
|
const [rows] = await pool.execute('SELECT 1'); |
|
|
|
|
|
|
|
// 测试OSS连接
|
|
|
|
const ossStatus = await OssUploader.testConnection(); |
|
|
|
|
|
|
|
res.writeHead(200, { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Access-Control-Allow-Origin': '*', |
|
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', |
|
|
|
'Access-Control-Allow-Headers': 'Content-Type' |
|
|
|
}); |
|
|
|
res.end(JSON.stringify({ |
|
|
|
success: true, |
|
|
|
status: 'healthy', |
|
|
|
database: 'connected', |
|
|
|
oss: ossStatus.success ? 'connected' : 'disconnected', |
|
|
|
timestamp: new Date().toISOString() |
|
|
|
})); |
|
|
|
} catch (error) { |
|
|
|
console.error('健康检查失败:', error.message); |
|
|
|
res.writeHead(503, { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Access-Control-Allow-Origin': '*', |
|
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', |
|
|
|
'Access-Control-Allow-Headers': 'Content-Type' |
|
|
|
}); |
|
|
|
res.end(JSON.stringify({ |
|
|
|
success: false, |
|
|
|
status: 'unhealthy', |
|
|
|
error: error.message, |
|
|
|
timestamp: new Date().toISOString() |
|
|
|
})); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// 处理GET请求,获取最新的合格证信息
|
|
|
|
if (req.method === 'GET' && req.url === '/getLatestCertificate') { |
|
|
|
try { |
|
|
|
@ -76,60 +116,84 @@ const server = http.createServer(async (req, res) => { |
|
|
|
}); |
|
|
|
|
|
|
|
req.on('end', async () => { |
|
|
|
// 解析表单数据
|
|
|
|
const formData = new URLSearchParams(body); |
|
|
|
const certificate = { |
|
|
|
subjectName: formData.get('subjectName'), |
|
|
|
contact: formData.get('contact'), |
|
|
|
productName: formData.get('productName'), |
|
|
|
weight: formData.get('weight'), |
|
|
|
basis: formData.get('basis'), |
|
|
|
origin: formData.get('origin'), |
|
|
|
date: formData.get('date'), |
|
|
|
signature: formData.get('signature') |
|
|
|
}; |
|
|
|
|
|
|
|
// 处理手写签名,上传到OSS
|
|
|
|
let signatureUrl = null; |
|
|
|
if (certificate.signature) { |
|
|
|
try { |
|
|
|
// 从base64字符串中提取图片数据
|
|
|
|
const base64Data = certificate.signature.replace(/^data:image\/png;base64,/, ''); |
|
|
|
const buffer = Buffer.from(base64Data, 'base64'); |
|
|
|
|
|
|
|
// 生成唯一的文件名,包含合格证信息的标识
|
|
|
|
const timestamp = Date.now(); |
|
|
|
const filename = `certificate_signature_${timestamp}.png`; |
|
|
|
|
|
|
|
// 上传到OSS,指定文件夹为certificate/signatures
|
|
|
|
signatureUrl = await OssUploader.uploadBuffer(buffer, filename, 'certificate/signatures', 'image'); |
|
|
|
console.log('手写签名上传到OSS成功:', signatureUrl); |
|
|
|
} catch (error) { |
|
|
|
console.error('上传手写签名到OSS失败:', error.message); |
|
|
|
// 即使上传失败,也继续处理,将签名数据存储为base64
|
|
|
|
signatureUrl = certificate.signature; |
|
|
|
try { |
|
|
|
// 解析表单数据
|
|
|
|
const formData = new URLSearchParams(body); |
|
|
|
const certificate = { |
|
|
|
subjectName: formData.get('subjectName'), |
|
|
|
contact: formData.get('contact'), |
|
|
|
productName: formData.get('productName'), |
|
|
|
weight: formData.get('weight'), |
|
|
|
basis: formData.get('basis'), |
|
|
|
origin: formData.get('origin'), |
|
|
|
date: formData.get('date'), |
|
|
|
signature: formData.get('signature') |
|
|
|
}; |
|
|
|
|
|
|
|
console.log('接收到的表单数据:', { |
|
|
|
subjectName: certificate.subjectName, |
|
|
|
contact: certificate.contact, |
|
|
|
productName: certificate.productName, |
|
|
|
weight: certificate.weight, |
|
|
|
basis: certificate.basis, |
|
|
|
origin: certificate.origin, |
|
|
|
date: certificate.date, |
|
|
|
hasSignature: !!certificate.signature |
|
|
|
}); |
|
|
|
|
|
|
|
// 处理手写签名,上传到OSS
|
|
|
|
let signatureUrl = null; |
|
|
|
if (certificate.signature) { |
|
|
|
try { |
|
|
|
// 从base64字符串中提取图片数据
|
|
|
|
const base64Data = certificate.signature.replace(/^data:image\/png;base64,/, ''); |
|
|
|
const buffer = Buffer.from(base64Data, 'base64'); |
|
|
|
|
|
|
|
// 生成唯一的文件名,包含合格证信息的标识
|
|
|
|
const timestamp = Date.now(); |
|
|
|
const filename = `certificate_signature_${timestamp}.png`; |
|
|
|
|
|
|
|
// 上传到OSS,指定文件夹为certificate/signatures
|
|
|
|
signatureUrl = await OssUploader.uploadBuffer(buffer, filename, 'certificate/signatures', 'image'); |
|
|
|
console.log('手写签名上传到OSS成功:', signatureUrl); |
|
|
|
} catch (error) { |
|
|
|
console.error('上传手写签名到OSS失败:', error.message); |
|
|
|
// 即使上传失败,也继续处理,将签名数据存储为base64
|
|
|
|
signatureUrl = certificate.signature; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 插入数据到数据库
|
|
|
|
await pool.execute( |
|
|
|
'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', |
|
|
|
[certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl] |
|
|
|
); |
|
|
|
|
|
|
|
// 返回成功响应,确保返回的signature是OSS URL
|
|
|
|
const responseCertificate = { |
|
|
|
...certificate, |
|
|
|
signature: signatureUrl |
|
|
|
}; |
|
|
|
|
|
|
|
res.writeHead(200, { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Access-Control-Allow-Origin': '*', |
|
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', |
|
|
|
'Access-Control-Allow-Headers': 'Content-Type' |
|
|
|
}); |
|
|
|
res.end(JSON.stringify({ success: true, certificate: responseCertificate })); |
|
|
|
// 插入数据到数据库
|
|
|
|
await pool.execute( |
|
|
|
'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', |
|
|
|
[certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl] |
|
|
|
); |
|
|
|
|
|
|
|
console.log('数据插入数据库成功'); |
|
|
|
|
|
|
|
// 返回成功响应,确保返回的signature是OSS URL
|
|
|
|
const responseCertificate = { |
|
|
|
...certificate, |
|
|
|
signature: signatureUrl |
|
|
|
}; |
|
|
|
|
|
|
|
res.writeHead(200, { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Access-Control-Allow-Origin': '*', |
|
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', |
|
|
|
'Access-Control-Allow-Headers': 'Content-Type' |
|
|
|
}); |
|
|
|
res.end(JSON.stringify({ success: true, certificate: responseCertificate })); |
|
|
|
} catch (error) { |
|
|
|
console.error('处理表单数据失败:', error.message); |
|
|
|
res.writeHead(500, { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Access-Control-Allow-Origin': '*', |
|
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', |
|
|
|
'Access-Control-Allow-Headers': 'Content-Type' |
|
|
|
}); |
|
|
|
res.end(JSON.stringify({ success: false, error: '处理数据失败,请重试' })); |
|
|
|
} |
|
|
|
}); |
|
|
|
} catch (error) { |
|
|
|
console.error('保存合格证信息失败:', error.message); |
|
|
|
|