hookehuyr

✨ feat: 新增瓦片切图工具

...@@ -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 ];
......
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 +}
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>地图层级:&nbsp;</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>上传图片范围:&nbsp;</div>
33 + <el-input
34 + v-model="map_left_bottom_range"
35 + style="width: 240px"
36 + placeholder="输入左下角经纬度"
37 + @blur="onLBRangeBlur"
38 + />
39 + &nbsp;
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"
......