✨ 静默启动
This commit is contained in:
parent
2ccddbe4b6
commit
4d9c5bf003
@ -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
|
||||||
|
@ -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 });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
@ -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
1
types/global.d.ts
vendored
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user