静默启动

This commit is contained in:
刘嘉伟 2024-10-14 11:24:54 +08:00
parent 2ccddbe4b6
commit 4d9c5bf003
4 changed files with 226 additions and 168 deletions

View File

@ -143,7 +143,8 @@ export const initConfigApi = win => {
user: sourceConfig?.user || "", user: sourceConfig?.user || "",
metaToken: sourceConfig?.metadatas?.token || "", metaToken: sourceConfig?.metadatas?.token || "",
systemSelfStart: false, systemSelfStart: false,
systemStartupConnect: false systemStartupConnect: false,
systemSilentStartup: false
}; };
let frpcProxys = []; let frpcProxys = [];
// 解析proxy // 解析proxy

View File

@ -1,16 +1,29 @@
import {app, BrowserWindow, ipcMain, Menu, MenuItem, MenuItemConstructorOptions, shell, Tray} from "electron"; import {
import {release} from "node:os"; app,
import node_path, {join} from "node:path"; BrowserWindow,
import {initGitHubApi} from "../api/github"; ipcMain,
import {initConfigApi} from "../api/config"; Menu,
import {initProxyApi} from "../api/proxy"; MenuItem,
import {initFrpcApi, startFrpWorkerProcess, stopFrpcProcess} from "../api/frpc"; MenuItemConstructorOptions,
import {initLoggerApi} from "../api/logger"; shell,
import {initFileApi} from "../api/file"; Tray
import {getConfig} from "../storage/config"; } 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 log from "electron-log";
import {initCommonApi} from "../api/common"; import { initCommonApi } from "../api/common";
import {initLocalApi} from "../api/local"; import { initLocalApi } from "../api/local";
// The built directory structure // The built directory structure
// //
// ├─┬ dist-electron // ├─┬ dist-electron
@ -24,8 +37,8 @@ import {initLocalApi} from "../api/local";
process.env.DIST_ELECTRON = join(__dirname, ".."); process.env.DIST_ELECTRON = join(__dirname, "..");
process.env.DIST = join(process.env.DIST_ELECTRON, "../dist"); process.env.DIST = join(process.env.DIST_ELECTRON, "../dist");
process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL
? join(process.env.DIST_ELECTRON, "../public") ? join(process.env.DIST_ELECTRON, "../public")
: process.env.DIST; : process.env.DIST;
// Disable GPU Acceleration for Windows 7 // Disable GPU Acceleration for Windows 7
if (release().startsWith("6.1")) app.disableHardwareAcceleration(); 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 (process.platform === "win32") app.setAppUserModelId(app.getName());
if (!app.requestSingleInstanceLock()) { if (!app.requestSingleInstanceLock()) {
app.quit(); app.quit();
process.exit(0); process.exit(0);
} }
// Remove electron security warnings // Remove electron security warnings
@ -50,177 +63,190 @@ const preload = join(__dirname, "../preload/index.js");
const url = process.env.VITE_DEV_SERVER_URL; const url = process.env.VITE_DEV_SERVER_URL;
const indexHtml = join(process.env.DIST, "index.html"); const indexHtml = join(process.env.DIST, "index.html");
let isQuiting; let isQuiting;
log.transports.file.level = 'debug'; log.transports.file.level = "debug";
log.transports.console.level = "debug"; log.transports.console.level = "debug";
async function createWindow() { async function createWindow(config: FrpConfig) {
win = new BrowserWindow({ console.log("config", config);
title: "Frpc Desktop", let show = true;
icon: join(process.env.VITE_PUBLIC, "logo/only/16x16.png"), if (config) {
width: 800, show = !config.systemSilentStartup;
height: 600, }
minWidth: 800, console.log("界面", show);
minHeight: 600, win = new BrowserWindow({
maxWidth: 1280, title: "Frpc Desktop",
maxHeight: 960, icon: join(process.env.VITE_PUBLIC, "logo/only/16x16.png"),
webPreferences: { width: 800,
preload, height: 600,
// Warning: Enable nodeIntegration and disable contextIsolation is not secure in production minWidth: 800,
// Consider using contextBridge.exposeInMainWorld minHeight: 600,
// Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation maxWidth: 1280,
nodeIntegration: true, maxHeight: 960,
contextIsolation: false webPreferences: {
} preload,
}); // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production
if (process.env.VITE_DEV_SERVER_URL) { // Consider using contextBridge.exposeInMainWorld
// electron-vite-vue#298 // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation
win.loadURL(url); nodeIntegration: true,
// Open devTool if the app is not packaged contextIsolation: false
win.webContents.openDevTools(); },
} else { show: show
win.loadFile(indexHtml); });
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();
}
} }
return false;
// 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;
});
} }
export const createTray = () => { export const createTray = (config: FrpConfig) => {
log.info(`当前环境 platform${process.platform} arch${process.arch} appData${app.getPath("userData")} version:${app.getVersion()}`) log.info(
let menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [ `当前环境 platform${process.platform} arch${
{ process.arch
label: '显示主窗口', click: function () { } appData${app.getPath("userData")} version:${app.getVersion()}`
win.show(); );
if (process.platform === "darwin") { let menu: Array<MenuItemConstructorOptions | MenuItem> = [
app.dock.show(); {
} label: "显示主窗口",
} click: function () {
},
{
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(); win.show();
}) if (process.platform === "darwin") {
app.dock.show();
getConfig((err, config) => {
if (!err) {
if (config) {
if (config.systemStartupConnect) {
log.info(`已开启自动连接 正在自动连接服务器`)
startFrpWorkerProcess(config)
}
}
} }
}) }
} },
{
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(() => { app.whenReady().then(() => {
createWindow().then(r => { getConfig((err, config) => {
createTray() createWindow(config).then(r => {
// 初始化各个API createTray(config);
initGitHubApi(); // 初始化各个API
initConfigApi(win); initGitHubApi();
initProxyApi(); initConfigApi(win);
initFrpcApi(); initProxyApi();
initLoggerApi(); initFrpcApi();
initFileApi(); initLoggerApi();
initCommonApi(); initFileApi();
initLocalApi(); initCommonApi();
// initUpdaterApi(win); initLocalApi();
}) // initUpdaterApi(win);
});
});
}); });
app.on("window-all-closed", () => { app.on("window-all-closed", () => {
win = null; win = null;
if (process.platform !== "darwin") { if (process.platform !== "darwin") {
stopFrpcProcess(() => { stopFrpcProcess(() => {
app.quit(); app.quit();
}) });
} }
}); });
app.on("second-instance", () => { app.on("second-instance", () => {
if (win) { if (win) {
// Focus on the main window if the user tried to open another // Focus on the main window if the user tried to open another
if (win.isMinimized()) win.restore(); if (win.isMinimized()) win.restore();
win.focus(); win.focus();
} }
}); });
app.on("activate", () => { app.on("activate", () => {
const allWindows = BrowserWindow.getAllWindows(); const allWindows = BrowserWindow.getAllWindows();
if (allWindows.length) { if (allWindows.length) {
allWindows[0].focus(); allWindows[0].focus();
} else { } else {
createWindow(); getConfig((err, config) => {
} createWindow(config).then(r => {});
});
}
}); });
app.on('before-quit', () => { app.on("before-quit", () => {
log.info("before-quit") log.info("before-quit");
isQuiting = true; isQuiting = true;
}) });
// New window example arg: new windows url // New window example arg: new windows url
ipcMain.handle("open-win", (_, arg) => { ipcMain.handle("open-win", (_, arg) => {
const childWindow = new BrowserWindow({ const childWindow = new BrowserWindow({
webPreferences: { webPreferences: {
preload, preload,
nodeIntegration: true, nodeIntegration: true,
contextIsolation: false contextIsolation: false
}
});
if (process.env.VITE_DEV_SERVER_URL) {
childWindow.loadURL(`${url}#${arg}`);
} else {
childWindow.loadFile(indexHtml, {hash: arg});
} }
});
if (process.env.VITE_DEV_SERVER_URL) {
childWindow.loadURL(`${url}#${arg}`);
} else {
childWindow.loadFile(indexHtml, { hash: arg });
}
}); });

View File

@ -41,6 +41,7 @@ const defaultFormData = ref<FrpConfig>({
proxyConfigProxyUrl: "", proxyConfigProxyUrl: "",
systemSelfStart: false, systemSelfStart: false,
systemStartupConnect: false, systemStartupConnect: false,
systemSilentStartup: false,
user: "", user: "",
metaToken: "", metaToken: "",
transportHeartbeatInterval: 30, transportHeartbeatInterval: 30,
@ -933,7 +934,7 @@ onUnmounted(() => {
<el-col :span="24"> <el-col :span="24">
<div class="h2">系统配置</div> <div class="h2">系统配置</div>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="开机自启:" prop="systemSelfStart"> <el-form-item label="开机自启:" prop="systemSelfStart">
<template #label> <template #label>
<div class="h-full flex items-center mr-1"> <div class="h-full flex items-center mr-1">
@ -963,7 +964,36 @@ onUnmounted(() => {
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="静默启动:" prop="systemSilentStartup">
<template #label>
<div class="h-full flex items-center mr-1">
<el-popover placement="top" trigger="hover">
<template #default>
开启后启动时<span class="font-black text-[#5A3DAA]"
>不打开界面</span
>
</template>
<template #reference>
<IconifyIconOffline
class="text-base"
color="#5A3DAA"
icon="info"
/>
</template>
</el-popover>
</div>
静默启动
</template>
<el-switch
active-text="开"
inline-prompt
inactive-text="关"
v-model="formData.systemSilentStartup"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="自动连接:" prop="systemStartupConnect"> <el-form-item label="自动连接:" prop="systemStartupConnect">
<template #label> <template #label>
<div class="h-full flex items-center mr-1"> <div class="h-full flex items-center mr-1">

1
types/global.d.ts vendored
View File

@ -76,6 +76,7 @@ declare global {
proxyConfigProxyUrl: string; proxyConfigProxyUrl: string;
systemSelfStart: boolean; systemSelfStart: boolean;
systemStartupConnect: boolean; systemStartupConnect: boolean;
systemSilentStartup: boolean;
user: string; user: string;
metaToken: string; metaToken: string;
transportHeartbeatInterval: number; transportHeartbeatInterval: number;