tangning недель назад: 3
Родитель
Сommit
7642a0fefe

+ 2 - 1
.env.fire

@@ -6,6 +6,7 @@ VITE_SWKK_URL="https://test.4dkankan.com"
 VITE_SERVICE_URL="https://test.4dkankan.com"
 VITE_SWSS_URL="https://uat-laser.4dkankan.com/uat"
 VITE_LASER_URL="https://uat-laser.4dkankan.com"
-VITE_FDKK_URL="https://uat-laser.4dkankan.com/uat"
+# VITE_FDKK_URL="https://uat-laser.4dkankan.com/uat"
+VITE_FDKK_URL="https://laser.4dkankan.com"
 VITE_DOC_URL="https://192.168.0.25/docs/#/product/huodiao/README"
 VITE_DRAW_URL="http://test-mix3d.4dkankan.com"

+ 3 - 0
src/helper/mount.ts

@@ -118,6 +118,7 @@ export const quiskMountFactory =
             return;
           }
         },
+        destroy: ()=> destroy()
       };
 
       const layoutProps = reactive({
@@ -126,10 +127,12 @@ export const quiskMountFactory =
         show: true,
         ...api,
       });
+      console.log('layoutProps', layoutProps,props)
       const destroy = mountComponent(Dialog, layoutProps, {
         default: () =>
           createVNode(comp, {
             ...props,
+            ...api,
             ref: (v: any) => {
               for (const key in v) {
                 if (dialogPropsKeys.includes(key as any)) {

+ 1 - 1
src/view/case/drawMap/creatMap.vue

@@ -271,7 +271,7 @@ const locateByCoordinates = (lat: number, lng: number) => {
     if (searchResults) {
       searchResults.innerHTML = `
         <div style="padding: 16px; text-align: center; color: #606266;width:345px;height: 106px;border: 1px solid #D9D9D9;">
-          <div style="font-weight: 500; margin-bottom: 8px;color:#67C23A;">经纬度定位成功</div>
+          <div style="font-weight: 500; margin-bottom: 8px;color:#67C23A;">经纬度定位成功2</div>
           <div style="font-size: 14px;color: #A7A7A7;">
             纬度: ${lat}<br/>
             经度: ${lng}

+ 11 - 9
src/view/case/newShare.vue

@@ -9,7 +9,7 @@
     <!-- 上级组织共享权限 -->
     <el-form-item class="org-share-item" label="上级组织共享权限">
       <template #label>
-        <span style="color: red;line-height: 36px;">*</span><span>上级组织共享权限</span>
+        <span v-if="orgSharePerm == 'none' && viewScope == 'login'" style="color: red;line-height: 36px;">*</span><span>上级组织共享权限</span>
       </template>
       <div class="org-share-row">
         <el-select v-model="selectedParentId" placeholder="上级组织名称">
@@ -71,17 +71,17 @@ const shareRef = ref<InstanceType<typeof ShareForm> | null>(null);
 
 // 仅复制公开分享的链接与密码(由子组件进行校验与保存)
 const copyPublicShare = async () => {
-  if (!selectedParentId.value) {
-    ElMessage.error("请选择上级组织");
-    return;
-  }
-  await handleConfirm();
+  // if (!selectedParentId.value) {
+  //   ElMessage.error("请选择上级组织");
+  //   return;
+  // }
+  await handleConfirm(true);
   await (shareRef.value as any)?.submit();
 };
 
 // 确认提交:仅触发接口调用与保存设置
-const handleConfirm = async () => {
-  if (!selectedParentId.value) {
+const handleConfirm = async (showTips = false) => {
+  if (!showTips && !selectedParentId.value) {
     ElMessage.error("请选择上级组织");
     return;
   }
@@ -99,7 +99,9 @@ const handleConfirm = async () => {
     shareAuth: shareAuthVal,
     mapShow: mapShowVal,
   });
-  ElMessage.success("设置已保存");
+  if(!showTips){
+    ElMessage.success("设置已保存");
+  }
   return "success";
 };
 

+ 2 - 1
src/view/mediaLibrary/index.vue

@@ -119,6 +119,7 @@ import { ref, onMounted, watch } from "vue";
 import GroupManage from './groupManage.vue';
 import UploadMedia from './uploadMedia.vue';
 import EditMedia from './editMedia.vue';
+const appId = import.meta.env.VITE_APP_APP;
 
 // 分组列表数据
 const groupList = ref<Array<any>>([]);
@@ -367,7 +368,7 @@ const refreshList = () => {
 // 跳转
 const floadileUrl = (row: any) => {
     if (row.fileType == 3) {
-      let url = `/code/index.html?title=${row.fileName}&app=${appConstant.deptId.toString()}&type=${row.fileFormat}&fileUrl=${row.fileUrl}&isSample=${appConstant.isSample.toString()}#/sign-model`
+      let url = `/code/index.html?fromRoute=${appId}&title=${row.fileName}&app=${appConstant.deptId.toString()}&type=${row.fileFormat}&fileUrl=${row.fileUrl}&isSample=${appConstant.isSample.toString()}#/sign-model`
       return window.open(url);
     } else {
       return window.open(row.fileUrl);

+ 1 - 1
src/view/newFireCase/dyManager/index.vue

@@ -43,7 +43,7 @@ import { getCameraTypeAllList } from "@/store/scene";
 const cameraTypeList = ref([])
 onMounted(() => {
   getCameraTypeAllList().then(res => {
-    cameraTypeList.value = res || []
+    cameraTypeList.value = res.filter(ele => ele.laser) || []
   })
 })
 const params = useScenePaggingParams();

+ 47 - 24
src/view/newFireCase/dyManager/sceneContent.vue

@@ -37,27 +37,27 @@
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
     <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }" width="420px">
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['hash']" @click="downHash(row)">
-        Hash
-      </span>
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['copy']" @click="copySceneHandler(row)">
-        复制
-      </span>
-      <span class="oper-span" v-pdpath="['edit']" @click="openSceneEdit(row, 0)">
-        编辑
-      </span>
-      <span v-pdpath="['gen']" v-if="pagging.state.query.searchType != '1'" class="oper-span" @click="genMeshScene(row)">
-        生成obj
-      </span>
-      <span class="oper-span" v-pdpath="['del']" v-if="pagging.state.query.searchType === '0'" @click="openSceneShareDialog(row)">
-        权限
-      </span>
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['down']" @click="sceneDownloadHandler(row)">
-        下载
-      </span>
-      <span class="oper-span delBtn delete-oper" v-if="pagging.state.query.searchType != '1'" v-pdpath="['del']" @click="delSceneHandler(row)">
-        删除
-      </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1' && row.status != 0 && row.status != 1" v-pdpath="['hash']" @click="downHash(row)">
+          Hash
+        </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1' && row.status != 0 && row.status != 1" v-pdpath="['copy']" @click="copySceneHandler(row)">
+          复制
+        </span>
+        <span class="oper-span" v-if="row.status != 0 && row.status != 1" v-pdpath="['edit']" @click="openSceneEdit(row, 0)">
+          编辑
+        </span>
+        <span v-pdpath="['gen']" v-if="pagging.state.query.searchType != '1' && row.status != 0 && row.status != 1 && row.location != 6" class="oper-span" @click="genMeshScene(row)">
+          生成obj
+        </span>
+        <span class="oper-span" v-pdpath="['del']" v-if="pagging.state.query.searchType === '0' && row.status != 0 && row.status != 1" @click="openSceneShareDialog(row)">
+          权限
+        </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1' && row.status != 0 && row.status != 1" v-pdpath="['down']" @click="sceneDownloadHandler(row)">
+          下载
+        </span>
+        <span class="oper-span delBtn delete-oper" v-if="pagging.state.query.searchType != '1' && row.status != 0" v-pdpath="['del']" @click="delSceneHandler(row)">
+          删除
+        </span>
     </el-table-column>
   </el-table>
 </template>
@@ -82,6 +82,8 @@ import { sceneShare as openSceneShare } from "@/view/case/quisk";
 import { downSceneHash } from "@/request";
 import { SceneTypeDesc } from '@/constant/scene';
 import { transformSWToken } from "@/store/user";
+const testLaserUrl = import.meta.env.VITE_SWSS_URL;
+const LaserUrl = import.meta.env.VITE_FDKK_URL;
 
 const props = defineProps<{ pagging: ScenePagging }>();
 const delSceneHandler = async (scene: QuoteScene) => {
@@ -97,18 +99,39 @@ const copySceneHandler = async (scene: QuoteScene) => {
 const downHash = async (scene: QuoteScene) => {
   downQuoteSceneHash(scene);
 };
-const sceneDownloadHandler = (scene: QuoteScene) => {
-  sceneDownload({ scene });
+const sceneDownloadHandler = async (scene: QuoteScene) => {
+  try {
+  await sceneDownload({ scene });
+  } catch (error) {
+    console.log(error)
+  }
+};
+const genMeshScene = async (scene: QuoteScene) => {
+  if (LocationEnum[scene.location] === "内网") return;
+  await genMeshScene({ num: scene.num });
+  props.pagging.refresh();
 };
 
 const openSceneEdit = async (scene: QuoteScene, type: any) => {
   const token = await transformSWToken(scene, type);
   if (!token) return;
   const isTest = window.location.host.includes("localhost") || window.location.host.includes("test");
-  const base = isTest ? "https://test.4dkankan.com" : "https://4dkankan.com";
+  let base = isTest ? "https://test.4dkankan.com" : "https://4dkankan.com";
+  if(scene.isObj === 0){
+    base = isTest ? testLaserUrl : LaserUrl;
+    window.open(`${base}/index.html?m=${scene.num}&token=${token}`, "_blank");
+    return
+  }
   window.open(`${base}/epg.html?m=${scene.num}&token=${token}`, "_blank");
 };
 
+const openLaserSceneEdit = async (scene: QuoteScene, type: any) => {
+  const token = await transformSWToken(scene, type);
+  if (!token) return;
+  const isTest = window.location.host.includes("localhost") || window.location.host.includes("test");
+  const base = isTest ? "https://test.4dkankan.com" : "https://4dkankan.com";
+  window.open(`${base}/epg.html?m=${scene.num}&token=${token}`, "_blank");
+};
 // 权限弹窗:与 mesh 列表一致,传入 num 与 isObj
 const openSceneShareDialog = async (scene: QuoteScene) => {
   const isObj = (scene as any).isObj ?? Number(![SceneType.SWSS, SceneType.SWYDSS].includes(scene.type as any));

+ 5 - 4
src/view/newFireCase/dyManager/sceneDownload.vue

@@ -4,7 +4,6 @@
     <div class="title">
       {{ stateTitle[state] }}
     </div>
-
     <div v-if="state === State.package">
       <div class="text" style="display: flex; justify-content: space-between; margin-top: 15px">
         <span>{{ filename }}</span>
@@ -28,7 +27,9 @@ import { ElLoading, ElMessage } from "element-plus";
 import { QuoteScene, SceneType } from "@/store/scene";
 import { QuiskExpose } from "@/helper/mount";
 
-const props = defineProps<{ scene: QuoteScene }>();
+const props = defineProps<{ scene: QuoteScene, onQuit: any }>();
+console.log(props);
+
 enum State {
   uncreate,
   package,
@@ -101,8 +102,8 @@ const download = () => {
         downloadURL.value = "/" + downloadURL.value;
       }
     }
-    console.error("downloadURL.value", downloadURL.value);
-    return saveAs(downloadURL.value, filename.value);
+    saveAs(downloadURL.value, filename.value);
+    return props.onQuit()
   }
 };
 

+ 1 - 1
src/view/newFireCase/meshManager/index.vue

@@ -43,7 +43,7 @@ import { getCameraTypeAllList } from "@/store/scene";
 const cameraTypeList = ref([])
 onMounted(() => {
   getCameraTypeAllList().then(res => {
-    cameraTypeList.value = res || []
+    cameraTypeList.value = res.filter(ele => ele.mesh) || []
   })
 })
 

+ 18 - 18
src/view/newFireCase/meshManager/sceneContent.vue

@@ -37,24 +37,24 @@
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
     <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }" width="340px">
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['hash']" @click="downHash(row)">
-        Hash
-      </span>
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['copy']" @click="copySceneHandler(row)">
-        复制
-      </span>
-      <span class="oper-span" v-pdpath="['edit']" @click="openSceneEdit(row, 1)">
-        编辑
-      </span>
-      <span class="oper-span" v-pdpath="['del']" v-if="pagging.state.query.searchType === '0'" @click="genMeshScene(row)">
-        权限
-      </span>
-      <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['down']" @click="sceneDownloadHandler(row)">
-        下载
-      </span>
-      <span class="oper-span delBtn delete-oper" v-if="pagging.state.query.searchType != '1'" v-pdpath="['del']" @click="delSceneHandler(row)">
-        删除
-      </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['hash']" @click="downHash(row)">
+          Hash
+        </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['copy']" @click="copySceneHandler(row)">
+          复制
+        </span>
+        <span class="oper-span" v-pdpath="['edit']" @click="openSceneEdit(row, 1)">
+          编辑
+        </span>
+        <span class="oper-span" v-pdpath="['del']" v-if="pagging.state.query.searchType === '0'" @click="genMeshScene(row)">
+          权限
+        </span>
+        <span class="oper-span" v-if="pagging.state.query.searchType != '1'" v-pdpath="['down']" @click="sceneDownloadHandler(row)">
+          下载
+        </span>
+        <span class="oper-span delBtn delete-oper" v-if="pagging.state.query.searchType != '1'" v-pdpath="['del']" @click="delSceneHandler(row)">
+          删除
+        </span>
     </el-table-column>
   </el-table>
 </template>

+ 12 - 2
src/view/newFireCase/newFireDetails/components/basicInfo.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="basic-info">
+    <div class="caseTitle">案件信息</div>
     <!-- 展示模式:按来源路由分支展示 -->
     <div class="show-view-content" v-if="props.editOrShow === 'show'">
       <!-- criminal 展示 -->
@@ -62,12 +63,13 @@
               placeholder="请输入起火对象"
             />
           </el-form-item>
-          <el-form-item label="详细地址" class="mandatory">
+          <el-form-item label="详细地址">
             <el-input
               v-model="bindFire.mapUrl"
               placeholder="输入名称搜索"
               clearable
               readonly
+              disabled
               class="mandatory"
             >
               <template #append>
@@ -418,13 +420,21 @@ const handleMapConfirm = (LocationInfo: any) => {
   .show-view-content{
     height: calc(100% - 20px);
   }
+  .caseTitle{
+    width: 60%;
+    text-align: center;
+    background: #FFFFFF;
+    margin: 0 auto;
+    padding: 48px 140px 0px 140px;
+    font-size: 24px;
+  }
 }
 .camera-from {
   width: 60%;
   height: calc(100% - 185px);
   background: #FFFFFF;
   margin: 0 auto;
-  padding: 48px 140px 48px 140px;
+  padding: 40px 140px 48px 140px;
   .all-content{
     height: calc(100% - 0px);
     padding-right: 60px;

+ 15 - 2
src/view/newFireCase/newFireDetails/components/creatMap.vue

@@ -271,7 +271,7 @@ const locateByCoordinates = (lat: number, lng: number) => {
     if (searchResults) {
       searchResults.innerHTML = `
         <div style="padding: 16px; text-align: center; color: #606266;width:345px;height: 106px;border: 1px solid #D9D9D9;">
-          <div style="font-weight: 500; margin-bottom: 8px;color:#67C23A;">经纬度定位成功</div>
+          <div style="font-weight: 500; margin-bottom: 8px;color:#67C23A;">经纬度定位成功1</div>
           <div style="font-size: 14px;color: #A7A7A7;">
             纬度: ${lat}<br/>
             经度: ${lng}
@@ -279,7 +279,19 @@ const locateByCoordinates = (lat: number, lng: number) => {
         </div>
       `
     }
-    
+    // var geocoder = new AMap.Geocoder({
+    //     city: "", //城市设为北京,默认:“全国”
+    //     radius: 1000 //范围,默认:500
+    // });
+    // geocoder.getAddress(lngLat, function(status, result) {
+    //         if (status === 'complete'&&result.regeocode) {
+    //             var address = result.regeocode.formattedAddress;
+    //             console.log('经纬度定位address:', address)
+    //         }else{
+    //           ElMessage.success('根据经纬度查询地址失败')
+    //         }
+    //     });
+    console.log('经纬度定位:', searchResults)
     ElMessage.success('经纬度定位成功')
   } catch (error) {
     console.error('经纬度定位失败:', error)
@@ -506,6 +518,7 @@ const getCanvasImage = async (): Promise<{url: string, fileName: string} | null>
 // 处理确认选择
 const handleConfirm = async () => {
   try {
+    console.error('保存方位图失败:', selectedLocation.value)
     emit('confirm', selectedLocation.value)
     handleClose()
   } catch (error) {

+ 1 - 1
src/view/newFireCase/newFireDetails/components/headerTop.vue

@@ -34,7 +34,7 @@
     class="rename-dialog"
   >
     <div class="dialog-content">
-      <el-input v-model="renameTitle" placeholder="请输入新的标题" />
+      <el-input v-model="renameTitle" maxlength="100" placeholder="请输入新的标题" />
     </div>
     <template #footer>
       <el-button plain type="primary" @click="renameVisible = false">取消</el-button>

+ 6 - 0
src/view/organization/detail.vue

@@ -25,6 +25,12 @@
 <script setup lang="ts">
 import { deptTypeDesc } from "@/constant/organization";
 import { Organization } from "@/store/organization";
+import { QuiskExpose } from "@/helper/mount";
 
 const props = defineProps<{ dept: Organization }>();
+defineExpose<QuiskExpose>({
+  async submit() {
+    return true;
+  },
+});
 </script>

+ 1 - 0
src/view/organization/edit.vue

@@ -126,6 +126,7 @@ defineExpose<QuiskExpose>({
     await (bindDept.value.id
       ? setOrganization(bindDept.value, superiorValue.value)
       : addOrganization(bindDept.value, superiorValue.value));
+    return true;
   },
 });
 

+ 9 - 9
src/view/system/login.vue

@@ -29,7 +29,7 @@
               <img
                 v-if="flag"
                 @click="flag = !flag"
-                style="width: 20px; margin: 15px"
+                style="width: 20px; margin: 15px;"
                 src="@/assets/image/pasword.png"
                 alt=""
               />
@@ -251,14 +251,14 @@ const submitClick = async () => {
   }
 
   .more a:first-child::after {
-    content: "";
-    position: absolute;
-    right: -5px;
-    width: 1px;
-    height: 8px;
-    background: #dcdee0;
-    top: 50%;
-    transform: translateY(-50%);
+    //content: "";
+    //position: absolute;
+    //right: -5px;
+    //width: 1px;
+    //height: 8px;
+    //background: #dcdee0;
+    //top: 50%;
+    //transform: translateY(-50%);
   }
 }
 

+ 133 - 28
yarn.lock

@@ -43,6 +43,111 @@
   resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
   integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
 
+"@esbuild/android-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
+  integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
+
+"@esbuild/android-arm@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
+  integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
+
+"@esbuild/android-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
+  integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
+
+"@esbuild/darwin-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
+  integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
+
+"@esbuild/darwin-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
+  integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
+
+"@esbuild/freebsd-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
+  integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
+
+"@esbuild/freebsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
+  integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
+
+"@esbuild/linux-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
+  integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
+
+"@esbuild/linux-arm@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
+  integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
+
+"@esbuild/linux-ia32@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
+  integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
+
+"@esbuild/linux-loong64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
+  integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
+
+"@esbuild/linux-mips64el@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
+  integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
+
+"@esbuild/linux-ppc64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
+  integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
+
+"@esbuild/linux-riscv64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
+  integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
+
+"@esbuild/linux-s390x@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
+  integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
+
+"@esbuild/linux-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
+  integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
+
+"@esbuild/netbsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
+  integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
+
+"@esbuild/openbsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
+  integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
+
+"@esbuild/sunos-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
+  integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
+
+"@esbuild/win32-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
+  integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
+
+"@esbuild/win32-ia32@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
+  integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
+
 "@esbuild/win32-x64@0.18.20":
   version "0.18.20"
   resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz"
@@ -92,7 +197,7 @@
   resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz"
   integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
 
-"@types/lodash-es@*", "@types/lodash-es@^4.17.6":
+"@types/lodash-es@^4.17.6":
   version "4.17.12"
   resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz"
   integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
@@ -104,7 +209,7 @@
   resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.7.tgz"
   integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==
 
-"@types/node@^20.4.5", "@types/node@>= 14":
+"@types/node@^20.4.5":
   version "20.16.5"
   resolved "https://registry.npmmirror.com/@types/node/-/node-20.16.5.tgz"
   integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==
@@ -136,14 +241,14 @@
   resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz"
   integrity sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==
 
-"@volar/language-core@~1.11.1", "@volar/language-core@1.11.1":
+"@volar/language-core@1.11.1", "@volar/language-core@~1.11.1":
   version "1.11.1"
   resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz"
   integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==
   dependencies:
     "@volar/source-map" "1.11.1"
 
-"@volar/source-map@~1.11.1", "@volar/source-map@1.11.1":
+"@volar/source-map@1.11.1", "@volar/source-map@~1.11.1":
   version "1.11.1"
   resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz"
   integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==
@@ -181,7 +286,7 @@
     estree-walker "^2.0.2"
     source-map-js "^1.2.0"
 
-"@vue/compiler-dom@^3.3.0", "@vue/compiler-dom@3.5.8":
+"@vue/compiler-dom@3.5.8", "@vue/compiler-dom@^3.3.0":
   version "3.5.8"
   resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.8.tgz"
   integrity sha512-GUNHWvoDSbSa5ZSHT9SnV5WkStWfzJwwTd6NMGzilOE/HM5j+9EB9zGXdtu/fCNEmctBqMs6C9SvVPpVPuk1Eg==
@@ -189,7 +294,7 @@
     "@vue/compiler-core" "3.5.8"
     "@vue/shared" "3.5.8"
 
-"@vue/compiler-sfc@^3.5.4", "@vue/compiler-sfc@3.5.8":
+"@vue/compiler-sfc@3.5.8", "@vue/compiler-sfc@^3.5.4":
   version "3.5.8"
   resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.8.tgz"
   integrity sha512-taYpngQtSysrvO9GULaOSwcG5q821zCoIQBtQQSx7Uf7DxpR6CIHR90toPr9QfDD2mqHQPCSgoWBvJu0yV9zjg==
@@ -265,7 +370,7 @@
     "@vue/compiler-ssr" "3.5.8"
     "@vue/shared" "3.5.8"
 
-"@vue/shared@^3.3.0", "@vue/shared@3.5.8":
+"@vue/shared@3.5.8", "@vue/shared@^3.3.0":
   version "3.5.8"
   resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.8.tgz"
   integrity sha512-mJleSWbAGySd2RJdX1RBtcrUBX6snyOc0qHpgk3lGi4l9/P/3ny3ELqFWqYdkXIwwNN/kdm8nD9ky8o6l/Lx2A==
@@ -279,7 +384,7 @@
     "@vueuse/shared" "10.11.1"
     vue-demi ">=0.14.8"
 
-"@vueuse/core@^10.11.0", "@vueuse/core@10.11.1":
+"@vueuse/core@10.11.1", "@vueuse/core@^10.11.0":
   version "10.11.1"
   resolved "https://registry.npmmirror.com/@vueuse/core/-/core-10.11.1.tgz"
   integrity sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==
@@ -812,6 +917,11 @@ form-data@^4.0.0:
     combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
+fsevents@~2.3.2:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
 function-bind@^1.1.2:
   version "1.1.2"
   resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz"
@@ -1168,7 +1278,7 @@ local-pkg@^0.5.0:
     mlly "^1.4.2"
     pkg-types "^1.0.3"
 
-lodash-es@*, lodash-es@^4.17.21:
+lodash-es@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
@@ -1178,7 +1288,7 @@ lodash-unified@^1.0.2:
   resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz"
   integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
 
-lodash@*, lodash@^4.17.21:
+lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1417,9 +1527,8 @@ proxy-from-env@^1.1.0:
   resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
   integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
 
-"public-service@file:":
+"public-service@file:.":
   version "0.0.0"
-  resolved "file:"
   dependencies:
     "@amap/amap-jsapi-loader" "^1.0.1"
     "@element-plus/icons-vue" "^2.1.0"
@@ -1432,9 +1541,10 @@ proxy-from-env@^1.1.0:
     element-plus "^2.3.8"
     html2canvas "^1.4.1"
     js-base64 "^3.7.5"
+    js-md5 "^0.8.3"
     mime "^3.0.0"
     mitt "^3.0.1"
-    public-service "file:"
+    public-service "file:C:/Users/13047/AppData/Local/Yarn/Cache/v6/npm-public-service-0.0.0-00dec2b4-274c-4f46-9c7b-91302cebb983-1767946847373/node_modules/public-service"
     qrcode.vue "^3.4.1"
     qs "^6.11.2"
     sass "^1.64.2"
@@ -1511,7 +1621,7 @@ resolve@^1.10.0:
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
-rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^3.27.1:
+rollup@^3.27.1:
   version "3.29.5"
   resolved "https://registry.npmmirror.com/rollup/-/rollup-3.29.5.tgz"
   integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==
@@ -1553,7 +1663,7 @@ safe-regex-test@^1.1.0:
     es-errors "^1.3.0"
     is-regex "^1.2.1"
 
-sass@*, sass@^1.64.2:
+sass@^1.64.2:
   version "1.79.3"
   resolved "https://registry.npmmirror.com/sass/-/sass-1.79.3.tgz"
   integrity sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==
@@ -1567,7 +1677,7 @@ screenfull@^6.0.2:
   resolved "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz"
   integrity sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==
 
-semver@^5.5.0, "semver@2 || 3 || 4 || 5":
+"semver@2 || 3 || 4 || 5", semver@^5.5.0:
   version "5.7.2"
   resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
   integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
@@ -1678,7 +1788,7 @@ sortablejs@^1.15.2:
   resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.3.tgz"
   integrity sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==
 
-source-map-js@^1.2.0, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0":
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz"
   integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -1790,7 +1900,7 @@ to-fast-properties@^2.0.0:
   resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
   integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
 
-tslib@^2.1.0, tslib@2.3.0:
+tslib@2.3.0, tslib@^2.1.0:
   version "2.3.0"
   resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
   integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
@@ -1840,7 +1950,7 @@ typed-array-length@^1.0.7:
     possible-typed-array-names "^1.0.0"
     reflect.getprototypeof "^1.0.6"
 
-typescript@*, typescript@^5.0.2:
+typescript@^5.0.2:
   version "5.6.2"
   resolved "https://registry.npmmirror.com/typescript/-/typescript-5.6.2.tgz"
   integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==
@@ -1907,7 +2017,7 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
-"vite@^4.0.0 || ^5.0.0", vite@^4.4.5:
+vite@^4.4.5:
   version "4.5.5"
   resolved "https://registry.npmmirror.com/vite/-/vite-4.5.5.tgz"
   integrity sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==
@@ -1923,12 +2033,7 @@ vue-cropper@^1.0.9:
   resolved "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.1.4.tgz"
   integrity sha512-5m98vBsCEI9rbS4JxELxXidtAui3qNyTHLHg67Qbn7g8cg+E6LcnC+hh3SM/p94x6mFh6KRxT1ttnta+wCYqWA==
 
-vue-demi@*:
-  version "0.14.10"
-  resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz"
-  integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
-
-vue-demi@>=0.14.8:
+vue-demi@*, vue-demi@>=0.14.8:
   version "0.14.10"
   resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz"
   integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
@@ -1940,7 +2045,7 @@ vue-draggable-plus@^0.5.0:
   dependencies:
     "@types/sortablejs" "^1.15.8"
 
-vue-router@^4.2.4, vue-router@>=4.0.0-rc.1:
+vue-router@^4.2.4:
   version "4.4.5"
   resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz"
   integrity sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==
@@ -1964,7 +2069,7 @@ vue-tsc@^1.8.5:
     "@vue/language-core" "1.8.27"
     semver "^7.5.4"
 
-"vue@^2.7.0 || ^3.2.25", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@3.5.8:
+vue@^3.3.4:
   version "3.5.8"
   resolved "https://registry.npmmirror.com/vue/-/vue-3.5.8.tgz"
   integrity sha512-hvuvuCy51nP/1fSRvrrIqTLSvrSyz2Pq+KQ8S8SXCxTWVE0nMaOnSDnSOxV1eYmGfvK7mqiwvd1C59CEEz7dAQ==