This commit is contained in:
2025-07-22 17:53:26 +08:00
parent f667c26650
commit e43f850840
17 changed files with 924 additions and 182 deletions

View File

@@ -109,10 +109,7 @@ logger.info(app.getPath('userData'))
logger.info('应用启动,日志文件路径:', logger.getLogPath())
// 添加更多启动信息
logger.info('开始检查单实例锁...')
// 创建单实例管理器
const singleInstanceManager = new SingleInstanceManager()
logger.info('开始初始化应用...')
// 清理缓存目录
function cleanupCacheDirectories() {
@@ -166,43 +163,25 @@ function cleanupCacheDirectories() {
}
}
/**
* 单应用启动实现
* 请求单一实例锁,
* 如果该方法返回`false`
* 则表示已经有一个实例在运行,
* 可以通过`app.quit()`方法退出当前实例。
*/
const gotTheLock = app.requestSingleInstanceLock()
// 检查是否为第一个实例
const isFirstInstance = singleInstanceManager.checkSingleInstance()
if (!isFirstInstance) {
logger.info('检测到已有实例运行,尝试激活现有实例')
// 尝试激活第一个实例的窗口
try {
const windows = BrowserWindow.getAllWindows()
if (windows.length > 0) {
const mainWindow = windows[0]
if (mainWindow.isMinimized()) {
mainWindow.restore()
}
mainWindow.show()
mainWindow.focus()
logger.info('成功激活现有实例窗口')
app.quit() // 退出当前实例
} else {
logger.warn('未找到现有实例窗口,可能是锁未正确释放')
logger.info('强制退出当前实例,避免重复托盘')
app.quit() // 强制退出,避免创建重复托盘
}
} catch (error) {
logger.error('激活现有实例失败:', error)
logger.info('强制退出当前实例,避免重复托盘')
app.quit() // 强制退出,避免创建重复托盘
}
if (!gotTheLock) {
logger.info('检测到已有实例运行,退出当前实例')
app.quit()
} else {
logger.info('这是第一个实例,继续启动')
// 这是第一个实例
// 监听第二个实例的启动
// 监听第二个实例被运行时
app.on('second-instance', (event, commandLine, workingDirectory) => {
// 当运行第二个实例时,将显示第一个实例的窗口
logger.info('检测到第二个实例启动,激活现有实例')
// 当有第二个实例被运行时,激活之前的实例并将焦点置于其窗口
const windows = BrowserWindow.getAllWindows()
if (windows.length > 0) {
const mainWindow = windows[0]
@@ -228,7 +207,7 @@ if (!isFirstInstance) {
callback(true);
});
electronApp.setAppUserModelId('com.electron')
electronApp.setAppUserModelId('com.huashiai.dify-market-manager-gui')
app.on('browser-window-created', (_, window) => {
optimizer.watchWindowShortcuts(window)
@@ -281,7 +260,7 @@ if (!isFirstInstance) {
}
if (!app.isQuiting) {
logger.info('用户关闭窗口,隐藏应用')
// 如果不是主动退出,则隐藏所有窗口
BrowserWindow.getAllWindows().forEach(window => {
window.hide()
@@ -299,9 +278,11 @@ if (!isFirstInstance) {
app.quit();
} else {
logger.info('主动退出,完全关闭应用')
// 如果是主动退出,则销毁托盘并退出应用
destroyTray()
app.quit()
// 使用 exit 确保完全退出
app.exit(0)
}
}
})
@@ -313,6 +294,7 @@ if (!isFirstInstance) {
return;
}
logger.info('应用即将退出,开始清理资源')
// 在应用程序即将退出时执行操作,例如保存数据
event.preventDefault();
@@ -325,7 +307,8 @@ if (!isFirstInstance) {
// 销毁托盘并退出应用
destroyTray()
app.quit();
// 使用 exit 确保完全退出
app.exit(0);
});
// 在应用退出时注销所有快捷键
@@ -336,6 +319,7 @@ if (!isFirstInstance) {
return;
}
logger.info('应用即将退出,注销快捷键')
event.preventDefault();
// 清除所有会话数据
@@ -348,12 +332,10 @@ if (!isFirstInstance) {
unregisterAllShortcuts()
destroyTray()
// 清理完成后退出应用
app.quit();
// 清理完成后退出应用,使用 exit 确保完全退出
app.exit(0);
})
// 监听进程退出信号,确保在系统强制关闭时也能清理缓存
process.on('SIGTERM', async () => {
logger.info('收到 SIGTERM 信号,开始清理缓存');
@@ -389,11 +371,8 @@ if (!isFirstInstance) {
// 不要立即退出,给应用一个恢复的机会
logger.error('应用遇到未处理的 Promise 拒绝,但将继续运行');
});
}
export function checkIsKeepAlive(){
const checkIsKeepAliveTimer=setInterval(async () => {