|
@@ -0,0 +1,199 @@
|
|
|
|
+const { app, BrowserWindow, ipcMain } = require('electron')
|
|
|
|
+const path = require('path')
|
|
|
|
+const fs = require('fs')
|
|
|
|
+
|
|
|
|
+// 设置环境变量
|
|
|
|
+process.env.NODE_ENV = process.env.NODE_ENV || 'development'
|
|
|
|
+
|
|
|
|
+// 命令行参数
|
|
|
|
+const argv = process.argv.slice(2);
|
|
|
|
+
|
|
|
|
+// 保存主窗口引用
|
|
|
|
+let mainWindow
|
|
|
|
+
|
|
|
|
+// 设置文件路径
|
|
|
|
+const settingsPath = path.join(app.getPath('userData'), 'settings.json');
|
|
|
|
+
|
|
|
|
+// 加载设置
|
|
|
|
+function loadSettings() {
|
|
|
|
+ try {
|
|
|
|
+ if (fs.existsSync(settingsPath)) {
|
|
|
|
+ const data = fs.readFileSync(settingsPath, 'utf8');
|
|
|
|
+ console.log('读取到设置文件:', data);
|
|
|
|
+ try {
|
|
|
|
+ return JSON.parse(data);
|
|
|
|
+ } catch (parseErr) {
|
|
|
|
+ console.error('解析设置文件失败:', parseErr);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ console.log('设置文件不存在:', settingsPath);
|
|
|
|
+ }
|
|
|
|
+ } catch (err) {
|
|
|
|
+ console.error('加载设置失败:', err);
|
|
|
|
+ }
|
|
|
|
+ return { defaultLoad: false };
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 保存设置
|
|
|
|
+function saveSettings(settings) {
|
|
|
|
+ try {
|
|
|
|
+ // 确保目录存在
|
|
|
|
+ const settingsDir = path.dirname(settingsPath);
|
|
|
|
+ if (!fs.existsSync(settingsDir)) {
|
|
|
|
+ fs.mkdirSync(settingsDir, { recursive: true });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const data = JSON.stringify(settings, null, 2);
|
|
|
|
+ console.log('保存设置:', data, '到路径:', settingsPath);
|
|
|
|
+ fs.writeFileSync(settingsPath, data, 'utf8');
|
|
|
|
+ return true;
|
|
|
|
+ } catch (err) {
|
|
|
|
+ console.error('保存设置失败:', err);
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function createWindow() {
|
|
|
|
+ // 加载设置
|
|
|
|
+ const settings = loadSettings();
|
|
|
|
+ console.log('当前设置:', settings);
|
|
|
|
+
|
|
|
|
+ // 判断是否直接加载应用
|
|
|
|
+ // 命令行参数优先,其次是设置,最后是生产环境默认值
|
|
|
|
+ const shouldDirectLoad = argv.includes('--direct-load') ||
|
|
|
|
+ settings.defaultLoad === true ||
|
|
|
|
+ process.env.NODE_ENV === 'production' ||
|
|
|
|
+ process.env.FORCE_DIRECT_LOAD === 'true';
|
|
|
|
+
|
|
|
|
+ console.log('是否直接加载应用:', shouldDirectLoad,
|
|
|
|
+ '(命令行:', argv.includes('--direct-load'),
|
|
|
|
+ ', 设置:', settings.defaultLoad,
|
|
|
|
+ ', 环境:', process.env.NODE_ENV, ')');
|
|
|
|
+
|
|
|
|
+ // 创建浏览器窗口
|
|
|
|
+ mainWindow = new BrowserWindow({
|
|
|
|
+ width: 1200,
|
|
|
|
+ height: 800,
|
|
|
|
+ webPreferences: {
|
|
|
|
+ nodeIntegration: false,
|
|
|
|
+ contextIsolation: true,
|
|
|
|
+ preload: path.join(__dirname, 'preload.cjs'),
|
|
|
|
+ webSecurity: process.env.NODE_ENV === 'production',
|
|
|
|
+ devTools: true
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 添加控制台消息监听
|
|
|
|
+ mainWindow.webContents.on('console-message', (event, level, message, line, sourceId) => {
|
|
|
|
+ console.log(`[WebContents] ${message}`);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 打开开发者工具
|
|
|
|
+ mainWindow.webContents.openDevTools();
|
|
|
|
+
|
|
|
|
+ if (shouldDirectLoad) {
|
|
|
|
+ // 直接加载Vue应用并导航到报表页面
|
|
|
|
+ console.log('直接加载报表页面...');
|
|
|
|
+ loadVueApp('/report');
|
|
|
|
+ } else {
|
|
|
|
+ // 加载测试页面
|
|
|
|
+ const testPath = path.join(__dirname, 'test.html');
|
|
|
|
+ console.log('加载测试页面...');
|
|
|
|
+ mainWindow.loadFile(testPath);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 添加错误处理
|
|
|
|
+ mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription) => {
|
|
|
|
+ console.error('页面加载失败:', errorCode, errorDescription);
|
|
|
|
+ const testPath = path.join(__dirname, 'test.html');
|
|
|
|
+ if (fs.existsSync(testPath)) {
|
|
|
|
+ mainWindow.loadFile(testPath);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 在加载页面前添加
|
|
|
|
+ mainWindow.webContents.on('dom-ready', () => {
|
|
|
|
+ console.log('DOM已准备就绪');
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 在页面加载后执行脚本
|
|
|
|
+ mainWindow.webContents.on('did-finish-load', () => {
|
|
|
|
+ console.log('页面加载完成');
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 当Electron完成初始化并准备创建浏览器窗口时调用此方法
|
|
|
|
+app.whenReady().then(() => {
|
|
|
|
+ createWindow()
|
|
|
|
+
|
|
|
|
+ // 设置IPC监听器
|
|
|
|
+ ipcMain.on('load-app', (event, route) => {
|
|
|
|
+ console.log('收到加载应用请求, 路由:', route || '默认');
|
|
|
|
+ loadVueApp(route);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 添加保存设置的IPC监听器
|
|
|
|
+ ipcMain.on('save-settings', (event, settings) => {
|
|
|
|
+ console.log('收到保存设置请求:', settings);
|
|
|
|
+ const success = saveSettings(settings);
|
|
|
|
+ console.log('保存设置结果:', success ? '成功' : '失败');
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 添加获取设置的IPC处理器
|
|
|
|
+ ipcMain.handle('get-settings', () => {
|
|
|
|
+ return loadSettings();
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ app.on('activate', () => {
|
|
|
|
+ if (BrowserWindow.getAllWindows().length === 0) {
|
|
|
|
+ createWindow()
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+// 加载Vue应用的函数
|
|
|
|
+function loadVueApp(route) {
|
|
|
|
+ if (!mainWindow) return;
|
|
|
|
+
|
|
|
|
+ const indexPath = path.join(__dirname, '../dist/index.html');
|
|
|
|
+ console.log('尝试加载Vue应用:', indexPath);
|
|
|
|
+
|
|
|
|
+ if (fs.existsSync(indexPath)) {
|
|
|
|
+ console.log('Vue应用文件存在,正在加载...');
|
|
|
|
+
|
|
|
|
+ // 构建URL,如果有指定路由则添加
|
|
|
|
+ let url = `file://${indexPath}?t=${Date.now()}`;
|
|
|
|
+ if (route) {
|
|
|
|
+ url += `#${route}`; // 使用hash模式路由
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ console.log('加载URL:', url);
|
|
|
|
+
|
|
|
|
+ // 在加载前清除缓存
|
|
|
|
+ mainWindow.webContents.session.clearCache().then(() => {
|
|
|
|
+ mainWindow.loadURL(url);
|
|
|
|
+
|
|
|
|
+ // 监听加载完成事件
|
|
|
|
+ mainWindow.webContents.once('did-finish-load', () => {
|
|
|
|
+ console.log('Vue应用加载完成');
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ console.error('Vue应用文件不存在:', indexPath);
|
|
|
|
+ mainWindow.webContents.executeJavaScript(`
|
|
|
|
+ alert('Vue应用文件不存在: ${indexPath}');
|
|
|
|
+ `).catch(err => console.error('执行脚本失败:', err));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 关闭所有窗口时退出应用
|
|
|
|
+app.on('window-all-closed', () => {
|
|
|
|
+ if (process.platform !== 'darwin') {
|
|
|
|
+ app.quit()
|
|
|
|
+ }
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+// 添加全局未捕获异常处理
|
|
|
|
+process.on('uncaughtException', (error) => {
|
|
|
|
+ console.error('未捕获的异常:', error)
|
|
|
|
+})
|