diff --git a/electron/api/config.ts b/electron/api/config.ts index b99a1ba..4bd9776 100644 --- a/electron/api/config.ts +++ b/electron/api/config.ts @@ -1,52 +1,102 @@ -import {app, ipcMain} from "electron"; -import {getConfig, saveConfig} from "../storage/config"; -import {listVersion} from "../storage/version"; +import { app, dialog, ipcMain } from "electron"; +import { getConfig, saveConfig } from "../storage/config"; +import { listVersion } from "../storage/version"; +import { generateConfig, genIniConfig, genTomlConfig } from "./frpc"; +import { exec } from "child_process"; +import { listProxy } from "../storage/proxy"; +import path from "path"; +import fs from "fs"; -const log = require('electron-log'); +const log = require("electron-log"); export const initConfigApi = () => { - 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]; + 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 - }); - }); - }); - - 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 + 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 + } }); + } }); + } }); + }); }; diff --git a/electron/api/frpc.ts b/electron/api/frpc.ts index f26a0b0..41799ef 100644 --- a/electron/api/frpc.ts +++ b/electron/api/frpc.ts @@ -38,7 +38,7 @@ const getFrpcVersionWorkerPath = ( * @param config * @param proxys */ -const genTomlConfig = (config: FrpConfig, proxys: Proxy[]) => { +export const genTomlConfig = (config: FrpConfig, proxys: Proxy[]) => { const proxyToml = proxys.map(m => { let toml = ` [[${m.type === "stcp" && m.stcpModel === "visitors" ? "visitors" : "proxies"}]] @@ -155,7 +155,7 @@ ${proxyToml.join("")} * @param config * @param proxys */ -const genIniConfig = (config: FrpConfig, proxys: Proxy[]) => { +export const genIniConfig = (config: FrpConfig, proxys: Proxy[]) => { const proxyIni = proxys.map(m => { let ini = ` [${m.name}] diff --git a/src/components/IconifyIcon/src/offlineIcon.ts b/src/components/IconifyIcon/src/offlineIcon.ts index 1dee587..531f98a 100644 --- a/src/components/IconifyIcon/src/offlineIcon.ts +++ b/src/components/IconifyIcon/src/offlineIcon.ts @@ -29,6 +29,9 @@ import ContentCopy from "@iconify-icons/material-symbols/content-copy"; import ContentPasteGo from "@iconify-icons/material-symbols/content-paste-go"; import Edit from "@iconify-icons/material-symbols/edit"; import CheckBox from "@iconify-icons/material-symbols/check-box"; +import ExportNotesOutline from "@iconify-icons/material-symbols/export-notes-outline"; +import uploadRounded from "@iconify-icons/material-symbols/upload-rounded"; +import downloadRounded from "@iconify-icons/material-symbols/download-rounded"; addIcon("cloud", Cloud); addIcon("rocket-launch-rounded", RocketLaunchRounded); @@ -53,4 +56,8 @@ addIcon("content-copy", ContentCopy); addIcon("content-paste-go", ContentPasteGo); addIcon("edit", Edit); addIcon("check-box", CheckBox); +addIcon("export", ExportNotesOutline); +addIcon("uploadRounded", uploadRounded); +addIcon("downloadRounded", downloadRounded); + diff --git a/src/layout/compoenets/Breadcrumb.vue b/src/layout/compoenets/Breadcrumb.vue index b4d8e89..c82b54c 100644 --- a/src/layout/compoenets/Breadcrumb.vue +++ b/src/layout/compoenets/Breadcrumb.vue @@ -1,9 +1,7 @@ diff --git a/src/views/download/index.vue b/src/views/download/index.vue index 7d9af59..a655f3b 100644 --- a/src/views/download/index.vue +++ b/src/views/download/index.vue @@ -117,7 +117,7 @@ onUnmounted(() => {
下载源: - + {
-
+ -
+