electron-vue-exam-single/electron/main.js

179 lines
4.1 KiB
JavaScript

// 确保所有导入都使用 ES 模块语法
import { app, BrowserWindow, ipcMain } from "electron";
import path from "path";
import { fileURLToPath } from "url";
import {
checkDatabaseInitialized,
initializeDatabase,
} from "./db/index.js";
// 导入配置项服务
import {
initConfigIpc,
} from "./service/configService.js";
// 导入字典服务 - 使用实际导出的函数名称
import {
initDictIpc,
} from "./service/dictService.js";
// 导入题干服务
import {
initQuestionIpc,
} from './service/questionService.js';
import {
initExamIpc,
} from "./service/examService.js";
// 添加考生服务导入
import {
initExamineeIpc
} from "./service/examineeService.js";
import {
initExamingIpc
} from "./service/examingService.js";
// 定义 __dirname 和 __filename
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 确保在应用最开始处添加单实例锁检查
// 尝试获取单实例锁
const gotTheLock = app.requestSingleInstanceLock();
// 如果获取锁失败,说明已有实例在运行,直接退出
if (!gotTheLock) {
app.quit();
} else {
// 设置第二个实例启动时的处理
app.on("second-instance", (event, commandLine, workingDirectory) => {
// 当用户尝试启动第二个实例时,聚焦到已有的主窗口
const mainWindow = BrowserWindow.getAllWindows()[0];
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
}
// 保存主窗口引用
let mainWindow = null;
function createWindow() {
// 如果已经有窗口,直接返回
if (mainWindow) {
return;
}
mainWindow = new BrowserWindow({
fullscreen: true,
webPreferences: {
preload: path.join(__dirname, "../electron/preload.js"),
nodeIntegration: false,
contextIsolation: true,
},
});
if (process.env.NODE_ENV === "development") {
mainWindow.loadURL("http://localhost:5173/");
mainWindow.webContents.openDevTools();
} else {
mainWindow.loadFile(path.join(__dirname, "../dist/index.html"));
}
// 当窗口关闭时,清空引用
mainWindow.on("closed", () => {
mainWindow = null;
});
}
// Initalize app
app.whenReady().then(() => {
setupApp();
createWindow();
setupIpcMain();
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
});
app.on("activate", () => {
// 只有当没有窗口时才创建新窗口
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
// Check database initialization status
async function setupApp() {
try {
console.log("应用启动 - 检查数据库初始化状态...");
// 使用全局变量防止重复初始化检查
if (global.dbInitCheck) {
console.log("数据库初始化检查已完成");
return;
}
global.dbInitCheck = true;
const isInitialized = await checkDatabaseInitialized();
console.log("数据库初始化状态:", isInitialized);
// 只检查状态,不自动初始化
} catch (error) {
console.error("数据库检查过程中出错:", error);
}
}
function setupIpcMain() {
// 数据库相关
ipcMain.handle("check-database-initialized", async () => {
try {
return await checkDatabaseInitialized();
} catch (error) {
console.error("Failed to check database initialization:", error);
return false;
}
});
ipcMain.handle("initialize-database", async () => {
try {
return await initializeDatabase();
} catch (error) {
console.error("Failed to initialize database:", error);
return false;
}
});
// 初始化config相关IPC
initConfigIpc(ipcMain);
// 初始化dict相关IPC
initDictIpc(ipcMain);
// 初始化exam相关IPC
initExamIpc(ipcMain);
// 初始化question相关IPC
initQuestionIpc(ipcMain);
// 初始化考生相关IPC
initExamineeIpc(ipcMain);
initExamingIpc(ipcMain);
}
// 确保在 app.whenReady() 中调用 setupIpcMain()
app.whenReady().then(() => {
setupApp();
createWindow();
setupIpcMain();
});
// 在应用退出前关闭所有数据库连接
app.on("will-quit", () => {
console.log("应用即将退出...");
});