bill před 5 měsíci
rodič
revize
c8416baefd

+ 8 - 3
src/api/fuse-model.ts

@@ -39,7 +39,7 @@ interface ServiceFuseModel {
   opacity: number;
   bottom: number;
   fusionNumId: number;
-  modelType: number
+  modelType: string
   transform: {
     position: SceneLocalPos;
     rotation: SceneLocalPos;
@@ -79,7 +79,7 @@ export const getSceneUrl = (sceneData: Scene) => {
       console.error(url, e);
     }
   }
-  return url
+  return [url.toString()]
 }
 
 const serviceToLocal = (
@@ -107,7 +107,11 @@ const serviceToLocal = (
     fusionId: serviceModel.fusionId,
     type: serviceModel.sceneData?.type === SceneType.DSFXJ ? SceneType.SWKK : serviceModel.sceneData?.type,
     size: serviceModel.sceneData?.modelSize,
-    raw: serviceModel.sceneData,
+    raw: {
+      ...serviceModel.sceneData,
+      laserOssRoot: params.root + '/' + serviceModel.sceneData.mapping + '',
+      panoOssRoot: params.root + '/' +serviceModel.sceneData.mapping + '',
+    },
     time: serviceModel.sceneData?.createTime,
     status: serviceModel.sceneData
       ? serviceModel.sceneData.status
@@ -122,6 +126,7 @@ const localToService = (
   hide: Number(!model.show),
   opacity: model.opacity,
   fusionNumId: model.fusionNumId,
+  modelType: model.modelType,
   bottom: model.bottom,
   transform: {
     position: model.position,

+ 3 - 0
src/api/scene.ts

@@ -28,7 +28,10 @@ export const SceneTypeDesc: Record<SceneType, string>  = lang.scene.types
 export interface Scene {
   createTime: string
   id: number
+  ossRoot: string
   isLaser: boolean
+  mapping: string
+  modelType: any
   modelDateType: string
   modelGlbUrl: string
   raw: any,

+ 14 - 14
src/api/setup.ts

@@ -132,20 +132,20 @@ export const axiosFactory = () => {
         hook.before && hook.before(config)
       }
 
-      if (!matchURL(axiosConfig.unTokenSet, config)) {
-        if (!axiosConfig.token) {
-          if (!offline && !matchURL(axiosConfig.unReqErrorSet, config)) {
-            const error = new Error(ui18n.t('resCode.4008'))
-            callErrorHandler('req', error, config)
-            throw error
-          }
-        } else {
-          config.headers = {
-            ...config.headers,
-            token: axiosConfig.token
-          }
-        }
-      }
+      // if (!matchURL(axiosConfig.unTokenSet, config)) {
+      //   if (!axiosConfig.token) {
+      //     if (!offline && !matchURL(axiosConfig.unReqErrorSet, config)) {
+      //       const error = new Error(ui18n.t('resCode.4008'))
+      //       callErrorHandler('req', error, config)
+      //       throw error
+      //     }
+      //   } else {
+      //     config.headers = {
+      //       ...config.headers,
+      //       token: axiosConfig.token
+      //     }
+      //   }
+      // }
       return config
     }
   )

+ 1 - 1
src/components/bill-ui/components/input/file.vue

@@ -42,7 +42,7 @@
         </div>
 
         <span v-else v-if="!maxLen || maxLen > modelValue.length">
-          {{ multiple ? t("sys.upload.conAdd") : t("sys.upload.rep") }}
+          {{ multiple ? $t("sys.upload.conAdd") : $t("sys.upload.rep") }}
         </span>
         <span class="tj" v-if="maxLen && modelValue.length">
           <span>{{ modelValue.length || 0 }}</span> / {{ maxLen }}

+ 5 - 5
src/components/static-preview/resource.vue

@@ -7,16 +7,16 @@
       playsinline
       webkit-playsinline
     >
-      <source :src="url" />
+      <source :src="getResources(url)" />
     </video>
-    <iframe v-else-if="type === MetaType.other" :src="url"></iframe>
+    <iframe v-else-if="type === MetaType.other" :src="getResources(url)"></iframe>
     <iframe
       v-else-if="type === MetaType.xfile"
       :src="`./xfile-viewer/index.html?file=${url}&time=${Date.now()}`"
     ></iframe>
-    <img :src="url" v-if="type === MetaType.image" />
+    <img :src="getResources(url)" v-if="type === MetaType.image" />
     <audio
-      :src="url"
+      :src="getResources(url)"
       v-if="type === MetaType.audio"
       controls
       autoplay
@@ -27,7 +27,7 @@
 </template>
 
 <script lang="ts" setup>
-import { getResource } from "@/env";
+import { getResource, getResources } from "@/env";
 import { computed } from "vue";
 import { getUrlType, MetaType } from "@/utils/meta";
 

+ 107 - 48
src/env/index.ts

@@ -1,26 +1,31 @@
-import { stackFactory, flatStacksValue, strToParams } from '@/utils'
-import { reactive, ref } from 'vue'
+import { stackFactory, flatStacksValue, strToParams } from "@/utils";
+import { reactive, ref } from "vue";
 
-import type { FuseModel, Path, TaggingPosition, View } from '@/store'
-export const viewModeStack = stackFactory(ref<'full' | 'auto'>('auto'))
-export const showToolbarStack = stackFactory(ref<boolean>(false))
-export const showHeadBarStack = stackFactory(ref<boolean>(true))
-export const showRightPanoStack = stackFactory(ref<boolean>(true))
-export const showLeftPanoStack = stackFactory(ref<boolean>(false))
-export const showLeftCtrlPanoStack = stackFactory(ref<boolean>(true))
+import type { FuseModel, Path, TaggingPosition, View } from "@/store";
+export const viewModeStack = stackFactory(ref<"full" | "auto">("auto"));
+export const showToolbarStack = stackFactory(ref<boolean>(false));
+export const showHeadBarStack = stackFactory(ref<boolean>(true));
+export const showRightPanoStack = stackFactory(ref<boolean>(true));
+export const showLeftPanoStack = stackFactory(ref<boolean>(false));
+export const showLeftCtrlPanoStack = stackFactory(ref<boolean>(true));
 export const showModeStack = stackFactory(ref<"pano" | "fuse">("fuse"));
-export const showRightCtrlPanoStack = stackFactory(ref<boolean>(true))
-export const showBottomBarStack = stackFactory(ref<boolean>(false), true)
-export const bottomBarHeightStack = stackFactory(ref<string>('60px'))
-export const showTaggingsStack = stackFactory(ref<boolean>(true))
-export const showPathsStack = stackFactory(ref<boolean>(true))
-export const showPathStack = stackFactory(ref<Path['id']>())
-export const showMeasuresStack = stackFactory(ref<boolean>(true))
-export const currentModelStack = stackFactory(ref<FuseModel | null>(null))
-export const showModelsMapStack = stackFactory(ref<WeakMap<FuseModel, boolean>>(new Map()), true)
-export const modelsChangeStoreStack = stackFactory(ref<boolean>(false))
-export const showTaggingPositionsStack = stackFactory(ref<WeakSet<TaggingPosition>>(new WeakSet()))
-export const currentViewStack = stackFactory(ref<View>())
+export const showRightCtrlPanoStack = stackFactory(ref<boolean>(true));
+export const showBottomBarStack = stackFactory(ref<boolean>(false), true);
+export const bottomBarHeightStack = stackFactory(ref<string>("60px"));
+export const showTaggingsStack = stackFactory(ref<boolean>(true));
+export const showPathsStack = stackFactory(ref<boolean>(true));
+export const showPathStack = stackFactory(ref<Path["id"]>());
+export const showMeasuresStack = stackFactory(ref<boolean>(true));
+export const currentModelStack = stackFactory(ref<FuseModel | null>(null));
+export const showModelsMapStack = stackFactory(
+  ref<WeakMap<FuseModel, boolean>>(new Map()),
+  true
+);
+export const modelsChangeStoreStack = stackFactory(ref<boolean>(false));
+export const showTaggingPositionsStack = stackFactory(
+  ref<WeakSet<TaggingPosition>>(new WeakSet())
+);
+export const currentViewStack = stackFactory(ref<View>());
 
 export const custom = flatStacksValue({
   viewMode: viewModeStack,
@@ -42,40 +47,94 @@ export const custom = flatStacksValue({
   showHeadBar: showHeadBarStack,
   currentView: currentViewStack,
   showMode: showModeStack,
-})
+});
 
+export const params = reactive(
+  strToParams(location.search)
+) as unknown as Params;
+params.caseId = Number(params.caseId);
+params.share = Boolean(Number(params.share));
+params.single = Boolean(Number(params.single));
 
-export const params = reactive(strToParams(location.search)) as unknown as Params
-params.caseId = Number(params.caseId)
-params.share = Boolean(Number(params.share))
-params.single = Boolean(Number(params.single))
+export type Params = {
+  caseId: number;
+  baseURL?: string;
+  modelId?: string;
+  laserRoot: string;
+  panoOSSRoot: string;
+  ossRoot: string;
+  root: string
+  laserOSSRoot: string;
+  service: string;
+  fileUrl?: string;
+  sign?: string;
+  ip: string;
+  type?: string;
+  serviceUrl?: string;
+  testMap?: boolean;
+  title?: string;
+  m?: string;
+  share?: boolean;
+  single?: boolean;
+  static: string;
+  token?: string;
 
-export type Params = { 
-  caseId: number,
-  baseURL?: string,
-  modelId?: string,
-  service: string
-  fileUrl?: string
-  sign?: string
-  type?: string
-  testMap?: boolean
-  title?: string
-  m?: string
-  share?: boolean,
-  single?: boolean
-  token?: string
-}
+  servicePort: string;
+  laserServicePort: string;
+};
 
-export const baseURL = params.baseURL ? params.baseURL : ''
+export const baseURL = params.baseURL ? params.baseURL : "";
 
 export const getResource = (uri: string) => {
-  if (~uri.indexOf('base64') || ~uri.indexOf('bolb') || ~uri.indexOf('//')) return uri
+  if (~uri.indexOf("base64") || ~uri.indexOf("bolb") || ~uri.indexOf("//"))
+    return uri;
 
-  if (uri[0] === '/') {
-    return `${baseURL}${uri}`
+  if (uri[0] === "/") {
+    return `${baseURL}${uri}`;
   } else {
-    return `${baseURL}/${uri}`
+    return `${baseURL}/${uri}`;
   }
-}
+};
 // /fusion
-export const namespace = '/fusion'
+
+if (import.meta.env.DEV) {
+  params.ip = 'http://192.168.0.62'
+  params.static = '/profile'
+  params.laserServicePort = '9008'
+  params.servicePort = '8808'
+} else {
+  params.ip = params.ip || ''
+  params.static = params.static || ''
+  params.laserServicePort = params.laserServicePort || ''
+  params.servicePort = params.servicePort || ''
+}
+
+const ip = params.ip + ':';
+params.root = `${ip}${params.laserServicePort}`
+params.ossRoot = `${ip}${params.laserServicePort}/${params.static}/`
+params.serviceUrl = `${ip}${params.servicePort}/fusion`;
+params.laserRoot = params.root
+
+params.serviceUrl = '/fusion'
+export let namespace = params.serviceUrl;
+
+
+export const getResources = (uri: string) => {
+  if (
+    !params.ossRoot ||
+    ~uri.indexOf('base64') ||
+    ~uri.indexOf('bolb') ||
+    ~uri.indexOf('//')
+  )
+    return uri
+
+  const root = uri.indexOf('/' + params.static) === 0 ? `${ip}${params.laserServicePort}` : params.ossRoot
+  const baseURL = new URL(root)
+  const url = new URL(uri, root)
+  const basePath =
+    baseURL.pathname[baseURL.pathname.length - 1] === '/'
+      ? baseURL.pathname.substring(0, baseURL.pathname.length - 1)
+      : baseURL.pathname
+  url.pathname = basePath + url.pathname
+  return url.href
+}

+ 2 - 2
src/model/app.vue

@@ -1,5 +1,5 @@
 <template>
-  <iframe class="external" :src="url" ref="iframeRef" v-if="url"></iframe>
+  <iframe class="external" :src="getResources(url)" ref="iframeRef" v-if="url"></iframe>
   <div class="laser-layer" v-show="!url">
     <div class="scene-canvas" ref="fuseRef">
       <div id="direction"></div>
@@ -10,7 +10,7 @@
 <script lang="ts">
 import { defineComponent, ref, watchEffect, computed, watch, nextTick } from "vue";
 import { SceneType } from "@/store";
-import { params } from "@/env";
+import { getResources, params } from "@/env";
 import { fuseModel, modelProps } from "./index";
 import { modelSDKFactory } from "./platform";
 import { getToken } from "@/api";

+ 5 - 4
src/model/platform.ts

@@ -20,6 +20,7 @@ import { aMapToWgs84 } from "@/utils/coord";
 
 import type { ModelType } from "./";
 import { offlinePrev } from "@/api/offline";
+import { params } from "@/env";
 
 export async function modelSDKFactory(
   type: ModelType,
@@ -37,10 +38,10 @@ export async function modelSDKFactory(
   if (type === fuseModel) {
     if (!fuseInitialed) {
       await initialSDK({
-        // laserRoot: offline ? offlinePrev : import.meta.env.VITE_LASER_HOST,
-        panoOSSRoot: offline ? offlinePrev : import.meta.env.VITE_PANO_OSS,
-        ossRoot: offline ? offlinePrev : import.meta.env.VITE_OSS,
-        laserOSSRoot: offline ? offlinePrev : import.meta.env.VITE_LASER_OSS,
+        laserRoot: offline ? offlinePrev : params.laserRoot,
+        panoOSSRoot: offline ? offlinePrev : params.panoOSSRoot,
+        ossRoot: offline ? offlinePrev : params.ossRoot,
+        laserOSSRoot: offline ? offlinePrev : params.laserOSSRoot,
         layout: dom,
         scenes: scenes.value,
         lonlat: center,

+ 1 - 1
src/sdk/association/fuseMode.ts

@@ -48,7 +48,7 @@ const setModels = (sdk: SDK, models: FuseModels, oldModels: FuseModels) => {
     if (getSceneModel(item)) {
       continue;
     }
-    console.error('addMode', item.status)
+    console.error('addMode', item)
     if (item.status !== SceneStatus.SUCCESS) {
       item.error = true;
       item.loaded = true;

+ 1 - 1
src/sdk/cover/index.js

@@ -1016,7 +1016,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             }
 
             try {
-                props.url = JSON.parse(props.url) //去掉 '\'
+                props.url = JSON.parse(props.url).toString() //去掉 '\'
             } catch (e) { }
 
             props.done = done; props.progressFun = progressFun; props.onError = onError

+ 2 - 1
src/views/guide/guide/edit-paths.vue

@@ -44,7 +44,7 @@
               @click.stop="deletePath(path)"
               :class="{ disabled: isScenePlayIng }"
             />
-            <img :src="getResource(getFileUrl(path.cover))" />
+            <img :src="getResources(getFileUrl(path.cover))" />
           </div>
           <div class="set-phone-attr" v-if="i !== paths.length - 1">
             <ui-input
@@ -108,6 +108,7 @@ import {
   showRightCtrlPanoStack,
   getResource,
   custom,
+  getResources,
 } from "@/env";
 
 import type { Guide, GuidePaths, GuidePath } from "@/store";

+ 2 - 2
src/views/guide/guide/sign.vue

@@ -2,7 +2,7 @@
   <ui-group-option class="sign-guide">
     <div class="info">
       <div class="guide-cover">
-        <img :src="getResource(getFileUrl(guide.cover))" />
+        <img :src="getResources(getFileUrl(guide.cover))" />
         <ui-icon
           type="preview"
           class="icon"
@@ -38,7 +38,7 @@
 <script setup lang="ts">
 import { Guide, getGuidePaths } from "@/store";
 import { getFileUrl, saveAs } from "@/utils";
-import { getResource } from "@/env";
+import { getResource, getResources } from "@/env";
 import { computed, watchEffect, nextTick, ref } from "vue";
 import { playSceneGuide, isScenePlayIng, pauseSceneGuide } from "@/sdk";
 import { VideoRecorder } from "simaqcore";

+ 3 - 1
src/views/record/shot.vue

@@ -23,7 +23,7 @@
       <div class="video-list" v-if="videoList.length">
         <div class="layout" :style="{ width: `${videoList.length * 130}px` }">
           <div v-for="video in videoList" :key="video.cover" class="cover">
-            <img :src="video.cover" />
+            <img :src="getResources(video.cover)" />
             <ui-icon
               type="preview"
               ctrl
@@ -71,6 +71,7 @@ import {
   bottomBarHeightStack,
   showHeadBarStack,
   showLeftPanoStack,
+  getResources,
 } from "@/env";
 import { appEl } from "@/store";
 import { useViewStack } from "@/hook";
@@ -252,6 +253,7 @@ export default defineComponent({
       complete,
       pause,
       close,
+      getResources,
       start,
       barHeight,
       el: sdk.layout,

+ 3 - 2
src/views/record/sign.vue

@@ -5,7 +5,7 @@
   >
     <div class="content">
       <span class="cover">
-        <img :src="getResource(getFileUrl(record.cover))" alt="" v-if="record.cover" />
+        <img :src="getResources(getFileUrl(record.cover))" alt="" v-if="record.cover" />
         <ui-icon
           type="preview"
           ctrl
@@ -66,7 +66,7 @@ import {
   RecordStatus,
 } from "@/store";
 import { Preview } from "@/components/static-preview/index.vue";
-import { getResource } from "@/env";
+import { getResource, getResources } from "@/env";
 import Shot from "./shot.vue";
 import type { RecordProcess } from "./help";
 import { Message } from "bill/index";
@@ -159,6 +159,7 @@ export default defineComponent({
       inputRef,
       RecordStatus,
       MetaType,
+      getResources,
       isPlayVideo,
       getResource,
       getFileUrl,

+ 2 - 1
src/views/security/link.vue

@@ -1,5 +1,5 @@
 <template>
-  <img :src="getLinkAttr(name, type)" v-if="getLinkAttr(name, type)" @click="cflyLink" />
+  <img :src="getResources(getLinkAttr(name, type)!)" v-if="getLinkAttr(name, type)" @click="cflyLink" />
 
   <Preview
     :items="items"
@@ -14,6 +14,7 @@
 import { ref } from "vue";
 import { getLinkAttr } from "./store";
 import { Preview, MediaItem } from "@/components/static-preview/index.vue";
+import { getResources } from "@/env";
 
 const props = defineProps<{
   name: string;

+ 12 - 12
src/views/setting/index.vue

@@ -3,7 +3,7 @@
     <ui-group :title="$t('setting.initView')" borderBottom>
       <ui-group-option>
         <div class="init-pic" :class="{ disabled: isEdit }">
-          <img :src="getFileUrl(setting!.cover)" class="init-puc-cover" />
+          <img :src="getResources(getFileUrl(setting!.cover))" class="init-puc-cover" />
           <div class="init-pic-set" @click="enterSetPic">{{$t('setting.name')}}</div>
         </div>
       </ui-group-option>
@@ -19,7 +19,7 @@
             :class="{ [back.type]: true, active: setting!.back === back.value }"
             @click="setting!.back !== back.value && changeBack(back.value)"
           >
-            <img :src="back.image" v-if="['img', 'map'].includes(back.type)" />
+            <img :src="getResources(back.image)" v-if="['img', 'map'].includes(back.type)" />
             <i class="iconfont" :class="back.image" v-else-if="back.type === 'icon'" />
             <span :style="{ background: back.image }" v-else></span>
             <p class="back-item-desc">{{ back.label }}</p>
@@ -35,7 +35,7 @@ import { RightFillPano } from "@/layout";
 import { enterEdit, enterOld, setting, isEdit, updataSetting } from "@/store";
 import { ref, watchEffect } from "vue";
 import { togetherCallback, getFileUrl, loadPack } from "@/utils";
-import { showRightPanoStack, showRightCtrlPanoStack, custom } from "@/env";
+import { showRightPanoStack, showRightCtrlPanoStack, custom, params, getResources } from "@/env";
 import { analysisPose, sdk, SettingResourceType } from "@/sdk";
 import { ui18n } from "@/lang";
 
@@ -46,26 +46,26 @@ watchEffect(async () => {
     {
       label: ui18n.t('setting.backs.1'),
       type: "map",
-      image: "/oss/fusion/default/images/map.png",
+      image: params.static + "/fusion/default/images/map.png",
       value: "map",
     },
     {
       label: ui18n.t('setting.backs.2'),
       type: "img",
-      image: "/oss/fusion/default/images/pic_ltby@2x.png",
-      value: "/oss/fusion/default/images/蓝天白云.jpg",
+      image: params.static + "/fusion/default/images/pic_ltby@2x.png",
+      value: params.static + "/fusion/default/images/蓝天白云.jpg",
     },
     {
       label: ui18n.t('setting.backs.3'),
       type: "img",
-      image: "/oss/fusion/default/images/pic_wymb@2x.png",
-      value: "/oss/fusion/default/images/乌云密布.jpg",
+      image: params.static + "/fusion/default/images/pic_wymb@2x.png",
+      value: params.static + "/fusion/default/images/乌云密布.jpg",
     },
     {
       label: ui18n.t('setting.backs.4'),
       type: "img",
-      image: "/oss/fusion/default/images/pic_yk@2x.png",
-      value: "/oss/fusion/default/images/夜空.jpg",
+      image: params.static + "/fusion/default/images/pic_yk@2x.png",
+      value: params.static + "/fusion/default/images/夜空.jpg",
     },
     // {
     //   label: "草地",
@@ -82,8 +82,8 @@ watchEffect(async () => {
     {
       label: ui18n.t('setting.backs.5'),
       type: "img",
-      image: "/oss/fusion/default/images/pic_bw@2x.png",
-      value: "/oss/fusion/default/images/傍晚.jpg",
+      image: params.static + "/fusion/default/images/pic_bw@2x.png",
+      value: params.static + "/fusion/default/images/傍晚.jpg",
     },
     // { label: "灰色", type: "color", image: "#333333", value: "#333" },
     // { label: "黑色", type: "color", image: "#000000", value: "#000" },

+ 2 - 2
src/views/tagging/sign.vue

@@ -5,7 +5,7 @@
     @click="edit && getTaggingIsShow(tagging) && emit('select', true)"
   >
     <div class="info">
-      <img :src="getResource(getFileUrl(findImage))" v-if="findImage" />
+      <img :src="getResources(getFileUrl(findImage))" v-if="findImage" />
       <div>
         <p>{{ tagging.title }}</p>
         <span>{{$t('tagging.pos')}}:{{ positions.length }}</span>
@@ -34,7 +34,7 @@
 <script setup lang="ts">
 import { getFileUrl, getUrlType, MetaType } from "@/utils";
 import { computed, ref, watchEffect, nextTick } from "vue";
-import { getResource, showTaggingPositionsStack } from "@/env";
+import { getResource, getResources, showTaggingPositionsStack } from "@/env";
 import { getTaggingPosNode, sdk } from "@/sdk";
 import {
   getTaggingStyle,

+ 2 - 1
src/views/tagging/styles.vue

@@ -23,7 +23,7 @@
       @click="clickHandler(hotStyle)"
     >
       <span>
-        <img :src="getFileUrl(hotStyle.icon)" />
+        <img :src="getResources(getFileUrl(hotStyle.icon))" />
         <ui-icon
           v-if="!hotStyle.default"
           class="delete"
@@ -61,6 +61,7 @@ import { createTaggingStyle } from "@/store";
 import { ref, computed, defineEmits } from "vue";
 import { Cropper } from "bill/index";
 import { getFileUrl } from "@/utils";
+import { getResources } from "@/env";
 
 const props = defineProps<{
   styles: TaggingStyles;

+ 2 - 2
src/views/view/sign.vue

@@ -2,7 +2,7 @@
   <ui-group-option class="sign" :class="{active}">
     <div class="content">
       <span class="cover" @click="fly">
-        <img :src="getResource(getFileUrl(view.cover))" alt="">
+        <img :src="getResources(getFileUrl(view.cover))" alt="">
       </span>
       <ui-input 
         class="view-title-input"
@@ -33,7 +33,7 @@
 <script lang="ts" setup>
 import { ref, computed, watchEffect } from 'vue'
 import { useFocus } from 'bill/hook/useFocus'
-import { custom, getResource } from '@/env'
+import { custom, getResource, getResources } from '@/env'
 import { deepIsRevise, getFileUrl } from '@/utils'
 import { loadModel, getModelDesc, ModelType, currentModel } from '@/model'
 import { viewToModelType } from '@/store'