Kaynağa Gözat

导出确权pdf

shuhao 4 ay önce
ebeveyn
işleme
2dca4a7a55

+ 1 - 0
package.json

@@ -41,6 +41,7 @@
     "vue-fontawesome": "^0.0.2",
     "vue-router": "^4.1.0",
     "vue3-openlayers": "^0.1.74",
+    "vue3-print-nb": "^0.1.4",
     "vuedraggable": "^2.24.3",
     "vueshowpdf": "^1.1.2",
     "vuex": "^4.0.2",

+ 3 - 2
src/main.js

@@ -22,6 +22,7 @@ import App from "@/App.vue";
 import router from "@/router";
 import 'video.js/dist/video-js.css'
 import '@/common/rem'
+import Print from 'vue3-print-nb'
 
 const app = createApp(App);
 app.use(mock)
@@ -31,8 +32,8 @@ app.use(mock)
     .use(router)
     .use(axios, { router, store, opt: "VE_API" })
     .use(permission, { router, store })
-    .use(directives, { router, store });
-
+    .use(directives, { router, store })
+    .use(Print);
 
 
 app.mount("#app");

+ 13 - 0
src/utils/map.js

@@ -7,6 +7,8 @@ import Draw from "ol/interaction/Draw";
 import Text from "ol/style/Text";
 import Icon from "ol/style/Icon";
 import {Circle, Fill, Stroke, Style} from 'ol/style.js';
+import * as proj from "ol/proj";
+import {getArea} from "ol/sphere.js";
 
 /*
  * @Author: your name
@@ -189,4 +191,15 @@ export const redBoxStyle = ()=>{
     return style
 }
 
+export const getAreaByWkt = (wkt)=>{
+    let area = 0;
+    let geom = new WKT().readGeometry(wkt)
+    // 获取图层上的Polygon,转成geoJson用于回显
+    geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:3857"));
+    let areaItem = getArea(geom);
+    areaItem = (areaItem + areaItem / 2) / 1000;
+    area = areaItem;
+    return area.toFixed(2)
+}
+
 

+ 3 - 1
src/utils/ol-map/VectorLayer.js

@@ -14,7 +14,9 @@ class VectorLayer {
    * @param {string} zIndex 图层层级
   */
   constructor(name,zIndex,options){
-    let source = new Source({})
+    let source = new Source({
+      crossOrigin:'anonymous',
+    })
     let ShowLevel = Common.ShowLevel
     let minZoom = ShowLevel[0]
     let maxZoom = ShowLevel[1]

+ 1 - 0
src/utils/ol-map/WMTSLayer.js

@@ -41,6 +41,7 @@ class WMTSLayer extends LTBaseObject{
         matrixSet: wmtsData.matrixSet,
         format: 'tiles',
         projection: projection,
+		crossOrigin:'anonymous',
         tileGrid: new WMTSTileGrid({
             origin: olExtent.getTopLeft(projectionExtent),
             resolutions: resolutions,

+ 4 - 3
src/utils/ol-map/XYZLayer.js

@@ -35,8 +35,9 @@ class XYZLayer extends LTBaseObject{
 		}
 		const vm = this
 		vm.source = new XYZ({
-      url : url
-    })
+			crossOrigin:'anonymous',
+      		url : url
+    	})
 
 		vm.layer = new Tile({
 			source:vm.source,
@@ -105,4 +106,4 @@ class XYZLayer extends LTBaseObject{
     const vm = this
 	}
 }
-export default XYZLayer
+export default XYZLayer

+ 259 - 0
src/views/authentic/Pdf.vue

@@ -0,0 +1,259 @@
+<template>
+  <el-dialog
+      class="my-dialog"
+      fullscreen
+      append-to-body
+      destroy-on-close
+      :model-value="showDialog"
+      @close="closeDialog()"
+  >
+    <div class="pdf-dialog-box" >
+      <div class="title" >
+        <div class="name" ></div>
+        <div class="pdf-close cursor-pointer" @click="closeDialog"></div>
+      </div>
+      <div class="pdf-my-body" >
+        <div class="pdfBox" id="printTest" >
+          <div class="a4">
+            <div class="a4_title">确权单</div>
+            <div class="a4_sub_title">111</div>
+            <table class="a4_table" border=1 style="border-collapse: collapse;">
+              <tr>
+                <td class="name">农场地址</td>
+                <td class="text">{{rowData.address}}</td>
+                <td class="name">农场名称</td>
+                <td class="text">{{rowData.farmName}}</td>
+              </tr>
+              <tr>
+                <td class="name">创建时间</td>
+                <td class="text">{{rowData.createDate}}</td>
+                <td class="name">农场面积</td>
+                <td class="text">{{rowData.area}}亩</td>
+              </tr>
+              <tr>
+                <td class="name">作物物种</td>
+                <td class="text">{{rowData.speciesTypeName}}</td>
+                <td class="name">客户姓名</td>
+                <td class="text">{{rowData.masterName}}</td>
+              </tr>
+              <tr>
+                <td class="name">联系电话</td>
+                <td class="text">{{rowData.masterTel}}</td>
+              </tr>
+            </table>
+            <div class="a4_sub_title">果树分布图</div>
+              <img class="img" v-if="imgUrl"  :src="imgUrl" />
+              <div class="img" v-else ref="mapRef" id="mapRefId">
+              </div>
+          </div>
+        </div>
+      </div>
+      <button class="yes-events" v-print="'#printTest'">去打印</button>
+
+    </div>
+  </el-dialog>
+</template>
+
+<script setup>
+import {reactive, ref, toRefs, computed, nextTick, onMounted} from "vue";
+import {useStore} from "vuex";
+import {WKT} from "ol/format";
+import html2canvas from "html2canvas"
+import PdfMap from "./pdfMap";
+import { dateFormat } from "@/utils/date_util";
+import {getAreaByWkt} from "../../utils/map";
+const emit = defineEmits(["closeDialog","success"])
+const state = useStore().state;
+const sendConfirmShow = ref(false)
+const mapRef = ref(null)
+
+async function send(){
+  closeDialog();
+}
+
+const props = defineProps({
+  title:{
+    type:String,
+    required:true
+  },
+  showDialog: {
+    type: Boolean,
+    default: true,
+  },
+  rowId:{
+    type: Number,
+    required:true,
+  }
+});
+
+let imgUrl = ref(null)
+const executor = ref([])
+const executorList = ref([])
+
+const formRef = ref(null);
+const {title, rowId} = toRefs(props);
+const closeDialog = (key) => {
+  switch (key){
+    case "sendConfirm":
+      sendConfirmShow.value = false;
+      return
+  }
+  emit("closeDialog", "pdf");
+};
+
+function  toImg(map) {
+  let canvas = map.getViewport().querySelector('canvas');
+  let dataURL = canvas.toDataURL('image/png');
+  imgUrl.value = dataURL;
+}
+
+
+/**表单验证规则
+ * @description:
+ * @param {*} computed
+ * @return {*}
+ */
+const rules = computed(() => ({
+}));
+
+
+let pdfMap = new PdfMap()
+let rowData = ref({})
+
+
+onMounted(()=>{
+  VE_API.authentic.getDetails({id:rowId.value}).then(({data})=>{
+    data.createDate = dateFormat(new Date(), "YYYY-mm-dd HH:MM:SS");
+    data.area = getAreaByWkt(data.geom)
+    rowData.value = data
+    pdfMap.initMap(data,mapRef.value)
+    setTimeout(function(){
+      toImg(pdfMap.kmap.map)
+    },1000)
+  })
+})
+
+</script>
+
+<style lang="scss" scoped>
+$title-height:0px;
+$body-height:calc(100% - $title-height);
+
+.pdf-dialog-box{
+  font-family: PingFangSC-Regular, PingFang SC;
+  position: absolute;
+  left: 25%;
+  right: 25%;
+  top:10%;
+  bottom:10%;
+  background: rgba(1,17,22,0.8);
+  box-shadow: 0px 0px 20px 0px #00FFF0;
+  border-radius: 4px;
+  border: 2px solid rgba(81,233,240,0.6);
+
+  .title{
+    width: 100%;
+    height: $title-height;
+    box-sizing: border-box;
+    background: rgba(0,77,101,0.8);
+    border-radius: 4px 4px 0px 0px;
+    border-bottom: 2px solid rgba(81,233,240,0.3);
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    .name{
+      margin-left: 20px;
+      font-size: 16px;
+      font-weight: 600;
+      color: #00FFF0;
+      height: 22px;
+    }
+    .pdf-close{
+      margin-right: 20px;
+      width: 16px;
+      height: 16px;
+      background-image: url("@/assets/img/close.png");
+      background-size: 100% 100%;
+    }
+  }
+  .pdf-my-body{
+    width: 100%;
+    height: $body-height;
+    box-sizing: border-box;
+    padding: 20px;
+    ::-webkit-scrollbar-thumb {
+      /* 滚动条里面小方块 */
+      background: rgb(70, 71, 71);;
+      border-radius: 6px;
+    }
+    ::-webkit-scrollbar-track {
+      /* 滚动条里面轨道 */
+      background: #ededed;
+    }
+  }
+
+  .pdfBox{
+    height: calc(100%);
+    width: 100%;
+    overflow-y: scroll;
+    background-color: rgba(141, 142, 142);
+    padding: 10px;
+    box-sizing: border-box;
+    display: flex;
+    justify-content: center;
+  }
+
+  .a4{
+    font-family: PingFangSC-Medium, PingFang SC;
+    background-color: #FFFFFF;
+    width:595px;
+    height:842px;
+    margin: 5px 0px 5px 0px;
+    padding: 19px 63px 19px 63px;
+    box-shadow: 0px 0px 10px 0px #071010;
+    font-weight: 600;
+    color: #000000;
+    .a4_title{
+      width:595px;
+      height: 33px;
+      font-size: 24px;
+      text-align: center;
+      margin: 10px 0px 10px 0px;
+    }
+    .a4_sub_title{
+      font-size: 16px;
+      margin: 10px 0px 10px 0px;
+    }
+    .a4_table{
+      height: calc(842px - 33px - 26px - 600px);
+      max-height: calc(842px - 33px - 26px - 600px);
+      width:595px;
+      font-size: 12px;
+      .name{
+        width: 92px;
+        height: 38px;
+        line-height: 38px;
+        padding-right: 9px;
+        box-sizing: border-box;
+        text-align: right;
+      }
+      .text{
+        width: 122px;
+        height: 38px;
+        line-height: 38px;
+        text-align: left;
+        padding-left: 9px;
+        box-sizing: border-box;
+      }
+    }
+    .img{
+      width:595px;
+      height: 500px;
+      z-index: 1000;
+    }
+  }
+
+
+}
+
+</style>

+ 78 - 0
src/views/authentic/pdfMap.js

@@ -0,0 +1,78 @@
+import config from "@/api/config.js";
+import * as KMap from "@/utils/ol-map/KMap";
+import * as util from "@/common/ol_common.js";
+import Style from "ol/style/Style";
+import Icon from "ol/style/Icon";
+import VectorLayer from "ol/layer/Vector.js";
+import WKT from "ol/format/WKT.js";
+import { reactive } from "vue";
+import Point from "ol/geom/Point.js";
+import Feature from "ol/Feature";
+import { newPoint } from "@/utils/map.js";
+import { Fill, Text } from "ol/style";
+import { getArea } from "ol/sphere.js";
+import * as proj from "ol/proj";
+import proj4 from "proj4";
+import { register } from "ol/proj/proj4";
+import {DragPan, MouseWheelZoom} from "ol/interaction";
+proj4.defs(
+  "EPSG:38572",
+  "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs"
+);
+register(proj4);
+
+/**
+ * @description 地图层对象
+ */
+class PdfMap {
+  constructor() {
+    let that = this;
+    let vectorStyle = new KMap.VectorStyle();
+    this.vectorStyle = vectorStyle;
+  }
+
+  initMap(data, target) {
+    let level = 16;
+    let coordinate = util.wktCastGeom(data.point).getFirstCoordinate();
+    this.kmap = new KMap.Map(
+      target,
+      level,
+      coordinate[0],
+      coordinate[1],
+      null,
+        6,
+        22
+    );
+    this.kmap.setLayerWkt(data.geom,true)
+    this.lock(false)
+  }
+  lock(lockval) {
+    let pan;
+    let mousezoom;
+    this.kmap.map.getInteractions().forEach(function (element) {
+      if (element instanceof DragPan)//获取 控制能否使用鼠标,手指拖动地图的对象
+        pan = element;
+      if(element instanceof MouseWheelZoom)//获取 控制能否使用滚轮滚动放大缩小地图的对象
+        mousezoom = element;
+      if (pan) {
+        if (lockval) {
+          pan.setActive(true);//此对象的setActive方法用来设置是否可以拖动滚动查看
+        }
+        else {
+          pan.setActive(false);
+        }
+      }
+      if (mousezoom) {
+        if (lockval) {
+          mousezoom.setActive(true);
+        }
+        else {
+          mousezoom.setActive(false);
+        }
+      }
+    });
+  }
+
+}
+
+export default PdfMap;

+ 191 - 48
yarn.lock

@@ -317,15 +317,15 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
-"@babel/helper-validator-identifier@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz"
-  integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+"@babel/helper-string-parser@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz"
+  integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
 
-"@babel/helper-validator-identifier@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz"
-  integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
+"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz"
+  integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
 
 "@babel/helper-validator-option@^7.18.6":
   version "7.18.6"
@@ -369,10 +369,12 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.4", "@babel/parser@^7.18.6":
-  version "7.21.2"
-  resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz"
-  integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==
+"@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.4", "@babel/parser@^7.18.6", "@babel/parser@^7.25.3":
+  version "7.26.2"
+  resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz"
+  integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==
+  dependencies:
+    "@babel/types" "^7.26.0"
 
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
   version "7.18.6"
@@ -1062,21 +1064,13 @@
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.4.4":
-  version "7.16.8"
-  resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz"
-  integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==
+"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.26.0", "@babel/types@^7.4.4":
+  version "7.26.0"
+  resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz"
+  integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.16.7"
-    to-fast-properties "^2.0.0"
-
-"@babel/types@^7.18.6", "@babel/types@^7.18.7":
-  version "7.18.7"
-  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.18.7.tgz"
-  integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.18.6"
-    to-fast-properties "^2.0.0"
+    "@babel/helper-string-parser" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
 
 "@colors/colors@1.5.0":
   version "1.5.0"
@@ -1259,6 +1253,11 @@
   resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
 
+"@jridgewell/sourcemap-codec@^1.5.0":
+  version "1.5.0"
+  resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+  integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
 "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
   version "0.3.14"
   resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz"
@@ -2108,6 +2107,17 @@
     estree-walker "^2.0.2"
     source-map "^0.6.1"
 
+"@vue/compiler-core@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz#bd70b7dabd12b0b6f31bc53418ba3da77994c437"
+  integrity sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==
+  dependencies:
+    "@babel/parser" "^7.25.3"
+    "@vue/shared" "3.5.12"
+    entities "^4.5.0"
+    estree-walker "^2.0.2"
+    source-map-js "^1.2.0"
+
 "@vue/compiler-dom@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz"
@@ -2116,6 +2126,14 @@
     "@vue/compiler-core" "3.2.47"
     "@vue/shared" "3.2.47"
 
+"@vue/compiler-dom@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz#456d631d11102535b7ee6fd954cf2c93158d0354"
+  integrity sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==
+  dependencies:
+    "@vue/compiler-core" "3.5.12"
+    "@vue/shared" "3.5.12"
+
 "@vue/compiler-sfc@2.7.14":
   version "2.7.14"
   resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz"
@@ -2141,6 +2159,21 @@
     postcss "^8.1.10"
     source-map "^0.6.1"
 
+"@vue/compiler-sfc@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz#6688120d905fcf22f7e44d3cb90f8dabc4dd3cc8"
+  integrity sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==
+  dependencies:
+    "@babel/parser" "^7.25.3"
+    "@vue/compiler-core" "3.5.12"
+    "@vue/compiler-dom" "3.5.12"
+    "@vue/compiler-ssr" "3.5.12"
+    "@vue/shared" "3.5.12"
+    estree-walker "^2.0.2"
+    magic-string "^0.30.11"
+    postcss "^8.4.47"
+    source-map-js "^1.2.0"
+
 "@vue/compiler-ssr@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz"
@@ -2149,6 +2182,14 @@
     "@vue/compiler-dom" "3.2.47"
     "@vue/shared" "3.2.47"
 
+"@vue/compiler-ssr@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz#5f1a3fbd5c44b79a6dbe88729f7801d9c9218bde"
+  integrity sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==
+  dependencies:
+    "@vue/compiler-dom" "3.5.12"
+    "@vue/shared" "3.5.12"
+
 "@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0":
   version "3.3.0"
   resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz"
@@ -2201,6 +2242,13 @@
   dependencies:
     "@vue/shared" "3.2.47"
 
+"@vue/reactivity@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz#a2815d91842ed7b9e7e7936c851923caf6b6e603"
+  integrity sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==
+  dependencies:
+    "@vue/shared" "3.5.12"
+
 "@vue/runtime-core@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz"
@@ -2209,6 +2257,14 @@
     "@vue/reactivity" "3.2.47"
     "@vue/shared" "3.2.47"
 
+"@vue/runtime-core@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz#849207f203d0fd82971f19574d30dbe7134c78c7"
+  integrity sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==
+  dependencies:
+    "@vue/reactivity" "3.5.12"
+    "@vue/shared" "3.5.12"
+
 "@vue/runtime-dom@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz"
@@ -2218,6 +2274,16 @@
     "@vue/shared" "3.2.47"
     csstype "^2.6.8"
 
+"@vue/runtime-dom@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz#6d4de3df49a90a460b311b1100baa5e2d0d1c8c9"
+  integrity sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==
+  dependencies:
+    "@vue/reactivity" "3.5.12"
+    "@vue/runtime-core" "3.5.12"
+    "@vue/shared" "3.5.12"
+    csstype "^3.1.3"
+
 "@vue/server-renderer@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz"
@@ -2226,11 +2292,24 @@
     "@vue/compiler-ssr" "3.2.47"
     "@vue/shared" "3.2.47"
 
+"@vue/server-renderer@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz#79c6bc3860e4e4ef80d85653c5d03fd94b26574e"
+  integrity sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==
+  dependencies:
+    "@vue/compiler-ssr" "3.5.12"
+    "@vue/shared" "3.5.12"
+
 "@vue/shared@3.2.47":
   version "3.2.47"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz"
   integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
 
+"@vue/shared@3.5.12":
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3"
+  integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==
+
 "@vue/vue-loader-v15@npm:vue-loader@^15.9.7":
   version "15.10.0"
   resolved "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.0.tgz"
@@ -2540,7 +2619,7 @@ ajv-keywords@^5.0.0:
   dependencies:
     fast-deep-equal "^3.1.3"
 
-ajv@8.11.0, ajv@^8.8.0:
+ajv@8.11.0, ajv@^8.0.0, ajv@^8.8.0:
   version "8.11.0"
   resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz"
   integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
@@ -2560,16 +2639,6 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
-ajv@^8.0.0:
-  version "8.9.0"
-  resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz"
-  integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==
-  dependencies:
-    fast-deep-equal "^3.1.1"
-    json-schema-traverse "^1.0.0"
-    require-from-string "^2.0.2"
-    uri-js "^4.2.2"
-
 ansi-align@^3.0.1:
   version "3.0.1"
   resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz"
@@ -3907,6 +3976,11 @@ csstype@^3.1.0:
   resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz"
   integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
 
+csstype@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
 data-view-buffer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz"
@@ -4319,6 +4393,11 @@ entities@^2.0.0:
   resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 
+entities@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
 env-paths@^2.2.0:
   version "2.2.1"
   resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz"
@@ -5213,7 +5292,7 @@ glob@^10.2.2:
     package-json-from-dist "^1.0.0"
     path-scurry "^1.11.1"
 
-glob@^7.1.3, glob@^7.1.4:
+glob@^7.1.3:
   version "7.2.0"
   resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz"
   integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -5225,6 +5304,18 @@ glob@^7.1.3, glob@^7.1.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^7.1.4:
+  version "7.2.3"
+  resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 glob@^8.0.1:
   version "8.1.0"
   resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
@@ -5526,7 +5617,7 @@ html-webpack-plugin@^5.1.0:
     pretty-error "^4.0.0"
     tapable "^2.0.0"
 
-html2canvas@^1.0.0-rc.5, html2canvas@^1.4.1:
+html2canvas@^1.0.0-rc.5:
   version "1.4.1"
   resolved "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz"
   integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
@@ -5534,6 +5625,14 @@ html2canvas@^1.0.0-rc.5, html2canvas@^1.4.1:
     css-line-break "^2.1.0"
     text-segmentation "^1.0.3"
 
+html2canvas@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
+  integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
+  dependencies:
+    css-line-break "^2.1.0"
+    text-segmentation "^1.0.3"
+
 htmlparser2@^3.8.3:
   version "3.10.1"
   resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz"
@@ -6772,6 +6871,13 @@ magic-string@^0.30.0:
   dependencies:
     "@jridgewell/sourcemap-codec" "^1.4.13"
 
+magic-string@^0.30.11:
+  version "0.30.12"
+  resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60"
+  integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.5.0"
+
 make-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz"
@@ -7013,9 +7119,9 @@ minimatch@*, minimatch@^3.0.4:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimatch@3.1.2, minimatch@^3.1.2:
+minimatch@3.1.2, minimatch@^3.1.1, minimatch@^3.1.2:
   version "3.1.2"
-  resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+  resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
   dependencies:
     brace-expansion "^1.1.7"
@@ -7106,7 +7212,7 @@ minipass-sized@^1.0.3:
 
 minipass@^3.0.0, minipass@^3.1.6:
   version "3.3.6"
-  resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+  resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz"
   integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
   dependencies:
     yallist "^4.0.0"
@@ -7268,6 +7374,11 @@ nanoid@^3.3.4:
   resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
   integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
 
+nanoid@^3.3.7:
+  version "3.3.7"
+  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
 nanomatch@^1.2.1:
   version "1.2.13"
   resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"
@@ -8100,6 +8211,11 @@ picocolors@^1.0.0:
   resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
   integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
 
+picocolors@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
 picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
   version "2.3.1"
   resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
@@ -8449,6 +8565,15 @@ postcss@^8.1.10, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.7
     picocolors "^1.0.0"
     source-map-js "^1.0.2"
 
+postcss@^8.4.47:
+  version "8.4.49"
+  resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
+  integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
+  dependencies:
+    nanoid "^3.3.7"
+    picocolors "^1.1.1"
+    source-map-js "^1.2.1"
+
 posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
   version "0.2.1"
   resolved "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz"
@@ -9568,6 +9693,11 @@ sortablejs@1.10.2:
   resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
 
+source-map-js@^1.2.0, source-map-js@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
 source-map-resolve@^0.5.0:
   version "0.5.3"
   resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
@@ -10097,11 +10227,6 @@ tiny-relative-date@^1.3.0:
   resolved "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz"
   integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
 
-to-fast-properties@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
-  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
-
 to-object-path@^0.3.0:
   version "0.3.0"
   resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"
@@ -10731,6 +10856,13 @@ vue3-openlayers@^0.1.74:
     ol-ext "^4.0.4"
     proj4 "^2.8.1"
 
+vue3-print-nb@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmjs.org/vue3-print-nb/-/vue3-print-nb-0.1.4.tgz#11ee3ef8857c34b403fb782da722e82ab7e20952"
+  integrity sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==
+  dependencies:
+    vue "^3.0.5"
+
 vue@^2.1.8:
   version "2.7.14"
   resolved "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz"
@@ -10739,6 +10871,17 @@ vue@^2.1.8:
     "@vue/compiler-sfc" "2.7.14"
     csstype "^3.1.0"
 
+vue@^3.0.5:
+  version "3.5.12"
+  resolved "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz#e08421c601b3617ea2c9ef0413afcc747130b36c"
+  integrity sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==
+  dependencies:
+    "@vue/compiler-dom" "3.5.12"
+    "@vue/compiler-sfc" "3.5.12"
+    "@vue/runtime-dom" "3.5.12"
+    "@vue/server-renderer" "3.5.12"
+    "@vue/shared" "3.5.12"
+
 vue@^3.2.47:
   version "3.2.47"
   resolved "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz"
@@ -11183,7 +11326,7 @@ yargs@^16.0.0:
 
 yarn@^1.22.22:
   version "1.22.22"
-  resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610"
+  resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz"
   integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==
 
 yocto-queue@^0.1.0: