Pārlūkot izejas kodu

Merge branch 'master' of http://192.168.0.115:3000/bill/traffic-laser

xzw 2 gadi atpakaļ
vecāks
revīzija
14e16273d7

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
server/test/SS-t-P1d6CwREny2/attach/sceneStore


+ 2 - 2
src/components/fill-slide/index.vue

@@ -15,7 +15,7 @@
           <template v-if="$slots.default">
             <slot :data="raw" />
           </template>
-          <img :src="getStaticFile(getURL ? getURL(raw) : raw.url)" class="image" v-else />
+          <img :src="useStaticUrl(getURL ? getURL(raw) : raw.url).value" class="image" v-else />
         </template>
       </ui-slide>
     </div>
@@ -27,7 +27,7 @@
 
 <script lang="ts" setup>
 import UiSlide from "@/components/base/components/slide/index.vue";
-import {getStaticFile} from "@/dbo/main";
+import {useStaticUrl} from '@/hook/useStaticUrl'
 import UiIcon from "@/components/base/components/icon/index.vue";
 
 type Item = {url: string}

+ 2 - 2
src/components/photos/index.vue

@@ -8,7 +8,7 @@
           @click="selectMode ? changeSelects(photo, !selects.includes(photo)) : $emit('update:active', photo)"
       >
         <div class="img-layout">
-          <img :src="getStaticFile(getURL ? getURL(photo) : photo.url)" />
+          <img :src="useStaticUrl(getURL ? getURL(photo) : photo.url).value" />
           <ui-input
               width="24px"
               height="24px"
@@ -26,7 +26,7 @@
   </div>
 </template>
 <script setup lang="ts">
-import {getStaticFile} from "@/dbo/main";
+import { useStaticUrl } from '@/hook/useStaticUrl'
 import UiInput from "@/components/base/components/input/index.vue";
 
 type Item = { url: string, id: string }

+ 1 - 4
src/dbo/local.ts

@@ -8,10 +8,7 @@ import Interfaces from "./interfaces";
 const params = useParams();
 params.m = params.m || (window as any).num || "SS-t-4pMXagRDjk";
 
-const baseURL =
-  (import.meta.env.VITE_API_BASE_URL
-    ? `/${import.meta.env.VITE_API_BASE_URL}`
-    : "") + `/${params.m}`;
+export const baseURL = import.meta.env.VITE_API_BASE_URL ? `/${import.meta.env.VITE_API_BASE_URL}/${params.m}` : "";
 const spliceUrl = "---";
 setSpliceUrl(spliceUrl);
 setStaticPrefix(baseURL);

+ 3 - 3
src/hook/useGraphic.ts

@@ -4,7 +4,7 @@ import VectorType from '@/graphic/enum/VectorType'
 import UIType from '@/graphic/enum/UIEvents'
 import type {RoadPhoto} from '@/store/roadPhotos'
 import type {AccidentPhoto} from '@/store/accidentPhotos'
-import {getStaticFile} from "@/dbo/main";
+import {api} from "@/store/sync";
 
 export type UITypeT = typeof UIType
 export type VectorTypeT = typeof VectorType
@@ -49,13 +49,13 @@ export const setCanvas = async (canvas: HTMLCanvasElement, data: Ref<AccidentPho
     drawRef.value = model.structureDraw(canvas, newsletter, graphicState);
     watch(
       () => data.value?.id,
-      (id, oldId) => {
+      async (id, oldId) => {
         if (data.value) {
           oldId && drawRef.value.load.clear()
           console.log("load", data.value)
           drawRef.value.load.load(data.value.data, {
             ...data.value.sceneData,
-            backImage: getStaticFile(data.value.photoUrl)
+            backImage: await api.getFile(data.value.photoUrl)
           })
         } else {
           drawRef.value.load.clear()

+ 17 - 0
src/hook/useStaticUrl.ts

@@ -0,0 +1,17 @@
+import {api} from '@/store/sync'
+import {Ref, ref} from "vue";
+
+const cache = new Map<string, Ref<string>>()
+export const useStaticUrl = (url) => {
+  if (cache.has(url)) {
+    return cache.get(url);
+  } else {
+    const realUrl = ref<string>()
+    api.getFile(url)
+      .then(data => {
+        realUrl.value = data
+        cache.set(url, realUrl)
+      })
+    return realUrl
+  }
+}

+ 1 - 0
src/sdk/types/sdk.ts

@@ -327,6 +327,7 @@ export type LaserSDKProps = {
   num: string;
   webSite: string;
   isDebug?: boolean;
+  getFileUrl: (url: string) => Promise<string>
   axios: any;
   basePath: string;
 };

+ 18 - 18
src/store/sync.ts

@@ -6,13 +6,14 @@ import {fixPoints} from "@/store/fixPoint";
 import {photos} from "@/store/photos";
 import {accidentPhotos} from "@/store/accidentPhotos";
 import {roadPhotos} from "@/store/roadPhotos";
-import {debounce, getId} from '@/utils'
+import {blobToBase64, debounce, getId} from '@/utils'
 import {watch} from "vue";
 import {params} from "@/hook";
-import router from "@/router";
+import router, {writeRouteName} from "@/router";
+import { baseURL } from '@/dbo/local'
 
 const global = window as any
-const api = import.meta.env.DEV && !global.android
+export const api = import.meta.env.DEV && !global.android
 // const api = import.meta.env.DEV
   ? {
       async setStore(data) {
@@ -27,13 +28,17 @@ const api = import.meta.env.DEV && !global.android
           headers: { "Content-Type": "multipart/form-data" },
           method: 'post',
           data: { file }
-        })).data.data
+        })).data.data as string
       },
       async downloadImage(file) {
         window.open(URL.createObjectURL(file))
       },
-      closePage() {
-
+      async getFile(url) {
+        const data = await axios.get(url,{responseType:'blob'})
+        return blobToBase64(data.data)
+      },
+      async closePage() {
+        return router.push({ name: writeRouteName.scene })
       }
     }
   : {
@@ -57,27 +62,23 @@ const api = import.meta.env.DEV && !global.android
         global.android.getSceneStore(params.m + "/store.json")
       })
     },
-    getImage(fileUrl) {
-      return new Promise(resolve => {
+    getFile(fileUrl) {
+      return new Promise<string>(resolve => {
         global.getImageCallback = resolve
-        // file为base64
         global.android.getImage(fileUrl)
-        //   File://
       })
     },
-    uploadImage(file) {
-      return new Promise(resolve => {
+    uploadImage(file: File) {
+      return new Promise<string>(resolve => {
         global.uploadImageCallback = resolve
-        // file为base64
-        global.android.uploadImage(params.m + "file.img", file)
-      //   File://
+        global.android.uploadImage(params.m + "/" + file.name, file)
       })
     },
-    downloadImage(file) {
+    downloadImage(file: File) {
       return new Promise(resolve => {
         global.downloadImageCallback = resolve
         // file为base64
-        global.android.downloadImage(params.m, file)
+        global.android.downloadImage(file.name, file)
       })
     },
     closePage() {
@@ -85,7 +86,6 @@ const api = import.meta.env.DEV && !global.android
         global.closeWebViewCallback = resolve
         global.android.closeWebView()
       })
-
     }
   }
 

+ 15 - 0
src/utils/index.ts

@@ -526,6 +526,21 @@ export const base64ToBlob = (base64Data: string) => {
   });
 };
 
+export const blobToBase64 = (blob: Blob) => {
+  return new Promise((resolve, reject) => {
+    const fileReader = new FileReader();
+    fileReader.onload = (e) => {
+      resolve(e.target.result);
+    };
+    // readAsDataURL
+    fileReader.readAsDataURL(blob);
+    fileReader.onerror = () => {
+      reject(new Error('blobToBase64 error'));
+    };
+  });
+}
+
+
 
 export const getId = () => {
   return (new Date()).getTime().toString() + Math.ceil(Math.random() * 1000).toString()

+ 2 - 2
src/views/accidents/print.vue

@@ -16,7 +16,7 @@
       <div class="content" ref="layoutRef">
         <div v-for="accidentPhoto in genAccidentPhotos" :key="accidentPhoto.id" class="item">
           <h4>{{accidentPhoto.title}}</h4>
-          <img :src="getStaticFile(accidentPhoto.url)">
+          <img :src="useStaticUrl(accidentPhoto.url).value">
         </div>
       </div>
     </div>
@@ -30,7 +30,7 @@ import {computed, ref} from "vue";
 import html2canvas from "html2canvas";
 import {router, writeRouteName} from "@/router";
 import {AccidentPhoto, accidentPhotos} from "@/store/accidentPhotos";
-import {getStaticFile} from "@/dbo/main";
+import {useStaticUrl} from "@/hook/useStaticUrl";
 import {downloadImage} from "@/store/sync";
 import Message from "@/components/base/components/message/message.vue";
 

+ 2 - 2
src/views/graphic/geos/magnifier.vue

@@ -20,7 +20,7 @@ import {uploadImage} from '@/store/sync'
 import {drawRef, FocusVector, uiType, UIType} from '@/hook/useGraphic'
 import {computed, ref, watch} from "vue";
 import {dataService} from "@/graphic/Service/DataService";
-import {getStaticFile} from "@/dbo/main";
+import {api} from "@/store/sync";
 import GeoActions from "@/graphic/enum/GeoActions";
 
 const props = defineProps<{geo: FocusVector}>()
@@ -48,7 +48,7 @@ const menus = [
 watch(
   () => [file.value],
   async ([blob]) => {
-    syncVector(getStaticFile(await uploadImage(blob)))
+    syncVector(await api.getFile(await uploadImage(blob)))
   }
 )
 

+ 2 - 2
src/views/roads/tabulation.vue

@@ -79,7 +79,7 @@
             <td class="image" colspan="6" height="360">
               <div class="photo-layout">
                 <img
-                    :src="getStaticFile(roadPhoto.url)"
+                    :src="useStaticUrl(roadPhoto.url).value"
                     @blur="history.push"
                     class="photo"
                     :style="{transform: photoCSSMatrix}"
@@ -129,7 +129,7 @@ import { formatDate } from "@/utils";
 import {computed, nextTick, ref} from "vue";
 import { useHistory } from '@/hook/useHistory'
 import {roadPhotos, RoadPhoto, getDefaultTable} from "@/store/roadPhotos";
-import {getStaticFile} from "@/dbo/main";
+import {useStaticUrl} from "@/hook/useStaticUrl";
 import html2canvas from 'html2canvas'
 import UiButton from "@/components/base/components/button/index.vue";
 import UiInput from "@/components/base/components/input/index.vue";

+ 2 - 0
src/views/scene/container.vue

@@ -12,6 +12,7 @@ import {currentApp} from "@/store/app";
 import {axios} from "@/dbo/";
 import {Loading} from '@kankan/components/index'
 import {Mode} from "@/sdk";
+import {api} from "@/store/sync";
 
 const emit = defineEmits<{ (e: 'loaded'): void }>()
 const sceneLayoutRef = ref<HTMLCanvasElement>();
@@ -23,6 +24,7 @@ onMounted(async () => {
       num: useParams().m,
       store: store,
       isDebug: useParams().test,
+      getFileUrl: api.getFile,
       webSite: "",
       axios,
       basePath: currentApp.basePath,

+ 8 - 6
src/views/scene/photo.vue

@@ -27,14 +27,16 @@ import { useSDK } from '@/hook/useLaser'
 import {genUseLoading} from "@/hook";
 import {base64ToBlob, getId} from "@/utils";
 import {nextTick, ref} from "vue";
-import {getStaticFile} from '@/dbo/main'
-import {uploadImage} from "@/store/sync";
+import {api, uploadImage} from "@/store/sync";
 import {router, writeRouteName} from "@/router";
 import {Pos, Pos3D} from "@/sdk";
 
-const showCoverUrl = ref<string>(
-  photos.value[photos.value.length - 1]?.url && getStaticFile(photos.value[photos.value.length - 1]?.url)
-)
+const showCoverUrl = ref<string>()
+if (photos.value[photos.value.length - 1]?.url) {
+  api.getFile(photos.value[photos.value.length - 1]?.url)
+    .then(url => showCoverUrl.value = url)
+}
+
 const tempPhoto = ref<string>();
 const coverRef = ref<HTMLImageElement>()
 const getCurrentScreens = (poss: Array<Pos3D>): Array<Pos> => {
@@ -85,7 +87,7 @@ const photo = genUseLoading(async () => {
       fixPoints: getCurrentScreens(fixPoints.value.map(data => data.pos)),
       basePoints: getCurrentScreens(basePoints.value.map(data => data.pos))
     })
-    showCoverUrl.value = getStaticFile(url)
+    showCoverUrl.value = await api.getFile(url)
     dom.style.pointerEvents = "all"
     baseLines.value.concat(list.value).forEach(item => {
       item.show = true