From 8b96f218d5284033f10c186c0ce18e4c16d8e9b2 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 31 Jan 2026 02:07:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D1::=20=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F=E7=9A=84ipv6=E6=A0=A1=E9=AA=8C=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/basic/src/utils/util.domain.ts | 9 +++++++-- .../plugins/common/domain-selector.vue | 3 ++- .../certd-client/src/plugin/validator/index.ts | 12 ++++++++++-- .../vben/layouts/basic/menu/use-mixed-menu.ts | 1 - .../src/vben/shared/utils/window.ts | 6 +++++- packages/ui/certd-client/vite.config.ts | 18 +++++++++++++----- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/packages/core/basic/src/utils/util.domain.ts b/packages/core/basic/src/utils/util.domain.ts index 59c1ee56f..6a3c676b7 100644 --- a/packages/core/basic/src/utils/util.domain.ts +++ b/packages/core/basic/src/utils/util.domain.ts @@ -58,8 +58,13 @@ function isIpv6(d: string) { if (!d) { return false; } - const isIPv6Regex = /^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$/gm; - return isIPv6Regex.test(d); + try { + // 尝试构造URL,用IPv6作为hostname + new URL(`http://[${d}]`); + return true; + } catch { + return false; + } } function isIp(d: string) { diff --git a/packages/ui/certd-client/src/components/plugins/common/domain-selector.vue b/packages/ui/certd-client/src/components/plugins/common/domain-selector.vue index 5ee9f986a..7a331e0be 100644 --- a/packages/ui/certd-client/src/components/plugins/common/domain-selector.vue +++ b/packages/ui/certd-client/src/components/plugins/common/domain-selector.vue @@ -60,6 +60,7 @@ import { request } from "/@/api/service"; import { Dicts } from "../lib/dicts"; import { useRouter } from "vue-router"; import { useDomainImport, useDomainImportManage } from "/@/views/certd/cert/domain/use"; +import { openRouteInNewWindow } from "/@/vben/utils"; defineOptions({ name: "DomainSelector", @@ -190,7 +191,7 @@ const router = useRouter(); function openDomainManager(e: any) { e.preventDefault(); // router.push("/certd/cert/domain"); - window.open(`${window.location.origin}/#/certd/cert/domain`); + openRouteInNewWindow("/certd/cert/domain"); } const openDomainImportManageDialog = useDomainImportManage(); diff --git a/packages/ui/certd-client/src/plugin/validator/index.ts b/packages/ui/certd-client/src/plugin/validator/index.ts index 392b258f8..5a6894b26 100644 --- a/packages/ui/certd-client/src/plugin/validator/index.ts +++ b/packages/ui/certd-client/src/plugin/validator/index.ts @@ -4,8 +4,16 @@ function isIpv6(d: string) { if (!d) { return false; } - const isIPv6Regex = /^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$/gm; - return isIPv6Regex.test(d); + // const isIPv6Regex = /^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$/gm; + // return isIPv6Regex.test(d); + + try { + // 尝试构造URL,用IPv6作为hostname + new URL(`http://[${d}]`); + return true; + } catch { + return false; + } } function isIpv4(d: string) { if (!d) { diff --git a/packages/ui/certd-client/src/vben/layouts/basic/menu/use-mixed-menu.ts b/packages/ui/certd-client/src/vben/layouts/basic/menu/use-mixed-menu.ts index 8021b472e..23a28eccd 100644 --- a/packages/ui/certd-client/src/vben/layouts/basic/menu/use-mixed-menu.ts +++ b/packages/ui/certd-client/src/vben/layouts/basic/menu/use-mixed-menu.ts @@ -167,7 +167,6 @@ function useMixedMenu() { * @param path 路由路径 */ function calcSideMenus(path: string = route.path) { - debugger; let { rootMenu } = findRootMenuByPath(menus.value, path); if (!rootMenu) { rootMenu = menus.value.find((item: any) => item.path === path); diff --git a/packages/ui/certd-client/src/vben/shared/utils/window.ts b/packages/ui/certd-client/src/vben/shared/utils/window.ts index 7096d0de8..828972ad1 100644 --- a/packages/ui/certd-client/src/vben/shared/utils/window.ts +++ b/packages/ui/certd-client/src/vben/shared/utils/window.ts @@ -27,8 +27,12 @@ function openWindow(url: string, options: OpenWindowOptions = {}): void { */ function openRouteInNewWindow(path: string) { const { hash, origin } = location; + let pathname = location.pathname; + if (pathname.endsWith("/")) { + pathname = pathname.slice(0, -1); + } const fullPath = path.startsWith("/") ? path : `/${path}`; - const url = `${origin}${hash ? "/#" : ""}${fullPath}`; + const url = `${origin}${pathname}${hash ? "/#" : ""}${fullPath}`; openWindow(url, { target: "_blank" }); } diff --git a/packages/ui/certd-client/vite.config.ts b/packages/ui/certd-client/vite.config.ts index 87d30d3ab..af78b528c 100644 --- a/packages/ui/certd-client/vite.config.ts +++ b/packages/ui/certd-client/vite.config.ts @@ -19,15 +19,16 @@ process.env.VITE_APP_VERSION = require("./package.json").version; process.env.VITE_APP_BUILD_TIME = require("dayjs")().format("YYYY-M-D HH:mm:ss"); import * as https from "node:https"; -export default ({ command, mode }) => { +export default (req: any) => { + const { command, mode } = req; console.log("args", command, mode); const env = loadEnv(mode, process.cwd()); const devServerFs: any = {}; const devAlias: any[] = []; - const base = "./"; - // if (mode.startsWith("dev")) { - // base = "./"; - // } + let base = "./"; + if (mode.startsWith("dev")) { + base = "/certd"; + } return { base: base, plugins: [ @@ -96,6 +97,13 @@ export default ({ command, mode }) => { //忽略证书 agent: new https.Agent({ rejectUnauthorized: false }), }, + "/certd/api": { + //配套后端 https://github.com/fast-crud/fs-server-js + target: "https://127.0.0.1:7002/api", + rewrite: path => path.replace(/^\/certd\/api/, ""), + //忽略证书 + agent: new https.Agent({ rejectUnauthorized: false }), + }, }, }, };