This commit is contained in:
李想 2025-03-31 09:03:27 +08:00
commit a40e213446
46 changed files with 3026 additions and 520 deletions

View File

@ -44,6 +44,7 @@
"screenfull": "^6.0.2",
"vite-plugin-svg-icons": "^2.0.1",
"vue": "^3.5.11",
"vue-cesium": "^3.2.9",
"vue-router": "^4.2.5"
},
"devDependencies": {

View File

@ -6,7 +6,6 @@
<script setup name="App">
import { reactive, provide, nextTick } from 'vue';
const state = reactive({
isRouterAlive: true,
});

View File

@ -0,0 +1,84 @@
<template>
<div ref="chartRef" :style="{ height, width }"></div>
</template>
<script>
import { ref, reactive, watch, watchEffect } from 'vue';
import { cloneDeep } from 'lodash';
import { useEcharts } from '../../hooks/useEcharts';
export default {
name: 'CustomEchartMaps',
props: {
chartData: {
type: Array,
default: () => [],
},
size: {
type: Object,
default: () => {},
},
option: {
type: Object,
default: () => ({}),
},
width: {
type: String,
default: '100%',
},
geo: {
type: Object,
default: () => {
return {};
},
},
name: {
type: String,
default: '',
},
height: {
type: String,
default: 'calc(100vh - 78px)',
},
},
emits: ['click'],
setup(props, { emit }) {
const chartRef = ref(null);
const { setOptions, getInstance, resize, registerMap } = useEcharts(chartRef);
const option = reactive({
// series: [],
});
watchEffect(() => {
props.chartData && initCharts();
});
watch(
() => props.size,
() => {
resize();
},
{
immediate: true,
}
);
function initCharts() {
if (props.option) {
Object.assign(option, cloneDeep(props.option));
}
// option.series = props.chartData;
setOptions(option);
registerMap(props.name, props.geo);
resize();
getInstance()?.off('click', onClick);
getInstance()?.on('click', onClick);
}
function onClick(params) {
emit('click', params);
}
return { chartRef };
},
};
</script>

View File

@ -18,6 +18,7 @@ import CustomEchartWaterDroplet from './custom-echart-water-droplet';
import CustomEchartPieGauge from './custom-echart-pie-gauge';
import CustomEchartWordCloud from './custom-echart-word-cloud';
import customEchartScatterBlister from './custom-echart-scatter-blister';
import customEchartMaps from './custom-echart-maps';
export {
SvgIcon,
@ -40,4 +41,5 @@ export {
CustomEchartPieGauge,
CustomEchartWordCloud,
customEchartScatterBlister,
customEchartMaps,
};

View File

@ -73,6 +73,19 @@ export const useEcharts = (elRef, theme = 'default') => {
chartInstance?.resize();
}
/**
* 注册地图数据
* @param {string} mapName - 地图名称
* @param {object} geoJSON - GeoJSON 数据
*/
function registerMap(mapName, geoJSON) {
if (!mapName || !geoJSON) {
console.warn('地图名称或 GeoJSON 数据无效');
return;
}
echarts.registerMap(mapName, geoJSON);
}
watch(
() => getDarkMode.value,
(theme) => {
@ -103,5 +116,6 @@ export const useEcharts = (elRef, theme = 'default') => {
resize,
echarts,
getInstance,
registerMap,
};
};

View File

@ -10,8 +10,21 @@ import '@smallwei/avue/lib/index.css';
import { registerGlobalMicroApps } from './micro';
import { registerElIcons } from './plugins/icon';
import './utils/permission';
// import VueCesium from 'vue-cesium';
// import 'vue-cesium/dist/index.css';
// import { VcViewer } from 'vue-cesium';
const app = createApp(App);
app.use(pinia).use(router).use(ElementPlus).use(Avue).mount('#root');
app
.use(pinia)
.use(router)
.use(ElementPlus)
.use(Avue)
// .use(VueCesium, {
// cesiumPath: 'https://cdn.bootcdn.net/ajax/libs/cesium/1.69.0/Cesium.js',
// accessToken:
// 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0ZTNkNmE0MS03MjVmLTRjYjEtYjY0ZS0xOTYxZGQ5NmEwOWYiLCJpZCI6MjI1MTM2LCJpYXQiOjE3NDMwNDY5MDB9.uNWADbo2Ol2hip2BopPzk4LYAAsExE_POBasweIbYBk',
// })
.mount('#root');
registerElIcons(app);
registerGlobalMicroApps();

View File

@ -1,6 +1,17 @@
import * as echarts from 'echarts/core';
import { BarChart, LineChart, PieChart, MapChart, PictorialBarChart, RadarChart, GraphChart, GaugeChart, ScatterChart } from 'echarts/charts';
import {
BarChart,
LineChart,
PieChart,
MapChart,
PictorialBarChart,
RadarChart,
GraphChart,
GaugeChart,
ScatterChart,
EffectScatterChart,
} from 'echarts/charts';
import 'echarts-gl';
import 'echarts-liquidfill';
import 'echarts-wordcloud';
@ -49,6 +60,7 @@ echarts.use([
GraphChart,
GaugeChart,
ScatterChart,
EffectScatterChart,
]);
export default echarts;

View File

@ -2,6 +2,11 @@
# yarn lockfile v1
"@amap/amap-jsapi-loader@^1.0.1":
version "1.0.1"
resolved "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz#9ec4b4d5d2467eac451f6c852e35db69e9f9f0c0"
integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"@ampproject/remapping@^2.2.0":
version "2.3.0"
resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
@ -698,6 +703,34 @@
resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@turf/circle@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/circle/-/circle-6.5.0.tgz#dc017d8c0131d1d212b7c06f76510c22bbeb093c"
integrity sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==
dependencies:
"@turf/destination" "^6.5.0"
"@turf/helpers" "^6.5.0"
"@turf/destination@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/destination/-/destination-6.5.0.tgz#30a84702f9677d076130e0440d3223ae503fdae1"
integrity sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==
dependencies:
"@turf/helpers" "^6.5.0"
"@turf/invariant" "^6.5.0"
"@turf/helpers@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e"
integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==
"@turf/invariant@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/invariant/-/invariant-6.5.0.tgz#970afc988023e39c7ccab2341bd06979ddc7463f"
integrity sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==
dependencies:
"@turf/helpers" "^6.5.0"
"@types/eslint@^8.4.5":
version "8.56.12"
resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a"
@ -939,7 +972,7 @@
"@vue/compiler-ssr" "3.5.13"
"@vue/shared" "3.5.13"
"@vue/shared@3.5.13":
"@vue/shared@3.5.13", "@vue/shared@^3.2.47":
version "3.5.13"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
@ -1066,6 +1099,11 @@
resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532"
integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
"@zouyaoji/heatmap.js@^2.0.8":
version "2.0.8"
resolved "https://registry.npmmirror.com/@zouyaoji/heatmap.js/-/heatmap.js-2.0.8.tgz#5f6b285e7635ca07f2ecdb3d83a9dc1d240433d7"
integrity sha512-kBQny/zOUFH2OFoVyu6IdGJEcQMENIAASUsaZhk+OuJ9WexsYf6EU2lCyGURcsFly1kTMZKODlV7nBTCgfvJqg==
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@ -1742,6 +1780,11 @@ commander@~12.1.0:
resolved "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
compare-versions@^6.1.0:
version "6.1.1"
resolved "https://registry.npmmirror.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9"
integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==
component-emitter@^1.2.1:
version "1.3.1"
resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
@ -2200,7 +2243,7 @@ echarts-wordcloud@^2.1.0:
resolved "https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz#c3de6fe267044f6c3343e4ff0e05eedb01c05096"
integrity sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==
echarts@^5.6.0:
echarts@^5.4.3, echarts@^5.6.0:
version "5.6.0"
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz#2377874dca9fb50f104051c3553544752da3c9d6"
integrity sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
@ -3976,6 +4019,11 @@ jszip@^3.10.1:
readable-stream "~2.3.6"
setimmediate "^1.0.5"
kdbush@^4.0.2:
version "4.0.2"
resolved "https://registry.npmmirror.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39"
integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==
keyv@^4.5.3, keyv@^4.5.4:
version "4.5.4"
resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@ -4132,7 +4180,7 @@ lodash-es@^4.17.21:
resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash-unified@^1.0.2:
lodash-unified@^1.0.2, lodash-unified@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894"
integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
@ -4352,6 +4400,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
mgrs@1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/mgrs/-/mgrs-1.0.0.tgz#fb91588e78c90025672395cb40b25f7cd6ad1829"
integrity sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==
micromatch@3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2"
@ -4461,6 +4514,11 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
mixin-deep@^1.2.0:
version "1.3.2"
resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
@ -5227,6 +5285,14 @@ progress@^2.0.3:
resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
proj4@^2.9.1:
version "2.15.0"
resolved "https://registry.npmmirror.com/proj4/-/proj4-2.15.0.tgz#d77c9956861c8ed516071c4208d576cebe800eb5"
integrity sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==
dependencies:
mgrs "1.0.0"
wkt-parser "^1.4.0"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@ -6780,6 +6846,11 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
urijs@^1.19.11:
version "1.19.11"
resolved "https://registry.npmmirror.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc"
integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
@ -6923,6 +6994,25 @@ vite@^5.0.8:
optionalDependencies:
fsevents "~2.3.3"
vue-cesium@^3.2.9:
version "3.2.9"
resolved "https://registry.npmmirror.com/vue-cesium/-/vue-cesium-3.2.9.tgz#67b9dcbb4ed8e228fde886b957d0f4b4a3e388ba"
integrity sha512-MOgxAfIL+qYT608n+Bqioz2NbAM9pTWztzZ2gOqfHMxNeOFGROCUFatrzCP/OhndeEH8hbqdnGyxt1bHV9+dzQ==
dependencies:
"@amap/amap-jsapi-loader" "^1.0.1"
"@turf/circle" "^6.5.0"
"@vue/shared" "^3.2.47"
"@zouyaoji/heatmap.js" "^2.0.8"
compare-versions "^6.1.0"
echarts "^5.4.3"
kdbush "^4.0.2"
lodash "^4.17.21"
lodash-es "^4.17.21"
lodash-unified "^1.0.3"
mitt "^3.0.1"
proj4 "^2.9.1"
urijs "^1.19.11"
vue-demi@*, vue-demi@^0.14.10:
version "0.14.10"
resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
@ -7047,6 +7137,11 @@ wildcard@^1.1.0:
resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
wkt-parser@^1.4.0:
version "1.4.0"
resolved "https://registry.npmmirror.com/wkt-parser/-/wkt-parser-1.4.0.tgz#7cca07a6ee5b4baf059b723e62d7fe95bc923bf5"
integrity sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"

View File

@ -0,0 +1,58 @@
import request from '@/utils/axios';
/**
* @Title: 列表
*/
export function GetEntityList(params = {}) {
return request('/system/dept/list', {
method: 'GET',
params,
});
}
/**
* @Title: 信息
*/
export function GetEntity(id) {
return request(`/system/dept/list/exclude/${id}`, {
method: 'GET',
});
}
/**
* @Title: 新增
*/
export function AddEntity(data = {}) {
return request('/system/dept', {
method: 'POST',
data,
});
}
/**
* @Title: 修改
*/
export function UpdateEntity(data = {}) {
return request('/system/dept', {
method: 'PUT',
data,
});
}
/**
* @Title: 删除
*/
export function DeleteEntity(params = {}) {
return request(`/system/dict/type/${params.id}`, {
method: 'DELETE',
});
}
/**
* @Title: 查询部门列表排除节点
*/
export function GetDeptExcludeChild(id) {
return request(`/system/dept/list/exclude/${id}`, {
method: 'GET',
});
}

View File

@ -0,0 +1,49 @@
import request from '@/utils/axios';
/**
* @Title: 列表
*/
export function GetEntityList(params = {}) {
return request('/system/dict/data/list', {
method: 'GET',
params,
});
}
/**
* @Title: 新增
*/
export function AddEntity(data = {}) {
return request('/system/dict/data', {
method: 'POST',
data,
});
}
/**
* @Title: 修改
*/
export function UpdateEntity(data = {}) {
return request('/system/dict/data', {
method: 'PUT',
data,
});
}
/**
* @Title: 删除
*/
export function DeleteEntity(params = {}) {
return request(`/system/dict/data/${params.id}`, {
method: 'DELETE',
});
}
/**
* @Title: 根据字典类型查询字典数据信息
*/
export function GetDict(dictType) {
return request(`/system/dict/data/list/${dictType}`, {
method: 'GET',
});
}

View File

@ -0,0 +1,58 @@
import request from '@/utils/axios';
/**
* @Title: 列表
*/
export function GetEntityList(params = {}) {
return request('/system/dict/type/list', {
method: 'GET',
params,
});
}
/**
* @Title: 新增
*/
export function AddEntity(data = {}) {
return request('/system/dict/type', {
method: 'POST',
data,
});
}
/**
* @Title: 修改
*/
export function UpdateEntity(data = {}) {
return request('/system/dict/type', {
method: 'PUT',
data,
});
}
/**
* @Title: 删除
*/
export function DeleteEntity(params = {}) {
return request(`/system/dict/type/${params.id}`, {
method: 'DELETE',
});
}
/**
* @Title: 获取字典选择框列表
*/
export function GetEntityOption() {
return request('system/dict/type/optionselect', {
method: 'GET',
});
}
/**
* @Title: 信息
*/
export function GetDictType(dictId) {
return request(`/system/dict/type/list/${dictId}`, {
method: 'GET',
});
}

View File

@ -3,7 +3,7 @@
* @Author: zenghua.wang
* @Date: 2023-06-20 11:48:41
* @LastEditors: zenghua.wang
* @LastEditTime: 2025-03-20 14:40:44
* @LastEditTime: 2025-03-26 16:14:45
*/
import { createRouter, createWebHistory } from 'vue-router';
import Layout from '@/layouts/index.vue';
@ -13,6 +13,7 @@ import traceRouter from './modules/trace';
import productOperateMainRoutes from './modules/productOperateMain';
import inputSuppliesRoutes from './modules/inputSupplies';
import plantingAndBreedingRouter from './modules/plantingAndBreeding';
import systemRouter from './modules/system';
export const constantRoutes = [
{
@ -47,6 +48,7 @@ export const constantRoutes = [
...inputSuppliesRoutes,
...plantingAndBreedingRouter,
...traceRouter,
...systemRouter,
];
/**

View File

@ -0,0 +1,25 @@
import Layout from '@/layouts/index.vue';
export default [
{
path: '/sub-government-affairs-service/system',
name: 'system',
component: Layout,
redirect: '/sub-government-affairs-service/system-dict',
meta: { title: '系统管理', icon: 'Document' },
children: [
{
path: '/sub-government-affairs-service/system-dict-type',
component: () => import('@/views/system/dict/type.vue'),
name: 'system-dict-type',
meta: { title: '字典类型', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/system-dict',
component: () => import('@/views/system/dict/index.vue'),
name: 'system-dict',
meta: { title: '字典管理', icon: 'Document' },
},
],
},
];

View File

@ -3,7 +3,7 @@
* @Author: zenghua.wang
* @Date: 2022-02-23 21:12:37
* @LastEditors: zenghua.wang
* @LastEditTime: 2025-03-24 10:05:36
* @LastEditTime: 2025-03-28 14:18:58
*/
import lodash from 'lodash';
import dayjs from 'dayjs';
@ -123,6 +123,16 @@ export const setDicLabel = (dicData, value) => {
}
return label;
};
/**
* @Title 设置字段显隐
* @param {*} column
* @param {*} fields
*/
export const setPropDisplay = (column, fields) => {
column.forEach((item) => {
item.display = fields.includes(item.prop) ? false : true;
});
};
/**
* @Title 将tree数据结构打平
* @param {*} tree
@ -259,25 +269,62 @@ export const blobToJSON = (blob) => {
* @param tree
* @returns
*/
export const getTree = (tree = []) => {
tree.forEach((item) => {
delete item.children;
export const getTree = (data, id = 'id', parentId = 'parentId', children = 'children') => {
data.forEach((item) => {
delete item[children];
});
const map = {};
tree.forEach((item) => {
map[item.id] = item;
data.forEach((item) => {
map[item[id]] = item;
});
const arr = [];
tree.forEach((item) => {
const parent = map[item.parentId];
const tree = [];
data.forEach((item) => {
const parent = map[item[parentId]];
if (parent) {
(parent.children || (parent.children = [])).push(item);
parent[children] = parent[children] || [];
parent[children].push(item);
} else {
arr.push(item);
tree.push(item);
}
});
return arr;
return tree;
};
/**
* @Title 根据节点 id 查找其父级祖父级等所有上级节点 id
* @param {*} treeData
* @param {*} targetId
* @returns
*/
export const getParentIds = (treeData, targetId, id = 'id', children = 'children') => {
const parentMap = {};
function buildParentMap(node, parentId = null) {
if (node[id]) {
parentMap[node[id]] = parentId;
}
if (node[children]) {
for (const child of node[children]) {
buildParentMap(child, node[id]);
}
}
}
for (const rootNode of treeData) {
buildParentMap(rootNode);
}
const parentIds = [];
let currentId = targetId;
while (parentMap[currentId] !== null) {
parentIds.push(parentMap[currentId]);
currentId = parentMap[currentId];
}
return parentIds.reverse();
};
/**
* @Title 获取路由中的参数
* @param name

View File

@ -58,7 +58,7 @@ import { useApp } from '@/hooks';
import { CRUD_OPTIONS } from '@/config';
import { getLandTypeTree, landTypeSave, getLandType, exportLandType, delLandType, editLandType } from '@/apis/baseInfo';
import { useUserStore } from '@/store/modules/user';
import { isEmpty, flattenTree, setDicLabel, downloadFile } from '@/utils';
import { isEmpty, getParentIds, flattenTree, setDicLabel, downloadFile } from '@/utils';
const { VITE_APP_BASE_API } = import.meta.env;
const app = useApp();
@ -125,7 +125,7 @@ const state = reactive({
dicHeaders: {
authorization: UserStore.token,
},
dicFormatter: (res) => [{ id: null, landType: '土地分类', children: res.data }],
dicFormatter: (res) => [{ id: '0', landType: '土地分类', children: res.data }],
span: 24,
rules: [
{
@ -188,7 +188,7 @@ watch(
if (!isEmpty(val)) {
const list = flattenTree(val);
treeDicData.value = list.map((item) => {
return { label: item.landType, value: item.id };
return { label: item.landType, value: item.id, id: item.id, parentId: item.pid };
});
}
}
@ -198,7 +198,7 @@ const getLandTree = async () => {
try {
const res = await getLandTypeTree();
if (res.code == 200) {
treeData.value = [{ id: null, landType: '土地分类', children: res.data }];
treeData.value = [{ id: '0', landType: '土地分类', children: res.data }];
}
} catch (err) {
app.$message.error(err.msg);
@ -210,7 +210,7 @@ getLandTree();
const loadData = () => {
state.loading = true;
getLandType({
pid: treeSelected.value?.id ?? null,
pid: treeSelected.value?.id ?? '0',
...state.query,
})
.then((res) => {
@ -307,7 +307,7 @@ async function rowDel(row, done, loading) {
const setPid = (row) => {
if (!isEmpty(row.pids)) {
const len = row.pids.length;
row.pid = row?.pids[len - 1] ?? null;
row.pid = row?.pids[len - 1] ?? '0';
}
};
@ -333,6 +333,8 @@ const rowSave = async (row, done, loading) => {
//
const rowEdit = (row) => {
row.pids = getParentIds(treeData.value, row.id);
console.log('pids=', row.pids);
crudRef.value && crudRef.value.rowEdit(row);
};

View File

@ -0,0 +1,239 @@
<template>
<div class="custom-page">
<avue-crud
ref="crudRef"
v-model="state.form"
v-model:search="state.query"
:table-loading="state.loading"
:data="state.data"
:option="state.options"
@refresh-change="refreshChange"
@search-reset="searchChange"
@search-change="searchChange"
@selection-change="selectionChange"
@row-save="rowSave"
@row-update="rowUpdate"
@row-del="rowDel"
>
<template #menu="scope">
<custom-table-operate :actions="state.options.actions" :data="scope" />
</template>
</avue-crud>
</div>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { useApp } from '@/hooks';
import { CRUD_OPTIONS } from '@/config';
import { isEmpty, getTree } from '@/utils';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity } from '@/apis/system/dept';
const app = useApp();
const crudRef = ref(null);
const state = reactive({
loading: false,
query: {},
form: {},
selection: [],
options: {
...CRUD_OPTIONS,
rowKey: 'deptId',
index: false,
selection: false,
expand: true,
column: [
{
label: '部门名称',
prop: 'deptName',
search: true,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '状态',
prop: 'status',
type: 'select',
search: true,
dicData: [
{
label: '启用',
value: '0',
},
{
label: '禁用',
value: '1',
},
],
value: '0',
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '排序',
prop: 'orderNum',
type: 'number',
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '负责人',
prop: 'leader',
hide: true,
},
{
label: '联系电话',
prop: 'phone',
hide: true,
},
{
label: '邮箱',
prop: 'email',
hide: true,
},
],
actions: [
{
name: '查看',
icon: 'view',
event: ({ row }) => rowView(row),
},
{
name: '编辑',
icon: 'edit',
event: ({ row }) => rowEdit(row),
},
{
type: 'danger',
name: '删除',
icon: 'delete',
event: ({ row }) => rowDel(row),
},
],
},
pageData: {
total: 0,
currentPage: 1,
pageSize: 10,
},
data: [],
minWeek: null,
maxWeek: null,
currentRow: {},
});
//
const loadData = () => {
state.loading = true;
GetEntityList(state.query)
.then((res) => {
if (res.code === 200) {
state.data = getTree(res.data, 'deptId');
console.log(139, state.data);
}
})
.catch((err) => {
app.$message.error(err.msg);
state.data = [];
})
.finally(() => {
state.loading = false;
});
};
loadData();
//
const searchChange = (params, done) => {
if (done) done();
state.query = params;
loadData();
};
//
const refreshChange = () => {
loadData();
app.$message.success('刷新成功');
};
//
const selectionChange = (rows) => {
state.selection = rows;
};
//
const rowView = (row) => {
crudRef.value.rowView(row);
};
//
const rowSave = (row, done, loading) => {
AddEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('添加成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowEdit = (row) => {
crudRef.value.rowEdit(row);
};
const rowUpdate = (row, index, done, loading) => {
UpdateEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('更新成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowDel = (row, index, done) => {
if (isEmpty(row)) return;
app
.$confirm(`删除后信息将不可查看,确认要删除吗?`, '确定删除', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
DeleteEntity({ id: row.id })
.then((res) => {
if (res.code === 200) {
app.$message.success('删除成功!');
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
})
.catch(() => {});
};
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="custom-page">
<avue-crud
ref="crudRef"
v-model="state.form"
v-model:search="state.query"
v-model:page="state.pageData"
:table-loading="state.loading"
:data="state.data"
:option="state.options"
@refresh-change="refreshChange"
@search-reset="searchChange"
@search-change="searchChange"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@row-save="rowSave"
@row-update="rowUpdate"
@row-del="rowDel"
>
<template #menu="scope">
<custom-table-operate :actions="state.options.actions" :data="scope" />
</template>
</avue-crud>
</div>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { useApp } from '@/hooks';
import { CRUD_OPTIONS } from '@/config';
import { isEmpty } from '@/utils';
import { useUserStore } from '@/store/modules/user';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity } from '@/apis/system/dict';
const { VITE_APP_BASE_API } = import.meta.env;
const app = useApp();
const UserStore = useUserStore();
const crudRef = ref(null);
const state = reactive({
loading: false,
query: {
current: 1,
size: 10,
},
form: {},
selection: [],
options: {
...CRUD_OPTIONS,
selection: false,
column: [
// {
// label: '',
// prop: 'dictCode',
// addDisplay: false,
// editDisplay: false,
// viewDisplay: false,
// },
{
label: '字典名称',
prop: 'dictLabel',
search: true,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '字典值',
prop: 'dictValue',
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '字典类型',
prop: 'dictType',
type: 'select',
search: true,
props: {
label: 'dictName',
value: 'dictType',
},
dicUrl: `${VITE_APP_BASE_API}/system/dict/type/optionselect`,
dicHeaders: {
authorization: UserStore.token,
},
dicFormatter: (res) => res.data,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '状态',
prop: 'status',
type: 'select',
search: true,
dicData: [
{
label: '启用',
value: '0',
},
{
label: '禁用',
value: '1',
},
],
value: '0',
rules: {
required: true,
message: '请选择',
trigger: 'blur',
},
},
{
label: '备注',
prop: 'remark',
type: 'textarea',
span: 24,
rows: 4,
overHidden: true,
width: 200,
},
],
actions: [
{
name: '查看',
icon: 'view',
event: ({ row }) => rowView(row),
},
{
name: '编辑',
icon: 'edit',
event: ({ row }) => rowEdit(row),
},
{
type: 'danger',
name: '删除',
icon: 'delete',
event: ({ row }) => rowDel(row),
},
],
},
pageData: {
total: 0,
currentPage: 1,
pageSize: 10,
},
data: [],
minWeek: null,
maxWeek: null,
currentRow: {},
});
//
const loadData = () => {
state.loading = true;
GetEntityList(state.query)
.then((res) => {
if (res.code === 200) {
const { current, size, total, records } = res.data;
state.data = records;
state.pageData = {
currentPage: current || 1,
pageSize: size || 10,
total: total,
};
}
})
.catch((err) => {
app.$message.error(err.msg);
state.data = [];
})
.finally(() => {
state.loading = false;
});
};
loadData();
//
const currentChange = (current) => {
state.query.current = current;
loadData();
};
//
const sizeChange = (size) => {
state.query.size = size;
loadData();
};
//
const searchChange = (params, done) => {
if (done) done();
state.query = params;
state.query.current = 1;
loadData();
};
//
const refreshChange = () => {
loadData();
app.$message.success('刷新成功');
};
//
const selectionChange = (rows) => {
state.selection = rows;
};
//
const rowView = (row) => {
crudRef.value.rowView(row);
};
//
const rowSave = (row, done, loading) => {
AddEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('添加成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowEdit = (row) => {
crudRef.value.rowEdit(row);
};
const rowUpdate = (row, index, done, loading) => {
UpdateEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('更新成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowDel = (row, index, done) => {
if (isEmpty(row)) return;
app
.$confirm(`删除后信息将不可查看,确认要删除吗?`, '确定删除', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
DeleteEntity({ id: row.dictCode })
.then((res) => {
if (res.code === 200) {
app.$message.success('删除成功!');
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
})
.catch(() => {});
};
</script>

View File

@ -0,0 +1,254 @@
<template>
<div class="custom-page">
<avue-crud
ref="crudRef"
v-model="state.form"
v-model:search="state.query"
v-model:page="state.pageData"
:table-loading="state.loading"
:data="state.data"
:option="state.options"
@refresh-change="refreshChange"
@search-reset="searchChange"
@search-change="searchChange"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@row-save="rowSave"
@row-update="rowUpdate"
@row-del="rowDel"
>
<template #menu="scope">
<custom-table-operate :actions="state.options.actions" :data="scope" />
</template>
</avue-crud>
</div>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { useApp } from '@/hooks';
import { CRUD_OPTIONS } from '@/config';
import { isEmpty } from '@/utils';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity } from '@/apis/system/dictType';
const app = useApp();
const crudRef = ref(null);
const state = reactive({
loading: false,
query: {
current: 1,
size: 10,
},
form: {},
selection: [],
options: {
...CRUD_OPTIONS,
selection: false,
column: [
{
label: '类型名称',
prop: 'dictName',
search: true,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '类型编码',
prop: 'dictType',
search: true,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '状态',
prop: 'status',
type: 'select',
search: true,
dicData: [
{
label: '启用',
value: '0',
},
{
label: '禁用',
value: '1',
},
],
value: '0',
rules: {
required: true,
message: '请选择',
trigger: 'blur',
},
},
{
label: '备注',
prop: 'remark',
type: 'textarea',
span: 24,
rows: 4,
overHidden: true,
width: 200,
},
],
actions: [
{
name: '查看',
icon: 'view',
event: ({ row }) => rowView(row),
},
{
name: '编辑',
icon: 'edit',
event: ({ row }) => rowEdit(row),
},
{
type: 'danger',
name: '删除',
icon: 'delete',
event: ({ row }) => rowDel(row),
},
],
},
pageData: {
total: 0,
currentPage: 1,
pageSize: 10,
},
data: [],
minWeek: null,
maxWeek: null,
currentRow: {},
});
//
const loadData = () => {
state.loading = true;
GetEntityList(state.query)
.then((res) => {
if (res.code === 200) {
const { current, size, total, records } = res.data;
state.data = records;
state.pageData = {
currentPage: current || 1,
pageSize: size || 10,
total: total,
};
}
})
.catch((err) => {
app.$message.error(err.msg);
state.data = [];
})
.finally(() => {
state.loading = false;
});
};
loadData();
//
const currentChange = (current) => {
state.query.current = current;
loadData();
};
//
const sizeChange = (size) => {
state.query.size = size;
loadData();
};
//
const searchChange = (params, done) => {
if (done) done();
state.query = params;
state.query.current = 1;
loadData();
};
//
const refreshChange = () => {
loadData();
app.$message.success('刷新成功');
};
//
const selectionChange = (rows) => {
state.selection = rows;
};
//
const rowView = (row) => {
crudRef.value.rowView(row);
};
//
const rowSave = (row, done, loading) => {
AddEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('添加成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowEdit = (row) => {
crudRef.value.rowEdit(row);
};
const rowUpdate = (row, index, done, loading) => {
UpdateEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('更新成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowDel = (row, index, done) => {
if (isEmpty(row)) return;
app
.$confirm(`删除后信息将不可查看,确认要删除吗?`, '确定删除', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
DeleteEntity({ id: row.id })
.then((res) => {
if (res.code === 200) {
app.$message.success('删除成功!');
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
})
.catch(() => {});
};
</script>

View File

@ -0,0 +1,20 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
declare module 'vue' {
export interface GlobalComponents {
BaseBg: typeof import('./src/components/baseBg.vue')['default']
CenterMap: typeof import('./src/components/centerMap.vue')['default']
CodeDialog: typeof import('./src/components/code-dialog/index.vue')['default']
CurrentTime: typeof import('./src/components/currentTime.vue')['default']
CustomBack: typeof import('./src/components/customBack.vue')['default']
CustomProgress: typeof import('./src/components/customProgress.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SubTop: typeof import('./src/components/subTop.vue')['default']
}
}

View File

@ -32,6 +32,7 @@
"pinia-plugin-persistedstate": "^3.2.1",
"screenfull": "^6.0.2",
"vue": "^3.3.11",
"vue-cesium": "^3.2.9",
"vue-router": "^4.2.5",
"vue3-scroll-seamless": "^1.0.6"
},

View File

@ -19,6 +19,11 @@ import { useSettingStore } from '@/store/modules/setting';
import zhCn from 'element-plus/es/locale/lang/zh-cn';
import currentTime from '@/components/currentTime.vue';
import { createApp } from 'vue';
import App from './App.vue';
import VueCesium from 'vue-cesium';
import 'vue-cesium/dist/index.css';
const SettingStore = useSettingStore();
//
const size = computed(() => SettingStore.themeConfig.globalComSize);
@ -32,6 +37,14 @@ let apptime = ref(null);
// onUnmounted(() => {
// apptime.value && apptime.value.chearTime();
// });
// const app = createApp(App);
// app.use(VueCesium, {
// cesiumPath: 'https://unpkg.com/cesium@1.104.0/Build/Cesium/Cesium.js',
// accessToken:
// 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiMDhmOWQzMi1mMTQwLTQ5YzktOTZjZS1lZjVlNTQzZjY4OTAiLCJpZCI6MjI1MTM2LCJpYXQiOjE3MTk1NTMxNTl9.3tRI3yX0jZxdsdx0Gvv40FWMnVpLu8CnQ8qedEDTeqs',
// });
// app.mount('#app');
</script>
<style lang="scss">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 717 KiB

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
<template>
<el-card body-class="custom_content_card_" :shadow="props.shadow">
<slot></slot>
</el-card>
</template>
<script setup>
const props = defineProps({
shadow: {
type: String,
default: 'never',
},
});
</script>
<style lang="scss">
.el-card:has(.custom_content_card_) {
border: none !important;
border-radius: 10px !important;
}
</style>

View File

@ -1,94 +0,0 @@
<template>
<el-select-v2
v-model="val"
:options="options"
:placeholder="props.set.placeholder"
:props="props.set.props"
:multiple="props.set.multiple"
@change="handleSelect"
/>
</template>
<script setup>
import { ref, onMounted, watch } from 'vue';
import request from '@/utils/axios';
const emit = defineEmits(['update:value']);
const props = defineProps({
set: {
type: Object,
default: () => {
return {
url: '',
options: [
{
value: '1',
label: 'label 1',
},
{
value: '2',
label: 'label 2',
},
{
value: '3',
label: 'label 3',
},
],
props: {
value: 'value',
label: 'label',
},
multiple: false,
placeholder: '请选择',
};
},
},
value: {
type: String || Array || null,
default: null,
},
});
onMounted(async () => {
if (props.set.multiple) val.value = [];
if (props.set.url) {
let res = await request(props.set.url, {
method: 'get',
data: { current: 1, size: 9999 },
});
if (res.code == 200) {
options.value = res.data.records;
}
} else {
options.value = props.set.options;
}
});
/* --------------- data --------------- */
// #region
const val = ref(null);
watch(
() => props.value,
() => {
val.value = props.value;
},
{
deep: true,
immediate: true,
}
);
const options = ref([]);
// #endregion
/* --------------- methods --------------- */
// #region
function handleSelect(val_) {
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -1,44 +0,0 @@
<template>
<el-select-v2 v-model="val" :options="options" placeholder="请选择网格" :props="_props" @change="handleSelect" />
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { GetEntityList } from '@/apis/grid.js';
const emit = defineEmits(['update:value']);
const props = defineProps({
//
value: {
type: String || null,
default: null,
},
});
onMounted(async () => {
let res = await GetEntityList();
if (res.code == 200) {
options.value = res.data.records;
}
});
/* --------------- data --------------- */
// #region
const val = ref(null);
const options = ref([]);
const _props = {
value: 'id',
label: 'productName',
};
// #endregion
/* --------------- methods --------------- */
// #region
function handleSelect(val_) {
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -1,60 +0,0 @@
<template>
<el-select v-model="val" @change="change">
<el-option v-for="item in options" :key="`land_type_${item.value}`" :value="item.value" :label="item.label" :placeholder="props.placeholder">
{{ item.label }}
</el-option>
</el-select>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
//
value: {
type: String || Number || null,
default: null,
},
placeholder: {
type: String,
default: '请选择',
},
});
const emit = defineEmits(['update:value']);
/* --------------- data --------------- */
// #region
const val = ref(null);
watch(
() => props.value,
() => {
val.value = props.value || props.value == 0 ? String(props.value) : null;
},
{
deep: true,
immediate: true,
}
);
const options = ref([
{ label: '耕地', value: '0' },
{ label: '果园', value: '1' },
{ label: '茶园', value: '2' },
{ label: '其他园地', value: '3' },
{ label: '林地', value: '4' },
{ label: '草地', value: '5' },
{ label: '其他农用地', value: '6' },
{ label: '农村宅基地', value: '7' },
]);
// #endregion
/* --------------- methods --------------- */
// #region
function change(val_) {
val.value = val_;
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -1,54 +0,0 @@
<template>
<el-select v-model="val" @change="change">
<el-option v-for="item in options" :key="`land_type_${item.value}`" :value="item.value" :label="item.label" :placeholder="props.placeholder">
{{ item.label }}
</el-option>
</el-select>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
//
value: {
type: String || Number || null,
default: null,
},
placeholder: {
type: String,
default: '请选择',
},
});
const emit = defineEmits(['update:value']);
/* --------------- data --------------- */
// #region
const val = ref(null);
watch(
() => props.value,
() => {
val.value = props.value || props.value == 0 ? String(props.value) : null;
},
{
deep: true,
immediate: true,
}
);
const options = ref([
{ label: '是', value: '0' },
{ label: '否', value: '1' },
]);
// #endregion
/* --------------- methods --------------- */
// #region
function change(val_) {
val.value = val_;
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -1,55 +0,0 @@
<template>
<el-select v-model="val" @change="change">
<el-option v-for="item in options" :key="`land_type_${item.value}`" :value="item.value" :label="item.label" :placeholder="props.placeholder">
{{ item.label }}
</el-option>
</el-select>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
//
value: {
type: String || Number || null,
default: null,
},
placeholder: {
type: String,
default: '请选择',
},
});
const emit = defineEmits(['update:value']);
/* --------------- data --------------- */
// #region
const val = ref(null);
watch(
() => props.value,
() => {
val.value = props.value || props.value == 0 ? String(props.value) : null;
},
{
deep: true,
immediate: true,
}
);
const options = ref([
{ label: '农用地', value: '0' },
{ label: '住宅用地', value: '1' },
{ label: '园林', value: '2' },
]);
// #endregion
/* --------------- methods --------------- */
// #region
function change(val_) {
val.value = val_;
emit('update:value', val_);
}
// #endregion
</script>
<style lang="scss" scoped></style>

View File

@ -1,72 +0,0 @@
<template>
<section :style="{ '--right': props.right ? 'flex-end' : 'unset' }">
<el-pagination
v-model:current-page="curPage"
v-model:page-size="curSize"
:page-sizes="[10, 20, 30, 40, 50, 100]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="curTotal"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</section>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
pageData: {
type: Object,
default: () => {
return {
page: 1,
size: 10,
total: 0,
};
},
},
pageSizes: {
type: Array,
default: () => {
return [10, 20, 30, 40, 50, 100];
},
},
right: {
type: Boolean,
default: true,
},
});
const emit = defineEmits(['pageChange', 'sizeChange']);
const curPage = ref(1);
const curSize = ref(10);
const curTotal = ref(0);
watch(
() => props.pageData,
() => {
curPage.value = props.pageData.page || 1;
curSize.value = props.pageData.size || 10;
curTotal.value = props.pageData.total || 0;
},
{
deep: true,
immediate: true,
}
);
function handleCurrentChange(val) {
emit('pageChange', val);
}
function handleSizeChange(val) {
emit('sizeChange', val);
}
</script>
<style lang="scss" scoped>
section {
display: flex;
justify-content: var(--right);
}
</style>

View File

@ -1,27 +1,212 @@
<template>
<div class="map-center-warp">
<img :src="getAssetsFile('images/vsualized/gmmap.png')" class="map-img" />
<div class="map-pos">
<custom-echart-maps :chart-data="chartsData.valData" height="100%" :option="chartsData.option" :geo="geoData" :name="mapName" />
</div>
</div>
</template>
<script setup>
import { isEmpty, getAssetsFile } from '@/utils';
import { ref, reactive, onMounted } from 'vue';
var aspectScale = 0.8807505292367753;
// var iconUrl = 'http://localhost:9529/sub-government-screen-service/src/assets/images/vsualized/home/partbg.png';
// var iconUrl = getAssetsFile('images/vsualized/gmmap.png').href;
var iconUrl = getAssetsFile('images/vsualized/gmmap2.png').href;
import geoJsonData from '../components/530926geo.json'; //
let geoData = geoJsonData;
let mapName = ref('ZJ');
const chartsData = reactive({
option: {
title: {
text: '',
left: 'center',
},
tooltip: {
trigger: 'item',
formatter: function (params) {
if (params.seriesType === 'effectScatter') {
return `${params.name}: (${params.value[0]}, ${params.value[1]})`;
}
return params.name;
},
},
toolbox: {
show: false,
orient: 'vertical',
left: 'right',
top: 'center',
feature: {
// dataView: { readOnly: false },
// restore: {},
// saveAsImage: {},
},
},
geo: {
map: mapName.value,
roam: true,
zoom: 1.1,
show: false,
itemStyle: {
normal: {
areaColor: '#1f77b4', //
borderColor: '#000', //
},
emphasis: {
areaColor: '#ff7f0e', //
borderColor: '#fff', //
},
},
},
series: [
// {
// name: '',
// type: 'map',
// mapType: mapName.value,
// roam: true,
// zoom: 1.2,
// itemStyle: {
// normal: {
// borderColor: '#000', //
// borderWidth: 1, //
// areaColor: 'transparent', //
// },
// emphasis: {
// borderColor: '#fff',
// borderWidth: 2,
// },
// },
// },
//
{
name: '闪烁散点',
type: 'effectScatter', // 使 effectScatter
coordinateSystem: 'geo',
data: [
//
{
name: '孟定镇',
value: [99.081993, 23.554045, 100], // , ,
itemStyle: {
color: '#FF0000', //
},
},
{
name: '勐永镇',
value: [99.406653, 23.534142, 80], // , ,
itemStyle: {
color: '#00FF00', //
},
},
],
symbolSize: function (val) {
return val[2] ? val[2] / 10 : 10; //
},
label: {
formatter: '{b}',
position: 'right',
show: false,
},
rippleEffect: {
period: 4, //
scale: 3, //
brushType: 'stroke', // 'stroke' 'fill'
},
hoverAnimation: false,
},
],
},
valData: [
{
name: '镇边界',
type: 'map',
mapType: mapName.value,
roam: true,
zoom: 1.2,
itemStyle: {
normal: {
borderColor: '#000', //
borderWidth: 1, //
areaColor: 'transparent', //
},
emphasis: {
borderColor: '#fff',
borderWidth: 2,
},
},
},
//
{
name: '闪烁散点',
type: 'effectScatter', // 使 effectScatter
coordinateSystem: 'geo',
data: [
//
{
name: '孟定镇',
value: [99.081993, 23.554045, 100], // , ,
itemStyle: {
color: '#FF0000', //
},
},
{
name: '勐永镇',
value: [99.406653, 23.534142, 80], // , ,
itemStyle: {
color: '#00FF00', //
},
},
],
symbolSize: function (val) {
return val[2] ? val[2] / 10 : 10; //
},
label: {
formatter: '{b}',
position: 'right',
show: false,
},
rippleEffect: {
period: 4, //
scale: 3, //
brushType: 'stroke', // 'stroke' 'fill'
},
hoverAnimation: false,
},
],
});
onMounted(() => {
console.info('iconUrl', iconUrl);
});
</script>
<style lang="scss" scoped>
div {
box-sizing: border-box;
}
.map-center-warp {
width: 100%;
text-align: center;
position: relative;
height: 100%;
height: 90%;
.map-img {
width: 80%;
height: 80%;
position: absolute;
bottom: 50px;
bottom: 0;
left: 50%;
object-fit: contain;
transform: translateX(-50%);
max-width: 1000px;
max-height: 1000px;
}
.map-pos {
width: 80%;
height: 80%;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
}
</style>

View File

@ -86,8 +86,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import InventoryCharts from './components/InventoryCharts.vue';
import waterIntakeCharts from './components/waterIntakeCharts.vue';
import growthIndexesCharts from './components/growthIndexesCharts.vue';

View File

@ -1,10 +1,23 @@
<template>
<div class="popular-feelings-warp">
<div class="popular-feelings-content">
<div
class="popular-feelings-content"
:style="{
'--before-bg': `url(${beforeBg})`,
}"
>
<template v-for="(n, index) in datalist" :key="index">
<div class="popular-feelings-item" :style="{ 'background-image': 'url(' + getAssetsFile('images/early/back1.png') + ')' + ',' + n.style }">
<div class="val">{{ n.val || 0 }}</div>
<div class="label">{{ n.title || 0 }}</div>
<div
class="popular-feelings-item"
:style="{
'background-image': 'url(' + getAssetsFile('images/early/back1.png') + ')',
}"
:class="n.name"
>
<div class="content-bg">
<div class="val">{{ n.val || 0 }}</div>
<div class="label">{{ n.title || 0 }}</div>
</div>
</div>
</template>
</div>
@ -14,11 +27,13 @@
import { ref, reactive, onMounted, computed } from 'vue';
import { isEmpty, getAssetsFile } from '@/utils';
let datalist = reactive([
{ title: '今天舆情量', val: 1872, style: 'left: 0,top: 50%,' },
{ title: '今日文章量', val: 1856, style: 'right: 0,top: 50%,' },
{ title: '今日浏览量', val: 54681, style: 'left: 50%,top: 0,' },
{ title: '文章总数', val: 75671, style: 'left: 50%,bottom: 0,' },
{ name: 'popular', title: '今天舆情量', val: 1872 },
{ title: '今日文章量', name: 'article', val: 1856 },
{ title: '今日浏览量', name: 'view', val: 54681 },
{ title: '文章总数', name: 'total', val: 75671 },
]);
const beforeBg = getAssetsFile('images/early/bg5.png');
</script>
<style lang="scss" scoped>
div {
@ -37,6 +52,95 @@ div {
background-size: 100% 100%;
background-position: left bottom;
background-repeat: no-repeat;
text-align: center;
&.popular {
left: 0;
top: 50%;
transform: translateY(-50%);
width: 35%;
height: 45%;
.val {
color: #fff;
font-weight: bold;
font-size: 14px;
}
.label {
color: #50e3c2;
margin-top: 8%;
font-size: 10px;
}
}
&.article {
left: 50%;
top: 0;
transform: translateX(-50%);
width: 35%;
height: 45%;
.val {
color: #fff;
font-weight: bold;
font-size: 14px;
}
.label {
color: #50e3c2;
margin-top: 8%;
font-size: 10px;
}
}
&.view {
right: 0;
top: 50%;
transform: translateY(-50%);
width: 35%;
height: 45%;
.val {
color: #fff;
font-weight: bold;
font-size: 14px;
}
.label {
color: #50e3c2;
margin-top: 8%;
font-size: 10px;
}
}
&.total {
left: 50%;
bottom: -10%;
transform: translateX(-50%);
width: 50%;
height: 66%;
.val {
color: #50e3c2;
font-weight: bold;
font-size: 20px;
margin-top: 2%;
}
.label {
color: #fff;
margin-top: 10%;
}
}
.content-bg {
width: 100%;
height: 100%;
}
// .content-bg ::before {
// content: '';
// position: absolute;
// top: 0;
// left: 0;
// width: 100%;
// height: 100%;
// background-image: var(--before-bg); /* */
// background-size: 100% 100%;
// background-position: left bottom;
// background-repeat: no-repeat;
// z-index: -1; /* */
// transform: rotate(90deg); /* */
// transform-origin: center; /* */
// }
}
}
}

View File

@ -60,9 +60,9 @@ let seriesList = computed(() => {
//
const min = Math.min(...values);
//
const maxSize4Pin = 50;
const maxSize4Pin = 38;
//
const minSize4Pin = 10;
const minSize4Pin = 8;
//
var a = (maxSize4Pin - minSize4Pin) / (max - min);
var b = maxSize4Pin - a * max;

View File

@ -7,7 +7,7 @@
<div class="left-charts-item">
<customBack top-title="舆情数据统计" :top-postion="'left'">
<template #back>
<!-- <popularFeelings></popularFeelings> -->
<popularFeelings></popularFeelings>
</template>
</customBack>
</div>
@ -51,8 +51,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import backToCharts from './components/backToCharts.vue';
import productTypeWordClould from './components/productTypeWordClould.vue';

View File

@ -58,8 +58,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import categoryCharts from './components/categoryCharts.vue';
import entitieslist from './components/entitieslist.vue';

View File

@ -1,21 +1,18 @@
<template>
<div class="home-trace-charts">
<custom-echart-mixin :chart-data="chartsData.valData" :option="chartsData.option" height="100%" />
<custom-echart-mixin :chart-data="handelData" :option="chartsData.option" height="100%" />
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { ref, reactive, onMounted, computed } from 'vue';
let itemStyle = reactive({
itemStyle: { borderRadius: [8, 8, 0, 0] },
});
let legendList = reactive(['赋码', '扫码']);
const chartsData = ref({
option: {
grid: {
left: '3%',
right: '4%',
bottom: '6%',
top: '18%',
containLabel: true,
},
color: ['#3685fe', '#41b879', '#ffd500', '#e57373'],
color: ['#3685fe', '#8dcbe9', '#ffd500', '#631f9f'],
title: {
text: ' ',
textStyle: {
@ -23,11 +20,44 @@ const chartsData = ref({
},
},
legend: {
data: ['赋码', '扫码'],
show: true,
data: legendList,
left: '0', // 10%
top: '0', //
itemWidth: 15, //
itemHeight: 8, //
textStyle: {
fontSize: 10, //
color: '#fff', //
},
},
barStyle: {
barWidth: 18,
barWidth: 10,
color: {
type: 'linear', // 线
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: '#45bfe9' },
{ offset: 1, color: '#01589c' },
],
global: false, // false
},
},
dataZoom: [
// {
// type: 'slider', //
// startValue: 0, //
// endValue: 2, //
// },
// {
// type: 'inside', //
// startValue: 0,
// endValue: 2,
// },
],
yAxis: [
{
type: 'value',
@ -39,62 +69,62 @@ const chartsData = ref({
show: true, // 线
lineStyle: {
type: 'dashed', // 线
color: '#ccc', // 线
width: 0.5, // 线
},
},
itemStyle: { fontSize: 8 },
},
// {
// type: 'value',
// name: '',
// yAxisIndex: 1,
// axisLabel: {
// formatter: '{value}',
// },
// },
],
},
valData: [
{
name: '1月',
value: 40,
type: '赋码',
seriesType: 'bar',
barWidth: 10,
itemStyle: {
color: {
type: 'linear', // 线
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: '#ff6666' },
{ offset: 1, color: '#ffcc66' },
],
global: false, // false
},
},
grid: {
x: '10%',
x2: '10%',
y: '20%',
y2: '20%',
},
{ name: '1月', value: 60, type: '扫码', seriesType: 'line' },
{ name: '2月', value: 20, type: '赋码', seriesType: 'bar', itemStyle: { borderRadius: [8, 8, 0, 0] } },
{ name: '2月', value: 100, type: '扫码', seriesType: 'line' },
{ name: '3月', value: 80, type: '赋码', seriesType: 'bar', itemStyle: { borderRadius: [8, 8, 0, 0] } },
{ name: '3月', value: 100, type: '扫码', seriesType: 'line' },
{ name: '4月', value: 40, type: '赋码', seriesType: 'bar', itemStyle: { borderRadius: [8, 8, 0, 0] } },
{ name: '4月', value: 120, type: '扫码', seriesType: 'line' },
{ name: '5月', value: 50, type: '赋码', seriesType: 'bar', itemStyle: { borderRadius: [8, 8, 0, 0] } },
{ name: '5月', value: 60, type: '扫码', seriesType: 'line' },
],
},
valData: [],
});
onMounted(() => {
if (chartsData.value.valData && chartsData.value.valData.length) {
chartsData.value.valData.forEach((m, index) => {
let num = 100;
m.value = (m.value + Math.random() + num).toFixed(0);
});
const randomVal = (num) => {
let list = [];
for (let i = 0; i < legendList.length; i++) {
let addNum = [10, 8, 2, 5];
let val = {
name: num + '月',
value: Number(Math.random() * 100 + addNum[i]).toFixed(2),
seriesType: i < legendList.length - 1 ? 'bar' : 'line',
type: legendList[i],
stack: num + '月',
};
if (val.seriesType == 'line') {
val.smooth = 30;
val.symbol = 'none';
}
if (val.seriesType == 'bar') {
val.symbol = 'none';
}
let lastVal = {
...val,
...itemStyle,
};
list[i] = i < legendList.length - 2 ? val : lastVal;
}
return list;
};
let handelData = computed(() => {
let list = [];
let maxMouth = 12;
for (let i = 0; i < maxMouth; i++) {
let val = randomVal(i + 1);
list = [...list, ...val];
}
list.map((m, indexm) => {
return { ...m, value: Number(Number(m.value) + Math.random() + indexm).toFixed(0) };
});
// console.info('handelData', list);
return list;
});
</script>
<style lang="scss" scoped>

View File

@ -73,8 +73,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import comprehensive from './components/comprehensive.vue';
import plantBreedCharts from './components/plantBreedCharts.vue';

View File

@ -58,8 +58,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import inputsGmp from './components/inputsGmp.vue';
import landbreedCharts from './components/landbreedCharts.vue';

View File

@ -58,8 +58,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import distributionCharts from './components/distributionCharts.vue';
import landuseCharts from './components/landuseCharts.vue';

View File

@ -1,10 +1,66 @@
<template>
<div class="plant-gs-warp">
<div class="plant-gs-content" :style="{ 'background-image': 'url(' + getAssetsFile('images/plant/bg1.png') + ')' }"></div>
<div ref="viewwarp" class="plant-gs-content" :style="{ 'background-image': 'url(' + getAssetsFile('images/plant/bg1.png') + ')' }">
<vc-config-provider :cesium-path="vcConfig.cesiumPath" :access-token="vcConfig.accessToken">
<vc-viewer ref="viewerRef" @ready="onViewerReady">
<vc-layer-imagery :minimum-level="12" :maximum-level="18" :contrast="1.8" :saturation="1" :alpha="1">
<vc-imagery-provider-amap :key="'c843a50db7157faf295c6fa37c48719f'"></vc-imagery-provider-amap>
</vc-layer-imagery>
<vc-entity>
<!-- <vc-graphics-polygon
ref="polygon5"
:hierarchy="[99.402267, 23.538889, 99.402267, 23.538889, 5000.0, 99.402267, 23.538889, 0.0]"
:material="[0, 255, 255, 125]"
:per-position-height="true"
:outline="true"
outline-color="black"
></vc-graphics-polygon> -->
</vc-entity>
</vc-viewer>
</vc-config-provider>
</div>
</div>
</template>
<script setup>
import { isEmpty, getAssetsFile } from '@/utils';
import { ref, reactive, onMounted, computed, nextTick, getCurrentInstance } from 'vue';
import { VcViewer, VcConfigProvider, VcImageryProviderAmap, VcLayerImagery, VcGraphicsPlane, VcEntity, VcGraphicsPolygon } from 'vue-cesium';
import 'vue-cesium/dist/index.css';
const vcConfig = reactive({
cesiumPath: 'https://cdn.bootcdn.net/ajax/libs/cesium/1.80.0/Cesium.js',
accessToken:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiNjJjZTUxYi1lOTQ3LTQ3YjctOGI3ZS02ZGUzY2E4YWFkNDkiLCJpZCI6Mjg4MjAxLCJpYXQiOjE3NDMwNTY0MzN9.rjHQiqf7Y8bccaqsapqveULVAUH6M1QkeFp-AKG-frA',
});
const viewerRef = ref(null);
const viewwarp = ref(null);
let plane2 = ref(null);
onMounted(() => {
console.info('onMounted', viewerRef);
Promise.all([plane2.value.creatingPromise]).then((instances) => {
console.info('instances');
// instances[0].viewer.zoomTo(instances[0].viewer.entities);
});
});
const onViewerReady = (readyObj) => {
console.info('readyObj', readyObj.Cesium); // Cesium namespace object
console.log(readyObj.viewer); // instanceof Cesium.Viewer
// Viewer
const { Cesium, viewer } = readyObj;
//
viewer.scene.globe.baseColor = Cesium.Color.DARKBLUE;
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(99.406653, 23.534142, 4000),
orientation: {
heading: Cesium.Math.toRadians(0), //
pitch: Cesium.Math.toRadians(-90), //
roll: 0, //
},
});
};
</script>
<style lang="scss" scoped>
.plant-gs-warp {
@ -17,6 +73,20 @@ import { isEmpty, getAssetsFile } from '@/utils';
background-repeat: no-repeat;
width: 100%;
height: 100%;
overflow: hidden;
::v-deep() {
.vc-viewer {
height: calc(100% - 30px) !important;
width: calc(100% - 20px) !important;
margin: 20px 10px 10px 10px !important;
}
canvas {
border-radius: 10px !important;
}
.cesium-viewer-bottom {
display: none !important;
}
}
}
}
</style>

View File

@ -26,9 +26,9 @@
</customBack>
</div>
</el-col>
<el-col :span="12">
<el-col :span="12" style="height: 100%">
<el-row style="height: 67%">
<el-col :span="24" class="center-top">
<el-col :span="24" class="center-top" style="height: 100%">
<div class="notice">
<noticeBar :height="'40px'"></noticeBar>
</div>
@ -86,10 +86,8 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import plantTypeCharts from './components/plantTypeCharts.vue';
import insectPestsCharts from './components/insectPestsCharts';
import insectPestsCharts from './components/insectPestsCharts.vue';
import pathologyCharts from './components/pathologyCharts.vue';
import waterfertilizerCharts from './components/waterfertilizerCharts.vue';
import irrigationCharts from './components/irrigationCharts.vue';

View File

@ -58,8 +58,6 @@
</div>
</template>
<script setup>
import baseBg from '@/components/baseBg.vue';
import customBack from '@/components/customBack.vue';
import centerMap from '@/components/centerMap.vue';
import codeNumCharts from './components/codeNumCharts.vue';
import mainPartCharts from './components/mainPartCharts.vue';

View File

@ -2,6 +2,11 @@
# yarn lockfile v1
"@amap/amap-jsapi-loader@^1.0.1":
version "1.0.1"
resolved "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz#9ec4b4d5d2467eac451f6c852e35db69e9f9f0c0"
integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"@ampproject/remapping@^2.2.0":
version "2.3.0"
resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
@ -705,6 +710,34 @@
resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@turf/circle@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/circle/-/circle-6.5.0.tgz#dc017d8c0131d1d212b7c06f76510c22bbeb093c"
integrity sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==
dependencies:
"@turf/destination" "^6.5.0"
"@turf/helpers" "^6.5.0"
"@turf/destination@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/destination/-/destination-6.5.0.tgz#30a84702f9677d076130e0440d3223ae503fdae1"
integrity sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==
dependencies:
"@turf/helpers" "^6.5.0"
"@turf/invariant" "^6.5.0"
"@turf/helpers@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e"
integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==
"@turf/invariant@^6.5.0":
version "6.5.0"
resolved "https://registry.npmmirror.com/@turf/invariant/-/invariant-6.5.0.tgz#970afc988023e39c7ccab2341bd06979ddc7463f"
integrity sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==
dependencies:
"@turf/helpers" "^6.5.0"
"@types/eslint@^8.4.5":
version "8.56.12"
resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a"
@ -941,7 +974,7 @@
"@vue/compiler-ssr" "3.5.13"
"@vue/shared" "3.5.13"
"@vue/shared@3.5.13":
"@vue/shared@3.5.13", "@vue/shared@^3.2.47":
version "3.5.13"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
@ -1046,6 +1079,11 @@
resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532"
integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
"@zouyaoji/heatmap.js@^2.0.8":
version "2.0.8"
resolved "https://registry.npmmirror.com/@zouyaoji/heatmap.js/-/heatmap.js-2.0.8.tgz#5f6b285e7635ca07f2ecdb3d83a9dc1d240433d7"
integrity sha512-kBQny/zOUFH2OFoVyu6IdGJEcQMENIAASUsaZhk+OuJ9WexsYf6EU2lCyGURcsFly1kTMZKODlV7nBTCgfvJqg==
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@ -1683,6 +1721,11 @@ commander@^7.2.0:
resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
compare-versions@^6.1.0:
version "6.1.1"
resolved "https://registry.npmmirror.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9"
integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==
component-emitter@^1.2.1:
version "1.3.1"
resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
@ -2099,7 +2142,7 @@ echarts-gl@^2.0.9:
claygl "^1.2.1"
zrender "^5.1.1"
echarts@^5.6.0:
echarts@^5.4.3, echarts@^5.6.0:
version "5.6.0"
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz#2377874dca9fb50f104051c3553544752da3c9d6"
integrity sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
@ -3763,6 +3806,11 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
kdbush@^4.0.2:
version "4.0.2"
resolved "https://registry.npmmirror.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39"
integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==
keyv@^4.5.3:
version "4.5.4"
resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@ -3894,7 +3942,7 @@ lodash-es@^4.17.21:
resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash-unified@^1.0.2:
lodash-unified@^1.0.2, lodash-unified@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894"
integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
@ -4091,6 +4139,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
mgrs@1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/mgrs/-/mgrs-1.0.0.tgz#fb91588e78c90025672395cb40b25f7cd6ad1829"
integrity sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==
micromatch@3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2"
@ -4183,6 +4236,11 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
mixin-deep@^1.2.0:
version "1.3.2"
resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
@ -4900,6 +4958,14 @@ progress@^2.0.3:
resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
proj4@^2.9.1:
version "2.15.0"
resolved "https://registry.npmmirror.com/proj4/-/proj4-2.15.0.tgz#d77c9956861c8ed516071c4208d576cebe800eb5"
integrity sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==
dependencies:
mgrs "1.0.0"
wkt-parser "^1.4.0"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@ -6368,6 +6434,11 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
urijs@^1.19.11:
version "1.19.11"
resolved "https://registry.npmmirror.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc"
integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
@ -6511,6 +6582,25 @@ vite@^5.0.8:
optionalDependencies:
fsevents "~2.3.3"
vue-cesium@^3.2.9:
version "3.2.9"
resolved "https://registry.npmmirror.com/vue-cesium/-/vue-cesium-3.2.9.tgz#67b9dcbb4ed8e228fde886b957d0f4b4a3e388ba"
integrity sha512-MOgxAfIL+qYT608n+Bqioz2NbAM9pTWztzZ2gOqfHMxNeOFGROCUFatrzCP/OhndeEH8hbqdnGyxt1bHV9+dzQ==
dependencies:
"@amap/amap-jsapi-loader" "^1.0.1"
"@turf/circle" "^6.5.0"
"@vue/shared" "^3.2.47"
"@zouyaoji/heatmap.js" "^2.0.8"
compare-versions "^6.1.0"
echarts "^5.4.3"
kdbush "^4.0.2"
lodash "^4.17.21"
lodash-es "^4.17.21"
lodash-unified "^1.0.3"
mitt "^3.0.1"
proj4 "^2.9.1"
urijs "^1.19.11"
vue-demi@*, vue-demi@^0.14.10:
version "0.14.10"
resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
@ -6642,6 +6732,11 @@ wildcard@^1.1.0:
resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
wkt-parser@^1.4.0:
version "1.4.0"
resolved "https://registry.npmmirror.com/wkt-parser/-/wkt-parser-1.4.0.tgz#7cca07a6ee5b4baf059b723e62d7fe95bc923bf5"
integrity sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"