From 678868153a200399d667c8ac441542e004fda6f1 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Mon, 2 Jun 2025 08:22:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/build.js | 1 - electron/electron-menu.js | 8 ++++---- electron/render/tabs/index.html | 19 +++++++++++++++++- electron/utils.js | 20 +++++++++++++------ resources/assets/js/app.js | 17 ++++++++-------- .../assets/js/components/Replace/utils.js | 19 +++++++++++------- .../pages/manage/components/DialogWrapper.vue | 4 ++-- resources/assets/js/store/actions.js | 9 +++++---- 8 files changed, 64 insertions(+), 33 deletions(-) diff --git a/electron/build.js b/electron/build.js index 8bdd11373..a5d4f35de 100644 --- a/electron/build.js +++ b/electron/build.js @@ -559,7 +559,6 @@ async function startBuild(data) { origin: "./", homeUrl: utils.formatUrl(data.url), apiUrl: utils.formatUrl(data.url) + "api/", - routeMode: "hash", } // information if (data.id === 'app') { diff --git a/electron/electron-menu.js b/electron/electron-menu.js index bbf3fa922..0e2f9c8b6 100644 --- a/electron/electron-menu.js +++ b/electron/electron-menu.js @@ -59,7 +59,7 @@ const electronMenu = { async saveImageAs(url, params) { let extension = ''; - if (utils.isLocalAssetPath(url)) { + if (utils.isLocalHost(url)) { extension = utils.localAssetRestoreRealPath(url).split('.').pop().toLowerCase(); } else { const urlExtension = url.split('.').pop().split(/[#?]/)[0].toLowerCase(); @@ -89,7 +89,7 @@ const electronMenu = { try { if (electronMenu.isBlobOrDataUrl(url)) { await electronMenu.writeNativeImage(filePath, nativeImage.createFromDataURL(url)); - } else if (utils.isLocalAssetPath(url)) { + } else if (utils.isLocalHost(url)) { await fs.promises.copyFile(utils.localAssetRestoreRealPath(url), filePath); } else { const writeStream = fs.createWriteStream(filePath) @@ -127,7 +127,7 @@ const electronMenu = { if (params.linkURL || params.srcURL) { const url = params.linkURL || params.srcURL; - if (!electronMenu.isBlobOrDataUrl(url) && !utils.isLocalAssetPath(url)) { + if (!electronMenu.isBlobOrDataUrl(url) && !utils.isLocalHost(url)) { popupMenu.append(new MenuItem({ label: electronMenu.language.openInBrowser, click: async function () { @@ -161,7 +161,7 @@ const electronMenu = { clipboard.writeText(url.substring(MAILTO_PREFIX.length)); }, })); - } else if (!utils.isLocalAssetPath(url)) { + } else if (!utils.isLocalHost(url)) { popupMenu.append(new MenuItem({ label: params.hasImageContents ? electronMenu.language.copyImageAddress : electronMenu.language.copyLinkAddress, click: async function () { diff --git a/electron/render/tabs/index.html b/electron/render/tabs/index.html index 8c85d8e02..69f0697e0 100644 --- a/electron/render/tabs/index.html +++ b/electron/render/tabs/index.html @@ -129,7 +129,7 @@ return this.activeItem ? this.activeItem.title : 'Untitled' }, canBrowser() { - return !(this.activeItem && /^file:/.test(this.activeItem.url)) + return !(this.activeItem && this.isLocalHost(this.activeItem.url)) } }, watch: { @@ -181,6 +181,23 @@ sendMessage(event, args) { electron?.sendMessage(event, args) + }, + + /** + * 判断是否是本地URL + * @param url + * @returns {boolean} + */ + isLocalHost(url) { + if (!url) { + return false + } + try { + const uri = new URL(url) + return uri.hostname == "localhost" + } catch (e) { + return false + } } }, } diff --git a/electron/utils.js b/electron/utils.js index ab6ff146e..d3570c98f 100644 --- a/electron/utils.js +++ b/electron/utils.js @@ -623,12 +623,20 @@ const utils = { }, /** - * 是否本地资源路径 - * @param {string} url + * 判断是否是本地URL + * @param url * @returns {boolean} */ - isLocalAssetPath(url) { - return url.startsWith('local-asset://') + isLocalHost(url) { + if (!url) { + return false + } + try { + const uri = new URL(url) + return uri.hostname == "localhost" + } catch (e) { + return false + } }, /** @@ -637,7 +645,7 @@ const utils = { * @returns {string} */ localAssetRestoreRealPath(url) { - if (!utils.isLocalAssetPath(url)) { + if (!utils.isLocalHost(url)) { return url } @@ -664,7 +672,7 @@ const utils = { loadUrl(browser, serverUrl, hash = null) { if (serverUrl) { if (hash) { - serverUrl = `${serverUrl}#${hash}`.replace(/\/*#\/*/g, '/') + serverUrl = `${serverUrl}#${hash}` } browser.loadURL(serverUrl).then(_ => { }).catch(_ => { }) } else { diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index 880b2a592..cfa9bc5f0 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -3,6 +3,7 @@ const isEEUIApp = window && window.navigator && /eeui/i.test(window.navigator.us const isSoftware = isElectron || isEEUIApp; import {languageName, switchLanguage as $L} from "./language"; +import {isLocalHost} from "./components/Replace/utils"; import './functions/common' import './functions/eeui' @@ -77,7 +78,7 @@ VueRouter.prototype.push = function push(location) { } // 路由方式 -const routeMode = (window && window.systemInfo && window.systemInfo.routeMode === 'hash') ? 'hash' : 'history'; +const routeMode = isLocalHost(window.location) ? 'hash' : 'history'; const router = new VueRouter({mode: routeMode, routes}); // 进度条配置 @@ -337,24 +338,24 @@ const $preload = async () => { } await store.dispatch("preload"); - const hash = (window.location[routeMode === 'history' ? 'pathname' : 'hash']).replace(/^[#\/\s]+/, ''); + const hash = (window.location[routeMode === 'hash' ? 'hash' : 'pathname']).replace(/^[#\/\s]+/, ''); if (hash !== 'preload') { await $init() return } - window.__initializeApp = async (route) => { - if (/^https?:\/\//.test(route)) { - if ($A.getDomain(route) !== $A.getDomain($A.mainUrl())) { + window.__initializeApp = async (loadHash) => { + if (/^https?:\/\//.test(loadHash)) { + if ($A.getDomain(loadHash) !== $A.getDomain($A.mainUrl())) { window.location.href = url; return; } - route = route.replace(/^https?:\/\/[^\/]+/, ''); + loadHash = loadHash.replace(/^https?:\/\/[^\/]+/, ''); } if (routeMode === 'hash') { - route = `#/${route.replace(/^[#\/\s]+/, '')}`; + loadHash = `#/${loadHash.replace(/^[#\/\s]+/, '')}`; } - window.history.replaceState(null, '', route) + window.history.replaceState(null, '', loadHash) await $init() } } diff --git a/resources/assets/js/components/Replace/utils.js b/resources/assets/js/components/Replace/utils.js index 8504ecc40..144538352 100644 --- a/resources/assets/js/components/Replace/utils.js +++ b/resources/assets/js/components/Replace/utils.js @@ -67,15 +67,20 @@ const convertLocalResourcePath = (() => { })() /** - * 是否是本地资源路径 + * 是否是本地URL * @param url * @returns {*} */ -const isLocalResourcePath = (url) => { - return url && ( - url.startsWith('file://') || - url.startsWith('local-asset://') - ) +const isLocalHost = (url) => { + if (!url) { + return false + } + try { + const uri = new URL(url) + return uri.hostname == "localhost" + } catch (e) { + return false + } } -export {convertLocalResourcePath, isLocalResourcePath} +export {convertLocalResourcePath, isLocalHost} diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 3c40b77e8..eacd2ce09 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -672,7 +672,7 @@ import longpress from "../../../directives/longpress"; import TransferDom from "../../../directives/transfer-dom"; import resizeObserver from "../../../directives/resize-observer"; import {languageList} from "../../../language"; -import {isLocalResourcePath} from "../../../components/Replace/utils"; +import {isLocalHost} from "../../../components/Replace/utils"; import emitter from "../../../store/events"; import Forwarder from "./Forwarder/index.vue"; import {throttle} from "lodash"; @@ -3086,7 +3086,7 @@ export default { value: $A.thumbRestore(event.target.currentSrc), }) } - if (data.type !== 'file' && !isLocalResourcePath(event.target.currentSrc)) { + if (data.type !== 'file' && !isLocalHost(event.target.currentSrc)) { this.operateCopys.push({ type: 'imagedown', icon: '', diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 9df5c8997..9f45b865f 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -1,6 +1,7 @@ import * as openpgp from 'openpgp_hi/lightweight'; import {initLanguage, languageList, languageName} from "../language"; import {$callData, $urlSafe, SSEClient} from '../utils' +import {isLocalHost} from "../components/Replace/utils"; import emitter from "./events"; import axios from "axios"; @@ -1224,7 +1225,7 @@ export default { userUrl({state}, url) { return new Promise(resolve => { // 如果是访问:服务器域名 且 当前是本地文件,则将服务器域名替换成本地路径 - if ($A.getDomain(url) == $A.getDomain($A.mainUrl()) && window.location.protocol == "file:") { + if ($A.getDomain(url) == $A.getDomain($A.mainUrl()) && isLocalHost(window.location)) { try { const remoteURL = new URL(url) if (/^\/(single|meeting)\//.test(remoteURL.pathname)) { @@ -1245,7 +1246,7 @@ export default { userid: state.userId, } // 如果是访问:服务器域名 或 本地文件,则添加 token 参数 - if ($A.getDomain(url) == $A.getDomain($A.mainUrl()) || $A.getProtocol(url) == "file:") { + if ($A.getDomain(url) == $A.getDomain($A.mainUrl()) || isLocalHost(window.location)) { params.token = state.userToken } resolve($A.urlAddParams(url, params)) @@ -1305,11 +1306,11 @@ export default { if (typeof objects.params.allowAccess === "undefined") { // 如果是本地文件,则允许跨域 - objects.params.allowAccess = $A.getProtocol(objects.params.url) == "file:" + objects.params.allowAccess = isLocalHost(objects.params.url) } if (typeof objects.params.showProgress === "undefined") { // 如果不是本地文件,则显示进度条 - objects.params.showProgress = $A.getProtocol(objects.params.url) != "file:" + objects.params.showProgress = !isLocalHost(objects.params.url) } $A.eeuiAppOpenPage(objects)