From 579b76dc0e8f75ef5e9dabf7e585c74ce9f03f30 Mon Sep 17 00:00:00 2001 From: zh <972939975@qq.com> Date: Fri, 11 Jul 2025 09:19:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86url=E4=B8=ADlocalhost=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E6=94=B9=E4=B8=BA=E5=BD=93=E5=89=8Dhost=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Global/global.js | 11 +++++ .../Base/BaseSource/BaseModel/Model/index.js | 14 ++---- src/Obj/Base/BaseSource/BaseTerrain/index.js | 4 +- src/Obj/Base/BillboardObject/index.js | 30 +++++++++--- src/Obj/Base/GroundSvg/index.js | 7 ++- src/Obj/Base/TrajectoryMotion/index.js | 5 +- src/Obj/Base/index.js | 2 + src/Tools/index.js | 49 +++++++++++++++++++ 8 files changed, 99 insertions(+), 23 deletions(-) diff --git a/src/Global/global.js b/src/Global/global.js index 3292264..688ed26 100644 --- a/src/Global/global.js +++ b/src/Global/global.js @@ -14,6 +14,7 @@ import { getTheme, setTheme } from "../Obj/Element/theme"; import { setActiveViewer as setMultiViewportActiveViewer } from './MultiViewportMode' import { setActiveViewer as setSplitActiveViewer, getSdk } from './SplitScreen' import { updateCluster } from './cluster/cluster' +import { getHost } from "../on"; let coordinateSystem = 'EPSG:4326' let _cartesian @@ -244,6 +245,16 @@ function setBillboardDefaultUrl(url, name) { else { name = 'billboard_default_url' } + let host = getHost() + if (!url.startsWith("http")) { + //说明是本地的json,在磁盘中存在的 + if (!url.includes(":")) { + if (host) { + let o = new URL(url, host) + url = o.href + } + } + } localStorage.setItem(name, url); } /*获取广告牌默认图标*/ diff --git a/src/Obj/Base/BaseSource/BaseModel/Model/index.js b/src/Obj/Base/BaseSource/BaseModel/Model/index.js index 8fab708..d693bbf 100644 --- a/src/Obj/Base/BaseSource/BaseModel/Model/index.js +++ b/src/Obj/Base/BaseSource/BaseModel/Model/index.js @@ -145,15 +145,7 @@ class Model extends BaseModel { if (!this.sdk || !this.sdk.viewer || !this.sdk.viewer.scene) { return } - if (!url.startsWith("http")) { - //说明是本地的json,在磁盘中存在的 - if (!url.includes(":")) { - if (this.options.host) { - let o = new URL(url, this.options.host) - url = o.href - } - } - } + url = this.replaceHost(url, this.options.host) // this.handler = new Cesium.ScreenSpaceEventHandler( // this.sdk.viewer.canvas // ) @@ -1336,7 +1328,9 @@ class Model extends BaseModel { this.name = this.options.name || '未命名对象' this.originalOptions = this.deepCopyObj(this.options) this._DialogObject.close() - this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions) + let cdoptions = this.deepCopyObj(this.options) + cdoptions.host = '' + this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(cdoptions) syncData(this.sdk, this.options.id) syncSplitData(this.sdk, this.options.id) }, diff --git a/src/Obj/Base/BaseSource/BaseTerrain/index.js b/src/Obj/Base/BaseSource/BaseTerrain/index.js index 4cb2a1c..0d2336c 100644 --- a/src/Obj/Base/BaseSource/BaseTerrain/index.js +++ b/src/Obj/Base/BaseSource/BaseTerrain/index.js @@ -247,7 +247,9 @@ class BaseTerrain extends BaseSource { } this.originalOptions = this.deepCopyObj(this.options) this._DialogObject.close() - this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions) + let cdoptions = this.deepCopyObj(this.options) + cdoptions.host = '' + this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(cdoptions) }, // resetCallBack: () => { // this.name = this.originalOptions.name diff --git a/src/Obj/Base/BillboardObject/index.js b/src/Obj/Base/BillboardObject/index.js index 5442879..3b49016 100644 --- a/src/Obj/Base/BillboardObject/index.js +++ b/src/Obj/Base/BillboardObject/index.js @@ -211,8 +211,9 @@ class BillboardObject extends Base { let index = 0 let font = getFontFamily(that.labelFontFamily) || 'Helvetica' + let url = that.replaceHost(that.options.billboard.image, that.options.host) that._frameImages = [] - if (that.options.billboard.image && that.options.billboard.image.endsWith('gif')) { + if (url && url.endsWith('gif')) { isGlf = true switch (that.options.heightMode) { case 2: @@ -222,7 +223,7 @@ class BillboardObject extends Base { } let gifImg = document.createElement('img') - gifImg.setAttribute('rel:animated_src', that.options.billboard.image) + gifImg.setAttribute('rel:animated_src', url) gifImg.setAttribute('rel:auto_play', '1') const imgDiv = document.createElement('div') imgDiv.appendChild(gifImg) @@ -272,7 +273,7 @@ class BillboardObject extends Base { else { let image = new Image() image.src = - that.options.billboard.image || + url || that.getSourceRootPath() + '/img/A-ablu-blank.png' switch (that.options.heightMode) { case 2: @@ -720,11 +721,21 @@ class BillboardObject extends Base { } get billboardImage() { - return this.options.billboard.image + let url = this.options.billboard.image + if (url && !url.startsWith("http")) { + //说明是本地的json,在磁盘中存在的 + if (!url.includes(":")) { + if (this.options.host) { + let o = new URL(url, this.options.host) + url = o.href + } + } + } + return url } set billboardImage(v) { let _this = this - this.options.billboard.image = v + this.options.billboard.image = this.replaceHost(v, this.options.host) let url = this.options.billboard.image || getBillboardDefaultUrl(this.options.billboard.defaultImage) || @@ -1497,10 +1508,11 @@ class BillboardObject extends Base { } set billboardDefaultImage(v) { - setBillboardDefaultUrl(v, this.options.billboard.defaultImage) + let url = this.replaceHost(v, this.options.host) + setBillboardDefaultUrl(url, this.options.billboard.defaultImage) this._elms.billboardDefaultImage && this._elms.billboardDefaultImage.forEach(item => { - item.src = v + item.src = url }) } @@ -1575,8 +1587,10 @@ class BillboardObject extends Base { } this.originalOptions = this.deepCopyObj(this.options) this._DialogObject.close() + let cdoptions = this.deepCopyObj(this.options) + cdoptions.host = '' this.Dialog.confirmCallBack && - this.Dialog.confirmCallBack(this.originalOptions) + this.Dialog.confirmCallBack(cdoptions) syncData(this.sdk, this.options.id) syncSplitData(this.sdk, this.options.id) }, diff --git a/src/Obj/Base/GroundSvg/index.js b/src/Obj/Base/GroundSvg/index.js index 812511d..ae53143 100644 --- a/src/Obj/Base/GroundSvg/index.js +++ b/src/Obj/Base/GroundSvg/index.js @@ -594,12 +594,13 @@ class GroundSvg extends Base { } init() { + let url = this.replaceHost(this.options.url, this.options.host) syncData(this.sdk, this.options.id) this.hierarchys = [] this.originalOptions = this.deepCopyObj(this.options) let geometryArray = [] const loader = new SVGLoader(); - loader.load(this.options.url, (data) => { + loader.load(url, (data) => { if (!this.sdk || !this.sdk.viewer || !this.sdk.viewer.entities) { return } @@ -923,7 +924,9 @@ class GroundSvg extends Base { this.text && (this.options.text.position = { lng: this.text.position[0], lat: this.text.position[1], alt: this.text.position[2] }) this.originalOptions = this.deepCopyObj(this.options) this._DialogObject.close() - this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions) + let cdoptions = this.deepCopyObj(this.options) + cdoptions.host = '' + this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(cdoptions) syncData(this.sdk, this.options.id) syncSplitData(this.sdk, this.options.id) }, diff --git a/src/Obj/Base/TrajectoryMotion/index.js b/src/Obj/Base/TrajectoryMotion/index.js index a626030..2b026f8 100644 --- a/src/Obj/Base/TrajectoryMotion/index.js +++ b/src/Obj/Base/TrajectoryMotion/index.js @@ -1305,9 +1305,10 @@ class TrajectoryMotion extends Base { } // 创建模型 static async addModel(that) { + let url = that.replaceHost(that.options.model.url, that.options.host) let options = { id: that.options.id, - url: that.options.model.url, + url: url, show: that.options.show ? that.options.model.show : false, scale: that.options.model.scale, // minimumPixelSize: that.options.model.pixelSize, @@ -2285,7 +2286,7 @@ class TrajectoryMotion extends Base { async changeModelUrl(url) { this.sdk.viewer.scene.primitives.remove(this.model) - this.options.model.url = url + this.options.model.url = this.replaceHost(url, this.options.host) let matrix = this.model.modelMatrix let position = this.model.position let options = { diff --git a/src/Obj/Base/index.js b/src/Obj/Base/index.js index 9a47175..319800a 100644 --- a/src/Obj/Base/index.js +++ b/src/Obj/Base/index.js @@ -6,6 +6,7 @@ * @update: 2023-12-01 12:12 */ import Tools from "../../Tools"; +import { getHost, getToken } from "../../on"; import { regLeftClickCallback, regRightClickCallback, regMoveCallback } from "../../Global/ClickCallback"; import { regLeftClickCallback as regLeftClickCallback2, regRightClickCallback as regRightClickCallback2, regMoveCallback as regMoveCallback2 } from "../../Global/SplitScreen/ClickCallback"; import { setSplitDirection, syncSplitData, getSdk } from "../../Global/SplitScreen"; @@ -27,6 +28,7 @@ class Base extends Tools { this.clickCallBack = null this.rightClickCallBack = null this.picking = true + this.options.host = this.options.host || getHost() this.setDefaultValue() // this.sdk.addIncetance(this.options.id, this) diff --git a/src/Tools/index.js b/src/Tools/index.js index 3cf0284..338b6d1 100644 --- a/src/Tools/index.js +++ b/src/Tools/index.js @@ -1195,6 +1195,55 @@ class Tools { return `${year}${month}${day}${hours}${minutes}${seconds}${milliseconds}`; } + replaceHost(url, host) { + let newUrl = url + if(!url || !host) { + return url + } + try { + if (!url.startsWith("http")) { + //说明是本地的json,在磁盘中存在的 + if (!url.includes(":")) { + if (this.options.host) { + let o = new URL(url, this.options.host) + newUrl = o.href + } + } + return newUrl + } + else { + // 移除可能的用户名:密码前缀 + const authRegex = /^[^@]+@/; + if (authRegex.test(url)) { + url = url.replace(authRegex, ''); + } + + // 添加协议前缀(如果没有) + if (!/^[a-z]+:\/\//i.test(url)) { + url = 'http://' + url; + } + + const parsedUrl = new URL(url); + const parsedUrl2 = new URL(host); + let hostname = parsedUrl.hostname; + let port = parsedUrl.port; + + // 处理IPv6地址(如果有括号) + if (hostname.startsWith('[') && hostname.endsWith(']')) { + hostname = hostname.slice(1, -1); + } + if ((hostname === 'localhost' || hostname === '127.0.0.1') && parseInt(port, 10) !== 55110) { + parsedUrl.port = parsedUrl2.port + parsedUrl.protocol = parsedUrl2.protocol + newUrl = parsedUrl.toString() + } + return newUrl + } + } catch (error) { + return newUrl + } + } + }