feat: 实现统一日志系统和维护模式功能
This commit is contained in:
@@ -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: '解锁失败',
|
||||
|
||||
@@ -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
@@ -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
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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: '风险评估失败' });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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: '获取操作日志详情失败',
|
||||
|
||||
@@ -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: '导出失败',
|
||||
|
||||
@@ -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: '初始化角色失败',
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
@@ -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: '操作失败',
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user