fgv2.0 平台 electron 打包桌面应用
whychw
2026-03-19 28a82d58fd6faff1d68ab4decac34c72995283f8
main.js
@@ -1,6 +1,10 @@
const { app, BrowserWindow, Menu } = require("electron");
const { app, BrowserWindow, Menu, ipcMain } = require("electron");
const path = require("path");
const { readConfigFile } = require('./getConfig');
const child_process = require("child_process");
// import log from "electron-log";
// 不支持 import
const log = require("electron-log");
// 获取配置文件
const config = readConfigFile();
@@ -32,6 +36,27 @@
  });
}
const appUrl = remoteUrl + 'server/getCookie';
const requestPromise = require("minimal-request-promise");
const checkService = function (cb) {
  requestPromise.get(appUrl).then(
    function (response) {
      log.info(response);
      log.info("Server started!");
      cb();
    },
    function (response) {
      log.warn(response);
      log.info("Waiting for the server start...");
      setTimeout(function () {
        checkService(cb);
      }, 500);
    }
  );
};
// Scheme must be registered before the app is ready
// protocol.registerSchemesAsPrivileged([
//   { scheme: "app", privileges: { secure: true, standard: true, stream: true } },
@@ -47,7 +72,7 @@
//   ? path.join(__dirname, "./loading.html")
//   : `file://${__dirname}/loading.html`;
const loadingURL = `file://${__dirname}/loading.html`;
const showLoading = (cb) => {
const showLoading = (cb, argFn) => {
  loadingWin = new BrowserWindow({
    // show: false,
    frame: false,
@@ -55,15 +80,15 @@
    height: 260,
    resizable: false,
    transparent: true,
    // webPreferences: {
    //   preload: path.join(__dirname, "./preload.js"),
    // },
    webPreferences: {
      preload: path.join(__dirname, "./preload.js"),
    },
  });
  // loadingWin.webContents.openDevTools();
  loadingWin.loadURL(loadingURL);
  loadingWin.setSkipTaskbar(true);
  // loadingWin.show();
  cb(true);
  cb(true, argFn);
  // 启动java程序
  // if (platform === 'win32') {
  //   ipcMain.once('renderer-ready', (event, data) => {
@@ -71,8 +96,122 @@
  //     serverProcess = require('child_process').execFile(dir + '/app_x64.exe');
  //   });
  // }
  requestPromise.get(appUrl).then(
    function () {
      log.info("窗口初始化 服务正常");
      // ipcRenderer.send('java-ready');
      loadingWin.webContents.send("java-ready");
    },
    function () {
      log.info("窗口初始化 接口不通");
      log.info("正在终止java进程,然后重启服务");
      // update(win.webContents, true);
      // 如果是win平台
      if (process.platform == 'darwin' || process.platform == 'win32') {
        stopForWin();
      } else if (process.platform == 'linux') {
        stopForLinux();
      }
    }
  );
};
async function createWindow(wait) {
// 终止java进程 并重启服务 win平台
function stopForWin() {
  let stop = child_process.spawn("cmd.exe", ["/c", `${process.cwd()}\\stop.bat`]);
  log.info(`${process.cwd()}\\stop.bat`);
  stop.on("exit", function (code) {
    if (code > 0) {
      log.info('执行stop.bat没有正确exit, 错误码' + code);
      // return false;
    }
    log.info("java进程被终止,准备重启服务");
    child_process.exec(
      `"${process.cwd()}\\fgv2.exe" restart`,
      (err) => {
        if (err) {
          log.info("重启服务出错了stderr: " + JSON.stringify(err));
          // 重新运行setup批处理 尝试重新注册服务
          child_process.spawn("cmd.exe", ["/c", "setup_service.bat"]);
          log.info("服务异常 正在尝试重新注册服务");
        } else {
          log.info("服务重启成功,连接中");
        }
        // 等到服务就绪再重启
        checkService(() => {
          loadingWin.webContents.send("java-ready");
        });
      }
    );
  });
  stop.on('error', (code, data) => {
    log.info('stop.bat 执行 error');
    log.info(code);
    log.info(data);
  });
}
// 终止java进程 并重启服务 linux平台
function stopForLinux() {
  let dir = path.join(process.cwd(), './stop.sh');
  let stop = child_process.spawn('bash', [dir]);
  // 监听脚本执行
  stop.stdout.on('data', (data) => {
    log.info(`stdout: ${data}`);
  });
  stop.stderr.on('data', (data) => {
    log.info(`stderr: ${data}`);
  });
  stop.on('close', (code) => {
    log.info(`子进程退出, 退出码:${code}`);
    log.info("java进程被终止,准备重启服务");
    child_process.exec(`systemctl --user restart fgv2.service`, (err, out, stde) => {
      log.info('==========');
      log.info(err);
      log.info(out);
      log.info(stde);
      if (err) {
        log.error('重启服务失败:' + err);
        let dir = path.join(process.cwd(), './setup_service.sh');
        child_process.exec(`bash "${dir}"`, (error, stdout, stderr) => {
          if (error) {
            log.error('执行失败:' + error);
          }
          log.info(`脚本输出: ${stdout}`);
          log.error(`脚本错误: ${stderr}`);
        });
      }
      if (out) {
        log.info(`重启服务输出: ${out}`);
      }
      if (stde) {
        log.error(`重启服务错误: ${stde}`);
        let dir = path.join(process.cwd(), './setup_service.sh');
        child_process.exec(`bash "${dir}"`, (error, stdout, stderr) => {
          // log.info('0000000');
          if (error) {
            log.error('执行失败:' + error);
          }
          log.info(`脚本输出: ${stdout}`);
          log.error(`脚本错误: ${stderr}`);
        });
      }
      // 等到服务就绪再重启
      checkService(() => {
        loadingWin.webContents.send("java-ready");
      });
    });
  });
}
async function createWindow(wait, cb) {
  // Create the browser window.
  win = new BrowserWindow({
    show: !wait,
@@ -84,12 +223,13 @@
      // nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      // contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION
      nodeIntegration: false,
      // nodeIntegration: true,
      webSecurity: true,
      allowEval: false,
      allowRunningInsecureContent: false,
      contextIsolation: true,
      enableRemoteModule: false,
      // preload: path.join(__dirname, "preload.js"),
      preload: path.join(__dirname, "preload.js"),
    },
  });
@@ -97,6 +237,8 @@
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // Load the url of the dev server if in development mode
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
    // DEBUG
    // win.webContents.openDevTools();
    if (!process.env.IS_TEST) win.webContents.openDevTools();
  } else {
    // createProtocol("app");
@@ -106,7 +248,10 @@
    // win.loadURL("http://118.89.139.230:8919/fg/");
    // win.loadURL('http://192.168.10.79:8919/fg/');
    // win.loadURL('http://192.168.10.80:8919/fg/');
    win.loadURL(remoteUrl);
    // 远程文件 不能提前加载
    // win.loadURL(remoteUrl + 'index.html');
    // DEBUG
    // win.webContents.openDevTools();
  }
  if (wait) {
@@ -115,10 +260,20 @@
    //   loadingWin.close();
    //   win.show();
    // }, 6000);
    win.once("ready-to-show", () => {
      loadingWin.hide();
      loadingWin.close();
      win.show();
    // win.once("ready-to-show", () => {
    //   loadingWin.hide();
    //   loadingWin.close();
    //   win.show();
    // });
    ipcMain.on("java-ready", () => {
      log.info("java-ready!");
      win.loadURL(remoteUrl + 'index.html');
      win.once("ready-to-show", () => {
        loadingWin.hide();
        loadingWin.close();
        win.show();
      });
    });
  }
}