From 91b97df99a9683555dfda6201b172576c3d45aa1 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, 6 Jan 2025 16:14:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20=E4=BC=A0=E8=BE=93=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/api/config.ts | 507 +++++++++++++++++++------------------ electron/api/frpc.ts | 161 +++++------- src/views/config/index.vue | 361 ++++++++++++++++++++++---- types/global.d.ts | 6 + 4 files changed, 643 insertions(+), 392 deletions(-) diff --git a/electron/api/config.ts b/electron/api/config.ts index 8937fff..176645f 100644 --- a/electron/api/config.ts +++ b/electron/api/config.ts @@ -1,268 +1,277 @@ -import {app, dialog, ipcMain, shell} from "electron"; -import {clearConfig, getConfig, saveConfig} from "../storage/config"; -import {clearVersion, listVersion} from "../storage/version"; -import {genIniConfig, genTomlConfig, stopFrpcProcess} from "./frpc"; -import {clearProxy, insertProxy, listProxy} from "../storage/proxy"; +import { app, dialog, ipcMain, shell } from "electron"; +import { clearConfig, getConfig, saveConfig } from "../storage/config"; +import { clearVersion, listVersion } from "../storage/version"; +import { genIniConfig, genTomlConfig, stopFrpcProcess } from "./frpc"; +import { clearProxy, insertProxy, listProxy } from "../storage/proxy"; import path from "path"; import fs from "fs"; const log = require("electron-log"); const toml = require("@iarna/toml"); -const {v4: uuidv4} = require("uuid"); +const { v4: uuidv4 } = require("uuid"); export const initConfigApi = win => { - ipcMain.on("config.saveConfig", async (event, args) => { - saveConfig(args, (err, numberOfUpdated, upsert) => { - if (!err) { - const start = args.systemSelfStart || false; - log.info("开启自启状态", start); - app.setLoginItemSettings({ - openAtLogin: start, //win - openAsHidden: start //macOs - }); + ipcMain.on("config.saveConfig", async (event, args) => { + saveConfig(args, (err, numberOfUpdated, upsert) => { + if (!err) { + const start = args.systemSelfStart || false; + log.info("开启自启状态", start); + app.setLoginItemSettings({ + openAtLogin: start, //win + openAsHidden: start //macOs + }); + } + event.reply("Config.saveConfig.hook", { + err: err, + numberOfUpdated: numberOfUpdated, + upsert: upsert + }); + }); + }); + + ipcMain.on("config.getConfig", async (event, args) => { + getConfig((err, doc) => { + event.reply("Config.getConfig.hook", { + err: err, + data: doc + }); + }); + }); + + ipcMain.on("config.versions", event => { + listVersion((err, doc) => { + event.reply("Config.versions.hook", { + err: err, + data: doc + }); + }); + }); + + ipcMain.on("config.hasConfig", event => { + getConfig((err, doc) => { + event.reply("Config.getConfig.hook", { + err: err, + data: doc + }); + }); + }); + + ipcMain.on("config.exportConfig", async (event, args) => { + const result = await dialog.showOpenDialog({ + properties: ["openDirectory"] + }); + const outputDirectory = result.filePaths[0]; + if (!outputDirectory) { + // 取消了 + return; + } + log.info(`导出目录 ${outputDirectory} 类型:${args}`); + getConfig((err1, config) => { + if (!err1 && config) { + listProxy((err2, proxys) => { + if (!err2) { + let configContent = ""; + if (args === "ini") { + configContent = genIniConfig(config, proxys); + } else if (args === "toml") { + configContent = genTomlConfig(config, proxys); } - event.reply("Config.saveConfig.hook", { - err: err, - numberOfUpdated: numberOfUpdated, - upsert: upsert + const configPath = path.join( + outputDirectory, + `frpc-desktop.${args}` + ); + fs.writeFile( + configPath, // 配置文件目录 + configContent, // 配置文件内容 + { flag: "w" }, + err => { + if (!err) { + // callback(filename); + event.reply("config.exportConfig.hook", { + data: "导出错误", + err: err + }); + } + } + ); + event.reply("Config.exportConfig.hook", { + data: { + configPath: configPath + } }); + } }); + } }); + }); - ipcMain.on("config.getConfig", async (event, args) => { - getConfig((err, doc) => { - event.reply("Config.getConfig.hook", { - err: err, - data: doc - }); - }); - }); - - ipcMain.on("config.versions", event => { - listVersion((err, doc) => { - event.reply("Config.versions.hook", { - err: err, - data: doc - }); - }); - }); - - ipcMain.on("config.hasConfig", event => { - getConfig((err, doc) => { - event.reply("Config.getConfig.hook", { - err: err, - data: doc - }); - }); - }); - - ipcMain.on("config.exportConfig", async (event, args) => { - const result = await dialog.showOpenDialog({ - properties: ["openDirectory"] - }); - const outputDirectory = result.filePaths[0]; - if (!outputDirectory) { - // 取消了 - return; - } - log.info(`导出目录 ${outputDirectory} 类型:${args}`); - getConfig((err1, config) => { - if (!err1 && config) { - listProxy((err2, proxys) => { - if (!err2) { - let configContent = ""; - if (args === "ini") { - configContent = genIniConfig(config, proxys); - } else if (args === "toml") { - configContent = genTomlConfig(config, proxys); - } - const configPath = path.join( - outputDirectory, - `frpc-desktop.${args}` - ); - fs.writeFile( - configPath, // 配置文件目录 - configContent, // 配置文件内容 - {flag: "w"}, - err => { - if (!err) { - // callback(filename); - event.reply("config.exportConfig.hook", { - data: "导出错误", - err: err - }); - } - } - ); - event.reply("Config.exportConfig.hook", { - data: { - configPath: configPath - } - }); - } - }); - } - }); - }); - - const parseTomlConfig = (tomlPath: string) => { - const importConfigPath = tomlPath; - const tomlData = fs.readFileSync(importConfigPath, "utf-8"); - log.info(`读取到配置内容 ${tomlData}`); - const sourceConfig = toml.parse(tomlData); - // log.info(`解析结果 ${sourceConfig}`); - // console.log(sourceConfig, "frpcConfig"); - // 解析config - const targetConfig: FrpConfig = { - currentVersion: null, - serverAddr: sourceConfig.serverAddr || "", - serverPort: sourceConfig.serverPort || "", - authMethod: sourceConfig?.user - ? "multiuser" - : sourceConfig?.auth?.method || "", - authToken: sourceConfig?.auth?.token || "", - transportHeartbeatInterval: - sourceConfig?.transport?.heartbeatInterval || 30, - transportHeartbeatTimeout: - sourceConfig?.transport?.heartbeatTimeout || 90, - tlsConfigEnable: sourceConfig?.transport?.tls?.enable || false, - tlsConfigCertFile: sourceConfig?.transport?.tls?.certFile || "", - tlsConfigKeyFile: sourceConfig?.transport?.tls?.keyFile || "", - tlsConfigServerName: sourceConfig?.transport?.tls?.serverName || "", - tlsConfigTrustedCaFile: sourceConfig?.transport?.tls?.trustedCaFile || "", - logLevel: sourceConfig?.log?.level || "info", - logMaxDays: sourceConfig?.log?.maxDays || 3, - proxyConfigProxyUrl: sourceConfig?.transport?.proxyURL || "", - proxyConfigEnable: Boolean(sourceConfig?.transport?.proxyURL) || false, - user: sourceConfig?.user || "", - metaToken: sourceConfig?.metadatas?.token || "", - systemSelfStart: false, - systemStartupConnect: false, - systemSilentStartup: false, - webEnable: true, - webPort: sourceConfig?.webServer?.port || 57400 - }; - let frpcProxys = []; - // 解析proxy - if (sourceConfig?.proxies && sourceConfig.proxies.length > 0) { - const frpcProxys1 = sourceConfig.proxies.map(m => { - const rm: Proxy = { - _id: uuidv4(), - name: m?.name, - type: m?.type, - localIp: m?.localIP || "", - localPort: m?.localPort || null, - remotePort: m?.remotePort || null, - customDomains: m?.customDomains || [], - subdomain: m.subdomain || "", - basicAuth: m.basicAuth || false, - httpUser: m.httpUser || "", - httpPassword: m.httpPassword || "", - // 以下为stcp参数 - stcpModel: "visited", - serverName: "", - secretKey: m?.secretKey || "", - bindAddr: "", - bindPort: null, - status: m?.status || true, - fallbackTo: m?.fallbackTo, - fallbackTimeoutMs: m?.fallbackTimeoutMs || 500 - }; - return rm; - }); - frpcProxys = [...frpcProxys, ...frpcProxys1]; - } - // 解析stcp的访问者 - if (sourceConfig?.visitors && sourceConfig.visitors.length > 0) { - const frpcProxys2 = sourceConfig.visitors.map(m => { - const rm: Proxy = { - _id: uuidv4(), - name: m?.name, - type: m?.type, - localIp: "", - localPort: null, - remotePort: null, - customDomains: [], - subdomain: m.subdomain || "", - basicAuth: m.basicAuth || false, - httpUser: m.httpUser || "", - httpPassword: m.httpPassword || "", - // 以下为stcp参数 - stcpModel: "visitors", - serverName: m?.serverName, - secretKey: m?.secretKey || "", - bindAddr: m?.bindAddr, - bindPort: m?.bindPort, - status: m?.status || true, - fallbackTo: m?.fallbackTo, - fallbackTimeoutMs: m?.fallbackTimeoutMs || 500 - }; - return rm; - }); - frpcProxys = [...frpcProxys, ...frpcProxys2]; - } - if (targetConfig) { - clearConfig(() => { - saveConfig(targetConfig); - }); - } - if (frpcProxys && frpcProxys.length > 0) { - clearProxy(() => { - frpcProxys.forEach(f => { - insertProxy(f, err => { - console.log("插入", f, err); - }); - }); - }); - } + const parseTomlConfig = (tomlPath: string) => { + const importConfigPath = tomlPath; + const tomlData = fs.readFileSync(importConfigPath, "utf-8"); + log.info(`读取到配置内容 ${tomlData}`); + const sourceConfig = toml.parse(tomlData); + // log.info(`解析结果 ${sourceConfig}`); + // console.log(sourceConfig, "frpcConfig"); + // 解析config + const targetConfig: FrpConfig = { + currentVersion: null, + serverAddr: sourceConfig.serverAddr || "", + serverPort: sourceConfig.serverPort || "", + authMethod: sourceConfig?.user + ? "multiuser" + : sourceConfig?.auth?.method || "", + authToken: sourceConfig?.auth?.token || "", + transportHeartbeatInterval: + sourceConfig?.transport?.heartbeatInterval || 30, + transportHeartbeatTimeout: + sourceConfig?.transport?.heartbeatTimeout || 90, + tlsConfigEnable: sourceConfig?.transport?.tls?.enable || false, + tlsConfigCertFile: sourceConfig?.transport?.tls?.certFile || "", + tlsConfigKeyFile: sourceConfig?.transport?.tls?.keyFile || "", + tlsConfigServerName: sourceConfig?.transport?.tls?.serverName || "", + tlsConfigTrustedCaFile: sourceConfig?.transport?.tls?.trustedCaFile || "", + logLevel: sourceConfig?.log?.level || "info", + logMaxDays: sourceConfig?.log?.maxDays || 3, + proxyConfigProxyUrl: sourceConfig?.transport?.proxyURL || "", + proxyConfigEnable: Boolean(sourceConfig?.transport?.proxyURL) || false, + user: sourceConfig?.user || "", + metaToken: sourceConfig?.metadatas?.token || "", + systemSelfStart: false, + systemStartupConnect: false, + systemSilentStartup: false, + webEnable: true, + webPort: sourceConfig?.webServer?.port || 57400, + transportProtocol: sourceConfig?.transport?.protocol || "tcp", + transportDialServerTimeout: + sourceConfig?.transport?.dialServerTimeout || 10, + transportDialServerKeepalive: + sourceConfig?.transport?.dialServerKeepalive || 70, + transportPoolCount: sourceConfig?.transport?.poolCount || 0, + transportTcpMux: sourceConfig?.transport?.tcpMux || true, + transportTcpMuxKeepaliveInterval: + sourceConfig?.transport?.tcpMuxKeepaliveInterval || 7200 }; - - ipcMain.on("config.importConfig", async (event, args) => { - const result = await dialog.showOpenDialog(win, { - properties: ["openFile"], - filters: [ - {name: "FrpcConfig Files", extensions: ["toml", "ini"]} // 允许选择的文件类型 - ] + let frpcProxys = []; + // 解析proxy + if (sourceConfig?.proxies && sourceConfig.proxies.length > 0) { + const frpcProxys1 = sourceConfig.proxies.map(m => { + const rm: Proxy = { + _id: uuidv4(), + name: m?.name, + type: m?.type, + localIp: m?.localIP || "", + localPort: m?.localPort || null, + remotePort: m?.remotePort || null, + customDomains: m?.customDomains || [], + subdomain: m.subdomain || "", + basicAuth: m.basicAuth || false, + httpUser: m.httpUser || "", + httpPassword: m.httpPassword || "", + // 以下为stcp参数 + stcpModel: "visited", + serverName: "", + secretKey: m?.secretKey || "", + bindAddr: "", + bindPort: null, + status: m?.status || true, + fallbackTo: m?.fallbackTo, + fallbackTimeoutMs: m?.fallbackTimeoutMs || 500 + }; + return rm; + }); + frpcProxys = [...frpcProxys, ...frpcProxys1]; + } + // 解析stcp的访问者 + if (sourceConfig?.visitors && sourceConfig.visitors.length > 0) { + const frpcProxys2 = sourceConfig.visitors.map(m => { + const rm: Proxy = { + _id: uuidv4(), + name: m?.name, + type: m?.type, + localIp: "", + localPort: null, + remotePort: null, + customDomains: [], + subdomain: m.subdomain || "", + basicAuth: m.basicAuth || false, + httpUser: m.httpUser || "", + httpPassword: m.httpPassword || "", + // 以下为stcp参数 + stcpModel: "visitors", + serverName: m?.serverName, + secretKey: m?.secretKey || "", + bindAddr: m?.bindAddr, + bindPort: m?.bindPort, + status: m?.status || true, + fallbackTo: m?.fallbackTo, + fallbackTimeoutMs: m?.fallbackTimeoutMs || 500 + }; + return rm; + }); + frpcProxys = [...frpcProxys, ...frpcProxys2]; + } + if (targetConfig) { + clearConfig(() => { + saveConfig(targetConfig); + }); + } + if (frpcProxys && frpcProxys.length > 0) { + clearProxy(() => { + frpcProxys.forEach(f => { + insertProxy(f, err => { + console.log("插入", f, err); + }); }); - if (result.canceled) { - return; - } else { - const filePath = result.filePaths[0]; - const fileExtension = path.extname(filePath); // 获取文件后缀名 - log.info(`导入文件 ${filePath} ${fileExtension}`); - if (fileExtension === ".toml") { - parseTomlConfig(filePath); - event.reply("Config.importConfig.hook", { - success: true - }); - } else { - event.reply("Config.importConfig.hook", { - success: false, - data: `导入失败,暂不支持 ${fileExtension} 格式文件` - }); - } - } - }); + }); + } + }; - ipcMain.on("config.clearAll", async (event, args) => { - stopFrpcProcess(() => { - clearConfig(); - clearProxy(); - clearVersion(); - event.reply("Config.clearAll.hook", {}); - }); + ipcMain.on("config.importConfig", async (event, args) => { + const result = await dialog.showOpenDialog(win, { + properties: ["openFile"], + filters: [ + { name: "FrpcConfig Files", extensions: ["toml", "ini"] } // 允许选择的文件类型 + ] }); + if (result.canceled) { + return; + } else { + const filePath = result.filePaths[0]; + const fileExtension = path.extname(filePath); // 获取文件后缀名 + log.info(`导入文件 ${filePath} ${fileExtension}`); + if (fileExtension === ".toml") { + parseTomlConfig(filePath); + event.reply("Config.importConfig.hook", { + success: true + }); + } else { + event.reply("Config.importConfig.hook", { + success: false, + data: `导入失败,暂不支持 ${fileExtension} 格式文件` + }); + } + } + }); - ipcMain.on("config.openDataFolder", async (event, args) => { - const userDataPath = app.getPath("userData"); - shell.openPath(userDataPath).then((errorMessage) => { - if (errorMessage) { - console.error('Failed to open Logger:', errorMessage); - event.reply("Config.openDataFolder.hook", false); - } else { - console.log('Logger opened successfully'); - event.reply("Config.openDataFolder.hook", true); - } - }); + ipcMain.on("config.clearAll", async (event, args) => { + stopFrpcProcess(() => { + clearConfig(); + clearProxy(); + clearVersion(); + event.reply("Config.clearAll.hook", {}); }); + }); + + ipcMain.on("config.openDataFolder", async (event, args) => { + const userDataPath = app.getPath("userData"); + shell.openPath(userDataPath).then(errorMessage => { + if (errorMessage) { + console.error("Failed to open Logger:", errorMessage); + event.reply("Config.openDataFolder.hook", false); + } else { + console.log("Logger opened successfully"); + event.reply("Config.openDataFolder.hook", true); + } + }); + }); }; diff --git a/electron/api/frpc.ts b/electron/api/frpc.ts index 5e46a3f..bf635d1 100644 --- a/electron/api/frpc.ts +++ b/electron/api/frpc.ts @@ -55,8 +55,7 @@ export const genTomlConfig = (config: FrpConfig, proxys: Proxy[]) => { /\\/g, "\\\\" ); - let toml = ` -${ + let toml = `${ rangePort ? `{{- range $_, $v := parseNumberRangePair "${m.localPort}" "${m.remotePort}" }}` : "" @@ -67,7 +66,7 @@ ${ ? "visitors" : "proxies" }]] -${rangePort ? "" : `name = "${m.name}"\n`} +${rangePort ? "" : `name = "${m.name}"`} type = "${m.type}" `; @@ -75,52 +74,38 @@ type = "${m.type}" case "tcp": case "udp": if (rangePort) { - toml += ` -name = "${m.name}-{{ $v.First }}" + toml += `name = "${m.name}-{{ $v.First }}" localPort = {{ $v.First }} -remotePort = {{ $v.Second }} - `; +remotePort = {{ $v.Second }}`; } else { - toml += ` -localIP = "${m.localIp}" + toml += `localIP = "${m.localIp}" localPort = ${m.localPort} -remotePort = ${m.remotePort} -`; +remotePort = ${m.remotePort}`; } break; case "http": case "https": const customDomains = m.customDomains.filter(f1 => f1 !== ""); if (customDomains && customDomains.length > 0) { - toml += ` -customDomains=[${m.customDomains.map(m => `"${m}"`)}] - `; + toml += `customDomains=[${m.customDomains.map(m => `"${m}"`)}]`; } if (m.subdomain) { - toml += ` -subdomain="${m.subdomain}" -`; + toml += `subdomain="${m.subdomain}"`; } if (m.basicAuth) { - toml += ` -httpUser = "${m.httpUser}" -httpPassword = "${m.httpPassword}" -`; + toml += `httpUser = "${m.httpUser}" +httpPassword = "${m.httpPassword}"`; } if (m.https2http) { - toml += ` -[proxies.plugin] + toml += `[proxies.plugin] type = "https2http" localAddr = "${m.localIp}:${m.localPort}" crtPath = "${m.https2httpCaFile}" -keyPath = "${m.https2httpKeyFile}" -`; +keyPath = "${m.https2httpKeyFile}"`; } else { - toml += ` -localIP = "${m.localIp}" -localPort = ${m.localPort} - `; + toml += `localIP = "${m.localIp}" +localPort = ${m.localPort}`; } break; @@ -129,25 +114,19 @@ localPort = ${m.localPort} case "sudp": if (m.stcpModel === "visitors") { // 访问者 - toml += ` -serverName = "${m.serverName}" + toml += `serverName = "${m.serverName}" bindAddr = "${m.bindAddr}" -bindPort = ${m.bindPort} -`; +bindPort = ${m.bindPort}`; if (m.fallbackTo) { - toml += ` -fallbackTo = "${m.fallbackTo}" -fallbackTimeoutMs = ${m.fallbackTimeoutMs || 500} - `; + toml += `fallbackTo = "${m.fallbackTo}" +fallbackTimeoutMs = ${m.fallbackTimeoutMs || 500}`; } } else if (m.stcpModel === "visited") { // 被访问者 - toml += ` -localIP = "${m.localIp}" + toml += `localIP = "${m.localIp}" localPort = ${m.localPort}`; } - toml += ` -secretKey="${m.secretKey}" + toml += `secretKey="${m.secretKey}" `; break; default: @@ -159,87 +138,88 @@ secretKey="${m.secretKey}" } return toml; }); - const toml = ` -serverAddr = "${config.serverAddr}" + const toml = `serverAddr = "${config.serverAddr}" serverPort = ${config.serverPort} ${ config.authMethod === "token" - ? ` -auth.method = "token" -auth.token = "${config.authToken}" -` + ? `auth.method = "token" +auth.token = "${config.authToken}"` : "" } ${ config.authMethod === "multiuser" - ? ` -user = "${config.user}" -metadatas.token = "${config.metaToken}" -` + ? `user = "${config.user}" +metadatas.token = "${config.metaToken}"` : "" } -${ - config.transportHeartbeatInterval - ? ` -transport.heartbeatInterval = ${config.transportHeartbeatInterval} -` - : "" -} -${ - config.transportHeartbeatTimeout - ? ` -transport.heartbeatTimeout = ${config.transportHeartbeatTimeout} -` - : "" -} - - log.to = "frpc.log" log.level = "${config.logLevel}" log.maxDays = ${config.logMaxDays} webServer.addr = "127.0.0.1" webServer.port = ${config.webPort} +${ + config.transportProtocol + ? `transport.protocol = "${config.transportProtocol}"` + : "" +} +${ + config.transportPoolCount + ? `transport.poolCount = ${config.transportPoolCount}` + : "" +} +${ + config.transportDialServerTimeout + ? `transport.dialServerTimeout = ${config.transportDialServerTimeout}` + : "" +} +${ + config.transportDialServerKeepalive + ? `transport.dialServerKeepalive = ${config.transportDialServerKeepalive}` + : "" +} +${ + config.transportHeartbeatInterval + ? `transport.heartbeatInterval = ${config.transportHeartbeatInterval}` + : "" +} +${ + config.transportHeartbeatTimeout + ? `transport.heartbeatTimeout = ${config.transportHeartbeatTimeout}` + : "" +} +${config.transportTcpMux ? `transport.tcpMux = ${config.transportTcpMux}` : ""} +${ + config.transportTcpMux && config.transportTcpMuxKeepaliveInterval + ? `transport.tcpMuxKeepaliveInterval = ${config.transportTcpMuxKeepaliveInterval}` + : "" +} transport.tls.enable = ${config.tlsConfigEnable} ${ config.tlsConfigEnable && config.tlsConfigCertFile - ? ` -transport.tls.certFile = "${config.tlsConfigCertFile}" -` + ? `transport.tls.certFile = "${config.tlsConfigCertFile}"` : "" } - ${ +${ config.tlsConfigEnable && config.tlsConfigKeyFile - ? ` -transport.tls.keyFile = "${config.tlsConfigKeyFile}" -` + ? `transport.tls.keyFile = "${config.tlsConfigKeyFile}"` : "" - } +} ${ config.tlsConfigEnable && config.tlsConfigTrustedCaFile - ? ` -transport.tls.trustedCaFile = "${config.tlsConfigTrustedCaFile}" -` + ? `transport.tls.trustedCaFile = "${config.tlsConfigTrustedCaFile}"` : "" } ${ config.tlsConfigEnable && config.tlsConfigServerName - ? ` -transport.tls.serverName = "${config.tlsConfigServerName}" -` + ? `transport.tls.serverName = "${config.tlsConfigServerName}"` : "" } - - ${ config.proxyConfigEnable - ? ` -transport.proxyURL = "${config.proxyConfigProxyUrl}" -` + ? `transport.proxyURL = "${config.proxyConfigProxyUrl}"` : "" } - -${proxyToml.join("")} - `; +${proxyToml.join("")}`; return toml; }; @@ -251,8 +231,7 @@ ${proxyToml.join("")} export const genIniConfig = (config: FrpConfig, proxys: Proxy[]) => { const proxyIni = proxys.map(m => { const rangePort = isRangePort(m); - let ini = ` -[${rangePort ? "range:" : ""}${m.name}] + let ini = `[${rangePort ? "range:" : ""}${m.name}] type = "${m.type}" `; switch (m.type) { diff --git a/src/views/config/index.vue b/src/views/config/index.vue index a80836d..866f7a8 100644 --- a/src/views/config/index.vue +++ b/src/views/config/index.vue @@ -47,7 +47,13 @@ const defaultFormData = ref({ transportHeartbeatInterval: 30, transportHeartbeatTimeout: 90, webEnable: true, - webPort: 57400 + webPort: 57400, + transportProtocol: "tcp", + transportDialServerTimeout: 10, + transportDialServerKeepalive: 7200, + transportPoolCount: 0, + transportTcpMux: true, + transportTcpMuxKeepaliveInterval: 30 }); const formData = ref(defaultFormData.value); @@ -121,6 +127,24 @@ const rules = reactive({ ], webPort: [ { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportProtocol: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportDialServerTimeout: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportDialServerKeepalive: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportPoolCount: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportTcpMux: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } + ], + transportTcpMuxKeepaliveInterval: [ + { required: true, message: "web界面端口不能为空", trigger: "change" } ] }); @@ -196,9 +220,49 @@ onMounted(() => { defaultFormData.value.transportHeartbeatTimeout; } if (data.webEnable == null || data.webEnable == undefined) { - data.webEnable = true; - data.webPort = 57400; + data.webEnable = defaultFormData.value.webEnable; + data.webPort = defaultFormData.value.webPort; } + if ( + data.transportProtocol === undefined || + data.transportProtocol == null + ) { + data.transportProtocol = defaultFormData.value.transportProtocol; + } + if ( + data.transportDialServerTimeout === undefined || + data.transportDialServerTimeout == null + ) { + data.transportDialServerTimeout = + defaultFormData.value.transportDialServerTimeout; + } + if ( + data.transportDialServerKeepalive === undefined || + data.transportDialServerKeepalive == null + ) { + data.transportDialServerKeepalive = + defaultFormData.value.transportDialServerKeepalive; + } + if ( + data.transportPoolCount === undefined || + data.transportPoolCount == null + ) { + data.transportPoolCount = defaultFormData.value.transportPoolCount; + } + if ( + data.transportTcpMux === undefined || + data.transportTcpMux == null + ) { + data.transportTcpMux = defaultFormData.value.transportTcpMux; + } + if ( + data.transportTcpMuxKeepaliveInterval === undefined || + data.transportTcpMuxKeepaliveInterval == null + ) { + data.transportTcpMuxKeepaliveInterval = + defaultFormData.value.transportTcpMuxKeepaliveInterval; + } + formData.value = data; } } @@ -422,7 +486,7 @@ onUnmounted(() => { :rules="rules" label-position="right" ref="formRef" - label-width="130" + label-width="150" > @@ -632,6 +696,72 @@ onUnmounted(() => { /> + + + +
传输配置
+
+ + + + + + + + + + + + + + + + + + { - -
TLS Config
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { - -
代理
-
- - - - - -
Web 界面
@@ -963,9 +1218,10 @@ onUnmounted(() => { icon="info" /> - 热更新等功能依赖于web界面,不可停用Web + 热更新等功能依赖于web界面,不可停用Web 启用Web: @@ -989,7 +1245,7 @@ onUnmounted(() => {