From 92d25ab90797ee1736392944cfc327321accb693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=85=88=E6=A3=AE?= Date: Wed, 13 Nov 2024 16:42:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=9F=E6=88=90config.json?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E9=AB=98=E7=BA=A7=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 + assets/game-step10.png | Bin 0 -> 29257 bytes composables/configJson.ts | 16 + composables/windows.ts | 50 +-- env/.env.dev | 1 + env/.env.prod | 1 + package.json | 2 +- pages/advance.vue | 45 ++- pages/index.vue | 403 ++++++++++++++---------- src-tauri/.gitignore | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/capabilities/default.json | 2 + src-tauri/easytier/config_template.json | 22 ++ src-tauri/easytier/tool/nssm.exe | Bin 0 -> 368640 bytes src-tauri/tauri.conf.json | 5 +- stores/index.ts | 1 + tsconfig.json | 1 + typings/index.d.ts | 1 + 19 files changed, 355 insertions(+), 206 deletions(-) create mode 100644 assets/game-step10.png create mode 100644 composables/configJson.ts create mode 100644 src-tauri/easytier/config_template.json create mode 100644 src-tauri/easytier/tool/nssm.exe diff --git a/README.md b/README.md index 6c73d46..e40e518 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,11 @@ Releases: [https://github.com/EasyTier/EasytierGame/releases](https://github.c ![game-step9](/assets/game-step9.png) +- 1.1.8 新增了 生成 easytier/config.json 的功能 会将一部分配置写入到 config.json 文件中,方便用户自定义配置,你可以在高级设置里启用和关闭这个功能(默认关闭) +**需要注意的是,如果config.json存在,每次启动easytierGame默认按照config.json的配置为准** +**你可以查看 config_template.json 里的注释进行配置** +![game-step10](/assets/game-step10.png) + ## 特性 - 基于easytier组网工具开发,界面清晰简单 diff --git a/assets/game-step10.png b/assets/game-step10.png new file mode 100644 index 0000000000000000000000000000000000000000..348931e532d1788a20a6ec49042211984c8c51bf GIT binary patch literal 29257 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 { + + const mainStore = useMainStore(); + const path = import.meta.env.VITE_CONFIG_FILE_NAME; + try { + const { proxyNetworks, autoStart, relayAllPeerrpc, coonectAfterStart, multiThread, enablExitNode, useSmoltcp, saveErrorLog, logLevel, ...otherConfig } = + mainStore.config; + await writeTextFile(path, JSON.stringify(otherConfig, null, 4), { baseDir: BaseDirectory.Resource }); + } catch (err) { + console.log(err); + ElMessage.error(`更新config.json失败`); + } +} diff --git a/composables/windows.ts b/composables/windows.ts index 507be60..0d0b424 100644 --- a/composables/windows.ts +++ b/composables/windows.ts @@ -1,38 +1,42 @@ import { type UnlistenFn } from "@tauri-apps/api/event"; -import { getCurrentWindow, PhysicalPosition, type WindowOptions, Window } from "@tauri-apps/api/window"; +import { getCurrentWindow, PhysicalPosition, type WindowOptions, Window, currentMonitor } from "@tauri-apps/api/window"; import { WebviewWindow } from "@tauri-apps/api/webviewWindow"; -import type { WebviewLabel, WebviewOptions, } from "@tauri-apps/api/webview"; +import type { WebviewLabel, WebviewOptions } from "@tauri-apps/api/webview"; export default async ( label: WebviewLabel, options?: Omit & WindowOptions, afterCreatedFunc?: (webviewWindow: WebviewWindow, appWindow: Window) => void | null, beforeCloseFunc?: () => void | null ) => { - let defaultOpts = { - parent: undefined, - closable: true, - resizable: true, - decorations: true, - maximizable: false, - minimizable: false, - x: 0, - y: 0 - }; - const appWindow = getCurrentWindow(); - if (appWindow) { - const appSize = await appWindow.outerSize(); - const factor = await appWindow.scaleFactor(); - const appPosition = await appWindow.outerPosition(); - const logicalPosition = new PhysicalPosition(appPosition.x + appSize.width, appPosition.y).toLogical(factor); - defaultOpts.parent = appWindow as any; - defaultOpts.x = logicalPosition.x; - defaultOpts.y = logicalPosition.y; - } let unListenlogClose: UnlistenFn | null = null; let unlistenLogCreated: UnlistenFn | null = null; let dialog = await WebviewWindow.getByLabel(label); if (!dialog) { - dialog = new WebviewWindow(label, {...defaultOpts, ...options}); + let defaultOpts: {[key:string]: any, parent: Window | undefined} = { + parent: undefined, + closable: true, + resizable: true, + decorations: true, + maximizable: false, + minimizable: false, + x: 0, + y: 0 + }; + const appWindow = getCurrentWindow(); + if (appWindow) { + const appSize = await appWindow.outerSize(); + // const monitor = await currentMonitor(); + // console.log(monitor) + const factor = await appWindow.scaleFactor(); + const appPosition = await appWindow.outerPosition(); + // console.log((appPosition.x + appSize.width) / 1.25); + const logicalPosition = new PhysicalPosition(appPosition.x + appSize.width, appPosition.y).toLogical(factor); + defaultOpts.parent = appWindow; + // console.log(logicalPosition); + defaultOpts.x = logicalPosition.x; + defaultOpts.y = logicalPosition.y; + } + dialog = new WebviewWindow(label, { ...defaultOpts, ...options }); unlistenLogCreated = await dialog.once("tauri://webview-created", async () => { if (dialog) { afterCreatedFunc && (await afterCreatedFunc(dialog, appWindow)); diff --git a/env/.env.dev b/env/.env.dev index e4d5eba..719cd46 100644 --- a/env/.env.dev +++ b/env/.env.dev @@ -1,3 +1,4 @@ VITE_CONFIG_PATH=easytier/config/ +VITE_CONFIG_FILE_NAME=easytier/config.json VITE_LOG_PATH=easytier/logs/ VITE_AUTO_START_SERVICE_NAME=easytierGameAutoStart \ No newline at end of file diff --git a/env/.env.prod b/env/.env.prod index e4d5eba..719cd46 100644 --- a/env/.env.prod +++ b/env/.env.prod @@ -1,3 +1,4 @@ VITE_CONFIG_PATH=easytier/config/ +VITE_CONFIG_FILE_NAME=easytier/config.json VITE_LOG_PATH=easytier/logs/ VITE_AUTO_START_SERVICE_NAME=easytierGameAutoStart \ No newline at end of file diff --git a/package.json b/package.json index c85cfb9..0e19b27 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "author": "leizi97", "description": "A simple network initiator based on Easytier", - "version": "1.1.7", + "version": "1.1.8", "scripts": { "dev": "nuxt dev --dotenv env/.env.dev --host 0.0.0.0", "build": "nuxt generate --dotenv env/.env.prod" diff --git a/pages/advance.vue b/pages/advance.vue index 1a39ec1..5f05d40 100644 --- a/pages/advance.vue +++ b/pages/advance.vue @@ -3,30 +3,47 @@

自定义网卡名 - +
不监听任何端口,只连接到对等节点
-
软件启动后,自动"启动联机"(搭配开机自启,无感联机)
输出日志到本地
+ class="ml-[5px]" + > + :value="item" + >
+ size="small" + > 打开日志目录
+
软件启动后,自动"启动联机"(搭配开机自启,无感联机)
+
+ 自动生成界面配置文件easytier/config.json + + 打开config.json目录 + +
+
允许此节点成为出口节点
禁用对等节点通信的加密,默认为false,必须与对等节点相同
@@ -47,6 +64,7 @@ import { resourceDir as getResourceDir, join } from "@tauri-apps/api/path"; import { Command } from "@tauri-apps/plugin-shell"; import { exists, mkdir, BaseDirectory } from "@tauri-apps/plugin-fs"; + import { ElMessage } from "element-plus"; const mainStore = useMainStore(); const appWindow = getCurrentWindow(); @@ -63,8 +81,21 @@ } await Command.create("explorer", [logDirPath]).execute(); }; - mainStore.$subscribe((...a) => { + const openConfigJsonDir = async () => { + const resourceDir = await getResourceDir(); + const easytierDir = await join(resourceDir, "easytier/"); + const isExists = await exists("easytier/", { baseDir: BaseDirectory.Resource }); + if (isExists) { + await Command.create("explorer", [easytierDir]).execute(); + } else { + ElMessage.error("config.json的目录不存在"); + } + }; + mainStore.$subscribe(async (...a) => { // console.log("subscribe", a); - appWindow.emitTo("main", "config", { config: { ...mainStore.config } }); + await appWindow.emitTo("main", "config", { config: { ...mainStore.config }, createConfigInEasytier: mainStore.createConfigInEasytier }); + // if(mainStore.createConfigInEasytier) { + // updateConfigJson(); + // } }); diff --git a/pages/index.vue b/pages/index.vue index 6d997f1..dd90f2d 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -9,179 +9,179 @@ :element-loading-spinner="''" element-loading-text="-------已经启用配置文件,界面配置不再生效-------" --> - -