From 93daaf49f4ccd30e6d67444b264d3be6f8de908b Mon Sep 17 00:00:00 2001 From: chenqiang Date: Tue, 9 Sep 2025 22:35:44 +0800 Subject: [PATCH] preload.js --- background/db/index.js | 2 +- background/db/path.js | 2 +- background/main.js | 208 ++++++++++++++++----------------- {src => background}/preload.js | 0 vue.config.js | 36 +++++- 5 files changed, 135 insertions(+), 113 deletions(-) rename {src => background}/preload.js (100%) diff --git a/background/db/index.js b/background/db/index.js index fdfa7b6..f5c0ff6 100644 --- a/background/db/index.js +++ b/background/db/index.js @@ -1,4 +1,4 @@ -const { getSystemDbPath, getUserDbPath } = require('./path.js'); // 添加路径函数导入 +const { getSystemDbPath, getUserDbPath } = require('./path.js'); // 确保这行代码存在 const { systemSchema, userSchema, defaultData } = require('./schema.js'); const { openDatabase, batchInsert } = require('./utils.js'); const bcrypt = require('bcryptjs'); diff --git a/background/db/path.js b/background/db/path.js index af9b47b..dd2c0fb 100644 --- a/background/db/path.js +++ b/background/db/path.js @@ -1,4 +1,4 @@ -const fs = require('fs'); // 添加缺失的fs模块导入 +const fs = require('fs'); // 确保这行代码存在 const path = require('path'); const { app } = require('electron'); diff --git a/background/main.js b/background/main.js index d16f1b9..c9d093d 100644 --- a/background/main.js +++ b/background/main.js @@ -43,117 +43,105 @@ let mainWindow = null; async function createWindow() { console.log('开始创建应用窗口...'); - try { - // 创建浏览器窗口 - mainWindow = new BrowserWindow({ - width: 800, - height: 600, - show: false, - // 在Windows 7上使用更兼容的配置 - webPreferences: { - // 使用绝对路径确保preload.js能被找到 - preload: path.resolve(__dirname, '../src/preload.js'), - nodeIntegration: false, - contextIsolation: true, - // 为Windows 7添加额外的兼容性配置 - enableRemoteModule: false, - sandbox: false, - webSecurity: false - } - }); - - console.log('Preload path:', path.resolve(__dirname, '../src/preload.js')); - - // 设置隐藏菜单栏 - mainWindow.setMenu(null); - - // 添加窗口准备好显示时的事件 - mainWindow.once('ready-to-show', () => { - console.log('窗口准备就绪,开始显示...'); - try { - // 在Windows 7上使用try-catch确保最大化操作不失败 - try { - mainWindow.maximize(); - console.log('窗口已最大化'); - } catch (e) { - console.error('窗口最大化失败:', e); - } - // 显示窗口 - mainWindow.show(); - console.log('窗口已显示'); - } catch (error) { - console.error('显示窗口时出错:', error); - // 作为备用方案,再次尝试显示窗口 - mainWindow.show(); - } - }); - - // 添加窗口显示事件 - mainWindow.on('show', () => { - console.log('窗口已成功显示'); - }); - - // 添加webContents加载完成事件 - mainWindow.webContents.on('did-finish-load', () => { - console.log('页面加载完成'); - }); - - // 添加窗口关闭事件监听 - 保持原有逻辑 - mainWindow.on("close", (event) => { - console.log("检测到窗口关闭事件"); - - // 阻止默认的关闭行为 - event.preventDefault(); - console.log("已阻止默认关闭行为"); - - // 使用同步方式显示对话框(Electron 11.5支持的方式) - try { - // 直接显示对话框并获取结果 - const response = dialog.showMessageBoxSync(mainWindow, { - type: "warning", - title: "确认关闭", - message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。", - buttons: ["取消", "确认关闭"], - defaultId: 0, - cancelId: 0, - }); - - console.log("用户选择了response:", response); - - // 检查用户选择的按钮索引 - if (response === 1) { - console.log("用户确认关闭,准备退出应用"); - // 移除所有事件监听器以防止任何干扰 - mainWindow.removeAllListeners(); - // 强制关闭窗口 - mainWindow.destroy(); - // 然后退出应用 - setTimeout(() => { - console.log("强制退出应用"); - app.quit(); - }, 100); - } else { - console.log("用户取消关闭"); - } - } catch (error) { - console.error("显示对话框时出错:", error); - } - }); - - // 加载应用内容 - if (process.env.WEBPACK_DEV_SERVER_URL) { - // 开发模式加载开发服务器URL - await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL); - if (!process.env.IS_TEST) mainWindow.webContents.openDevTools(); - } else { - createProtocol("app"); - // 生产模式加载本地HTML文件 - mainWindow.loadURL("app://./index.html"); + // 创建浏览器窗口 + mainWindow = new BrowserWindow({ + width: 800, + height: 600, + // 确保在Windows 7上能正常显示 + show: false, + webPreferences: { + // 更新preload路径,使用__dirname确保路径正确 + preload: path.join(__dirname, 'preload.js'), + nodeIntegration: false, + contextIsolation: true, } - } catch (windowError) { - console.error('创建窗口失败:', windowError); - // 显示错误对话框 - dialog.showErrorBox('创建窗口失败', `无法创建应用窗口: ${windowError.message}`); + }); + + // 设置隐藏菜单栏 + mainWindow.setMenu(null); + + // 添加窗口准备好显示时的事件 + mainWindow.once('ready-to-show', () => { + console.log('窗口准备就绪,开始显示...'); + try { + // 在Windows 7上使用try-catch确保最大化操作不失败 + try { + mainWindow.maximize(); + console.log('窗口已最大化'); + } catch (e) { + console.error('窗口最大化失败:', e); + } + // 显示窗口 + mainWindow.show(); + console.log('窗口已显示'); + } catch (error) { + console.error('显示窗口时出错:', error); + // 作为备用方案,再次尝试显示窗口 + mainWindow.show(); + } + }); + + // 添加窗口显示事件 + mainWindow.on('show', () => { + console.log('窗口已成功显示'); + }); + + // 添加webContents加载完成事件 + mainWindow.webContents.on('did-finish-load', () => { + console.log('页面加载完成'); + }); + + // 添加窗口关闭事件监听 - 保持原有逻辑 + mainWindow.on("close", (event) => { + console.log("检测到窗口关闭事件"); + + // 阻止默认的关闭行为 + event.preventDefault(); + console.log("已阻止默认关闭行为"); + + // 使用同步方式显示对话框(Electron 11.5支持的方式) + try { + // 直接显示对话框并获取结果 + const response = dialog.showMessageBoxSync(mainWindow, { + type: "warning", + title: "确认关闭", + message: "确认要退出软件吗?退出后,未完成的考试将不会被保存。", + buttons: ["取消", "确认关闭"], + defaultId: 0, + cancelId: 0, + }); + + console.log("用户选择了response:", response); + + // 检查用户选择的按钮索引 + if (response === 1) { + console.log("用户确认关闭,准备退出应用"); + // 移除所有事件监听器以防止任何干扰 + mainWindow.removeAllListeners(); + // 强制关闭窗口 + mainWindow.destroy(); + // 然后退出应用 + setTimeout(() => { + console.log("强制退出应用"); + app.quit(); + }, 100); + } else { + console.log("用户取消关闭"); + } + } catch (error) { + console.error("显示对话框时出错:", error); + } + }); + + // 加载应用内容 + if (process.env.WEBPACK_DEV_SERVER_URL) { + // 开发模式加载开发服务器URL + await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL); + if (!process.env.IS_TEST) mainWindow.webContents.openDevTools(); + } else { + createProtocol("app"); + // 生产模式加载本地HTML文件 + mainWindow.loadURL("app://./index.html"); } } diff --git a/src/preload.js b/background/preload.js similarity index 100% rename from src/preload.js rename to background/preload.js diff --git a/vue.config.js b/vue.config.js index ade8474..2ac7ffb 100644 --- a/vue.config.js +++ b/vue.config.js @@ -12,7 +12,41 @@ module.exports = { pluginOptions: { electronBuilder: { - mainProcessFile: 'background/main.js', + // 基础配置 + nodeIntegration: false, + contextIsolation: true, + // 更新preload路径到新位置 + preload: "background/preload.js", + mainProcessFile: "background/main.js", + lintPreloadFiles: false, + externals: ["fontkit", "pdfkit"], + + // 主进程webpack配置 + chainWebpackMainProcess: (config) => { + config.module + .rule("babel") + .test(/\.js$/) + .use("babel-loader") + .loader("babel-loader") + .options({ + presets: ["@babel/preset-env"], + plugins: [ + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-proposal-class-properties", + ], + }) + .end(); + + // 添加对mjs文件的处理 - 兼容Electron 11 + config.module + .rule("mjs") + .test(/\.mjs$/) + .include.add(/node_modules/) + .end() + .type("javascript/auto"); + }, + + // 所有构建选项都放在这里 builderOptions: { // 应用基本信息 appId: 'com.example.exam11',