feat: 实现统一日志系统和维护模式功能

This commit is contained in:
zhang1106
2026-04-28 10:57:17 +08:00
parent 763e425f78
commit bf2cd221b9
43 changed files with 1966 additions and 430 deletions
+8 -7
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('AuthRoute');
const express = require('express');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
@@ -124,7 +125,7 @@ router.post('/register', async (req, res) => {
});
}
} catch (error) {
console.error('注册错误:', error);
logger.error('注册错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '注册失败',
@@ -222,7 +223,7 @@ router.post('/login', async (req, res) => {
},
});
} catch (error) {
console.error('登录错误:', error);
logger.error('登录错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '登录失败',
@@ -264,7 +265,7 @@ router.get('/profile', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取profile错误:', error);
logger.error('获取profile错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取用户信息失败',
@@ -312,7 +313,7 @@ router.put('/profile', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('更新profile错误:', error);
logger.error('更新profile错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新失败',
@@ -356,7 +357,7 @@ router.put('/password', authMiddleware, async (req, res) => {
message: '密码修改成功',
});
} catch (error) {
console.error('修改密码错误:', error);
logger.error('修改密码错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '密码修改失败',
@@ -376,7 +377,7 @@ router.post('/check-admin', async (req, res) => {
},
});
} catch (error) {
console.error('检查管理员错误:', error);
logger.error('检查管理员错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '检查失败',
@@ -428,7 +429,7 @@ router.post('/unlock', async (req, res) => {
message: '账户解锁成功',
});
} catch (error) {
console.error('解锁账户错误:', error);
logger.error('解锁账户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '解锁失败',
+7 -6
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('BackgroundRoute');
const express = require('express');
const path = require('path');
const fs = require('fs');
@@ -36,7 +37,7 @@ router.get('/', (req, res) => {
data: settings,
});
} catch (error) {
console.error('读取背景设置失败:', error);
logger.error('读取背景设置失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '读取背景设置失败' });
}
});
@@ -50,7 +51,7 @@ router.put('/', (req, res) => {
data: settings,
});
} catch (error) {
console.error('保存背景设置失败:', error);
logger.error('保存背景设置失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '保存背景设置失败' });
}
});
@@ -88,7 +89,7 @@ router.post('/upload', (req, res) => {
file.mv(filePath, err => {
if (err) {
console.error('文件保存失败:', err);
logger.error('文件保存失败', { err: err.message, stack: err.stack });
return res.status(500).json({ error: '文件保存失败' });
}
@@ -96,7 +97,7 @@ router.post('/upload', (req, res) => {
res.json({ path: fileUrl });
});
} catch (error) {
console.error('上传错误:', error);
logger.error('上传错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: '上传失败' });
}
});
@@ -106,7 +107,7 @@ router.get('/settings', (req, res) => {
const settings = JSON.parse(fs.readFileSync(SETTINGS_FILE, 'utf8'));
res.json(settings);
} catch (error) {
console.error('读取背景设置失败:', error);
logger.error('读取背景设置失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '读取背景设置失败' });
}
});
@@ -117,7 +118,7 @@ router.post('/settings', (req, res) => {
fs.writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2));
res.json({ success: true });
} catch (error) {
console.error('保存背景设置失败:', error);
logger.error('保存背景设置失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '保存背景设置失败' });
}
});
+116 -48
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('BackupRoute');
const express = require('express');
const router = express.Router();
const fs = require('fs');
@@ -76,7 +77,7 @@ router.post('/', async (req, res) => {
try {
const { description = '', includeFiles = true } = req.body;
console.log('开始创建备份...');
logger.info('开始创建备份...');
const result = await createBackup({
description,
includeFiles: includeFiles !== false,
@@ -88,7 +89,7 @@ router.post('/', async (req, res) => {
data: result,
});
} catch (error) {
console.error('创建备份失败:', error);
logger.error('创建备份失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '创建备份失败',
@@ -178,7 +179,7 @@ router.get('/list', async (req, res) => {
data: { backups: resolvedFiles, total: resolvedFiles.length },
});
} catch (error) {
console.error('获取备份列表失败:', error);
logger.error('获取备份列表失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取备份列表失败',
@@ -211,7 +212,7 @@ router.get('/validate/:filename', async (req, res) => {
data: validation,
});
} catch (error) {
console.error('验证备份文件失败:', error);
logger.error('验证备份文件失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '验证备份文件失败',
@@ -248,7 +249,8 @@ router.get('/restore-progress/:filename', async (req, res) => {
};
try {
console.log(`开始恢复备份: ${filename}`);
logger.info('开始恢复备份: ${filename}');
logger.info('恢复选项', { data: options });
sendProgress({ stage: 'start', message: '正在验证备份文件...', progress: 5 });
const validation = await validateBackupFile(filePath);
@@ -285,12 +287,56 @@ router.get('/restore-progress/:filename', async (req, res) => {
const totalTables = require('../utils/backup').RESTORE_ORDER.length;
let processedTables = 0;
let isStopped = false;
let clientDisconnected = false;
// 监听客户端断开连接 - 使用多种事件确保可靠检测
req.on('close', () => {
if (!clientDisconnected) {
clientDisconnected = true;
logger.info('客户端断开连接(req.close),准备停止恢复...');
isStopped = true;
}
});
req.on('aborted', () => {
if (!clientDisconnected) {
clientDisconnected = true;
logger.info('客户端中断请求(req.aborted),准备停止恢复...');
isStopped = true;
}
});
res.on('close', () => {
if (!clientDisconnected) {
clientDisconnected = true;
logger.info('响应流关闭(res.close),准备停止恢复...');
isStopped = true;
}
});
// 定期检查客户端是否仍然连接
const keepAliveInterval = setInterval(() => {
if (res.writableEnded || res.destroyed) {
if (!clientDisconnected) {
clientDisconnected = true;
logger.info('检测到响应流已结束,准备停止恢复...');
isStopped = true;
}
clearInterval(keepAliveInterval);
}
}, 1000);
const result = await restoreBackup(filePath, {
overwriteExisting: options.overwriteExisting !== false,
skipTables: options.skipTables || [],
skipFiles: options.skipFiles === true,
skipUserData: options.skipUserData === true,
shouldStop: () => isStopped,
onProgress: (tableName, status, count) => {
// 如果已停止,不再发送进度
if (isStopped) return;
processedTables++;
const progress = 20 + Math.floor((processedTables / totalTables) * 70);
const statusMap = {
@@ -312,23 +358,43 @@ router.get('/restore-progress/:filename', async (req, res) => {
},
});
sendProgress({
stage: 'complete',
message: '恢复完成!',
progress: 100,
result: {
tablesRestored: result.tablesRestored,
recordsRestored: result.recordsRestored,
filesRestored: result.filesRestored,
restoredAt: result.restoredAt,
tableDetails: result.tableDetails,
fileDetails: result.fileDetails,
},
});
clearInterval(keepAliveInterval);
if (result.stopped) {
sendProgress({
stage: 'stopped',
message: result.rolledBack ? '恢复已停止,数据已回滚到恢复前的状态' : '恢复已停止,数据可能处于不一致状态',
progress: 0,
result: {
tablesRestored: result.tablesRestored,
recordsRestored: result.recordsRestored,
filesRestored: result.filesRestored,
restoredAt: result.restoredAt,
tableDetails: result.tableDetails,
fileDetails: result.fileDetails,
stopped: true,
rolledBack: result.rolledBack,
},
});
} else {
sendProgress({
stage: 'complete',
message: '恢复完成!',
progress: 100,
result: {
tablesRestored: result.tablesRestored,
recordsRestored: result.recordsRestored,
filesRestored: result.filesRestored,
restoredAt: result.restoredAt,
tableDetails: result.tableDetails,
fileDetails: result.fileDetails,
},
});
}
res.end();
} catch (error) {
console.error('恢复备份失败:', error);
logger.error('恢复备份失败', { error: error.message, stack: error.stack });
sendProgress({ stage: 'error', message: `恢复失败: ${error.message}`, progress: 0 });
res.end();
}
@@ -352,14 +418,16 @@ router.post('/restore', async (req, res) => {
});
}
console.log(`开始恢复备份: ${filename}`);
logger.info('开始恢复备份: ${filename}');
logger.info('恢复选项', { data: options });
const result = await restoreBackup(filePath, {
overwriteExisting: options.overwriteExisting !== false,
skipTables: options.skipTables || [],
skipFiles: options.skipFiles === true,
skipUserData: options.skipUserData === true,
onProgress: (tableName, status, count) => {
console.log(` ${tableName}: ${status}${count ? ` (${count})` : ''}`);
logger.info(` ${tableName}: ${status}${count ? ` (${count})` : ''}`);
},
});
@@ -369,7 +437,7 @@ router.post('/restore', async (req, res) => {
data: result,
});
} catch (error) {
console.error('恢复备份失败:', error);
logger.error('恢复备份失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '恢复备份失败',
@@ -401,7 +469,7 @@ router.post('/upload', async (req, res) => {
const isCompressed = nameLower.endsWith('.gz');
console.log(`上传备份文件: ${originalName}, 压缩: ${isCompressed}, 大小: ${backupFile.size}`);
logger.info('上传备份文件: ${originalName}, 压缩: ${isCompressed}, 大小: ${backupFile.size}');
// 保存到临时文件
const tempFilename = `upload_${Date.now()}`;
@@ -437,7 +505,7 @@ router.post('/upload', async (req, res) => {
},
});
} catch (error) {
console.error('上传备份文件失败:', error);
logger.error('上传备份文件失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '上传备份文件失败',
@@ -465,11 +533,11 @@ router.get('/download/:filename', (req, res) => {
res.download(filePath, filename, err => {
if (err) {
console.error('下载备份文件失败:', err);
logger.error('下载备份文件失败', { err: err.message, stack: err.stack });
}
});
} catch (error) {
console.error('下载备份文件失败:', error);
logger.error('下载备份文件失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '下载备份文件失败',
@@ -503,7 +571,7 @@ router.delete('/:filename', (req, res) => {
data: { filename },
});
} catch (error) {
console.error('删除备份文件失败:', error);
logger.error('删除备份文件失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '删除备份文件失败',
@@ -539,7 +607,7 @@ router.get('/info', (req, res) => {
},
});
} catch (error) {
console.error('获取备份信息失败:', error);
logger.error('获取备份信息失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取备份信息失败',
@@ -570,7 +638,7 @@ router.post('/clean', (req, res) => {
data: result,
});
} catch (error) {
console.error('清理备份失败:', error);
logger.error('清理备份失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '清理备份失败',
@@ -580,7 +648,7 @@ router.post('/clean', (req, res) => {
});
router.use((error, req, res, next) => {
console.error('路由错误:', error);
logger.error('路由错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '服务器内部错误',
@@ -599,7 +667,7 @@ router.get('/auto/status', (req, res) => {
data: status,
});
} catch (error) {
console.error('获取自动备份状态失败:', error);
logger.error('获取自动备份状态失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取自动备份状态失败',
@@ -675,7 +743,7 @@ router.post('/auto/settings', (req, res) => {
});
}
} catch (error) {
console.error('更新自动备份设置失败:', error);
logger.error('更新自动备份设置失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新自动备份设置失败',
@@ -709,7 +777,7 @@ router.post('/auto/execute', async (req, res) => {
});
}
} catch (error) {
console.error('立即执行备份失败:', error);
logger.error('立即执行备份失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '立即执行备份失败',
@@ -741,7 +809,7 @@ router.post('/auto/test-cron', (req, res) => {
},
});
} catch (error) {
console.error('测试 Cron 表达式失败:', error);
logger.error('测试 Cron 表达式失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '测试 Cron 表达式失败',
@@ -761,7 +829,7 @@ router.get('/remote/targets', (req, res) => {
data: { targets },
});
} catch (error) {
console.error('获取远端备份目标失败:', error);
logger.error('获取远端备份目标失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取远端备份目标失败',
@@ -787,7 +855,7 @@ router.get('/remote/targets/:id', (req, res) => {
data: { target },
});
} catch (error) {
console.error('获取远端备份目标失败:', error);
logger.error('获取远端备份目标失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取远端备份目标失败',
@@ -816,7 +884,7 @@ router.post('/remote/targets', (req, res) => {
data: { target },
});
} catch (error) {
console.error('添加远端备份目标失败:', error);
logger.error('添加远端备份目标失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '添加远端备份目标失败',
@@ -837,7 +905,7 @@ router.put('/remote/targets/:id', (req, res) => {
data: { target },
});
} catch (error) {
console.error('更新远端备份目标失败:', error);
logger.error('更新远端备份目标失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新远端备份目标失败',
@@ -863,7 +931,7 @@ router.delete('/remote/targets/:id', (req, res) => {
message: '远端备份目标已删除',
});
} catch (error) {
console.error('删除远端备份目标失败:', error);
logger.error('删除远端备份目标失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '删除远端备份目标失败',
@@ -907,7 +975,7 @@ router.post('/remote/test', async (req, res) => {
});
}
} catch (error) {
console.error('[RemoteBackup] 测试远端连接失败:', error);
logger.error('[RemoteBackup] 测试远端连接失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '测试远端连接失败',
@@ -944,7 +1012,7 @@ router.post('/remote/targets/:id/test', async (req, res) => {
});
}
} catch (error) {
console.error('测试远端连接失败:', error);
logger.error('测试远端连接失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '测试远端连接失败',
@@ -962,7 +1030,7 @@ router.get('/remote/settings', (req, res) => {
data: { settings },
});
} catch (error) {
console.error('获取远端备份设置失败:', error);
logger.error('获取远端备份设置失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取远端备份设置失败',
@@ -981,7 +1049,7 @@ router.put('/remote/settings', (req, res) => {
data: { settings },
});
} catch (error) {
console.error('更新远端备份设置失败:', error);
logger.error('更新远端备份设置失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新远端备份设置失败',
@@ -1004,7 +1072,7 @@ router.get('/remote/protocols', (req, res) => {
data: { protocols },
});
} catch (error) {
console.error('获取协议列表失败:', error);
logger.error('获取协议列表失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取协议列表失败',
@@ -1078,7 +1146,7 @@ router.post('/remote/upload', async (req, res) => {
},
});
} catch (error) {
console.error('手动上传备份失败:', error);
logger.error('手动上传备份失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '手动上传备份失败',
@@ -1106,7 +1174,7 @@ router.get('/logs', async (req, res) => {
data: result,
});
} catch (error) {
console.error('获取备份日志失败:', error);
logger.error('获取备份日志失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取备份日志失败',
@@ -1133,7 +1201,7 @@ router.get('/logs/:id', async (req, res) => {
data: log,
});
} catch (error) {
console.error('获取备份日志详情失败:', error);
logger.error('获取备份日志详情失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取备份日志详情失败',
@@ -1154,7 +1222,7 @@ router.delete('/logs/clean', async (req, res) => {
data: { deletedCount },
});
} catch (error) {
console.error('清理旧日志失败:', error);
logger.error('清理旧日志失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '清理旧日志失败',
+14 -13
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('CablesRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -146,7 +147,7 @@ async function validatePortCompatibility(sourceDeviceId, sourcePortName, targetD
return checkPortCompatibility(sourcePort, targetPort);
} catch (error) {
console.error('验证端口兼容性时出错:', error);
logger.error('验证端口兼容性时出错', { error: error.message, stack: error.stack });
return {
compatible: false,
reasons: [{
@@ -163,7 +164,7 @@ async function updatePortStatus(deviceId, portName, status) {
try {
await DevicePort.update({ status }, { where: { deviceId, portName } });
} catch (error) {
console.error(`更新端口状态失败: ${deviceId}:${portName} -> ${status}`, error);
logger.error('更新端口状态失败: ${deviceId}:${portName} -> ${status}', { error: error.message, stack: error.stack });
}
}
@@ -233,7 +234,7 @@ router.get('/', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取接线列表失败:', error);
logger.error('获取接线列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -262,7 +263,7 @@ router.get('/device/:deviceId', async (req, res) => {
res.json(cables);
} catch (error) {
console.error('获取设备接线失败:', error);
logger.error('获取设备接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -308,7 +309,7 @@ router.get('/rack/:rackId', async (req, res) => {
res.json(cables);
} catch (error) {
console.error('获取机柜接线失败:', error);
logger.error('获取机柜接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -393,7 +394,7 @@ router.post('/check-conflict', async (req, res) => {
conflicts,
});
} catch (error) {
console.error('检查接线冲突失败:', error);
logger.error('检查接线冲突失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -414,7 +415,7 @@ router.post('/check-compatibility', async (req, res) => {
...compatibilityResult,
});
} catch (error) {
console.error('检查端口兼容性失败:', error);
logger.error('检查端口兼容性失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -542,7 +543,7 @@ router.post('/', async (req, res) => {
res.status(201).json(createdCable);
} catch (error) {
console.error('创建接线失败:', error);
logger.error('创建接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -622,7 +623,7 @@ router.post('/batch', async (req, res) => {
res.json(results);
} catch (error) {
console.error('批量创建接线失败:', error);
logger.error('批量创建接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -683,7 +684,7 @@ router.put('/:cableId', async (req, res) => {
res.status(404).json({ error: '接线不存在' });
}
} catch (error) {
console.error('更新接线失败:', error);
logger.error('更新接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -717,7 +718,7 @@ router.delete('/batch', async (req, res) => {
deletedCount,
});
} catch (error) {
console.error('批量删除接线失败:', error);
logger.error('批量删除接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -748,7 +749,7 @@ router.delete('/:cableId', async (req, res) => {
res.status(404).json({ error: '接线不存在' });
}
} catch (error) {
console.error('删除接线失败:', error);
logger.error('删除接线失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -776,7 +777,7 @@ router.get('/:cableId', async (req, res) => {
res.json(cable);
} catch (error) {
console.error('获取接线详情失败:', error);
logger.error('获取接线详情失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+6 -5
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('ConsumablesRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -175,7 +176,7 @@ router.get('/export', async (req, res) => {
total: result.length,
});
} catch (error) {
console.error('导出失败:', error);
logger.error('导出失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -219,7 +220,7 @@ router.post('/', async (req, res) => {
res.status(201).json(consumable);
} catch (error) {
await transaction.rollback();
console.error('创建耗材错误:', error);
logger.error('创建耗材错误', { error: error.message, stack: error.stack });
if (error.name === 'SequelizeValidationError') {
const messages = error.errors.map(e => `${e.path}: ${e.message}`).join(', ');
res.status(400).json({ error: `Validation error: ${messages}` });
@@ -345,7 +346,7 @@ router.post('/create-with-inbound', async (req, res) => {
res.status(201).json(consumable);
} catch (error) {
await transaction.rollback();
console.error('创建耗材并入库错误:', error);
logger.error('创建耗材并入库错误', { error: error.message, stack: error.stack });
if (error.name === 'SequelizeValidationError') {
const messages = error.errors.map(e => `${e.path}: ${e.message}`).join(', ');
res.status(400).json({ error: `Validation error: ${messages}` });
@@ -1891,7 +1892,7 @@ router.get('/devices/search', async (req, res) => {
res.json({ devices: result });
} catch (error) {
console.error('搜索设备失败:', error);
logger.error('搜索设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -1927,7 +1928,7 @@ router.get('/devices/by-sn/:sn', async (req, res) => {
},
});
} catch (error) {
console.error('查询设备失败:', error);
logger.error('查询设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+5 -4
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('DangerousOperationsRoute');
const express = require('express');
const router = express.Router();
const { authMiddleware } = require('../middleware/auth');
@@ -55,7 +56,7 @@ router.post('/log', async (req, res) => {
res.json({ success: true, riskLevel });
} catch (error) {
console.error('Failed to log dangerous operation:', error);
logger.error('Failed to log dangerous operation', { error: error.message, stack: error.stack });
res.status(500).json({ error: '日志记录失败' });
}
});
@@ -98,7 +99,7 @@ router.get('/logs', async (req, res) => {
totalPages: Math.ceil(total / parseInt(pageSize)),
});
} catch (error) {
console.error('Failed to get dangerous operations logs:', error);
logger.error('Failed to get dangerous operations logs', { error: error.message, stack: error.stack });
res.status(500).json({ error: '获取日志失败' });
}
});
@@ -144,7 +145,7 @@ router.delete('/logs/clean', async (req, res) => {
remainingCount: result.remainingCount,
});
} catch (error) {
console.error('Failed to clean logs:', error);
logger.error('Failed to clean logs', { error: error.message, stack: error.stack });
res.status(500).json({ error: '清理日志失败' });
}
});
@@ -177,7 +178,7 @@ router.get('/risk-assessment', async (req, res) => {
: 'STANDARD',
});
} catch (error) {
console.error('Failed to assess risk:', error);
logger.error('Failed to assess risk', { error: error.message, stack: error.stack });
res.status(500).json({ error: '风险评估失败' });
}
});
+12 -11
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('DevicePortsRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -59,8 +60,8 @@ router.get('/', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取端口列表失败:', error);
console.error('Error name:', error.name);
logger.error('获取端口列表失败', { error: error.message, stack: error.stack });
logger.error('Error name', { error: error.name });
res.status(500).json({ error: error.message, errorType: error.name });
}
});
@@ -88,7 +89,7 @@ router.get('/device/:deviceId', async (req, res) => {
res.json(ports);
} catch (error) {
console.error('获取设备端口失败:', error);
logger.error('获取设备端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -136,7 +137,7 @@ router.post('/', async (req, res) => {
res.status(201).json(createdPort);
} catch (error) {
console.error('创建端口失败:', error);
logger.error('创建端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -297,7 +298,7 @@ router.post('/batch', async (req, res) => {
throw error;
}
} catch (error) {
console.error('批量创建端口失败:', error);
logger.error('批量创建端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -336,7 +337,7 @@ router.put('/:portId', async (req, res) => {
res.status(404).json({ error: '端口不存在' });
}
} catch (error) {
console.error('更新端口失败:', error);
logger.error('更新端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -359,7 +360,7 @@ router.delete('/batch', async (req, res) => {
deletedCount,
});
} catch (error) {
console.error('批量删除端口失败:', error);
logger.error('批量删除端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -400,7 +401,7 @@ router.delete('/:portId', async (req, res) => {
res.status(204).json();
} catch (error) {
console.error('删除端口失败:', error);
logger.error('删除端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -422,7 +423,7 @@ router.post('/batch-delete', async (req, res) => {
deletedCount,
});
} catch (error) {
console.error('批量删除端口失败:', error);
logger.error('批量删除端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -482,7 +483,7 @@ router.get('/export/all', async (req, res) => {
pageSize: parsedPageSize,
});
} catch (error) {
console.error('获取端口列表失败:', error);
logger.error('获取端口列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -506,7 +507,7 @@ router.get('/:portId', async (req, res) => {
res.json(port);
} catch (error) {
console.error('获取端口详情失败:', error);
logger.error('获取端口详情失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+25 -30
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('DevicesRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -512,7 +513,7 @@ router.post('/import-preview', async (req, res) => {
},
});
} catch (error) {
console.error('预览设备数据失败:', error);
logger.error('预览设备数据失败', { error: error.message, stack: error.stack });
res.status(500).json({
error: error.message || '预览过程中发生未知错误',
});
@@ -531,8 +532,8 @@ router.get('/', validateQuery(queryDeviceSchema), async (req, res) => {
// 关键词搜索(所有文本字段 + 自定义字段)
if (keyword) {
console.log('搜索关键词:', keyword);
console.log('数据库类型:', dbDialect);
logger.info('搜索关键词', { data: keyword });
logger.info('数据库类型', { data: dbDialect });
// 转义关键词中的特殊字符,防止SQL注入
// 转义单引号(SQL注入)和 LIKE 通配符(%、_)
@@ -561,10 +562,7 @@ router.get('/', validateQuery(queryDeviceSchema), async (req, res) => {
},
});
console.log(
'找到的自定义字段:',
customFields.map(f => f.fieldName)
);
logger.info('找到的自定义字段', { data: customFields.map(f => f.fieldName) });
// 构建自定义字段搜索条件(使用原始SQL,兼容SQLite和MySQL
if (customFields.length > 0) {
@@ -592,7 +590,7 @@ router.get('/', validateQuery(queryDeviceSchema), async (req, res) => {
// 合并所有搜索条件
where[Op.or] = searchConditions;
console.log('搜索条件数量:', searchConditions.length);
logger.info('搜索条件数量', { data: searchConditions.length });
}
// 状态筛选
@@ -615,13 +613,10 @@ router.get('/', validateQuery(queryDeviceSchema), async (req, res) => {
// 调试日志
if (process.env.NODE_ENV === 'development') {
console.log('=== 设备查询调试 ===');
console.log('接收参数 - roomId:', roomId, 'rackId:', rackId);
console.log('查询条件 - where:', JSON.stringify(where));
console.log(
'机房筛选条件 - Rack.where:',
roomId && roomId !== 'all' ? { roomId: roomId } : undefined
);
logger.info('=== 设备查询调试 ===');
logger.info('接收参数', { roomId, rackId });
logger.info('查询条件 - where', { data: JSON.stringify(where) });
logger.info('机房筛选条件 - Rack.where', { data: roomId && roomId !== 'all' ? { roomId: roomId } : undefined });
}
// 空闲设备筛选
@@ -653,10 +648,10 @@ router.get('/', validateQuery(queryDeviceSchema), async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('搜索设备失败:', error);
console.error('错误详情:', error.message);
logger.error('搜索设备失败', { error: error.message, stack: error.stack });
logger.error('错误详情', { error: error.message });
if (error.sql) {
console.error('SQL:', error.sql);
logger.error('SQL', { error: error.sql });
}
res.status(500).json({ error: error.message, sql: error.sql });
}
@@ -717,7 +712,7 @@ router.get('/all', async (req, res) => {
total: devices.length,
});
} catch (error) {
console.error('获取设备列表失败:', error);
logger.error('获取设备列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -941,7 +936,7 @@ router.get('/import-template', async (req, res) => {
// 删除临时文件
fs.unlinkSync(path.join(tempDir, 'import_template.csv'));
} catch (error) {
console.error('生成导入模板失败:', error);
logger.error('生成导入模板失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '生成导入模板失败' });
}
});
@@ -1068,7 +1063,7 @@ router.get('/export', async (req, res) => {
// 删除临时文件
fs.unlinkSync(path.join(__dirname, '../temp/devices.csv'));
} catch (error) {
console.error('导出设备数据失败:', error);
logger.error('导出设备数据失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '导出设备数据失败' });
}
});
@@ -1525,7 +1520,7 @@ router.post('/import', async (req, res) => {
res.json({ statistics: stats });
} catch (error) {
await t.rollback();
console.error('导入设备数据失败:', error);
logger.error('导入设备数据失败', { error: error.message, stack: error.stack });
// 清理临时文件
try {
@@ -1533,7 +1528,7 @@ router.post('/import', async (req, res) => {
fs.unlinkSync(filePath);
}
} catch (fileErr) {
console.error('删除临时文件失败:', fileErr);
logger.error('删除临时文件失败', { error: fileErr });
}
res.status(500).json({
@@ -2070,7 +2065,7 @@ router.get('/enhanced-export', async (req, res) => {
});
}
} catch (error) {
console.error('增强导出失败:', error);
logger.error('增强导出失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '增强导出失败' });
}
});
@@ -2179,7 +2174,7 @@ router.put('/:deviceId/to-idle', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('设备转入空闲设备失败:', error);
logger.error('设备转入空闲设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -2456,7 +2451,7 @@ router.post('/batch-delete', validateBody(batchDeviceIdsSchema), async (req, res
});
} catch (error) {
await t.rollback();
console.error('批量删除设备错误:', error);
logger.error('批量删除设备错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message, stack: error.stack });
}
});
@@ -2539,7 +2534,7 @@ router.delete('/delete-all', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('删除所有设备错误:', error);
logger.error('删除所有设备错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message, stack: error.stack });
}
});
@@ -2603,7 +2598,7 @@ router.delete('/:deviceId', async (req, res) => {
);
}
} catch (err) {
console.error('更新机柜功率失败:', err);
logger.error('更新机柜功率失败', { err: err.message, stack: err.stack });
throw err; // 重新抛出错误,触发事务回滚
}
}
@@ -2618,7 +2613,7 @@ router.delete('/:deviceId', async (req, res) => {
await t.commit();
if (deletedCables > 0) {
console.log(`已删除 ${deletedCables} 条相关接线`);
logger.info('已删除 ${deletedCables} 条相关接线');
}
await logDeviceOperation(
@@ -2645,7 +2640,7 @@ router.delete('/:deviceId', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('删除设备失败:', error);
logger.error('删除设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+22 -27
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('IdleDevicesRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -83,7 +84,7 @@ router.get('/', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取空闲设备列表失败:', error);
logger.error('获取空闲设备列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -245,7 +246,7 @@ router.post('/from-device/:deviceId', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('设备转入空闲设备失败:', error);
logger.error('设备转入空闲设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -312,7 +313,7 @@ router.post('/batch-from-devices', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('批量转入空闲设备失败:', error);
logger.error('批量转入空闲设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -322,52 +323,46 @@ router.put('/batch-restore', async (req, res) => {
try {
const { devices } = req.body;
console.log('========== batch-restore 开始 ==========');
console.log('原始请求 body:', JSON.stringify(req.body));
console.log('devices 参数:', devices);
logger.info('========== batch-restore 开始 ==========');
logger.info('原始请求 body', { data: JSON.stringify(req.body) });
logger.info('devices 参数', { data: devices });
if (!devices || !Array.isArray(devices) || devices.length === 0) {
await t.rollback();
console.log('错误: devices 参数无效');
logger.info('错误: devices 参数无效');
return res.status(400).json({ error: '请提供有效的设备列表' });
}
const deviceIds = devices.map(d => d.deviceId).filter(Boolean);
console.log('提取的 deviceIds:', deviceIds);
logger.info('提取的 deviceIds', { data: deviceIds });
if (deviceIds.length === 0) {
await t.rollback();
console.log('错误: deviceIds 为空');
logger.info('错误: deviceIds 为空');
return res.status(400).json({ error: '设备ID不能为空' });
}
console.log('开始查询设备,条件:', { deviceId: { [Op.in]: deviceIds }, isIdle: true });
logger.info('开始查询设备,条件', { data: { deviceId: { [Op.in]: deviceIds }, isIdle: true } });
const idleDevices = await Device.findAll({
where: { deviceId: { [Op.in]: deviceIds }, isIdle: true },
transaction: t,
});
console.log('查询到的空闲设备数量:', idleDevices.length);
logger.info('查询到的空闲设备数量', { data: idleDevices.length });
if (idleDevices.length > 0) {
console.log(
'查询到的设备ID:',
idleDevices.map(d => d.deviceId)
);
logger.info('查询到的设备ID', { data: idleDevices.map(d => d.deviceId) });
}
if (idleDevices.length === 0) {
console.log('没有找到空闲设备,检查设备是否存在:');
logger.info('没有找到空闲设备,检查设备是否存在:');
const allDevices = await Device.findAll({
where: { deviceId: { [Op.in]: deviceIds } },
transaction: t,
});
console.log('设备表中存在的设备数量:', allDevices.length);
logger.info('设备表中存在的设备数量', { data: allDevices.length });
if (allDevices.length > 0) {
console.log(
'存在的设备及其 isIdle 状态:',
allDevices.map(d => ({ deviceId: d.deviceId, isIdle: d.isIdle }))
);
logger.info('存在的设备及其 isIdle 状态', { data: allDevices.map(d => ({ deviceId: d.deviceId, isIdle: d.isIdle })) });
}
await t.rollback();
@@ -493,7 +488,7 @@ router.put('/batch-restore', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('批量上架设备失败:', error);
logger.error('批量上架设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -536,9 +531,9 @@ router.put('/:deviceId/shelve', async (req, res) => {
}
const deviceHeight = height || device.height || 1;
console.log('上架设备 - 位置检查参数:', { rackId, position, deviceHeight, deviceId, existingDeviceId: device.deviceId });
logger.info('上架设备 - 位置检查参数', { data: { rackId, position, deviceHeight, deviceId, existingDeviceId: device.deviceId } });
const positionCheck = await checkPositionAvailable(rackId, position, deviceHeight, deviceId, t);
console.log('上架设备 - 位置检查结果:', positionCheck);
logger.info('上架设备 - 位置检查结果', { data: positionCheck });
if (!positionCheck.available) {
await t.rollback();
return res.status(400).json({ error: positionCheck.reason });
@@ -606,7 +601,7 @@ router.put('/:deviceId/shelve', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('设备上架失败:', error);
logger.error('设备上架失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -776,7 +771,7 @@ router.put('/:deviceId/restore', async (req, res) => {
});
} catch (error) {
await t.rollback();
console.error('恢复设备失败:', error);
logger.error('恢复设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -822,7 +817,7 @@ router.delete('/:deviceId', async (req, res) => {
res.json({ message: '空闲设备删除成功' });
} catch (error) {
await t.rollback();
console.error('删除空闲设备失败:', error);
logger.error('删除空闲设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+7 -6
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('InventoryRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -266,7 +267,7 @@ router.post('/plans/:planId/start', async (req, res) => {
deviceCount: allDevices.length,
});
} catch (error) {
console.error('启动盘点错误:', error);
logger.error('启动盘点错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -330,7 +331,7 @@ router.get('/tasks/:taskId', async (req, res) => {
res.json({ task, records: enrichedRecords });
} catch (error) {
console.error('获取盘点任务记录错误:', error);
logger.error('获取盘点任务记录错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -649,7 +650,7 @@ router.post('/quick-add-device', async (req, res) => {
pendingDevice,
});
} catch (error) {
console.error('快速添加设备错误:', error);
logger.error('快速添加设备错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -704,7 +705,7 @@ router.get('/pending-devices', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取暂存设备列表错误:', error);
logger.error('获取暂存设备列表错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -889,7 +890,7 @@ router.post('/pending-devices/:pendingId/sync', async (req, res) => {
pendingDevice,
});
} catch (error) {
console.error('同步设备错误:', error);
logger.error('同步设备错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -983,7 +984,7 @@ router.post('/pending-devices/batch-sync', async (req, res) => {
errors,
});
} catch (error) {
console.error('批量同步设备错误:', error);
logger.error('批量同步设备错误', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+11 -10
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('NetworkCardsRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -35,7 +36,7 @@ router.get('/', async (req, res) => {
res.json(networkCards);
} catch (error) {
console.error('获取网卡列表失败:', error);
logger.error('获取网卡列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -61,7 +62,7 @@ router.get('/device/:deviceId', async (req, res) => {
res.json(networkCards);
} catch (error) {
console.error('获取设备网卡失败:', error);
logger.error('获取设备网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -126,7 +127,7 @@ router.get('/device/:deviceId/with-ports', async (req, res) => {
res.json(cardsWithPorts);
} catch (error) {
console.error('获取网卡及端口失败:', error);
logger.error('获取网卡及端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -158,7 +159,7 @@ router.get('/find', async (req, res) => {
res.json(networkCard);
} catch (error) {
console.error('查找网卡失败:', error);
logger.error('查找网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -182,7 +183,7 @@ router.get('/:nicId', async (req, res) => {
res.json(networkCard);
} catch (error) {
console.error('获取网卡详情失败:', error);
logger.error('获取网卡详情失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -198,7 +199,7 @@ router.get('/:nicId/ports', async (req, res) => {
res.json(ports);
} catch (error) {
console.error('获取网卡端口失败:', error);
logger.error('获取网卡端口失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -246,7 +247,7 @@ router.post('/', async (req, res) => {
res.status(201).json(createdCard);
} catch (error) {
console.error('创建网卡失败:', error);
logger.error('创建网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -379,7 +380,7 @@ router.post('/batch', async (req, res) => {
throw error;
}
} catch (error) {
console.error('批量创建网卡失败:', error);
logger.error('批量创建网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -405,7 +406,7 @@ router.put('/:nicId', async (req, res) => {
res.status(404).json({ error: '网卡不存在' });
}
} catch (error) {
console.error('更新网卡失败:', error);
logger.error('更新网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -431,7 +432,7 @@ router.delete('/:nicId', async (req, res) => {
res.status(404).json({ error: '网卡不存在' });
}
} catch (error) {
console.error('删除网卡失败:', error);
logger.error('删除网卡失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+6 -5
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('OperationLogsRoute');
const express = require('express');
const { Op } = require('sequelize');
const { sequelize } = require('../db');
@@ -83,7 +84,7 @@ router.get('/', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取操作日志失败:', error);
logger.error('获取操作日志失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取操作日志失败',
@@ -108,7 +109,7 @@ router.get('/modules', authMiddleware, async (req, res) => {
data: moduleList,
});
} catch (error) {
console.error('获取模块列表失败:', error);
logger.error('获取模块列表失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取模块列表失败',
@@ -141,7 +142,7 @@ router.get('/types', authMiddleware, async (req, res) => {
data: typeList,
});
} catch (error) {
console.error('获取操作类型列表失败:', error);
logger.error('获取操作类型列表失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取操作类型列表失败',
@@ -201,7 +202,7 @@ router.get('/statistics', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取操作日志统计失败:', error);
logger.error('获取操作日志统计失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取操作日志统计失败',
@@ -225,7 +226,7 @@ router.get('/:recordId', authMiddleware, async (req, res) => {
data: log,
});
} catch (error) {
console.error('获取操作日志详情失败:', error);
logger.error('获取操作日志详情失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取操作日志详情失败',
+4 -3
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('RacksRoute');
const express = require('express');
const router = express.Router();
const Rack = require('../models/Rack');
@@ -181,7 +182,7 @@ router.get('/import-template', async (req, res) => {
// 发送文件
res.send(excelBuffer);
} catch (error) {
console.error('生成导入模板失败:', error);
logger.error('生成导入模板失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '生成导入模板失败' });
}
});
@@ -275,13 +276,13 @@ router.get('/export', async (req, res) => {
});
fileStream.on('error', err => {
console.error('文件流错误:', err);
logger.error('文件流错误', { err: err.message, stack: err.stack });
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
}
});
} catch (error) {
console.error('导出租机柜数据失败:', error);
logger.error('导出租机柜数据失败', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '导出失败',
+8 -7
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('RolesRoute');
const express = require('express');
const Role = require('../models/Role');
const Permission = require('../models/Permission');
@@ -45,7 +46,7 @@ router.get('/', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取角色列表错误:', error);
logger.error('获取角色列表错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取角色列表失败',
@@ -65,7 +66,7 @@ router.get('/all', authMiddleware, async (req, res) => {
data: roles,
});
} catch (error) {
console.error('获取所有角色错误:', error);
logger.error('获取所有角色错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取角色列表失败',
@@ -98,7 +99,7 @@ router.get('/:roleId', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取角色详情错误:', error);
logger.error('获取角色详情错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取角色详情失败',
@@ -155,7 +156,7 @@ router.post('/', authMiddleware, async (req, res) => {
data: role,
});
} catch (error) {
console.error('创建角色错误:', error);
logger.error('创建角色错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '创建角色失败',
@@ -264,7 +265,7 @@ router.put('/:roleId', authMiddleware, async (req, res) => {
data: role,
});
} catch (error) {
console.error('更新角色错误:', error);
logger.error('更新角色错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新角色失败',
@@ -321,7 +322,7 @@ router.delete('/:roleId', authMiddleware, async (req, res) => {
message: '删除成功',
});
} catch (error) {
console.error('删除角色错误:', error);
logger.error('删除角色错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '删除角色失败',
@@ -377,7 +378,7 @@ router.post('/init-roles', authMiddleware, async (req, res) => {
message: '初始化角色成功',
});
} catch (error) {
console.error('初始化角色错误:', error);
logger.error('初始化角色错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '初始化角色失败',
+2 -1
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('StatisticsRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -162,7 +163,7 @@ router.get('/', authMiddleware, async (req, res) => {
deviceTrendData,
});
} catch (error) {
console.error('获取统计数据失败:', error);
logger.error('获取统计数据失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+7 -8
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('SystemSettingsRoute');
const express = require('express');
const router = express.Router();
const fs = require('fs');
@@ -234,14 +235,12 @@ const initDefaultSettings = async () => {
updatedCount++;
}
} catch (error) {
console.error(`初始化设置 ${setting.settingKey} 失败:`, error.message);
logger.error('初始化设置 ${setting.settingKey} 失败', { error: error.message });
errorCount++;
}
}
console.log(
`系统设置初始化结果: 创建 ${createdCount} 个, 更新 ${updatedCount} 个, 失败 ${errorCount}`
);
logger.info(`系统设置初始化结果: 创建 ${createdCount} 个, 更新 ${updatedCount} 个, 失败 ${errorCount}`);
return { createdCount, updatedCount, errorCount };
};
@@ -562,7 +561,7 @@ router.post('/backup', async (req, res) => {
backupCount: backupFiles.length,
});
} catch (error) {
console.error('备份失败:', error);
logger.error('备份失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '备份失败' });
}
});
@@ -665,7 +664,7 @@ router.post('/backup/restore', async (req, res) => {
restoredAt: new Date().toISOString(),
});
} catch (error) {
console.error('恢复备份失败:', error);
logger.error('恢复备份失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: '恢复备份失败' });
}
});
@@ -725,7 +724,7 @@ router.get('/system/info', async (req, res) => {
}
}
} catch (syncError) {
console.error('同步版本号到数据库失败:', syncError);
logger.error('同步版本号到数据库失败', { error: syncError });
}
const [deviceCount, rackCount, roomCount, userCount] = await Promise.all([
@@ -752,7 +751,7 @@ router.get('/system/info', async (req, res) => {
// 这里使用模拟值,避免依赖额外的库
diskPercent = Math.min(95, Math.max(20, usedMemPercent - 10));
} catch (diskError) {
console.error('获取磁盘信息失败:', diskError);
logger.error('获取磁盘信息失败', { error: diskError });
}
res.json({
+2 -1
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('TicketsRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -611,7 +612,7 @@ router.get('/export', async (req, res) => {
res.setHeader('Content-Disposition', `attachment; filename=tickets_${Date.now()}.csv`);
return res.send(csvWithBom);
} catch (error) {
console.error('导出工单失败:', error);
logger.error('导出工单失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
+3 -2
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('TopologyRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -193,7 +194,7 @@ router.get('/switch/:switchId', async (req, res) => {
}
});
} catch (error) {
console.error('获取拓扑数据失败:', error);
logger.error('获取拓扑数据失败', { error: error.message, stack: error.stack });
res.status(500).json({ success: false, error: error.message });
}
});
@@ -315,7 +316,7 @@ router.get('/rack/:rackId', async (req, res) => {
res.json({ success: true, data: { nodes, edges, statistics } });
} catch (error) {
console.error('获取机柜拓扑数据失败:', error);
logger.error('获取机柜拓扑数据失败', { error: error.message, stack: error.stack });
res.status(500).json({ success: false, error: error.message });
}
});
+12 -11
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('UsersRoute');
const express = require('express');
const bcrypt = require('bcryptjs');
const path = require('path');
@@ -111,7 +112,7 @@ router.get('/', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('获取用户列表错误:', error);
logger.error('获取用户列表错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取用户列表失败',
@@ -132,7 +133,7 @@ router.get('/all', authMiddleware, async (req, res) => {
data: users,
});
} catch (error) {
console.error('获取所有用户错误:', error);
logger.error('获取所有用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取用户列表失败',
@@ -174,7 +175,7 @@ router.get('/:userId', authMiddleware, async (req, res) => {
data: user,
});
} catch (error) {
console.error('获取用户详情错误:', error);
logger.error('获取用户详情错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '获取用户详情失败',
@@ -259,7 +260,7 @@ router.post('/', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('创建用户错误:', error);
logger.error('创建用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '创建用户失败',
@@ -413,7 +414,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
data: updatedUser,
});
} catch (error) {
console.error('更新用户错误:', error);
logger.error('更新用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '更新用户失败',
@@ -456,7 +457,7 @@ router.put('/:userId/password', authMiddleware, async (req, res) => {
message: '密码重置成功',
});
} catch (error) {
console.error('重置密码错误:', error);
logger.error('重置密码错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '重置密码失败',
@@ -512,7 +513,7 @@ router.delete('/:userId', authMiddleware, async (req, res) => {
message: '删除成功',
});
} catch (error) {
console.error('删除用户错误:', error);
logger.error('删除用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '删除用户失败',
@@ -583,7 +584,7 @@ router.post('/:userId/avatar', authMiddleware, async (req, res) => {
data: { avatar: avatarUrl },
});
} catch (error) {
console.error('上传头像错误:', error);
logger.error('上传头像错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '上传头像失败',
@@ -617,7 +618,7 @@ router.delete('/:userId/avatar', authMiddleware, async (req, res) => {
message: '头像删除成功',
});
} catch (error) {
console.error('删除头像错误:', error);
logger.error('删除头像错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '删除头像失败',
@@ -656,7 +657,7 @@ router.put('/:userId/approve', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('审核用户错误:', error);
logger.error('审核用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '审核用户失败',
@@ -695,7 +696,7 @@ router.put('/:userId/reject', authMiddleware, async (req, res) => {
},
});
} catch (error) {
console.error('拒绝用户错误:', error);
logger.error('拒绝用户错误', { error: error.message, stack: error.stack });
res.status(500).json({
success: false,
message: '操作失败',
+4 -3
View File
@@ -1,3 +1,4 @@
const logger = require('../utils/logger').module('WarehousesRoute');
const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
@@ -72,7 +73,7 @@ router.get('/', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取库房列表失败:', error);
logger.error('获取库房列表失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -121,7 +122,7 @@ router.get('/:warehouseId/devices', async (req, res) => {
pageSize: parseInt(pageSize),
});
} catch (error) {
console.error('获取库房设备失败:', error);
logger.error('获取库房设备失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});
@@ -231,7 +232,7 @@ router.delete('/:warehouseId', async (req, res) => {
res.json({ message: '库房删除成功' });
} catch (error) {
console.error('删除库房失败:', error);
logger.error('删除库房失败', { error: error.message, stack: error.stack });
res.status(500).json({ error: error.message });
}
});