const { BrowserWindow } = require('electron');
const path = require('path');
const fs = require('fs');
/**
* 日志窗口管理器
* 显示 MySQL 和 Spring Boot 的实时日志
*/
class LogWindowManager {
constructor() {
this.logWindow = null;
this.logs = [];
this.maxLogs = 1000; // 最多保留1000条日志
}
/**
* 创建日志窗口
*/
createLogWindow() {
this.logWindow = new BrowserWindow({
width: 900,
height: 600,
title: 'NPQS9100 - 服务日志',
backgroundColor: '#1e1e1e',
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
// 加载日志页面
const logHtml = this.generateLogHTML();
this.logWindow.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(logHtml)}`);
// 窗口关闭事件 - 只清理引用,不退出应用
this.logWindow.on('closed', () => {
console.log('[LogWindow] Log window closed by user');
this.logWindow = null;
});
// 防止日志窗口关闭时退出应用(但允许隐藏)
this.closeHandler = (event) => {
// 只是隐藏窗口,不是真正关闭
// 这样可以随时再打开
event.preventDefault();
this.logWindow.hide();
console.log('[LogWindow] Log window hidden');
};
this.logWindow.on('close', this.closeHandler);
return this.logWindow;
}
/**
* 生成日志HTML页面
*/
generateLogHTML() {
return `
NPQS9100 服务日志
`;
}
/**
* 添加日志
*/
addLog(type, message) {
const timestamp = new Date().toLocaleTimeString();
const logEntry = {
timestamp,
type,
message
};
this.logs.push(logEntry);
// 限制日志数量
if (this.logs.length > this.maxLogs) {
this.logs.shift();
}
// 发送到窗口
if (this.logWindow && !this.logWindow.isDestroyed()) {
this.logWindow.webContents.send('log-message', logEntry);
}
// 同时输出到控制台
console.log(`[${type.toUpperCase()}] ${message}`);
}
/**
* 显示日志窗口
*/
show() {
if (!this.logWindow || this.logWindow.isDestroyed()) {
// 窗口已被销毁,重新创建
console.log('[LogWindow] Recreating log window...');
this.createLogWindow();
// 重新发送历史日志
this.logs.forEach(log => {
this.logWindow.webContents.send('log-message', log);
});
} else {
this.logWindow.show();
this.logWindow.focus();
console.log('[LogWindow] Log window shown');
}
}
/**
* 隐藏日志窗口
*/
hide() {
if (this.logWindow && !this.logWindow.isDestroyed()) {
this.logWindow.hide();
console.log('[LogWindow] Log window hidden');
}
}
/**
* 检查日志窗口是否可见
*/
isVisible() {
return this.logWindow && !this.logWindow.isDestroyed() && this.logWindow.isVisible();
}
/**
* 切换日志窗口显示/隐藏
*/
toggle() {
if (this.isVisible()) {
this.hide();
} else {
this.show();
}
}
/**
* 关闭日志窗口(真正销毁)
*/
close() {
if (this.logWindow && !this.logWindow.isDestroyed()) {
try {
// 移除 close 事件监听,允许真正关闭
if (this.closeHandler) {
this.logWindow.removeListener('close', this.closeHandler);
}
this.logWindow.removeAllListeners('close');
this.logWindow.removeAllListeners('closed');
// 强制销毁窗口
this.logWindow.destroy();
console.log('[LogWindow] Log window destroyed');
} catch (error) {
console.error('[LogWindow] Error closing log window:', error);
} finally {
this.logWindow = null;
this.closeHandler = null;
}
}
}
/**
* 获取所有日志
*/
getLogs() {
return this.logs;
}
/**
* 清空日志
*/
clearLogs() {
this.logs = [];
if (this.logWindow && !this.logWindow.isDestroyed()) {
this.logWindow.webContents.send('clear-logs');
}
}
}
module.exports = LogWindowManager;