From a6d1195f13b08a125e7f575d4baa8c23607c9c87 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Thu, 27 Nov 2025 17:10:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=87=BA=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/extraResources/dll/myDllDemo.dll | Bin 10752 -> 0 bytes build/extraResources/java/.gitignore | 10 -- build/extraResources/java/README.txt | 65 +-------- build/extraResources/java/kill-java-port.bat | 115 ---------------- cmd/builder.json | 6 +- electron/config/config.default.js | 2 +- electron/main.js | 8 +- electron/preload/lifecycle.js | 133 ++++++------------- frontend/src/App.vue | 8 -- package.json | 5 +- 10 files changed, 61 insertions(+), 291 deletions(-) delete mode 100644 build/extraResources/dll/myDllDemo.dll delete mode 100644 build/extraResources/java/.gitignore delete mode 100644 build/extraResources/java/kill-java-port.bat diff --git a/build/extraResources/dll/myDllDemo.dll b/build/extraResources/dll/myDllDemo.dll deleted file mode 100644 index ffd5446761c7725046e78cf3acf3ed4d1064664c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 -color 0E -title 清理NPQS9100 Java端口占用 -cls -echo ========================================== -echo 清理 NPQS9100 Java 端口占用 -echo ========================================== -echo. - -REM 获取Java目录(脚本所在目录) -set JAVA_HOME=%~dp0 -cd /d "%JAVA_HOME%" - -REM 读取实际运行的端口 -set PORT_FILE=.running-port -set JAVA_PORT= - -if exist "%PORT_FILE%" ( - set /p JAVA_PORT=<"%PORT_FILE%" - echo [√] 检测到运行记录:端口 %JAVA_PORT% - echo. -) else ( - echo [!] 未找到运行记录文件,使用默认端口 18092 - echo. - set JAVA_PORT=18092 -) - -echo [1] 检查端口 %JAVA_PORT% 占用情况... -echo. - -REM 查找占用该端口的连接 -netstat -ano | findstr ":%JAVA_PORT%" > "%TEMP%\java_port.txt" - -if %errorlevel% equ 0 ( - echo 发现以下端口 %JAVA_PORT% 连接: - echo ---------------------------------------- - type "%TEMP%\java_port.txt" - echo ---------------------------------------- - echo. - - echo [2] 提取进程ID并结束进程... - echo. - - REM 提取所有LISTENING状态的PID - for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%JAVA_PORT%" ^| findstr "LISTENING"') do ( - if not "%%a"=="0" ( - echo 正在结束进程 PID: %%a - taskkill /F /PID %%a 2>nul - if errorlevel 1 ( - echo [失败] 无法结束进程 %%a - ) else ( - echo [成功] 已结束进程 %%a - ) - ) - ) - - REM 如果还有其他状态的连接,也尝试结束 - for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%JAVA_PORT%" ^| findstr /V "LISTENING"') do ( - if not "%%a"=="0" ( - echo 正在结束进程 PID: %%a - taskkill /F /PID %%a 2>nul - if errorlevel 1 ( - echo [已结束或无权限] 进程 %%a - ) else ( - echo [成功] 已结束进程 %%a - ) - ) - ) - - echo. - echo [3] 清理完成 - - REM 等待2秒让进程完全释放 - timeout /t 2 /nobreak >nul - - echo. - echo [4] 再次检查端口 %JAVA_PORT%... - netstat -ano | findstr ":%JAVA_PORT%" - if errorlevel 1 ( - echo [√] 端口 %JAVA_PORT% 已完全释放 - - REM 删除端口记录文件 - if exist "%PORT_FILE%" ( - del "%PORT_FILE%" - echo [√] 已清理端口记录文件 - ) - ) else ( - echo [!] 仍有连接存在(可能是TIME_WAIT状态,会自动释放) - ) - -) else ( - echo [√] 没有发现占用端口 %JAVA_PORT% 的进程 - - REM 删除端口记录文件 - if exist "%PORT_FILE%" ( - del "%PORT_FILE%" - echo [√] 已清理端口记录文件 - ) -) - -REM 清理临时文件 -if exist "%TEMP%\java_port.txt" del "%TEMP%\java_port.txt" - -echo. -echo ========================================== -echo 清理完成 -echo ========================================== -echo. -echo 说明: -echo - 此脚本只清理 NPQS9100 应用使用的 Java 端口 -echo - 不会影响您电脑上的其他 Java 应用 -echo. -pause - diff --git a/cmd/builder.json b/cmd/builder.json index 9e12e05..8e161e5 100644 --- a/cmd/builder.json +++ b/cmd/builder.json @@ -57,8 +57,8 @@ "filter": ["**/*"] }, { - "from": "build/NPQS9100-启动器.bat", - "to": "NPQS9100-启动器.bat" + "from": "build/NPQS9100.bat", + "to": "NPQS9100.bat" }, { "from": "build/extraResources/使用说明.txt", @@ -91,4 +91,4 @@ ] }, "compression": "store" -} \ No newline at end of file +} diff --git a/electron/config/config.default.js b/electron/config/config.default.js index 7a3e982..3a9f88d 100644 --- a/electron/config/config.default.js +++ b/electron/config/config.default.js @@ -12,7 +12,7 @@ module.exports = () => { singleLock: true, windowsOption: { title: 'NPQS9100-自动检测平台', - menuBarVisible: true, // 显示菜单栏,方便查看日志 + menuBarVisible: false, // 隐藏菜单栏 width: 1920, height: 1000, minWidth: 1024, diff --git a/electron/main.js b/electron/main.js index c506dfc..5ce4e28 100644 --- a/electron/main.js +++ b/electron/main.js @@ -118,6 +118,11 @@ function createTray() { // 创建应用菜单 function createApplicationMenu() { + // 生产环境隐藏菜单栏 + Menu.setApplicationMenu(null); + + // 调试时可以使用下面的菜单(取消注释) + /* const template = [ { label: '查看', @@ -147,9 +152,10 @@ function createApplicationMenu() { ] } ]; - + const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); + */ } // 注册 IPC 处理器 diff --git a/electron/preload/lifecycle.js b/electron/preload/lifecycle.js index 6360b0e..3a8b2c5 100644 --- a/electron/preload/lifecycle.js +++ b/electron/preload/lifecycle.js @@ -267,40 +267,41 @@ class Lifecycle { const win = getMainWindow(); win.show(); win.focus(); - - // 添加主窗口关闭事件监听 + + // 窗口关闭时,使用 Electron 原生对话框确认 win.on('close', async (event) => { - // 总是弹出确认对话框 + if (global.isConfirmedExit) { + logger.info('[lifecycle] Exit already confirmed, proceeding'); + return; + } + event.preventDefault(); - + logger.info('[lifecycle] Window close intercepted, showing exit confirm dialog'); + const { dialog } = require('electron'); - const { app } = require('electron'); - - const response = await dialog.showMessageBox(win, { + const { response } = await dialog.showMessageBox(win, { type: 'question', + buttons: ['取消', '退出'], + defaultId: 1, + cancelId: 0, title: '退出确认', message: '确定要退出应用吗?', - buttons: ['取消', '退出'], - defaultId: 0, - cancelId: 0 + noLink: true }); - - if (response.response === 1) { - // 用户确认退出 + + if (response === 1) { logger.info('[lifecycle] User confirmed exit'); - - // 移除所有监听器避免循环 - win.removeAllListeners('close'); - - // 执行清理 + global.isConfirmedExit = true; await this.cleanup(); - - // 退出应用 + if (win && !win.isDestroyed()) { + win.destroy(); + } app.quit(); + } else { + logger.info('[lifecycle] User cancelled exit'); } - // 用户取消,什么都不做(已经 preventDefault) }); - + // 立即刷新一次,确保显示最新内容 setTimeout(() => { if (win && !win.isDestroyed()) { @@ -496,22 +497,14 @@ class Lifecycle { try { // 显示提示对话框 - const { response } = await dialog.showMessageBox({ + await dialog.showMessageBox({ type: 'warning', - title: '需要管理员权限', - message: '安装 MySQL 服务需要管理员权限', - detail: '应用将以管理员身份重新启动', - buttons: ['取消', '确定'], - defaultId: 1, - cancelId: 0 + title: '告警', + message: '需要管理员权限', + buttons: ['确定'] }); - - if (response === 0) { - // 用户取消,关闭应用 - logger.info('[lifecycle] User cancelled admin elevation'); - app.quit(); - return; - } + + // 用户点击确定,以管理员身份重启 // 获取应用可执行文件路径 const exePath = app.getPath('exe'); @@ -588,63 +581,6 @@ class Lifecycle { */ async electronAppReady() { logger.info('[lifecycle] electron-app-ready'); - - // 检查管理员权限 - const hasAdminPrivileges = this.checkAdminPrivileges(); - logger.info('[lifecycle] Has admin privileges:', hasAdminPrivileges); - - if (!hasAdminPrivileges) { - logger.warn('[lifecycle] No admin privileges, will request elevation when needed'); - - // 立即请求管理员权限 - const { dialog, app } = require('electron'); - const { spawn } = require('child_process'); - - setTimeout(async () => { - const { response } = await dialog.showMessageBox({ - type: 'warning', - title: '需要管理员权限', - message: 'NPQS9100 需要管理员权限来管理 MySQL 服务', - detail: '应用将以管理员身份重新启动。\n\n如果您拒绝,应用可能无法正常工作。', - buttons: ['退出应用', '以管理员身份启动'], - defaultId: 1, - cancelId: 0 - }); - - if (response === 0) { - logger.info('[lifecycle] User declined admin elevation, quitting'); - app.quit(); - return; - } - - // 以管理员身份重启 - try { - const exePath = app.getPath('exe'); - logger.info('[lifecycle] Restarting with admin privileges:', exePath); - - const psCommand = `Start-Process -FilePath "${exePath}" -Verb RunAs`; - const child = spawn('powershell.exe', ['-Command', psCommand], { - detached: true, - stdio: 'ignore', - windowsHide: true - }); - - child.unref(); - - // 设置标记,跳过清理 - this.isRestartingForAdmin = true; - - // 退出当前实例 - setTimeout(() => { - app.quit(); - }, 500); - } catch (error) { - logger.error('[lifecycle] Failed to restart as admin:', error); - dialog.showErrorBox('启动失败', '无法以管理员身份启动应用,请手动右键选择"以管理员身份运行"'); - app.quit(); - } - }, 1000); - } } /** @@ -653,6 +589,17 @@ class Lifecycle { async windowReady() { logger.info('[lifecycle] window-ready hook triggered'); + // 在创建任何窗口之前,先检查管理员权限 + const hasAdminPrivileges = this.checkAdminPrivileges(); + logger.info('[lifecycle] Has admin privileges:', hasAdminPrivileges); + + if (!hasAdminPrivileges) { + logger.warn('[lifecycle] No admin privileges, requesting elevation'); + // 调用已有的 restartAsAdmin 方法,避免代码重复 + await this.restartAsAdmin(); + return; // 阻止后续代码执行 + } + // 创建日志管理器(但不显示窗口,仅用于写日志文件) logger.info('[lifecycle] Creating log window manager...'); this.logWindowManager = new LogWindowManager(); diff --git a/frontend/src/App.vue b/frontend/src/App.vue index b39c68c..8d37c8c 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -32,14 +32,6 @@ onMounted(() => { const language = globalStore.language ?? getBrowserLang() i18n.locale.value = language globalStore.setGlobalState('language', language as LanguageType) - // 移除 autofit,使用 CSS 自适应 - // autofit.init({ - // el: '#app', - // dw: 1440, - // dh: 900, - // resize: true, - // limit: 0.1 - // }) }) // element language diff --git a/package.json b/package.json index 73c20a6..e220862 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,12 @@ "encrypt": "ee-bin encrypt", "icon": "ee-bin icon", "re-sqlite": "electron-rebuild -f -w better-sqlite3", - "build-w": "ee-bin build --cmds=win64", + "build-w": "ee-bin build --cmds=win64 && npm run rename-output", "build-we": "ee-bin build --cmds=win_e", "build-m": "ee-bin build --cmds=mac", "build-m-arm64": "ee-bin build --cmds=mac_arm64", - "build-l": "ee-bin build --cmds=linux" + "build-l": "ee-bin build --cmds=linux", + "rename-output": "node -e \"const fs=require('fs'); const oldPath='out/win-unpacked'; const newPath='out/NPQS-9100'; if(fs.existsSync(oldPath)){if(fs.existsSync(newPath)) fs.rmSync(newPath,{recursive:true}); fs.renameSync(oldPath, newPath); console.log('Renamed to NPQS-9100');}\"" }, "repository": "https://github.com/dromara/electron-egg.git", "keywords": [