From 0433b60dfcfff888ec2ae6977dbe4aa8c12fc66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E4=BA=9A=E6=98=95?= <1549469775@qq.com> Date: Thu, 12 Jun 2025 17:45:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=8A=9F=E8=83=BD=E5=B9=B6=E9=87=8D=E6=9E=84=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 `electron.vite.config.1749712333417.mjs` 配置文件,配置Vite构建相关插件和参数 - 创建 `packages/utils/index.ts` 工具类文件,添加通用工具函数 `isPromise` 和 `slash` - 扩展 `packages/utils/main/index.ts` 工具类,新增 `getFileUrl` 和 `getPreloadUrl` 方法 - 新增 `packages/utils/main/session/cookies.ts` 实现Electron会话cookie管理功能 - 新增 `packages/utils/main/session/index.ts` 实现Electron多会话隔离功能 - 重构多处代码引用路径,将原 `main/utils` 迁移至 `packages/utils` 统一管理 - 新增设置模块相关代码:`src/common/event/Setting/*` 实现配置同步保存功能 - 新增设置页面 `src/renderer/src/pages/setting/index.vue` 提供UI交互 - 优化导航栏菜单逻辑,移除模块切换功能,整合为统一菜单 --- electron.vite.config.1749712333417.mjs | 133 ++++++++++++++++++++++++++ packages/utils/index.ts | 11 +++ packages/utils/main/index.ts | 17 ++++ packages/utils/main/session/cookies.ts | 47 +++++++++ packages/utils/main/session/index.ts | 82 ++++++++++++++++ src/common/event/PlatForm/main/command.ts | 2 +- src/common/event/Setting/hook.ts | 63 ++++++++++++ src/common/event/Setting/index.ts | 23 +++++ src/common/event/Setting/main/command.ts | 13 +++ src/common/event/Updater/hook.ts | 16 ++++ src/common/event/Updater/index.ts | 18 ++-- src/common/lib/abstract.ts | 17 ++++ src/common/lib/browser.ts | 5 + src/common/lib/electron.ts | 5 + src/main/modules/commands/index.ts | 2 +- src/main/modules/window-manager/windowsMap.ts | 2 +- src/main/utils/index.ts | 28 ------ src/main/utils/session/cookies.ts | 47 --------- src/main/utils/session/index.ts | 82 ---------------- src/renderer/src/pages/index/index.vue | 4 +- src/renderer/src/pages/setting/index.vue | 18 ++++ src/renderer/src/store/index.ts | 9 +- src/renderer/src/store/module.store.ts | 30 ------ src/renderer/src/ui/NavBar.vue | 126 ++++++++++++------------ src/renderer/typed-router.d.ts | 1 + tsconfig.node.json | 4 + 26 files changed, 532 insertions(+), 273 deletions(-) create mode 100644 electron.vite.config.1749712333417.mjs create mode 100644 packages/utils/main/session/cookies.ts create mode 100644 packages/utils/main/session/index.ts create mode 100644 src/common/event/Setting/hook.ts create mode 100644 src/common/event/Setting/index.ts create mode 100644 src/common/event/Setting/main/command.ts create mode 100644 src/common/event/Updater/hook.ts delete mode 100644 src/main/utils/index.ts delete mode 100644 src/main/utils/session/cookies.ts delete mode 100644 src/main/utils/session/index.ts create mode 100644 src/renderer/src/pages/setting/index.vue delete mode 100644 src/renderer/src/store/module.store.ts diff --git a/electron.vite.config.1749712333417.mjs b/electron.vite.config.1749712333417.mjs new file mode 100644 index 0000000..dd4359d --- /dev/null +++ b/electron.vite.config.1749712333417.mjs @@ -0,0 +1,133 @@ +// electron.vite.config.ts +import { resolve } from "path"; +import { defineConfig, externalizeDepsPlugin } from "electron-vite"; +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import UnoCSS from "unocss/vite"; +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import VueMacros from "unplugin-vue-macros/vite"; +import { VueRouterAutoImports } from "unplugin-vue-router"; +import VueRouter from "unplugin-vue-router/vite"; +import Layouts from "vite-plugin-vue-layouts"; +import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite"; +import monacoEditorPlugin from "vite-plugin-monaco-editor"; +import IconsResolver from "unplugin-icons/resolver"; +import Icons from "unplugin-icons/vite"; +var __electron_vite_injected_dirname = "D:\\@code\\xyx\\electron-app"; +var electron_vite_config_default = defineConfig({ + main: { + resolve: { + alias: { + config: resolve("config"), + main: resolve("src/main"), + common: resolve("src/common"), + "@res": resolve("resources") + } + }, + plugins: [externalizeDepsPlugin()] + }, + preload: { + build: { + lib: { + entry: { + index: resolve(__electron_vite_injected_dirname, "./src/preload/index.ts"), + plugin: resolve(__electron_vite_injected_dirname, "./src/preload/plugin.ts") + } + } + }, + plugins: [externalizeDepsPlugin()] + }, + renderer: { + root: resolve(__electron_vite_injected_dirname, "./src/renderer"), + resolve: { + alias: { + config: resolve("config"), + common: resolve("src/common"), + "@": resolve("src/renderer/src"), + "@res": resolve("resources") + } + }, + css: { + preprocessorOptions: { + scss: { + additionalData: `@use "@/assets/style/global" as *; +`, + api: "modern-compiler" + } + } + }, + build: { + rollupOptions: { + input: { + main: resolve(__electron_vite_injected_dirname, "./src/renderer/index.html"), + about: resolve(__electron_vite_injected_dirname, "./src/renderer/about.html") + } + } + }, + plugins: [ + UnoCSS(), + VueMacros({ + plugins: { + vue: vue(), + vueJsx: vueJsx(), + vueRouter: VueRouter({ + root: resolve(__electron_vite_injected_dirname, "src/renderer"), + // https://github.com/posva/unplugin-vue-router + extensions: [".vue", ".setup.tsx"], + exclude: ["**/_ui"] + }) + } + }), + VueI18nPlugin({ + compositionOnly: false, + include: resolve(__electron_vite_injected_dirname, "packages/locales/languages/**") + }), + Layouts({ + layoutsDirs: "src/layouts", + pagesDirs: "src/pages", + defaultLayout: "default", + extensions: ["vue", "setup.tsx"], + exclude: ["**/_ui"] + }), + // https://github.com/antfu/unplugin-auto-import + AutoImport({ + imports: [ + "vue", + "@vueuse/core", + VueRouterAutoImports, + { + // add any other imports you were relying on + "vue-router/auto": ["useLink"] + }, + "vue-i18n" + ], + dts: true, + dirs: ["src/composables"], + vueTemplate: true + }), + // https://github.com/antfu/vite-plugin-components + Components({ + dts: true, + dirs: ["src/components", "src/ui"], + resolvers: [ + IconsResolver({ + prefix: "icon" + }) + ] + }), + Icons(), + // https://wf0.github.io/example/plugins/Formatter.html + // @ts-ignore ... + monacoEditorPlugin.default({ + publicPath: "monacoeditorwork", + customDistPath() { + return resolve(__electron_vite_injected_dirname, "out/renderer/monacoeditorwork"); + } + }) + ] + } +}); +export { + electron_vite_config_default as default +}; diff --git a/packages/utils/index.ts b/packages/utils/index.ts index e69de29..8c5ee26 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -0,0 +1,11 @@ +export function isPromise(value: () => any) { + return value && Object.prototype.toString.call(value) === "[object Promise]" +} + +export function slash(path: string) { + const isExtendedLengthPath = path.startsWith("\\\\?\\") + if (isExtendedLengthPath) { + return path + } + return path.replace(/\\/g, "/") +} diff --git a/packages/utils/main/index.ts b/packages/utils/main/index.ts index d78e8cd..4da7a0c 100644 --- a/packages/utils/main/index.ts +++ b/packages/utils/main/index.ts @@ -1,5 +1,22 @@ +import { is } from "@electron-toolkit/utils" import { webContents } from "electron" +import { join } from "node:path" +import { slash } from "utils" export const broadcast = void>>(event: keyof T, ...args: Parameters) => { webContents.getAllWebContents().forEach(browser => browser.send(event as any, ...args)) } + +export function getFileUrl(app: string) { + let winURL = "" + if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { + winURL = process.env["ELECTRON_RENDERER_URL"] + `/${app}#/` + } else { + winURL = join(__dirname, `../renderer/${app}#/`) + } + return slash(winURL) +} + +export function getPreloadUrl(file) { + return join(__dirname, `../preload/${file}.mjs`) +} diff --git a/packages/utils/main/session/cookies.ts b/packages/utils/main/session/cookies.ts new file mode 100644 index 0000000..3088021 --- /dev/null +++ b/packages/utils/main/session/cookies.ts @@ -0,0 +1,47 @@ +import { BrowserView, BrowserWindow } from "electron" + +const cookies = { + getCurrCookies(params = {}, currWin: BrowserView | BrowserWindow) { + let currSession = currWin.webContents.session + return currSession.cookies.get(Object.assign({}, params)) + }, + removeCurrCookies(cookies = [], currWin: BrowserView | BrowserWindow) { + let currSession = currWin.webContents.session + let err = [] + let apiCount = 0 + return new Promise((resove, reject) => { + cookies.forEach(async (item: any) => { + await currSession.cookies.remove(`http://${item.domain}`, item.name) + apiCount = apiCount + 1 + if (err.length === apiCount) { + resove({ message: "cookie 清除成功" }) + } else { + reject(err) + } + }) + }) + }, + setCurrCookies(cookies = [], currWin: BrowserView | BrowserWindow) { + let currSession = currWin.webContents.session + let err = [] + let apiCount = 0 + return new Promise((resove, reject) => { + cookies.forEach(async (item: any) => { + await currSession.cookies.set( + Object.assign({}, item, { + url: `http://${item.domain}`, + name: item.name, + }), + ) + apiCount = apiCount + 1 + if (err.length === apiCount) { + resove({ message: "cookie 设置成功!" }) + } else { + reject(err) + } + }) + }) + }, +} + +export default cookies \ No newline at end of file diff --git a/packages/utils/main/session/index.ts b/packages/utils/main/session/index.ts new file mode 100644 index 0000000..128df4f --- /dev/null +++ b/packages/utils/main/session/index.ts @@ -0,0 +1,82 @@ +// https://blog.guowenfh.com/2017/10/21/2017/electron-multiple-session/#%E5%9C%A8-webview-%E4%B8%AD + +import { BrowserWindow } from "electron" +/** + * 创建一个 登录 的窗口。 + * 用于 session 隔离 + * Promise 中有 {partition,userinfo,cookies} + * @returns Promise + */ +function createLoginWin(partition) { + partition = partition || `persist:${Math.random()}` + // const charset = require("superagent-charset") + // const request = charset(require("superagent")) // HTTP + let presWindow = new BrowserWindow({ + width: 1280, + height: 768, + title: "用户登陆", + webPreferences: { + webSecurity: false, + allowRunningInsecureContent: true, + partition, + }, + }) + let webContents = presWindow.webContents + return new Promise(function (resove, _) { + // webContents.openDevTools(); + presWindow.loadURL("https://login.taobao.com/member/login.jhtml") + webContents.on("did-navigate-in-page", async function () { + // 这里可以看情况进行参数的传递,获取制定的 cookies + const cookies = await webContents.session.cookies.get({}) + let obj = { partition, cookies } + resove(obj) + // webContents.session.cookies.get({}, function (err, cookies) { + // if (err) { + // presWindow.close() // 关闭登陆窗口 + // return reject(err) + // } + // let obj = { partition, cookies } + // resove(obj) + // fetch("https://login.taobao.com/member/login.jhtml", { + // method: "GET", + // credentials: "include", + // headers: { + // Cookie: cookies.map(item => `${item.name}=${item.value};`).join(" "), + // "Content-Type": "application/json", + // }, + // }) + // .then(response => response.json()) + // .then(data => { + // console.log(data) + // presWindow.close() + // resove(obj) + // }) + // .catch(err => { + // presWindow.close() + // reject(err) + // }) + // }) + // 这一步并不是必需的。 + // request + // .get("http://taobao.com/userinfo") + // .query({ _: Date.now() }) // query string + // .set("Cookie", cookies.map(item => `${item.name}=${item.value};`).join(" ")) + // .end(function (err, res) { + // presWindow.close() + // if (err) { + // return reject(err) + // } + // if (!res || !res.body || !res.body.result !== 1) { + // return reject(res.body) + // } + // let obj = { partition, cookies, userinfo: res.body.data } + // resove(obj) + // }) + }) + // }) + }) +} + +export { + createLoginWin +} diff --git a/src/common/event/PlatForm/main/command.ts b/src/common/event/PlatForm/main/command.ts index 28fcd72..97e09cd 100644 --- a/src/common/event/PlatForm/main/command.ts +++ b/src/common/event/PlatForm/main/command.ts @@ -3,10 +3,10 @@ import { inject } from "inversify" import errorHandler from "logger/main-error" import Tabs from "main/modules/tabs" import WindowManager from "main/modules/window-manager" -import { getFileUrl } from "main/utils" import icon from "@res/icon.png?asset" import setting from "setting/main" import { LogLevel } from "logger/common" +import { getFileUrl } from "utils/main" export default class PlatFormCommand { constructor( diff --git a/src/common/event/Setting/hook.ts b/src/common/event/Setting/hook.ts new file mode 100644 index 0000000..8456d3a --- /dev/null +++ b/src/common/event/Setting/hook.ts @@ -0,0 +1,63 @@ +import { defineStore } from "pinia" +import { Setting } from "." +import type { IConfig } from "config" + +let rawConfig: IConfig = Setting.getInstance().sync() as unknown as IConfig + +export const useSettingStore = defineStore( + "Setting", + () => { + const config = ref(JSON.parse(JSON.stringify(rawConfig))) + const diffKeys = ref<(keyof IConfig)[]>([]) + const isSame = computed(() => { + return diffKeys.value.length === 0 + }) + watch( + () => config.value, + () => { + diffKeys.value = [] + ;(Object.keys(config.value) as (keyof IConfig)[]).forEach((key: keyof IConfig) => { + if (config.value[key] !== rawConfig[key]) { + diffKeys.value.push(key) + } + }) + }, + { + deep: true, + immediate: true, + }, + ) + const reset = () => { + const tempConfig = JSON.parse(JSON.stringify(rawConfig)) + config.value = tempConfig + } + const isSaving = ref(false) + const save = async () => { + if (isSaving.value) { + return + } + isSaving.value = true + try { + const tempConfig = JSON.parse(JSON.stringify(unref(config))) + await Setting.getInstance().save(tempConfig) + isSaving.value = false + rawConfig = JSON.parse(JSON.stringify(tempConfig)) + config.value = tempConfig + } catch (error) { + isSaving.value = false + throw error + } + } + return { + config, + isSame, + isSaving, + diffKeys, + reset, + save, + } + }, + { + persist: false, + }, +) diff --git a/src/common/event/Setting/index.ts b/src/common/event/Setting/index.ts new file mode 100644 index 0000000..7abe0cc --- /dev/null +++ b/src/common/event/Setting/index.ts @@ -0,0 +1,23 @@ +import { ApiFactory } from "common/lib/abstract" +import { BaseSingleton } from "base" +import { IConfig } from "config" + +class Setting extends BaseSingleton { + constructor() { + super() + } + + private get api() { + return ApiFactory.getApiClient() + } + + sync() { + return this.api.callSync("SettingCommand.sync") + } + + save(config: IConfig) { + return this.api.call("SettingCommand.save", config) + } +} + +export { Setting } diff --git a/src/common/event/Setting/main/command.ts b/src/common/event/Setting/main/command.ts new file mode 100644 index 0000000..6c9afd6 --- /dev/null +++ b/src/common/event/Setting/main/command.ts @@ -0,0 +1,13 @@ +import Setting, { IConfig } from "setting/main" + +export default class SettingCommand { + static init() { + console.log("SettingCommand init") + } + sync() { + return Setting.config() + } + save(config: IConfig) { + return Setting.set(config) + } +} diff --git a/src/common/event/Updater/hook.ts b/src/common/event/Updater/hook.ts new file mode 100644 index 0000000..0cfc34a --- /dev/null +++ b/src/common/event/Updater/hook.ts @@ -0,0 +1,16 @@ +import { EventMaps } from "helper/updater/common" +import { defineStore } from "pinia" + +export const useSettingStore = defineStore( + "Updater", + () => { + getApi().on("update-progress", (_, data) => { + console.log(data) + }) + + return {} + }, + { + persist: false, + }, +) diff --git a/src/common/event/Updater/index.ts b/src/common/event/Updater/index.ts index 6a829d0..2b23ee4 100644 --- a/src/common/event/Updater/index.ts +++ b/src/common/event/Updater/index.ts @@ -1,15 +1,13 @@ -import { EventMaps } from "helper/updater/common" +import { BaseEvent } from "common/lib/abstract" -const curProgress = ref(0) - -getApi().on("update-progress", (_, data) => { - console.log(data) -}) +class Updater extends BaseEvent { + constructor() { + super() + } -function useUpdate() { - return { - curProgress, + test() { + this.api } } -export { useUpdate } +export { Updater } diff --git a/src/common/lib/abstract.ts b/src/common/lib/abstract.ts index 0a025d9..981d02e 100644 --- a/src/common/lib/abstract.ts +++ b/src/common/lib/abstract.ts @@ -1,9 +1,11 @@ import { ElectronApiClient } from "common/lib/electron" import { BrowserApiClient } from "common/lib/browser" +import { BaseSingleton } from "base/index" // 定义抽象 API 接口 export interface IApiClient { call(command: string, ...args: any[]): Promise + callSync(command: string, ...args: any[]): void on(channel: K, callback: (...args: any[]) => void): void off(channel: K, callback: (...args: any[]) => void): void offAll(channel: K): void @@ -15,6 +17,11 @@ class NullApiClient implements IApiClient { console.warn(`API call to ${command} failed: API client not initialized`) return undefined as any } + callSync(command: string, ...args: any[]): void { + args + console.warn(`API callSync to ${command} failed: API client not initialized`) + return undefined as any + } on(channel: K, callback: (...args: any[]) => void): void { callback @@ -51,3 +58,13 @@ export class ApiFactory { return this.instance } } + +export class BaseEvent extends BaseSingleton { + constructor() { + super() + } + + public get api() { + return ApiFactory.getApiClient() + } +} diff --git a/src/common/lib/browser.ts b/src/common/lib/browser.ts index e80a478..035a71b 100644 --- a/src/common/lib/browser.ts +++ b/src/common/lib/browser.ts @@ -11,6 +11,11 @@ export class BrowserApiClient implements IApiClient { }).then(res => res.json()) } + callSync(): void { + // 浏览器特定实现,可能使用 fetch 或其他方式 + console.log("不支持 callSync 方法") + } + // 实现其他方法... on(channel: K, callback: (...args: any[]) => void): void { // 浏览器中可能使用 WebSocket 或其他方式 diff --git a/src/common/lib/electron.ts b/src/common/lib/electron.ts index 43da684..05609d2 100644 --- a/src/common/lib/electron.ts +++ b/src/common/lib/electron.ts @@ -6,6 +6,11 @@ export class ElectronApiClient implements IApiClient { return window.api.call(command, ...args) } + callSync(command: string, ...args: any[]): Promise { + // Electron 特定实现 + return window.api.callSync(command, ...args) + } + on(channel: K, callback: (...args: any[]) => void): void { window.api.on(channel, callback) } diff --git a/src/main/modules/commands/index.ts b/src/main/modules/commands/index.ts index 45474a7..c7f97df 100644 --- a/src/main/modules/commands/index.ts +++ b/src/main/modules/commands/index.ts @@ -3,8 +3,8 @@ import { ipcMain, Menu, MenuItem } from "electron" import { inject } from "inversify" import IOC from "main/_ioc" import BaseClass from "main/base/base" -import { isPromise } from "main/utils" import WindowManager from "../window-manager" +import { isPromise } from "utils" export default class Commands extends BaseClass { destroy() { diff --git a/src/main/modules/window-manager/windowsMap.ts b/src/main/modules/window-manager/windowsMap.ts index c128cf7..4d1ca6e 100644 --- a/src/main/modules/window-manager/windowsMap.ts +++ b/src/main/modules/window-manager/windowsMap.ts @@ -1,7 +1,7 @@ import Config from "config" import { BrowserWindowConstructorOptions } from "electron" -import { getFileUrl, getPreloadUrl } from "main/utils" import icon from "@res/icon.png?asset" +import { getFileUrl, getPreloadUrl } from "utils/main" export type Param = Partial & Required> diff --git a/src/main/utils/index.ts b/src/main/utils/index.ts deleted file mode 100644 index 3d7d89d..0000000 --- a/src/main/utils/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { is } from "@electron-toolkit/utils" -import { join } from "node:path" - -export function getFileUrl(app: string) { - let winURL = "" - if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { - winURL = process.env["ELECTRON_RENDERER_URL"] + `/${app}#/` - } else { - winURL = join(__dirname, `../renderer/${app}#/`) - } - return slash(winURL) -} - -export function getPreloadUrl(file) { - return join(__dirname, `../preload/${file}.mjs`) -} - -export function isPromise(value: () => any) { - return value && Object.prototype.toString.call(value) === "[object Promise]" -} - -export function slash(path: string) { - const isExtendedLengthPath = path.startsWith("\\\\?\\") - if (isExtendedLengthPath) { - return path - } - return path.replace(/\\/g, "/") -} diff --git a/src/main/utils/session/cookies.ts b/src/main/utils/session/cookies.ts deleted file mode 100644 index 3088021..0000000 --- a/src/main/utils/session/cookies.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { BrowserView, BrowserWindow } from "electron" - -const cookies = { - getCurrCookies(params = {}, currWin: BrowserView | BrowserWindow) { - let currSession = currWin.webContents.session - return currSession.cookies.get(Object.assign({}, params)) - }, - removeCurrCookies(cookies = [], currWin: BrowserView | BrowserWindow) { - let currSession = currWin.webContents.session - let err = [] - let apiCount = 0 - return new Promise((resove, reject) => { - cookies.forEach(async (item: any) => { - await currSession.cookies.remove(`http://${item.domain}`, item.name) - apiCount = apiCount + 1 - if (err.length === apiCount) { - resove({ message: "cookie 清除成功" }) - } else { - reject(err) - } - }) - }) - }, - setCurrCookies(cookies = [], currWin: BrowserView | BrowserWindow) { - let currSession = currWin.webContents.session - let err = [] - let apiCount = 0 - return new Promise((resove, reject) => { - cookies.forEach(async (item: any) => { - await currSession.cookies.set( - Object.assign({}, item, { - url: `http://${item.domain}`, - name: item.name, - }), - ) - apiCount = apiCount + 1 - if (err.length === apiCount) { - resove({ message: "cookie 设置成功!" }) - } else { - reject(err) - } - }) - }) - }, -} - -export default cookies \ No newline at end of file diff --git a/src/main/utils/session/index.ts b/src/main/utils/session/index.ts deleted file mode 100644 index 128df4f..0000000 --- a/src/main/utils/session/index.ts +++ /dev/null @@ -1,82 +0,0 @@ -// https://blog.guowenfh.com/2017/10/21/2017/electron-multiple-session/#%E5%9C%A8-webview-%E4%B8%AD - -import { BrowserWindow } from "electron" -/** - * 创建一个 登录 的窗口。 - * 用于 session 隔离 - * Promise 中有 {partition,userinfo,cookies} - * @returns Promise - */ -function createLoginWin(partition) { - partition = partition || `persist:${Math.random()}` - // const charset = require("superagent-charset") - // const request = charset(require("superagent")) // HTTP - let presWindow = new BrowserWindow({ - width: 1280, - height: 768, - title: "用户登陆", - webPreferences: { - webSecurity: false, - allowRunningInsecureContent: true, - partition, - }, - }) - let webContents = presWindow.webContents - return new Promise(function (resove, _) { - // webContents.openDevTools(); - presWindow.loadURL("https://login.taobao.com/member/login.jhtml") - webContents.on("did-navigate-in-page", async function () { - // 这里可以看情况进行参数的传递,获取制定的 cookies - const cookies = await webContents.session.cookies.get({}) - let obj = { partition, cookies } - resove(obj) - // webContents.session.cookies.get({}, function (err, cookies) { - // if (err) { - // presWindow.close() // 关闭登陆窗口 - // return reject(err) - // } - // let obj = { partition, cookies } - // resove(obj) - // fetch("https://login.taobao.com/member/login.jhtml", { - // method: "GET", - // credentials: "include", - // headers: { - // Cookie: cookies.map(item => `${item.name}=${item.value};`).join(" "), - // "Content-Type": "application/json", - // }, - // }) - // .then(response => response.json()) - // .then(data => { - // console.log(data) - // presWindow.close() - // resove(obj) - // }) - // .catch(err => { - // presWindow.close() - // reject(err) - // }) - // }) - // 这一步并不是必需的。 - // request - // .get("http://taobao.com/userinfo") - // .query({ _: Date.now() }) // query string - // .set("Cookie", cookies.map(item => `${item.name}=${item.value};`).join(" ")) - // .end(function (err, res) { - // presWindow.close() - // if (err) { - // return reject(err) - // } - // if (!res || !res.body || !res.body.result !== 1) { - // return reject(res.body) - // } - // let obj = { partition, cookies, userinfo: res.body.data } - // resove(obj) - // }) - }) - // }) - }) -} - -export { - createLoginWin -} diff --git a/src/renderer/src/pages/index/index.vue b/src/renderer/src/pages/index/index.vue index 798684c..a55ca47 100644 --- a/src/renderer/src/pages/index/index.vue +++ b/src/renderer/src/pages/index/index.vue @@ -1,9 +1,7 @@ diff --git a/src/renderer/src/pages/setting/index.vue b/src/renderer/src/pages/setting/index.vue new file mode 100644 index 0000000..0a34780 --- /dev/null +++ b/src/renderer/src/pages/setting/index.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 722243b..9922464 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -1,11 +1,8 @@ - -import { createPinia } from 'pinia' -import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' +import { createPinia } from "pinia" +import piniaPluginPersistedstate from "pinia-plugin-persistedstate" const pinia = createPinia() pinia.use(piniaPluginPersistedstate) export default pinia -export { - pinia -} \ No newline at end of file +export { pinia } diff --git a/src/renderer/src/store/module.store.ts b/src/renderer/src/store/module.store.ts deleted file mode 100644 index 6022e26..0000000 --- a/src/renderer/src/store/module.store.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { defineStore } from "pinia" - -export enum ModuleType { - CommonPanel = 0, - CodeMgr = 1, - LinkBox = 2, -} -export const useModuleStore = defineStore("module", () => { - const curModuleId = ref(ModuleType.CommonPanel) - - const modules: Record<"id" | "label", string | ModuleType>[] = [ - { id: ModuleType.CommonPanel, label: "全能面板" }, - { id: ModuleType.CodeMgr, label: "代码管家" }, - { id: ModuleType.LinkBox, label: "超链鉴宝" }, - ] - - const setModule = (type: ModuleType) => { - console.log(type); - curModuleId.value = type - } - const curModule = computed(() => { - return modules.find(m => m.id === curModuleId.value) - }) - return { - ModuleType, - setModule, - modules, - curModule, - } -}) diff --git a/src/renderer/src/ui/NavBar.vue b/src/renderer/src/ui/NavBar.vue index 0e487ca..61589d4 100644 --- a/src/renderer/src/ui/NavBar.vue +++ b/src/renderer/src/ui/NavBar.vue @@ -15,9 +15,7 @@
{{ Config.ExeConfig.name }}
-
{{ t("browser.navbar.menu.label") }}
-
{{ ModuleStore.curModule?.label ?? "选择模块" }}
-
设置
+
{{ menu.label }}
@@ -61,7 +59,6 @@ import { PopupMenu } from "@/bridge/PopupMenu" import { usePlatForm } from "common/event/PlatForm/hook" import { LogLevel } from "logger/common" - import { useModuleStore } from "@/store/module.store" const PlatForm = usePlatForm() @@ -82,76 +79,77 @@ return false }) - // function backHome() { - // router.push("/") - // } function back() { router.back() } const { t } = useI18n() - const onClickMenu = async e => { - const menu = new PopupMenu([ - { - label: isFullScreen.value ? t("browser.navbar.menu.quit-fullscreen") : t("browser.navbar.menu.fullscreen"), - async click() { - await PlatForm.toggleFullScreen() - isFullScreen.value = !isFullScreen.value - }, + const menuList = [ + { + label: t("browser.navbar.menu.label"), + async click(e) { + const menu = new PopupMenu([ + { + label: "首选项", + async click() { + router.push("/setting") + }, + }, + { + label: t("browser.navbar.menu.toggleDevTools"), + async click() { + PlatForm.toggleDevTools() + }, + }, + { + label: "重载", + async click() { + PlatForm.reload() + }, + }, + { + label: "崩溃", + async click() { + PlatForm.crash() + }, + }, + { + label: curLogLevel.value === LogLevel.TRACE ? "关闭调试模式" : "开启调试模式", + async click() { + if (curLogLevel.value === LogLevel.TRACE) { + await PlatForm.logSetLevel(LogLevel.INFO) + curLogLevel.value = LogLevel.INFO + return + } + await PlatForm.logSetLevel(LogLevel.TRACE) + curLogLevel.value = LogLevel.TRACE + }, + }, + ]) + const obj = e.target.getBoundingClientRect() + menu.show({ x: ~~obj.x, y: ~~(obj.y + obj.height) }) }, - { - label: t("browser.navbar.menu.toggleDevTools"), - async click() { - PlatForm.toggleDevTools() - }, + }, + { + label: "查看", + async click(e) { + const menu = new PopupMenu([ + { + label: isFullScreen.value ? t("browser.navbar.menu.quit-fullscreen") : t("browser.navbar.menu.fullscreen"), + async click() { + await PlatForm.toggleFullScreen() + isFullScreen.value = !isFullScreen.value + }, + }, + ]) + const obj = e.target.getBoundingClientRect() + menu.show({ x: ~~obj.x, y: ~~(obj.y + obj.height) }) }, - { - label: "重载", - async click() { - PlatForm.reload() - }, - }, - { - label: "崩溃", - async click() { - PlatForm.crash() - }, - }, - { - label: curLogLevel.value === LogLevel.TRACE ? "关闭调试模式" : "开启调试模式", - async click() { - if (curLogLevel.value === LogLevel.TRACE) { - await PlatForm.logSetLevel(LogLevel.INFO) - curLogLevel.value = LogLevel.INFO - return - } - await PlatForm.logSetLevel(LogLevel.TRACE) - curLogLevel.value = LogLevel.TRACE - }, - }, - ]) - const obj = e.target.getBoundingClientRect() - menu.show({ x: ~~obj.x, y: ~~(obj.y + obj.height) }) - } + }, + ] const onClickAbout = () => { PlatForm.showAbout() } - - const ModuleStore = useModuleStore() - - const onClickPage = async e => { - const menu = new PopupMenu(toRaw(ModuleStore.modules as any)) - menu.setClickEvent(item => { - ModuleStore.setModule(item.id) - // if (item.id === ModuleStore.ModuleType.CommonPanel) {} - }) - const obj = e.target.getBoundingClientRect() - menu.show({ x: ~~obj.x, y: ~~(obj.y + obj.height) }) - } - - const onClickSetting = () => { - router.push("/setting") - }