Showing
8 changed files
with
550 additions
and
3 deletions
| ... | @@ -12,6 +12,10 @@ declare module '@vue/runtime-core' { | ... | @@ -12,6 +12,10 @@ declare module '@vue/runtime-core' { |
| 12 | AudioBackground: typeof import('./src/components/audioBackground.vue')['default'] | 12 | AudioBackground: typeof import('./src/components/audioBackground.vue')['default'] |
| 13 | AudioBackground1: typeof import('./src/components/audioBackground1.vue')['default'] | 13 | AudioBackground1: typeof import('./src/components/audioBackground1.vue')['default'] |
| 14 | AudioList: typeof import('./src/components/audioList.vue')['default'] | 14 | AudioList: typeof import('./src/components/audioList.vue')['default'] |
| 15 | + ElButton: typeof import('element-plus/es')['ElButton'] | ||
| 16 | + ElInput: typeof import('element-plus/es')['ElInput'] | ||
| 17 | + ElOption: typeof import('element-plus/es')['ElOption'] | ||
| 18 | + ElSelect: typeof import('element-plus/es')['ElSelect'] | ||
| 15 | Floor: typeof import('./src/components/Floor/index.vue')['default'] | 19 | Floor: typeof import('./src/components/Floor/index.vue')['default'] |
| 16 | InfoPopup: typeof import('./src/components/InfoPopup.vue')['default'] | 20 | InfoPopup: typeof import('./src/components/InfoPopup.vue')['default'] |
| 17 | InfoPopupLite: typeof import('./src/components/InfoPopupLite.vue')['default'] | 21 | InfoPopupLite: typeof import('./src/components/InfoPopupLite.vue')['default'] | ... | ... |
| ... | @@ -25,6 +25,8 @@ | ... | @@ -25,6 +25,8 @@ |
| 25 | "xys_upload": "npm run build_tar && npm run scp-xys && npm run dec-xys && npm run remove_tar" | 25 | "xys_upload": "npm run build_tar && npm run scp-xys && npm run dec-xys && npm run remove_tar" |
| 26 | }, | 26 | }, |
| 27 | "dependencies": { | 27 | "dependencies": { |
| 28 | + "@amap/amap-jsapi-loader": "^1.0.1", | ||
| 29 | + "@element-plus/icons-vue": "^2.3.1", | ||
| 28 | "@photo-sphere-viewer/core": "^5.7.3", | 30 | "@photo-sphere-viewer/core": "^5.7.3", |
| 29 | "@photo-sphere-viewer/gallery-plugin": "^5.7.3", | 31 | "@photo-sphere-viewer/gallery-plugin": "^5.7.3", |
| 30 | "@photo-sphere-viewer/gyroscope-plugin": "^5.7.3", | 32 | "@photo-sphere-viewer/gyroscope-plugin": "^5.7.3", |
| ... | @@ -39,6 +41,7 @@ | ... | @@ -39,6 +41,7 @@ |
| 39 | "animate.css": "^4.1.1", | 41 | "animate.css": "^4.1.1", |
| 40 | "dayjs": "^1.11.3", | 42 | "dayjs": "^1.11.3", |
| 41 | "default-passive-events": "^2.0.0", | 43 | "default-passive-events": "^2.0.0", |
| 44 | + "element-plus": "^2.9.3", | ||
| 42 | "font-awesome": "^4.7.0", | 45 | "font-awesome": "^4.7.0", |
| 43 | "global": "^4.4.0", | 46 | "global": "^4.4.0", |
| 44 | "html-to-json-parser": "^1.1.0", | 47 | "html-to-json-parser": "^1.1.0", | ... | ... |
| ... | @@ -2,7 +2,7 @@ | ... | @@ -2,7 +2,7 @@ |
| 2 | * @Author: hookehuyr hookehuyr@gmail.com | 2 | * @Author: hookehuyr hookehuyr@gmail.com |
| 3 | * @Date: 2022-05-31 12:06:19 | 3 | * @Date: 2022-05-31 12:06:19 |
| 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 5 | - * @LastEditTime: 2024-09-25 17:17:40 | 5 | + * @LastEditTime: 2025-01-23 16:10:45 |
| 6 | * @FilePath: /map-demo/src/main.js | 6 | * @FilePath: /map-demo/src/main.js |
| 7 | * @Description: | 7 | * @Description: |
| 8 | */ | 8 | */ |
| ... | @@ -57,6 +57,8 @@ import 'video.js/dist/video-js.css'; | ... | @@ -57,6 +57,8 @@ import 'video.js/dist/video-js.css'; |
| 57 | import 'viewerjs/dist/viewer.css'; | 57 | import 'viewerjs/dist/viewer.css'; |
| 58 | import VueViewer from 'v-viewer'; | 58 | import VueViewer from 'v-viewer'; |
| 59 | 59 | ||
| 60 | +import * as ElementPlusIconsVue from '@element-plus/icons-vue' | ||
| 61 | + | ||
| 60 | const pinia = createPinia(); | 62 | const pinia = createPinia(); |
| 61 | const app = createApp(App); | 63 | const app = createApp(App); |
| 62 | 64 | ||
| ... | @@ -102,4 +104,8 @@ app | ... | @@ -102,4 +104,8 @@ app |
| 102 | app.use(VueVideoPlayer) | 104 | app.use(VueVideoPlayer) |
| 103 | app.use(VueViewer); | 105 | app.use(VueViewer); |
| 104 | 106 | ||
| 107 | +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { | ||
| 108 | + app.component(key, component) | ||
| 109 | +} | ||
| 110 | + | ||
| 105 | app.mount('#app'); | 111 | app.mount('#app'); | ... | ... |
| 1 | /* | 1 | /* |
| 2 | * @Date: 2023-05-29 11:10:19 | 2 | * @Date: 2023-05-29 11:10:19 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2024-09-20 17:54:57 | 4 | + * @LastEditTime: 2025-01-23 16:22:10 |
| 5 | * @FilePath: /map-demo/src/route.js | 5 | * @FilePath: /map-demo/src/route.js |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | */ | 7 | */ |
| ... | @@ -69,4 +69,12 @@ export default [ | ... | @@ -69,4 +69,12 @@ export default [ |
| 69 | title: '详情页', | 69 | title: '详情页', |
| 70 | }, | 70 | }, |
| 71 | }, | 71 | }, |
| 72 | + { | ||
| 73 | + path: '/map_cutter', | ||
| 74 | + name: '瓦片切图工具', | ||
| 75 | + component: () => import('@/views/mapCutter.vue'), | ||
| 76 | + meta: { | ||
| 77 | + title: '瓦片切图工具', | ||
| 78 | + }, | ||
| 79 | + }, | ||
| 72 | ]; | 80 | ]; | ... | ... |
src/utils/TileCutter.js
0 → 100644
| 1 | +/* | ||
| 2 | + * @Date: 2025-01-22 11:45:30 | ||
| 3 | + * @LastEditors: hookehuyr hookehuyr@gmail.com | ||
| 4 | + * @LastEditTime: 2025-01-23 16:38:00 | ||
| 5 | + * @FilePath: /map-demo/src/utils/TileCutter.js | ||
| 6 | + * @Description: 文件描述 | ||
| 7 | + */ | ||
| 8 | +const tileSize = 512; | ||
| 9 | + | ||
| 10 | +export function TileCutter(imageURL, bounds, zoomLevel) { | ||
| 11 | + const img = new Image(); | ||
| 12 | + img.crossOrigin = "Anonymous"; // 避免跨域问题 | ||
| 13 | + img.src = imageURL; | ||
| 14 | + img.onload = () => { | ||
| 15 | + sliceImageToTiles(img, bounds, zoomLevel); | ||
| 16 | + }; | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | + | ||
| 20 | +function sliceImageToTiles(image, bounds, zoomLevel) { | ||
| 21 | + const canvas = document.createElement("canvas"); | ||
| 22 | + const ctx = canvas.getContext("2d"); | ||
| 23 | + | ||
| 24 | + const imgWidth = image.width; | ||
| 25 | + const imgHeight = image.height; | ||
| 26 | + | ||
| 27 | + const southWest = bounds.getSouthWest(); | ||
| 28 | + const northEast = bounds.getNorthEast(); | ||
| 29 | + | ||
| 30 | + const lonStart = southWest.lng; | ||
| 31 | + const latStart = southWest.lat; | ||
| 32 | + const lonEnd = northEast.lng; | ||
| 33 | + const latEnd = northEast.lat; | ||
| 34 | + | ||
| 35 | + let tileStartX = lonToTileX(lonStart, zoomLevel); | ||
| 36 | + let tileEndX = lonToTileX(lonEnd, zoomLevel); | ||
| 37 | + let tileStartY = latToTileY(latEnd, zoomLevel); // 取 latEnd 作为起点 | ||
| 38 | + let tileEndY = latToTileY(latStart, zoomLevel); // 取 latStart 作为终点 | ||
| 39 | + | ||
| 40 | + // 确保 tileStartX <= tileEndX,tileStartY <= tileEndY | ||
| 41 | + tileStartX = Math.min(tileStartX, tileEndX); | ||
| 42 | + tileEndX = Math.max(tileStartX, tileEndX); | ||
| 43 | + tileStartY = Math.min(tileStartY, tileEndY); | ||
| 44 | + tileEndY = Math.max(tileStartY, tileEndY); | ||
| 45 | + | ||
| 46 | + // console.warn(`瓦片编号: X(${tileStartX} -> ${tileEndX}), Y(${tileStartY} -> ${tileEndY})`); | ||
| 47 | + | ||
| 48 | + const cols = tileEndX - tileStartX + 1; | ||
| 49 | + const rows = tileEndY - tileStartY + 1; | ||
| 50 | + | ||
| 51 | + const tileWidth = imgWidth / cols; | ||
| 52 | + const tileHeight = imgHeight / rows; | ||
| 53 | + | ||
| 54 | + const scaleFactor = 2; // 调高分辨率倍率 | ||
| 55 | + | ||
| 56 | + canvas.width = tileSize * scaleFactor; | ||
| 57 | + canvas.height = tileSize * scaleFactor; | ||
| 58 | + | ||
| 59 | + ctx.scale(scaleFactor, scaleFactor); | ||
| 60 | + | ||
| 61 | + for (let x = 0; x < cols; x++) { | ||
| 62 | + for (let y = 0; y < rows; y++) { | ||
| 63 | + ctx.clearRect(0, 0, tileSize, tileSize); | ||
| 64 | + | ||
| 65 | + ctx.drawImage( | ||
| 66 | + image, | ||
| 67 | + x * tileWidth, y * tileHeight, tileWidth, tileHeight, // 源图像区域 | ||
| 68 | + 0, 0, tileSize, tileSize // 目标画布区域 | ||
| 69 | + ); | ||
| 70 | + | ||
| 71 | + canvas.toBlob((blob) => { | ||
| 72 | + if (!blob) { | ||
| 73 | + console.error("瓦片转换失败!"); | ||
| 74 | + return; | ||
| 75 | + } | ||
| 76 | + const tileX = tileStartX + x; | ||
| 77 | + const tileY = tileStartY + y; | ||
| 78 | + // console.warn(`保存瓦片: ${tileX}_${tileY}_${zoomLevel}.png`); | ||
| 79 | + saveTile(blob, `${tileX}_${tileY}_${zoomLevel}.png`); | ||
| 80 | + }, "image/png", 1.0); | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | +} | ||
| 84 | +// 经纬度转换为瓦片坐标 | ||
| 85 | +function lonToTileX(lon, zoom) { | ||
| 86 | + return Math.floor(((lon + 180) / 360) * Math.pow(2, zoom)); | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +function latToTileY(lat, zoom) { | ||
| 90 | + return Math.floor( | ||
| 91 | + ((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2) * Math.pow(2, zoom) | ||
| 92 | + ); | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +function saveTile(blob, filename) { | ||
| 96 | + const link = document.createElement("a"); | ||
| 97 | + link.href = URL.createObjectURL(blob); | ||
| 98 | + link.download = filename; | ||
| 99 | + document.body.appendChild(link); | ||
| 100 | + link.click(); | ||
| 101 | + document.body.removeChild(link); | ||
| 102 | +} |
src/views/mapCutter.vue
0 → 100644
| 1 | +<!-- | ||
| 2 | + * @Date: 2025-01-22 11:40:12 | ||
| 3 | + * @LastEditors: hookehuyr hookehuyr@gmail.com | ||
| 4 | + * @LastEditTime: 2025-01-23 16:32:53 | ||
| 5 | + * @FilePath: /map-demo/src/views/mapCutter.vue | ||
| 6 | + * @Description: 文件描述 | ||
| 7 | +--> | ||
| 8 | +<template> | ||
| 9 | + <div style="display: flex; padding: 1rem 0 0 1rem; gap: 1rem; align-items: center;"> | ||
| 10 | + <div>目标地图经纬度</div> | ||
| 11 | + <el-input | ||
| 12 | + v-model="map_center" | ||
| 13 | + style="width: 240px" | ||
| 14 | + placeholder="输入经纬度" | ||
| 15 | + @blur="onCenterBlur" | ||
| 16 | + /> | ||
| 17 | + </div> | ||
| 18 | + <div style="display: flex; padding: 1rem; gap: 1rem;"> | ||
| 19 | + <div style="display: flex; align-items: center;"> | ||
| 20 | + <div>地图层级: </div> | ||
| 21 | + <el-select v-model="map_zoom" placeholder="地图层级" style="width: 240px" @change="onZoomChange"> | ||
| 22 | + <el-option | ||
| 23 | + v-for="item in zoom_options" | ||
| 24 | + :key="item.value" | ||
| 25 | + :label="item.label" | ||
| 26 | + :value="item.value" | ||
| 27 | + /> | ||
| 28 | + </el-select> | ||
| 29 | + </div> | ||
| 30 | + | ||
| 31 | + <div style="display: flex; align-items: center;"> | ||
| 32 | + <div>上传图片范围: </div> | ||
| 33 | + <el-input | ||
| 34 | + v-model="map_left_bottom_range" | ||
| 35 | + style="width: 240px" | ||
| 36 | + placeholder="输入左下角经纬度" | ||
| 37 | + @blur="onLBRangeBlur" | ||
| 38 | + /> | ||
| 39 | + | ||
| 40 | + <el-input | ||
| 41 | + v-model="map_right_top_range" | ||
| 42 | + style="width: 240px" | ||
| 43 | + placeholder="输入右上角的经纬度" | ||
| 44 | + @blur="onRTRangeBlur" | ||
| 45 | + /> | ||
| 46 | + </div> | ||
| 47 | + <div v-if="showUpload"> | ||
| 48 | + <input type="file" @change="handleImageUpload" /> | ||
| 49 | + <el-button type="primary" @click="cutTiles">切割瓦片</el-button> | ||
| 50 | + </div> | ||
| 51 | + </div> | ||
| 52 | + <div id="map-container"></div> | ||
| 53 | + <div> | ||
| 54 | + | ||
| 55 | + </div> | ||
| 56 | + <div v-if="showUpload" class="controls"> | ||
| 57 | + <el-button type="primary" :icon="Top" @click="moveImage('up')">图片上移</el-button> | ||
| 58 | + <el-button type="primary" :icon="Bottom" @click="moveImage('down')">图片下移</el-button> | ||
| 59 | + <el-button type="primary" :icon="Back" @click="moveImage('left')">图片左移</el-button> | ||
| 60 | + <el-button type="primary" :icon="Right" @click="moveImage('right')">图片右移</el-button> | ||
| 61 | + <el-button type="primary" :icon="Plus" @click="scaleImage(1.01)">图片放大</el-button> | ||
| 62 | + <el-button type="primary" :icon="Minus" @click="scaleImage(0.99)">图片缩小</el-button> | ||
| 63 | + <el-button type="primary" @click="rotateMap(10)">地图顺时针旋转</el-button> | ||
| 64 | + <el-button type="primary" @click="rotateMap(-10)">地图逆时针旋转</el-button> | ||
| 65 | + </div> | ||
| 66 | +</template> | ||
| 67 | + | ||
| 68 | +<script setup> | ||
| 69 | +import { onMounted, ref, computed } from "vue"; | ||
| 70 | +// import AMapLoader from "@amap/amap-jsapi-loader"; | ||
| 71 | +import { TileCutter } from "@/utils/TileCutter"; | ||
| 72 | +import { Top, Bottom, Back, Right, Plus, Minus } from '@element-plus/icons-vue' | ||
| 73 | + | ||
| 74 | +const map = ref(null); | ||
| 75 | +const imageLayer = ref(null); | ||
| 76 | +const imageURL = ref(""); // 存储上传的图片 | ||
| 77 | +const bounds = ref(null); // 图片覆盖的边界 | ||
| 78 | +const mapRotation = ref(0); // 存储地图旋转角度 | ||
| 79 | +const zooms = ref([17, 18]); | ||
| 80 | + | ||
| 81 | +const map_zoom = ref(17) | ||
| 82 | + | ||
| 83 | +const zoom_options = [ | ||
| 84 | + { | ||
| 85 | + value: 17, | ||
| 86 | + label: 17, | ||
| 87 | + }, | ||
| 88 | + { | ||
| 89 | + value: 18, | ||
| 90 | + label: 18, | ||
| 91 | + }, | ||
| 92 | +] | ||
| 93 | + | ||
| 94 | +const map_left_bottom_range = ref(null); // 120.583625,31.311858 | ||
| 95 | +const map_right_top_range = ref(null); // 120.591047,31.318265 | ||
| 96 | + | ||
| 97 | +const map_center = ref(null); | ||
| 98 | + | ||
| 99 | +onMounted(async () => { | ||
| 100 | + loadMap(); | ||
| 101 | +}); | ||
| 102 | + | ||
| 103 | +function loadMap() { | ||
| 104 | + // 初始化地图 | ||
| 105 | + map.value = new AMap.Map('map-container', { | ||
| 106 | + zoom: 17, | ||
| 107 | + zooms: zooms.value, | ||
| 108 | + center: [120.587648, 31.314616], | ||
| 109 | + rotation: 0, // 初始地图角度 | ||
| 110 | + layers: [ | ||
| 111 | + new AMap.TileLayer.RoadNet(), | ||
| 112 | + new AMap.TileLayer.Satellite(), | ||
| 113 | + ], | ||
| 114 | + }); | ||
| 115 | + | ||
| 116 | + | ||
| 117 | + // Canvas作为切片 | ||
| 118 | + var layer1 = new AMap.TileLayer.Flexible({ | ||
| 119 | + tileSize: 256, | ||
| 120 | + // cacheSize: 300, | ||
| 121 | + zIndex: 200, | ||
| 122 | + createTile: function (x, y, z, success, fail) { | ||
| 123 | + var c = document.createElement('canvas'); | ||
| 124 | + c.width = c.height = 256; | ||
| 125 | + | ||
| 126 | + var cxt = c.getContext("2d"); | ||
| 127 | + cxt.font = "15px Verdana"; | ||
| 128 | + cxt.fillStyle = "#ff976a"; | ||
| 129 | + cxt.strokeStyle = "#ff976a"; | ||
| 130 | + cxt.strokeRect(0, 0, 256, 256); | ||
| 131 | + cxt.fillText('(' + [x, y, z].join(',') + ')', 10, 30); | ||
| 132 | + | ||
| 133 | + // 通知API切片创建完成 | ||
| 134 | + success(c); | ||
| 135 | + } | ||
| 136 | + }); | ||
| 137 | + | ||
| 138 | + layer1.setMap(map.value); | ||
| 139 | + | ||
| 140 | + // 监听 zoomchange 事件 | ||
| 141 | + map.value.on('zoomchange', () => { | ||
| 142 | + const currentZoom = map.value.getZoom(); | ||
| 143 | + if (currentZoom === 18) { | ||
| 144 | + map_zoom.value = 18; | ||
| 145 | + } else { | ||
| 146 | + map_zoom.value = 17; | ||
| 147 | + } | ||
| 148 | + }); | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +function handleImageUpload(event) { | ||
| 152 | + const file = event.target.files[0]; | ||
| 153 | + if (!file) return; | ||
| 154 | + | ||
| 155 | + const reader = new FileReader(); | ||
| 156 | + reader.onload = (e) => { | ||
| 157 | + imageURL.value = e.target.result; | ||
| 158 | + addImageToMap(imageURL.value); | ||
| 159 | + }; | ||
| 160 | + reader.readAsDataURL(file); | ||
| 161 | +} | ||
| 162 | + | ||
| 163 | +function addImageToMap(url) { | ||
| 164 | + if (imageLayer.value) { | ||
| 165 | + map.value.remove(imageLayer.value); | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + // TAG: 设置图片范围 | ||
| 169 | + bounds.value = new AMap.Bounds(map_left_bottom_range.value, map_right_top_range.value); // 设置图片范围 左下角 (西南) -> 右上角 (东北) | ||
| 170 | + imageLayer.value = new AMap.ImageLayer({ | ||
| 171 | + url: url, | ||
| 172 | + bounds: bounds.value, | ||
| 173 | + zooms: [17, 18], | ||
| 174 | + opacity: 0.6 // 透明度 (0 完全透明, 1 完全不透明) | ||
| 175 | + }); | ||
| 176 | + | ||
| 177 | + map.value.add(imageLayer.value); | ||
| 178 | +} | ||
| 179 | + | ||
| 180 | + | ||
| 181 | +function cutTiles() { | ||
| 182 | + if (!imageURL.value) { | ||
| 183 | + alert("请先上传图片"); | ||
| 184 | + return; | ||
| 185 | + } | ||
| 186 | + // TAG: 切割瓦片等级 | ||
| 187 | + TileCutter(imageURL.value, bounds.value, map_zoom.value); // 传入图片、地图范围、缩放级别 | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +// ✅ 1. 位置移动 | ||
| 191 | +const moveImage = (direction) => { | ||
| 192 | +const offset = 0.0001; // 移动步长(经纬度差值) | ||
| 193 | +const sw = bounds.value.getSouthWest(); | ||
| 194 | +const ne = bounds.value.getNorthEast(); | ||
| 195 | + | ||
| 196 | +let newBounds; | ||
| 197 | +switch (direction) { | ||
| 198 | + case "up": | ||
| 199 | + newBounds = new AMap.Bounds([sw.lng, sw.lat + offset], [ne.lng, ne.lat + offset]); | ||
| 200 | + break; | ||
| 201 | + case "down": | ||
| 202 | + newBounds = new AMap.Bounds([sw.lng, sw.lat - offset], [ne.lng, ne.lat - offset]); | ||
| 203 | + break; | ||
| 204 | + case "left": | ||
| 205 | + newBounds = new AMap.Bounds([sw.lng - offset, sw.lat], [ne.lng - offset, ne.lat]); | ||
| 206 | + break; | ||
| 207 | + case "right": | ||
| 208 | + newBounds = new AMap.Bounds([sw.lng + offset, sw.lat], [ne.lng + offset, ne.lat]); | ||
| 209 | + break; | ||
| 210 | +} | ||
| 211 | + | ||
| 212 | +bounds.value = newBounds; | ||
| 213 | +imageLayer.value.setBounds(bounds.value); | ||
| 214 | +}; | ||
| 215 | + | ||
| 216 | +// ✅ 2. 缩放图片 | ||
| 217 | +const scaleImage = (factor) => { | ||
| 218 | +const sw = bounds.value.getSouthWest(); | ||
| 219 | +const ne = bounds.value.getNorthEast(); | ||
| 220 | + | ||
| 221 | +const centerX = (sw.lng + ne.lng) / 2; | ||
| 222 | +const centerY = (sw.lat + ne.lat) / 2; | ||
| 223 | +const newWidth = (ne.lng - sw.lng) * factor; | ||
| 224 | +const newHeight = (ne.lat - sw.lat) * factor; | ||
| 225 | + | ||
| 226 | +bounds.value = new AMap.Bounds( | ||
| 227 | + [centerX - newWidth / 2, centerY - newHeight / 2], | ||
| 228 | + [centerX + newWidth / 2, centerY + newHeight / 2] | ||
| 229 | +); | ||
| 230 | + | ||
| 231 | +imageLayer.value.setBounds(bounds.value); | ||
| 232 | +}; | ||
| 233 | + | ||
| 234 | +// 旋转地图 | ||
| 235 | +const rotateMap = (deltaAngle) => { | ||
| 236 | + if (!map.value) return; | ||
| 237 | + | ||
| 238 | + mapRotation.value += deltaAngle; | ||
| 239 | + | ||
| 240 | + console.log(`地图旋转: ${mapRotation.value}°`); | ||
| 241 | + | ||
| 242 | + map.value.setRotation(mapRotation.value); | ||
| 243 | +}; | ||
| 244 | + | ||
| 245 | + | ||
| 246 | +const onZoomChange = (value) => { // 调整地图图层 | ||
| 247 | + map.value.setZoom(value); | ||
| 248 | +} | ||
| 249 | + | ||
| 250 | +const onLBRangeBlur = () => { | ||
| 251 | + const str = map_left_bottom_range.value; | ||
| 252 | + const formattedArray = str.split(',').map(Number); | ||
| 253 | + map_left_bottom_range.value = formattedArray; | ||
| 254 | +} | ||
| 255 | +const onRTRangeBlur = () => { | ||
| 256 | + const str = map_right_top_range.value; | ||
| 257 | + const formattedArray = str.split(',').map(Number); | ||
| 258 | + map_right_top_range.value = formattedArray; | ||
| 259 | +} | ||
| 260 | + | ||
| 261 | +const showUpload = computed(() => { | ||
| 262 | + return map_left_bottom_range.value && map_right_top_range.value ? true : false; | ||
| 263 | +}); | ||
| 264 | + | ||
| 265 | +const onCenterBlur = () => { | ||
| 266 | + const str = map_center.value; | ||
| 267 | + const formattedArray = str.split(',').map(Number); | ||
| 268 | + map.value.setCenter(formattedArray); | ||
| 269 | +} | ||
| 270 | +</script> | ||
| 271 | + | ||
| 272 | +<style> | ||
| 273 | +#map-container { | ||
| 274 | + width: 100%; | ||
| 275 | + height: 100vh; | ||
| 276 | +} | ||
| 277 | + | ||
| 278 | +.controls { | ||
| 279 | + position: absolute; | ||
| 280 | + top: 8rem; | ||
| 281 | + right: 10px; | ||
| 282 | + background: rgba(255, 255, 255, 0.8); | ||
| 283 | + padding: 10px; | ||
| 284 | + border-radius: 5px; | ||
| 285 | + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); | ||
| 286 | +} | ||
| 287 | +</style> |
| ... | @@ -9,6 +9,7 @@ import { createProxy } from './build/proxy' | ... | @@ -9,6 +9,7 @@ import { createProxy } from './build/proxy' |
| 9 | import DefineOptions from 'unplugin-vue-define-options/vite'; | 9 | import DefineOptions from 'unplugin-vue-define-options/vite'; |
| 10 | import AutoImport from 'unplugin-auto-import/vite'; | 10 | import AutoImport from 'unplugin-auto-import/vite'; |
| 11 | import postcsspxtoviewport from 'postcss-px-to-viewport' | 11 | import postcsspxtoviewport from 'postcss-px-to-viewport' |
| 12 | +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' | ||
| 12 | 13 | ||
| 13 | var path = require('path'); | 14 | var path = require('path'); |
| 14 | const fs = require('fs'); | 15 | const fs = require('fs'); |
| ... | @@ -30,7 +31,7 @@ export default ({ command, mode }) => { | ... | @@ -30,7 +31,7 @@ export default ({ command, mode }) => { |
| 30 | // 将要用到的插件数组。Falsy 虚值的插件将被忽略,插件数组将被扁平化(flatten)。查看 插件 API 获取 Vite 插件的更多细节。 | 31 | // 将要用到的插件数组。Falsy 虚值的插件将被忽略,插件数组将被扁平化(flatten)。查看 插件 API 获取 Vite 插件的更多细节。 |
| 31 | vue(), | 32 | vue(), |
| 32 | Components({ | 33 | Components({ |
| 33 | - resolvers: [VantResolver()], | 34 | + resolvers: [VantResolver(), ElementPlusResolver()], |
| 34 | }), | 35 | }), |
| 35 | // styleImport({ | 36 | // styleImport({ |
| 36 | // resolves: [VantResolve()], | 37 | // resolves: [VantResolve()], |
| ... | @@ -56,6 +57,7 @@ export default ({ command, mode }) => { | ... | @@ -56,6 +57,7 @@ export default ({ command, mode }) => { |
| 56 | eslintrc: { | 57 | eslintrc: { |
| 57 | enabled: true, | 58 | enabled: true, |
| 58 | }, | 59 | }, |
| 60 | + resolvers: [ElementPlusResolver()], | ||
| 59 | }), | 61 | }), |
| 60 | ], | 62 | ], |
| 61 | publicDir: 'public', // 作为静态资源服务的文件夹。这个目录中的文件会在开发中被服务于 /,在开发模式时,会被拷贝到 outDir 的根目录,并没有转换,永远只是复制到这里。该值可以是文件系统的绝对路径,也可以是相对于项目的根目录路径。 | 63 | publicDir: 'public', // 作为静态资源服务的文件夹。这个目录中的文件会在开发中被服务于 /,在开发模式时,会被拷贝到 outDir 的根目录,并没有转换,永远只是复制到这里。该值可以是文件系统的绝对路径,也可以是相对于项目的根目录路径。 | ... | ... |
| ... | @@ -2,6 +2,11 @@ | ... | @@ -2,6 +2,11 @@ |
| 2 | # yarn lockfile v1 | 2 | # yarn lockfile v1 |
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | +"@amap/amap-jsapi-loader@^1.0.1": | ||
| 6 | + version "1.0.1" | ||
| 7 | + resolved "https://mirrors.cloud.tencent.com/npm/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz#9ec4b4d5d2467eac451f6c852e35db69e9f9f0c0" | ||
| 8 | + integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw== | ||
| 9 | + | ||
| 5 | "@antfu/utils@^0.5.2": | 10 | "@antfu/utils@^0.5.2": |
| 6 | version "0.5.2" | 11 | version "0.5.2" |
| 7 | resolved "https://mirrors.cloud.tencent.com/npm/@antfu/utils/-/utils-0.5.2.tgz" | 12 | resolved "https://mirrors.cloud.tencent.com/npm/@antfu/utils/-/utils-0.5.2.tgz" |
| ... | @@ -55,6 +60,11 @@ | ... | @@ -55,6 +60,11 @@ |
| 55 | resolved "https://mirrors.cloud.tencent.com/npm/@colors/colors/-/colors-1.5.0.tgz" | 60 | resolved "https://mirrors.cloud.tencent.com/npm/@colors/colors/-/colors-1.5.0.tgz" |
| 56 | integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== | 61 | integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== |
| 57 | 62 | ||
| 63 | +"@ctrl/tinycolor@^3.4.1": | ||
| 64 | + version "3.6.1" | ||
| 65 | + resolved "https://mirrors.cloud.tencent.com/npm/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" | ||
| 66 | + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== | ||
| 67 | + | ||
| 58 | "@cypress/request@^2.88.10": | 68 | "@cypress/request@^2.88.10": |
| 59 | version "2.88.11" | 69 | version "2.88.11" |
| 60 | resolved "https://mirrors.cloud.tencent.com/npm/@cypress/request/-/request-2.88.11.tgz" | 70 | resolved "https://mirrors.cloud.tencent.com/npm/@cypress/request/-/request-2.88.11.tgz" |
| ... | @@ -87,6 +97,11 @@ | ... | @@ -87,6 +97,11 @@ |
| 87 | debug "^3.1.0" | 97 | debug "^3.1.0" |
| 88 | lodash.once "^4.1.1" | 98 | lodash.once "^4.1.1" |
| 89 | 99 | ||
| 100 | +"@element-plus/icons-vue@^2.3.1": | ||
| 101 | + version "2.3.1" | ||
| 102 | + resolved "https://mirrors.cloud.tencent.com/npm/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz#1f635ad5fdd5c85ed936481525570e82b5a8307a" | ||
| 103 | + integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg== | ||
| 104 | + | ||
| 90 | "@eslint-community/eslint-utils@^4.3.0": | 105 | "@eslint-community/eslint-utils@^4.3.0": |
| 91 | version "4.4.0" | 106 | version "4.4.0" |
| 92 | resolved "https://mirrors.cloud.tencent.com/npm/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" | 107 | resolved "https://mirrors.cloud.tencent.com/npm/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" |
| ... | @@ -94,6 +109,26 @@ | ... | @@ -94,6 +109,26 @@ |
| 94 | dependencies: | 109 | dependencies: |
| 95 | eslint-visitor-keys "^3.3.0" | 110 | eslint-visitor-keys "^3.3.0" |
| 96 | 111 | ||
| 112 | +"@floating-ui/core@^1.6.0": | ||
| 113 | + version "1.6.9" | ||
| 114 | + resolved "https://mirrors.cloud.tencent.com/npm/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" | ||
| 115 | + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== | ||
| 116 | + dependencies: | ||
| 117 | + "@floating-ui/utils" "^0.2.9" | ||
| 118 | + | ||
| 119 | +"@floating-ui/dom@^1.0.1": | ||
| 120 | + version "1.6.13" | ||
| 121 | + resolved "https://mirrors.cloud.tencent.com/npm/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" | ||
| 122 | + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== | ||
| 123 | + dependencies: | ||
| 124 | + "@floating-ui/core" "^1.6.0" | ||
| 125 | + "@floating-ui/utils" "^0.2.9" | ||
| 126 | + | ||
| 127 | +"@floating-ui/utils@^0.2.9": | ||
| 128 | + version "0.2.9" | ||
| 129 | + resolved "https://mirrors.cloud.tencent.com/npm/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" | ||
| 130 | + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== | ||
| 131 | + | ||
| 97 | "@jridgewell/sourcemap-codec@^1.4.13": | 132 | "@jridgewell/sourcemap-codec@^1.4.13": |
| 98 | version "1.4.15" | 133 | version "1.4.15" |
| 99 | resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" | 134 | resolved "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" |
| ... | @@ -152,6 +187,11 @@ | ... | @@ -152,6 +187,11 @@ |
| 152 | resolved "https://mirrors.cloud.tencent.com/npm/@photo-sphere-viewer/virtual-tour-plugin/-/virtual-tour-plugin-5.7.3.tgz#3359446d1ff429c7c7673329b80a62ff13ae0591" | 187 | resolved "https://mirrors.cloud.tencent.com/npm/@photo-sphere-viewer/virtual-tour-plugin/-/virtual-tour-plugin-5.7.3.tgz#3359446d1ff429c7c7673329b80a62ff13ae0591" |
| 153 | integrity sha512-TMlRT5edoLk54YtyPY1U3q7h2OfCFEvQna8zoSilhBO21ENivOtnCm055YS6JvaAuTmD91kN4lfBZlhk0+fzPg== | 188 | integrity sha512-TMlRT5edoLk54YtyPY1U3q7h2OfCFEvQna8zoSilhBO21ENivOtnCm055YS6JvaAuTmD91kN4lfBZlhk0+fzPg== |
| 154 | 189 | ||
| 190 | +"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": | ||
| 191 | + version "2.11.7" | ||
| 192 | + resolved "https://mirrors.cloud.tencent.com/npm/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671" | ||
| 193 | + integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== | ||
| 194 | + | ||
| 155 | "@rollup/pluginutils@^4.1.2", "@rollup/pluginutils@^4.2.1": | 195 | "@rollup/pluginutils@^4.1.2", "@rollup/pluginutils@^4.2.1": |
| 156 | version "4.2.1" | 196 | version "4.2.1" |
| 157 | resolved "https://mirrors.cloud.tencent.com/npm/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" | 197 | resolved "https://mirrors.cloud.tencent.com/npm/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" |
| ... | @@ -181,6 +221,18 @@ | ... | @@ -181,6 +221,18 @@ |
| 181 | dependencies: | 221 | dependencies: |
| 182 | "@types/sizzle" "*" | 222 | "@types/sizzle" "*" |
| 183 | 223 | ||
| 224 | +"@types/lodash-es@^4.17.6": | ||
| 225 | + version "4.17.12" | ||
| 226 | + resolved "https://mirrors.cloud.tencent.com/npm/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" | ||
| 227 | + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== | ||
| 228 | + dependencies: | ||
| 229 | + "@types/lodash" "*" | ||
| 230 | + | ||
| 231 | +"@types/lodash@*": | ||
| 232 | + version "4.17.14" | ||
| 233 | + resolved "https://mirrors.cloud.tencent.com/npm/@types/lodash/-/lodash-4.17.14.tgz#bafc053533f4cdc5fcc9635af46a963c1f3deaff" | ||
| 234 | + integrity sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A== | ||
| 235 | + | ||
| 184 | "@types/lodash@^4.14.182": | 236 | "@types/lodash@^4.14.182": |
| 185 | version "4.14.182" | 237 | version "4.14.182" |
| 186 | resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz" | 238 | resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz" |
| ... | @@ -213,6 +265,11 @@ | ... | @@ -213,6 +265,11 @@ |
| 213 | resolved "https://mirrors.cloud.tencent.com/npm/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz" | 265 | resolved "https://mirrors.cloud.tencent.com/npm/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz" |
| 214 | integrity sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A== | 266 | integrity sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A== |
| 215 | 267 | ||
| 268 | +"@types/web-bluetooth@^0.0.16": | ||
| 269 | + version "0.0.16" | ||
| 270 | + resolved "https://mirrors.cloud.tencent.com/npm/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" | ||
| 271 | + integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== | ||
| 272 | + | ||
| 216 | "@types/yauzl@^2.9.1": | 273 | "@types/yauzl@^2.9.1": |
| 217 | version "2.10.0" | 274 | version "2.10.0" |
| 218 | resolved "https://mirrors.cloud.tencent.com/npm/@types/yauzl/-/yauzl-2.10.0.tgz" | 275 | resolved "https://mirrors.cloud.tencent.com/npm/@types/yauzl/-/yauzl-2.10.0.tgz" |
| ... | @@ -451,11 +508,26 @@ | ... | @@ -451,11 +508,26 @@ |
| 451 | "@vueuse/shared" "8.9.4" | 508 | "@vueuse/shared" "8.9.4" |
| 452 | vue-demi "*" | 509 | vue-demi "*" |
| 453 | 510 | ||
| 511 | +"@vueuse/core@^9.1.0": | ||
| 512 | + version "9.13.0" | ||
| 513 | + resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" | ||
| 514 | + integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== | ||
| 515 | + dependencies: | ||
| 516 | + "@types/web-bluetooth" "^0.0.16" | ||
| 517 | + "@vueuse/metadata" "9.13.0" | ||
| 518 | + "@vueuse/shared" "9.13.0" | ||
| 519 | + vue-demi "*" | ||
| 520 | + | ||
| 454 | "@vueuse/metadata@8.9.4": | 521 | "@vueuse/metadata@8.9.4": |
| 455 | version "8.9.4" | 522 | version "8.9.4" |
| 456 | resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/metadata/-/metadata-8.9.4.tgz" | 523 | resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/metadata/-/metadata-8.9.4.tgz" |
| 457 | integrity sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw== | 524 | integrity sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw== |
| 458 | 525 | ||
| 526 | +"@vueuse/metadata@9.13.0": | ||
| 527 | + version "9.13.0" | ||
| 528 | + resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" | ||
| 529 | + integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== | ||
| 530 | + | ||
| 459 | "@vueuse/shared@8.9.4": | 531 | "@vueuse/shared@8.9.4": |
| 460 | version "8.9.4" | 532 | version "8.9.4" |
| 461 | resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/shared/-/shared-8.9.4.tgz" | 533 | resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/shared/-/shared-8.9.4.tgz" |
| ... | @@ -463,6 +535,13 @@ | ... | @@ -463,6 +535,13 @@ |
| 463 | dependencies: | 535 | dependencies: |
| 464 | vue-demi "*" | 536 | vue-demi "*" |
| 465 | 537 | ||
| 538 | +"@vueuse/shared@9.13.0": | ||
| 539 | + version "9.13.0" | ||
| 540 | + resolved "https://mirrors.cloud.tencent.com/npm/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" | ||
| 541 | + integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== | ||
| 542 | + dependencies: | ||
| 543 | + vue-demi "*" | ||
| 544 | + | ||
| 466 | "@xmldom/xmldom@^0.8.3": | 545 | "@xmldom/xmldom@^0.8.3": |
| 467 | version "0.8.7" | 546 | version "0.8.7" |
| 468 | resolved "https://mirrors.cloud.tencent.com/npm/@xmldom/xmldom/-/xmldom-0.8.7.tgz" | 547 | resolved "https://mirrors.cloud.tencent.com/npm/@xmldom/xmldom/-/xmldom-0.8.7.tgz" |
| ... | @@ -603,6 +682,11 @@ astral-regex@^2.0.0: | ... | @@ -603,6 +682,11 @@ astral-regex@^2.0.0: |
| 603 | resolved "https://mirrors.cloud.tencent.com/npm/astral-regex/-/astral-regex-2.0.0.tgz" | 682 | resolved "https://mirrors.cloud.tencent.com/npm/astral-regex/-/astral-regex-2.0.0.tgz" |
| 604 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== | 683 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== |
| 605 | 684 | ||
| 685 | +async-validator@^4.2.5: | ||
| 686 | + version "4.2.5" | ||
| 687 | + resolved "https://mirrors.cloud.tencent.com/npm/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" | ||
| 688 | + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== | ||
| 689 | + | ||
| 606 | async@^3.2.0: | 690 | async@^3.2.0: |
| 607 | version "3.2.4" | 691 | version "3.2.4" |
| 608 | resolved "https://mirrors.cloud.tencent.com/npm/async/-/async-3.2.4.tgz" | 692 | resolved "https://mirrors.cloud.tencent.com/npm/async/-/async-3.2.4.tgz" |
| ... | @@ -1052,6 +1136,11 @@ dayjs@^1.10.4, dayjs@^1.11.3: | ... | @@ -1052,6 +1136,11 @@ dayjs@^1.10.4, dayjs@^1.11.3: |
| 1052 | resolved "https://mirrors.cloud.tencent.com/npm/dayjs/-/dayjs-1.11.7.tgz" | 1136 | resolved "https://mirrors.cloud.tencent.com/npm/dayjs/-/dayjs-1.11.7.tgz" |
| 1053 | integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== | 1137 | integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== |
| 1054 | 1138 | ||
| 1139 | +dayjs@^1.11.13: | ||
| 1140 | + version "1.11.13" | ||
| 1141 | + resolved "https://mirrors.cloud.tencent.com/npm/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" | ||
| 1142 | + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== | ||
| 1143 | + | ||
| 1055 | debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: | 1144 | debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: |
| 1056 | version "4.3.4" | 1145 | version "4.3.4" |
| 1057 | resolved "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz" | 1146 | resolved "https://mirrors.cloud.tencent.com/npm/debug/-/debug-4.3.4.tgz" |
| ... | @@ -1134,6 +1223,27 @@ ecc-jsbn@~0.1.1: | ... | @@ -1134,6 +1223,27 @@ ecc-jsbn@~0.1.1: |
| 1134 | jsbn "~0.1.0" | 1223 | jsbn "~0.1.0" |
| 1135 | safer-buffer "^2.1.0" | 1224 | safer-buffer "^2.1.0" |
| 1136 | 1225 | ||
| 1226 | +element-plus@^2.9.3: | ||
| 1227 | + version "2.9.3" | ||
| 1228 | + resolved "https://mirrors.cloud.tencent.com/npm/element-plus/-/element-plus-2.9.3.tgz#9d44f9aa5a810009490ecb814052aed560d77bb0" | ||
| 1229 | + integrity sha512-6tSLp5XytDS4TMZ0P3aGZnr7MXTagfNycepNfIDitd9IgwM9y01+Ssu6mglNi8RiXYhek6LBWNOd/cvpIO12+w== | ||
| 1230 | + dependencies: | ||
| 1231 | + "@ctrl/tinycolor" "^3.4.1" | ||
| 1232 | + "@element-plus/icons-vue" "^2.3.1" | ||
| 1233 | + "@floating-ui/dom" "^1.0.1" | ||
| 1234 | + "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" | ||
| 1235 | + "@types/lodash" "^4.14.182" | ||
| 1236 | + "@types/lodash-es" "^4.17.6" | ||
| 1237 | + "@vueuse/core" "^9.1.0" | ||
| 1238 | + async-validator "^4.2.5" | ||
| 1239 | + dayjs "^1.11.13" | ||
| 1240 | + escape-html "^1.0.3" | ||
| 1241 | + lodash "^4.17.21" | ||
| 1242 | + lodash-es "^4.17.21" | ||
| 1243 | + lodash-unified "^1.0.2" | ||
| 1244 | + memoize-one "^6.0.0" | ||
| 1245 | + normalize-wheel-es "^1.2.0" | ||
| 1246 | + | ||
| 1137 | emoji-regex@^8.0.0: | 1247 | emoji-regex@^8.0.0: |
| 1138 | version "8.0.0" | 1248 | version "8.0.0" |
| 1139 | resolved "https://mirrors.cloud.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz" | 1249 | resolved "https://mirrors.cloud.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz" |
| ... | @@ -1296,6 +1406,11 @@ escalade@^3.1.1: | ... | @@ -1296,6 +1406,11 @@ escalade@^3.1.1: |
| 1296 | resolved "https://mirrors.cloud.tencent.com/npm/escalade/-/escalade-3.1.1.tgz" | 1406 | resolved "https://mirrors.cloud.tencent.com/npm/escalade/-/escalade-3.1.1.tgz" |
| 1297 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== | 1407 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== |
| 1298 | 1408 | ||
| 1409 | +escape-html@^1.0.3: | ||
| 1410 | + version "1.0.3" | ||
| 1411 | + resolved "https://mirrors.cloud.tencent.com/npm/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" | ||
| 1412 | + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== | ||
| 1413 | + | ||
| 1299 | escape-string-regexp@4.0.0: | 1414 | escape-string-regexp@4.0.0: |
| 1300 | version "4.0.0" | 1415 | version "4.0.0" |
| 1301 | resolved "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" | 1416 | resolved "https://mirrors.cloud.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" |
| ... | @@ -1993,6 +2108,16 @@ locate-path@^6.0.0: | ... | @@ -1993,6 +2108,16 @@ locate-path@^6.0.0: |
| 1993 | dependencies: | 2108 | dependencies: |
| 1994 | p-locate "^5.0.0" | 2109 | p-locate "^5.0.0" |
| 1995 | 2110 | ||
| 2111 | +lodash-es@^4.17.21: | ||
| 2112 | + version "4.17.21" | ||
| 2113 | + resolved "https://mirrors.cloud.tencent.com/npm/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" | ||
| 2114 | + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== | ||
| 2115 | + | ||
| 2116 | +lodash-unified@^1.0.2: | ||
| 2117 | + version "1.0.3" | ||
| 2118 | + resolved "https://mirrors.cloud.tencent.com/npm/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894" | ||
| 2119 | + integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== | ||
| 2120 | + | ||
| 1996 | lodash.once@^4.1.1: | 2121 | lodash.once@^4.1.1: |
| 1997 | version "4.1.1" | 2122 | version "4.1.1" |
| 1998 | resolved "https://mirrors.cloud.tencent.com/npm/lodash.once/-/lodash.once-4.1.1.tgz" | 2123 | resolved "https://mirrors.cloud.tencent.com/npm/lodash.once/-/lodash.once-4.1.1.tgz" |
| ... | @@ -2080,6 +2205,11 @@ make-dir@^2.1.0: | ... | @@ -2080,6 +2205,11 @@ make-dir@^2.1.0: |
| 2080 | pify "^4.0.1" | 2205 | pify "^4.0.1" |
| 2081 | semver "^5.6.0" | 2206 | semver "^5.6.0" |
| 2082 | 2207 | ||
| 2208 | +memoize-one@^6.0.0: | ||
| 2209 | + version "6.0.0" | ||
| 2210 | + resolved "https://mirrors.cloud.tencent.com/npm/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" | ||
| 2211 | + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== | ||
| 2212 | + | ||
| 2083 | merge-stream@^2.0.0: | 2213 | merge-stream@^2.0.0: |
| 2084 | version "2.0.0" | 2214 | version "2.0.0" |
| 2085 | resolved "https://mirrors.cloud.tencent.com/npm/merge-stream/-/merge-stream-2.0.0.tgz" | 2215 | resolved "https://mirrors.cloud.tencent.com/npm/merge-stream/-/merge-stream-2.0.0.tgz" |
| ... | @@ -2301,6 +2431,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: | ... | @@ -2301,6 +2431,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: |
| 2301 | resolved "https://mirrors.cloud.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz" | 2431 | resolved "https://mirrors.cloud.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz" |
| 2302 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== | 2432 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== |
| 2303 | 2433 | ||
| 2434 | +normalize-wheel-es@^1.2.0: | ||
| 2435 | + version "1.2.0" | ||
| 2436 | + resolved "https://mirrors.cloud.tencent.com/npm/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e" | ||
| 2437 | + integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== | ||
| 2438 | + | ||
| 2304 | npm-run-path@^4.0.0: | 2439 | npm-run-path@^4.0.0: |
| 2305 | version "4.0.1" | 2440 | version "4.0.1" |
| 2306 | resolved "https://mirrors.cloud.tencent.com/npm/npm-run-path/-/npm-run-path-4.0.1.tgz" | 2441 | resolved "https://mirrors.cloud.tencent.com/npm/npm-run-path/-/npm-run-path-4.0.1.tgz" | ... | ... |
-
Please register or login to post a comment