From 4d9c5bf00306ae28c3152d74abd7e0e819489925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=98=89=E4=BC=9F?= <8473136@qq.com> Date: Mon, 14 Oct 2024 11:24:54 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=9D=99=E9=BB=98=E5=90=AF?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/api/config.ts | 3 +- electron/main/index.ts | 356 ++++++++++++++++++++----------------- src/views/config/index.vue | 34 +++- types/global.d.ts | 1 + 4 files changed, 226 insertions(+), 168 deletions(-) diff --git a/electron/api/config.ts b/electron/api/config.ts index b13e73e..0e678a9 100644 --- a/electron/api/config.ts +++ b/electron/api/config.ts @@ -143,7 +143,8 @@ export const initConfigApi = win => { user: sourceConfig?.user || "", metaToken: sourceConfig?.metadatas?.token || "", systemSelfStart: false, - systemStartupConnect: false + systemStartupConnect: false, + systemSilentStartup: false }; let frpcProxys = []; // 解析proxy diff --git a/electron/main/index.ts b/electron/main/index.ts index 2a49ae9..93743bb 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -1,16 +1,29 @@ -import {app, BrowserWindow, ipcMain, Menu, MenuItem, MenuItemConstructorOptions, shell, Tray} from "electron"; -import {release} from "node:os"; -import node_path, {join} from "node:path"; -import {initGitHubApi} from "../api/github"; -import {initConfigApi} from "../api/config"; -import {initProxyApi} from "../api/proxy"; -import {initFrpcApi, startFrpWorkerProcess, stopFrpcProcess} from "../api/frpc"; -import {initLoggerApi} from "../api/logger"; -import {initFileApi} from "../api/file"; -import {getConfig} from "../storage/config"; +import { + app, + BrowserWindow, + ipcMain, + Menu, + MenuItem, + MenuItemConstructorOptions, + shell, + Tray +} from "electron"; +import { release } from "node:os"; +import node_path, { join } from "node:path"; +import { initGitHubApi } from "../api/github"; +import { initConfigApi } from "../api/config"; +import { initProxyApi } from "../api/proxy"; +import { + initFrpcApi, + startFrpWorkerProcess, + stopFrpcProcess +} from "../api/frpc"; +import { initLoggerApi } from "../api/logger"; +import { initFileApi } from "../api/file"; +import { getConfig } from "../storage/config"; import log from "electron-log"; -import {initCommonApi} from "../api/common"; -import {initLocalApi} from "../api/local"; +import { initCommonApi } from "../api/common"; +import { initLocalApi } from "../api/local"; // The built directory structure // // ├─┬ dist-electron @@ -24,8 +37,8 @@ import {initLocalApi} from "../api/local"; process.env.DIST_ELECTRON = join(__dirname, ".."); process.env.DIST = join(process.env.DIST_ELECTRON, "../dist"); process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL - ? join(process.env.DIST_ELECTRON, "../public") - : process.env.DIST; + ? join(process.env.DIST_ELECTRON, "../public") + : process.env.DIST; // Disable GPU Acceleration for Windows 7 if (release().startsWith("6.1")) app.disableHardwareAcceleration(); @@ -34,8 +47,8 @@ if (release().startsWith("6.1")) app.disableHardwareAcceleration(); if (process.platform === "win32") app.setAppUserModelId(app.getName()); if (!app.requestSingleInstanceLock()) { - app.quit(); - process.exit(0); + app.quit(); + process.exit(0); } // Remove electron security warnings @@ -50,177 +63,190 @@ const preload = join(__dirname, "../preload/index.js"); const url = process.env.VITE_DEV_SERVER_URL; const indexHtml = join(process.env.DIST, "index.html"); let isQuiting; -log.transports.file.level = 'debug'; +log.transports.file.level = "debug"; log.transports.console.level = "debug"; -async function createWindow() { - win = new BrowserWindow({ - title: "Frpc Desktop", - icon: join(process.env.VITE_PUBLIC, "logo/only/16x16.png"), - width: 800, - height: 600, - minWidth: 800, - minHeight: 600, - maxWidth: 1280, - maxHeight: 960, - webPreferences: { - preload, - // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production - // Consider using contextBridge.exposeInMainWorld - // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation - nodeIntegration: true, - contextIsolation: false - } - }); - if (process.env.VITE_DEV_SERVER_URL) { - // electron-vite-vue#298 - win.loadURL(url); - // Open devTool if the app is not packaged - win.webContents.openDevTools(); - } else { - win.loadFile(indexHtml); +async function createWindow(config: FrpConfig) { + console.log("config", config); + let show = true; + if (config) { + show = !config.systemSilentStartup; + } + console.log("界面", show); + win = new BrowserWindow({ + title: "Frpc Desktop", + icon: join(process.env.VITE_PUBLIC, "logo/only/16x16.png"), + width: 800, + height: 600, + minWidth: 800, + minHeight: 600, + maxWidth: 1280, + maxHeight: 960, + webPreferences: { + preload, + // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production + // Consider using contextBridge.exposeInMainWorld + // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation + nodeIntegration: true, + contextIsolation: false + }, + show: show + }); + if (process.env.VITE_DEV_SERVER_URL) { + // electron-vite-vue#298 + win.loadURL(url); + // Open devTool if the app is not packaged + win.webContents.openDevTools(); + } else { + win.loadFile(indexHtml); + } + + // Test actively push message to the Electron-Renderer + win.webContents.on("did-finish-load", () => { + win?.webContents.send("main-process-message", new Date().toLocaleString()); + }); + + // Make all links open with the browser, not with the application + win.webContents.setWindowOpenHandler(({ url }) => { + if (url.startsWith("https:")) shell.openExternal(url); + return { action: "deny" }; + }); + + // 隐藏菜单栏 + const { Menu } = require("electron"); + Menu.setApplicationMenu(null); + // hide menu for Mac + // if (process.platform !== "darwin") { + // app.dock.hide(); + // } + + win.on("minimize", function (event) { + event.preventDefault(); + win.hide(); + }); + + win.on("close", function (event) { + if (!isQuiting) { + event.preventDefault(); + win.hide(); + if (process.platform === "darwin") { + app.dock.hide(); + } } - - // Test actively push message to the Electron-Renderer - win.webContents.on("did-finish-load", () => { - win?.webContents.send("main-process-message", new Date().toLocaleString()); - }); - - // Make all links open with the browser, not with the application - win.webContents.setWindowOpenHandler(({url}) => { - if (url.startsWith("https:")) shell.openExternal(url); - return {action: "deny"}; - }); - - // 隐藏菜单栏 - const {Menu} = require("electron"); - Menu.setApplicationMenu(null); - // hide menu for Mac - // if (process.platform !== "darwin") { - // app.dock.hide(); - // } - - win.on('minimize', function (event) { - event.preventDefault(); - win.hide(); - }); - - win.on('close', function (event) { - if (!isQuiting) { - event.preventDefault(); - win.hide(); - if (process.platform === "darwin") { - app.dock.hide(); - } - } - return false; - }); - + return false; + }); } -export const createTray = () => { - log.info(`当前环境 platform:${process.platform} arch:${process.arch} appData:${app.getPath("userData")} version:${app.getVersion()}`) - let menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [ - { - label: '显示主窗口', click: function () { - win.show(); - if (process.platform === "darwin") { - app.dock.show(); - } - } - }, - { - label: '退出', - click: () => { - isQuiting = true; - stopFrpcProcess(() => { - app.quit(); - }) - } - } - ]; - tray = new Tray(node_path.join(process.env.VITE_PUBLIC, "logo/only/16x16.png")) - tray.setToolTip('Frpc Desktop') - const contextMenu = Menu.buildFromTemplate(menu) - tray.setContextMenu(contextMenu) - - // 托盘双击打开 - tray.on('double-click', () => { +export const createTray = (config: FrpConfig) => { + log.info( + `当前环境 platform:${process.platform} arch:${ + process.arch + } appData:${app.getPath("userData")} version:${app.getVersion()}` + ); + let menu: Array = [ + { + label: "显示主窗口", + click: function () { win.show(); - }) - - getConfig((err, config) => { - if (!err) { - if (config) { - if (config.systemStartupConnect) { - log.info(`已开启自动连接 正在自动连接服务器`) - startFrpWorkerProcess(config) - } - } + if (process.platform === "darwin") { + app.dock.show(); } - }) -} + } + }, + { + label: "退出", + click: () => { + isQuiting = true; + stopFrpcProcess(() => { + app.quit(); + }); + } + } + ]; + tray = new Tray( + node_path.join(process.env.VITE_PUBLIC, "logo/only/16x16.png") + ); + tray.setToolTip("Frpc Desktop"); + const contextMenu = Menu.buildFromTemplate(menu); + tray.setContextMenu(contextMenu); + + // 托盘双击打开 + tray.on("double-click", () => { + win.show(); + }); + + if (config) { + if (config.systemStartupConnect) { + log.info(`已开启自动连接 正在自动连接服务器`); + startFrpWorkerProcess(config); + } + } +}; app.whenReady().then(() => { - createWindow().then(r => { - createTray() - // 初始化各个API - initGitHubApi(); - initConfigApi(win); - initProxyApi(); - initFrpcApi(); - initLoggerApi(); - initFileApi(); - initCommonApi(); - initLocalApi(); - // initUpdaterApi(win); - }) + getConfig((err, config) => { + createWindow(config).then(r => { + createTray(config); + // 初始化各个API + initGitHubApi(); + initConfigApi(win); + initProxyApi(); + initFrpcApi(); + initLoggerApi(); + initFileApi(); + initCommonApi(); + initLocalApi(); + // initUpdaterApi(win); + }); + }); }); app.on("window-all-closed", () => { - win = null; - if (process.platform !== "darwin") { - stopFrpcProcess(() => { - app.quit(); - }) - } + win = null; + if (process.platform !== "darwin") { + stopFrpcProcess(() => { + app.quit(); + }); + } }); app.on("second-instance", () => { - if (win) { - // Focus on the main window if the user tried to open another - if (win.isMinimized()) win.restore(); - win.focus(); - } + if (win) { + // Focus on the main window if the user tried to open another + if (win.isMinimized()) win.restore(); + win.focus(); + } }); app.on("activate", () => { - const allWindows = BrowserWindow.getAllWindows(); - if (allWindows.length) { - allWindows[0].focus(); - } else { - createWindow(); - } + const allWindows = BrowserWindow.getAllWindows(); + if (allWindows.length) { + allWindows[0].focus(); + } else { + getConfig((err, config) => { + createWindow(config).then(r => {}); + }); + } }); -app.on('before-quit', () => { - log.info("before-quit") - isQuiting = true; -}) +app.on("before-quit", () => { + log.info("before-quit"); + isQuiting = true; +}); // New window example arg: new windows url ipcMain.handle("open-win", (_, arg) => { - const childWindow = new BrowserWindow({ - webPreferences: { - preload, - nodeIntegration: true, - contextIsolation: false - } - }); - - if (process.env.VITE_DEV_SERVER_URL) { - childWindow.loadURL(`${url}#${arg}`); - } else { - childWindow.loadFile(indexHtml, {hash: arg}); + const childWindow = new BrowserWindow({ + webPreferences: { + preload, + nodeIntegration: true, + contextIsolation: false } + }); + + if (process.env.VITE_DEV_SERVER_URL) { + childWindow.loadURL(`${url}#${arg}`); + } else { + childWindow.loadFile(indexHtml, { hash: arg }); + } }); diff --git a/src/views/config/index.vue b/src/views/config/index.vue index 61e00ed..6bfb97b 100644 --- a/src/views/config/index.vue +++ b/src/views/config/index.vue @@ -41,6 +41,7 @@ const defaultFormData = ref({ proxyConfigProxyUrl: "", systemSelfStart: false, systemStartupConnect: false, + systemSilentStartup: false, user: "", metaToken: "", transportHeartbeatInterval: 30, @@ -933,7 +934,7 @@ onUnmounted(() => {
系统配置
- +