Initial commit: Add maimaiDX API web application with AimeDB scanning and logging features

This commit is contained in:
kejiz
2025-09-18 10:19:08 +08:00
commit 4e83f159f0
84 changed files with 14012 additions and 0 deletions

View File

@@ -0,0 +1,143 @@
// 日志级别枚举
const LogLevel = {
DEBUG: 0,
INFO: 1,
WARN: 2,
ERROR: 3
};
// 当前日志级别
let currentLogLevel = LogLevel.INFO;
// 日志缓冲区
let logBuffer = [];
const MAX_BUFFER_SIZE = 1000;
// 设置日志级别
export function setLogLevel(level) {
currentLogLevel = level;
}
// 获取当前时间戳
function getTimestamp() {
return new Date().toISOString();
}
// 写入日志到缓冲区
function writeToBuffer(level, message, data = null) {
const logEntry = {
timestamp: getTimestamp(),
level: Object.keys(LogLevel).find(key => LogLevel[key] === level),
message: message,
data: data
};
logBuffer.push(logEntry);
// 保持缓冲区大小在限制内
if (logBuffer.length > MAX_BUFFER_SIZE) {
logBuffer = logBuffer.slice(-MAX_BUFFER_SIZE);
}
// 在控制台输出日志
switch (level) {
case LogLevel.DEBUG:
console.debug(`[DEBUG] ${message}`, data);
break;
case LogLevel.INFO:
console.info(`[INFO] ${message}`, data);
break;
case LogLevel.WARN:
console.warn(`[WARN] ${message}`, data);
break;
case LogLevel.ERROR:
console.error(`[ERROR] ${message}`, data);
break;
}
}
// Debug级别日志
export function logDebug(message, data = null) {
if (currentLogLevel <= LogLevel.DEBUG) {
writeToBuffer(LogLevel.DEBUG, message, data);
}
}
// Info级别日志
export function logInfo(message, data = null) {
if (currentLogLevel <= LogLevel.INFO) {
writeToBuffer(LogLevel.INFO, message, data);
}
}
// Warn级别日志
export function logWarn(message, data = null) {
if (currentLogLevel <= LogLevel.WARN) {
writeToBuffer(LogLevel.WARN, message, data);
}
}
// Error级别日志
export function logError(message, data = null) {
if (currentLogLevel <= LogLevel.ERROR) {
writeToBuffer(LogLevel.ERROR, message, data);
}
}
// 获取日志缓冲区
export function getLogBuffer() {
return [...logBuffer]; // 返回副本
}
// 清空日志缓冲区
export function clearLogBuffer() {
logBuffer = [];
}
// 将日志保存到文件
export function saveLogsToFile() {
const logs = getLogBuffer();
const logText = logs.map(entry =>
`${entry.timestamp} [${entry.level}] ${entry.message} ${entry.data ? JSON.stringify(entry.data) : ''}`
).join('\n');
const blob = new Blob([logText], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `frontend-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.txt`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
// API请求日志
export function logApiRequest(method, url, data = null) {
logInfo(`API Request: ${method} ${url}`, data);
}
// API响应日志
export function logApiResponse(status, data = null) {
if (status >= 400) {
logError(`API Response: ${status}`, data);
} else {
logInfo(`API Response: ${status}`, data);
}
}
export default {
LogLevel,
setLogLevel,
logDebug,
logInfo,
logWarn,
logError,
getLogBuffer,
clearLogBuffer,
saveLogsToFile,
logApiRequest,
logApiResponse
};