| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- import { app, BrowserWindow, ipcMain, dialog, shell } from "electron";
- import { fileURLToPath } from "url";
- import path from "path";
- import { spawn } from "child_process";
- import fs from "fs";
- import Papa from "./libs/papaparse/papaparse.js";
- process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
- const __filename = fileURLToPath(import.meta.url);
- const __dirname = path.dirname(__filename);
- let mainWindow = null;
- function createWindow() {
- mainWindow = new BrowserWindow({
- width: 1400,
- height: 900,
- minWidth: 800,
- minHeight: 600,
- webPreferences: {
- preload: path.join(__dirname, "./preload.mjs"),
- contextIsolation: true,
- nodeIntegration: false,
- allowRunningInsecureContent: false,
- },
- icon: path.join(__dirname, "../src/assets/images/icon.png"),//这里切换程序图标
- });
- if (process.env.NODE_ENV === "development") {
- mainWindow.loadURL("http://localhost:5173");
- // mainWindow.webContents.openDevTools(); //这是打开控制台
- } else {
- mainWindow.loadFile(path.join(__dirname, "../dist/index.html"));
- // mainWindow.webContents.openDevTools(); //这是打开控制台
- }
- // ✅ 运行 Python EXE
- ipcMain.handle("run-python-exe", async (event, apiName, params = {}) => {
- return new Promise((resolve, reject) => {
- let pythonExePath;
- if (process.env.NODE_ENV === "development") {
- pythonExePath = path.join(__dirname, "../serves/dist/api_test.exe");
- } else {
- pythonExePath = path.join(
- process.resourcesPath,
- "app.asar.unpacked",
- "serves",
- "dist",
- "api_test.exe"
- );
- }
- if (!fs.existsSync(pythonExePath)) {
- reject(`Python EXE 不存在: ${pythonExePath}`);
- return;
- }
- const args = [
- apiName,
- Buffer.from(JSON.stringify(params)).toString("base64"),
- ];
- const child = spawn(pythonExePath, args, { encoding: "utf8" });
- let stdoutData = "";
- let stderrData = "";
- child.stdout.on("data", (data) => (stdoutData += data.toString()));
- child.stderr.on("data", (data) => (stderrData += data.toString()));
- child.on("close", (code) => {
- if (code !== 0) {
- reject(`Python EXE exited with code ${code}\n${stderrData}`);
- return;
- }
- try {
- resolve(JSON.parse(stdoutData));
- } catch (err) {
- resolve(stdoutData.trim());
- }
- });
- });
- });
- // ✅ 读取 CSV
- ipcMain.handle("read-csv", async (event, filePath) => {
- try {
- const csvData = fs.readFileSync(filePath, "utf-8");
- const parsedData = Papa.parse(csvData, {
- header: true,
- skipEmptyLines: true,
- transformHeader: (header) => header.trim(),
- });
- const cleanData = parsedData.data.filter((row) =>
- Object.values(row).some((val) => val && val.trim() !== "")
- );
- return cleanData;
- } catch (error) {
- console.error("读取 CSV 失败:", error);
- return { error: error.message };
- }
- });
- // ✅ 文件选择
- ipcMain.handle("get-file-path", async () => {
- try {
- const { filePaths } = await dialog.showOpenDialog({
- properties: ["openFile", "multiSelections"],
- });
- return filePaths.length > 0 ? filePaths[0] : null;
- } catch (error) {
- console.error("获取文件路径失败:", error);
- return null;
- }
- });
- // ✅ 保存数据到文件夹?
- ipcMain.handle("save-submission", async (event, args) => {
- try {
- const baseDir = path.join(app.getPath("documents"), "雷击引下线数据");
- const { folderName, files } = args;
- const targetDir = path.join(baseDir, folderName);
- fs.mkdirSync(targetDir, { recursive: true });
- const savedPaths = [];
- for (const f of files) {
- const filePath = path.join(targetDir, f.fileName);
- const data =
- typeof f.content === "string" ? f.content : JSON.stringify(f.content);
- fs.writeFileSync(filePath, data, "utf8");
- savedPaths.push({ fileName: f.fileName, fullPath: filePath });
- }
- return { ok: true, dir: targetDir, savedPaths };
- } catch (err) {
- console.error("save-submission failed:", err);
- return { ok: false, error: String(err) };
- }
- });
- /** ✅ 删除单个文件夹 */
- ipcMain.handle("delete-folder", async (event, folderPath) => {
- try {
- if (!folderPath || !fs.existsSync(folderPath)) {
- return { ok: false, error: "文件夹不存在" };
- }
- fs.rmSync(folderPath, { recursive: true, force: true });
- console.log("已删除文件夹:", folderPath);
- return { ok: true };
- } catch (err) {
- console.error("删除文件夹失败:", err);
- return { ok: false, error: String(err) };
- }
- });
- /** ✅ 清空所有数据文件夹 */
- ipcMain.handle("clear-all-folders", async () => {
- try {
- const baseDir = path.join(app.getPath("documents"), "雷击引下线数据");
- if (fs.existsSync(baseDir)) {
- fs.rmSync(baseDir, { recursive: true, force: true });
- console.log("已清空目录:", baseDir);
- }
- return { ok: true };
- } catch (err) {
- console.error("清空文件夹失败:", err);
- return { ok: false, error: String(err) };
- }
- });
- // ✅ 读取文本文件
- ipcMain.handle("read-text-file", async (event, filePath) => {
- try {
- const content = fs.readFileSync(filePath, "utf8");
- return { ok: true, content };
- } catch (err) {
- return { ok: false, error: String(err) };
- }
- });
- // ✅ 读取 JSON 文件
- ipcMain.handle("read-json-file", async (event, filePath) => {
- try {
- const text = fs.readFileSync(filePath, "utf8");
- const json = JSON.parse(text);
- return { ok: true, json };
- } catch (err) {
- return { ok: false, error: String(err) };
- }
- });
- // ✅ 打开文件夹(只打开到指定目录)
- ipcMain.handle("open-path", async (event, folderPath) => {
- try {
- const stats = fs.statSync(folderPath);
- const target = stats.isDirectory()
- ? folderPath
- : path.dirname(folderPath);
- await shell.openPath(target);
- return { ok: true, opened: target };
- } catch (err) {
- console.error("打开路径失败:", err);
- return { ok: false, error: String(err) };
- }
- });
- // ✅ 关闭确认
- mainWindow.on("close", (event) => {
- event.preventDefault();
- const choice = dialog.showMessageBoxSync(mainWindow, {
- type: "question",
- buttons: ["取消", "退出"],
- defaultId: 0,
- title: "确认退出",
- message: "退出程序正在分析中的数据会丢失,确定要退出程序吗?",
- });
- if (choice === 1) {
- mainWindow.removeAllListeners("close");
- mainWindow.close();
- }
- });
- mainWindow.on("closed", () => {
- mainWindow = null;
- });
- }
- app.whenReady().then(createWindow);
- app.on("window-all-closed", () => {
- if (process.platform !== "darwin") app.quit();
- });
- app.on("activate", () => {
- if (BrowserWindow.getAllWindows().length === 0) createWindow();
- });
- export { createWindow };
|