179 lines
4.1 KiB
JavaScript
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("应用即将退出...");
|
|
});
|