当前位置: 首页 > news >正文

Vue3+TS+ECharts5实现中国地图数据信息显示

1.引言

最近在做一个管理系统,主要技术栈使用的是Vue3+TS+Vite+ElementPlus,主要参考项目是yudao-ui-admin-vue3,其中用到ECharts5做数字大屏,展示中国地图相关信息,以此基础做一个分享,写下这篇文章。

"dependencies": {"@element-plus/icons-vue": "^2.1.0","@kjgl77/datav-vue3": "^1.6.1","@vueuse/core": "^10.2.1","echarts": "^5.4.2","echarts-wordcloud": "^2.1.0","element-plus": "2.3.7","vue": "3.3.4","vue-i18n": "9.2.2","vue-router": "^4.2.4","vue-types": "^5.1.0","vuedraggable": "^4.1.0"}

在读这篇文章之前,建议先读一下自适应大屏容器组件这篇文章。

2.封装ECharts组件

通常在实际项目中,需要用到ECharts图表的地方肯定很多,我们可以封装一个ECharts组件,方便使用,这里在 yudao-ui-admin-vue3基础上,添加了一个响应式变量,为了在引用ECharts父组件中获取到ECharts初始化实例,在地图中自动随机显示各省份数据的函数中使用。

为什么要添加这个响应式变量了?我实际使用中遇到的问题,如果把ECharts初始化实例赋值为响应式变量,会导致tooltip提示框在设置trigger: ‘axis’显示不出来,如果赋值为非响应式变量,父组件接受变量时数据为空,拿不到数据,所以我的解决办法是添加一个响应式变量,这样双方都可以满足。

<script lang="ts" setup>
import type { EChartsOption } from 'echarts'
import echarts from '@/plugins/echarts'
import { debounce } from 'lodash-es'
import 'echarts-wordcloud'
import { propTypes } from '@/utils/propTypes'
import { PropType } from 'vue'
import { useAppStore } from '@/store/modules/app'
import { isString } from '@/utils/is'
import { useDesign } from '@/hooks/web/useDesign'defineOptions({ name: 'EChart' })const { getPrefixCls, variables } = useDesign()const prefixCls = getPrefixCls('echart')const appStore = useAppStore()const props = defineProps({options: {type: Object as PropType<EChartsOption>,required: true},width: propTypes.oneOfType([Number, String]).def('100%'),height: propTypes.oneOfType([Number, String]).def('100%')
})const isDark = computed(() => appStore.getIsDark)const theme = computed(() => {const echartTheme: boolean | string = unref(isDark) ? true : 'auto'return echartTheme
})const options = computed(() => {return Object.assign(props.options, {darkMode: unref(theme)})
})const elRef = ref<ElRef>()let echartRef: Nullable<echarts.ECharts> = null
/**********************添加的响应式变量******************/
const eChart = ref()const contentEl = ref<Element>()const styles = computed(() => {const width = isString(props.width) ? props.width : `${props.width}px`const height = isString(props.height) ? props.height : `${props.height}px`return {width,height}
})const initChart = () => {if (unref(elRef) && props.options) {echartRef = echarts.init(unref(elRef) as HTMLElement)echartRef?.setOption(unref(options))/**********************初始化后再赋值******************/eChart.value = echartRef}
}watch(() => options.value,(options) => {if (echartRef) {echartRef?.setOption(options)}},{deep: true}
)const resizeHandler = debounce(() => {if (echartRef) {echartRef.resize()}
}, 100)const contentResizeHandler = async (e: TransitionEvent) => {if (e.propertyName === 'width') {resizeHandler()}
}onMounted(() => {initChart()window.addEventListener('resize', resizeHandler)contentEl.value = document.getElementsByClassName(`${variables.namespace}-layout-content`)[0]unref(contentEl) &&(unref(contentEl) as Element).addEventListener('transitionend', contentResizeHandler)
})onBeforeUnmount(() => {window.removeEventListener('resize', resizeHandler)unref(contentEl) &&(unref(contentEl) as Element).removeEventListener('transitionend', contentResizeHandler)
})onActivated(() => {if (echartRef) {echartRef.resize()}
})defineExpose({ eChart })
</script><template><div ref="elRef" :class="[$attrs.class, prefixCls]" :style="styles"></div>
</template>

3.数据的准备

数据主要分为ECharts5需要的中国地图数据,需要显示的自定义数据,以及各个省份的中心经纬度数据。

1.地图数据。由于ECharts5地图不能直接引入,需要自己下载JSON数据,然后引入。地图数据下载地址为阿里云数据可视化平台,下载JSON数据,可根据自己的需要对南海诸岛的数据做编辑。数据下载后,放入asserts目录中,引入。

2.自定义显示数据。自定义显示数据就是想要在地图上显示的信息,当鼠标点击某个省份后,tooltip显示框显示的数据内容。本地中,显示的数据为各个省份合同数以及合同金额,如下图所示。

数据格式为:

interface digitalScreenDataType {name: stringvalue: number
}
interface contractInfoForFirstArea {name: stringcontractInfoByFirstArea: digitalScreenDataType[]
}

数据内容举例:

[{name: '北京市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.9923 },{ name: '合同总数', value: 51 }]},{name: '天津市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 170.2683 },{ name: '合同总数', value: 30790 }]}
]

3.各个省份的中心经纬度数据。此数据主要为了显示各省份的中心点,利用的ECharts的配置,可以让中心点具有不同的显示效果。ECharts文档传送门。

数据定义:

const geoCodeMap = [{ name: '北京市', delay: 63, lossPercent: 2, value: [119.337634104, 26.0911937119] },{ name: '天津市', delay: 63, lossPercent: 2, value: [117.190182, 39.125596] },{ name: '河北省', delay: 63, lossPercent: 2, value: [114.502461, 38.045474] },{ name: '山西省', delay: 63, lossPercent: 2, value: [112.549248, 37.857014] },{ name: '内蒙古自治区', delay: 63, lossPercent: 2, value: [111.670801, 40.818311] },{ name: '辽宁省', delay: 63, lossPercent: 2, value: [123.429096, 41.796767] },{ name: '吉林省', delay: 63, lossPercent: 2, value: [125.3245, 43.886841] },{ name: '黑龙江省', delay: 63, lossPercent: 2, value: [126.642464, 45.756967] },{ name: '上海市', delay: 63, lossPercent: 2, value: [121.487899486, 31.24916171] },{ name: '江苏省', delay: 63, lossPercent: 2, value: [118.767413, 32.041544] },{ name: '浙江省', delay: 63, lossPercent: 2, value: [120.153576, 30.287459] },{ name: '安徽省', delay: 63, lossPercent: 2, value: [117.283042, 31.86119] },{ name: '福建省', delay: 63, lossPercent: 2, value: [119.306239, 26.075302] },{ name: '江西省', delay: 63, lossPercent: 2, value: [115.892151, 28.676493] },{ name: '山东省', delay: 63, lossPercent: 2, value: [117.000923, 36.675807] },{ name: '河南省', delay: 63, lossPercent: 2, value: [113.665412, 34.757975] },{ name: '湖北省', delay: 63, lossPercent: 2, value: [114.298572, 30.584355] },{ name: '湖南省', delay: 63, lossPercent: 2, value: [112.982279, 28.19409] },{ name: '广东省', delay: 63, lossPercent: 2, value: [113.280637, 23.125178] },{ name: '广西壮族自治区', delay: 63, lossPercent: 2, value: [108.320004, 22.82402] },{ name: '海南省', delay: 63, lossPercent: 2, value: [110.33119, 20.031971] },{ name: '重庆市', delay: 63, lossPercent: 2, value: [106.504962, 29.533155] },{ name: '四川省', delay: 63, lossPercent: 2, value: [104.065735, 30.659462] },{ name: '贵州省', delay: 63, lossPercent: 2, value: [106.713478, 26.578343] },{ name: '云南省', delay: 63, lossPercent: 2, value: [102.712251, 25.040609] },{ name: '西藏自治区', delay: 63, lossPercent: 2, value: [91.132212, 29.660361] },{ name: '陕西省', delay: 63, lossPercent: 2, value: [108.948024, 34.263161] },{ name: '甘肃省', delay: 63, lossPercent: 2, value: [103.823557, 36.058039] },{ name: '青海省', delay: 63, lossPercent: 2, value: [96.07, 36.62] },{ name: '宁夏回族自治区', delay: 63, lossPercent: 2, value: [106.278179, 38.46637] },{ name: '新疆维吾尔自治区', delay: 63, lossPercent: 2, value: [87.617733, 43.792818] },{ name: '台湾省', delay: 63, lossPercent: 2, value: [121.509062, 25.044332] },{ name: '香港特别行政区', delay: 63, lossPercent: 2, value: [114.173355, 22.320048] },{ name: '澳门特别行政区', delay: 63, lossPercent: 2, value: [113.54909, 22.198951] }
]

配置项:

{type: 'effectScatter',coordinateSystem: 'geo',symbolSize: 7,effectType: 'ripple',legendHoverLink: false,showEffectOn: 'render',rippleEffect: {period: 4,scale: 2.5,brushType: 'stroke'},zlevel: 1,itemStyle: {color: '#99FBFE',shadowBlur: 5,shadowColor: '#fff'},data: geoCodeMap}

4.地图展示组件

/** * @LeftTop.vue * @author: zgr * @createTime: 2023/9/25 */<template><EChart :options="options" ref="chinaMapRef" />
</template><script lang="ts" setup>interface digitalScreenDataType {name: stringvalue: number
}
interface contractInfoForFirstArea {name: stringcontractInfoByFirstArea: digitalScreenDataType[]
}import * as echarts from 'echarts'
import chinaData from '@/assets/map/china.json'
echarts.registerMap('china', chinaData)defineOptions({ name: 'ContractMap' })
//计时器
const timer = reactive({//地图动态显示数据mapIntervalTimer: null
})
const geoCodeMap = [{ name: '北京市', delay: 63, lossPercent: 2, value: [119.337634104, 26.0911937119] },{ name: '天津市', delay: 63, lossPercent: 2, value: [117.190182, 39.125596] },{ name: '河北省', delay: 63, lossPercent: 2, value: [114.502461, 38.045474] },{ name: '山西省', delay: 63, lossPercent: 2, value: [112.549248, 37.857014] },{ name: '内蒙古自治区', delay: 63, lossPercent: 2, value: [111.670801, 40.818311] },{ name: '辽宁省', delay: 63, lossPercent: 2, value: [123.429096, 41.796767] },{ name: '吉林省', delay: 63, lossPercent: 2, value: [125.3245, 43.886841] },{ name: '黑龙江省', delay: 63, lossPercent: 2, value: [126.642464, 45.756967] },{ name: '上海市', delay: 63, lossPercent: 2, value: [121.487899486, 31.24916171] },{ name: '江苏省', delay: 63, lossPercent: 2, value: [118.767413, 32.041544] },{ name: '浙江省', delay: 63, lossPercent: 2, value: [120.153576, 30.287459] },{ name: '安徽省', delay: 63, lossPercent: 2, value: [117.283042, 31.86119] },{ name: '福建省', delay: 63, lossPercent: 2, value: [119.306239, 26.075302] },{ name: '江西省', delay: 63, lossPercent: 2, value: [115.892151, 28.676493] },{ name: '山东省', delay: 63, lossPercent: 2, value: [117.000923, 36.675807] },{ name: '河南省', delay: 63, lossPercent: 2, value: [113.665412, 34.757975] },{ name: '湖北省', delay: 63, lossPercent: 2, value: [114.298572, 30.584355] },{ name: '湖南省', delay: 63, lossPercent: 2, value: [112.982279, 28.19409] },{ name: '广东省', delay: 63, lossPercent: 2, value: [113.280637, 23.125178] },{ name: '广西壮族自治区', delay: 63, lossPercent: 2, value: [108.320004, 22.82402] },{ name: '海南省', delay: 63, lossPercent: 2, value: [110.33119, 20.031971] },{ name: '重庆市', delay: 63, lossPercent: 2, value: [106.504962, 29.533155] },{ name: '四川省', delay: 63, lossPercent: 2, value: [104.065735, 30.659462] },{ name: '贵州省', delay: 63, lossPercent: 2, value: [106.713478, 26.578343] },{ name: '云南省', delay: 63, lossPercent: 2, value: [102.712251, 25.040609] },{ name: '西藏自治区', delay: 63, lossPercent: 2, value: [91.132212, 29.660361] },{ name: '陕西省', delay: 63, lossPercent: 2, value: [108.948024, 34.263161] },{ name: '甘肃省', delay: 63, lossPercent: 2, value: [103.823557, 36.058039] },{ name: '青海省', delay: 63, lossPercent: 2, value: [96.07, 36.62] },{ name: '宁夏回族自治区', delay: 63, lossPercent: 2, value: [106.278179, 38.46637] },{ name: '新疆维吾尔自治区', delay: 63, lossPercent: 2, value: [87.617733, 43.792818] },{ name: '台湾省', delay: 63, lossPercent: 2, value: [121.509062, 25.044332] },{ name: '香港特别行政区', delay: 63, lossPercent: 2, value: [114.173355, 22.320048] },{ name: '澳门特别行政区', delay: 63, lossPercent: 2, value: [113.54909, 22.198951] }
]
let preSelectMapIndex = 0
const dataList = ref<contractInfoForFirstArea[]>([])
const options = reactive<echarts.EChartsOption>({showLegendSymbol: false,tooltip: {trigger: 'item',//是否显示提示框组件show: true,backgroundColor: 'rgba(0,0,55,0.4)',textStyle: {color: 'white',fontSize: 14,lineHeight: 20},// 如果需要自定义 tooltip样式,需要使用formatterformatter: function (params) {let toolTipHtml = ''let data = dataList.valuefor (let i = 0; i < data.length; i++) {if (params.name === data[i].name) {toolTipHtml += data[i].name + ':<br>'for (let j = 0; j < data[i].contractInfoByFirstArea.length; j++) {toolTipHtml +=data[i].contractInfoByFirstArea[j].name +':' +data[i].contractInfoByFirstArea[j].value +'<br>'}}}return toolTipHtml}},visualMap: {min: 0,max: 800,show: false,seriesIndex: 0,// 颜色inRange: {color: ['rgba(41,166,206, .5)', 'rgba(69,117,245, .9)']}},// 底部背景geo: {show: true,aspectScale: 0.85, //长宽比zoom: 1.6,top: '30%',left: '25%',map: 'china',roam: false,itemStyle: {areaColor: 'rgba(0,0,0,0)',shadowColor: 'rgba(138,181,218,0.8)',borderColor: '#232652',borderWidth: 2},emphasis: {itemStyle: {areaColor: '#00aeef',shadowColor: 'rgba(138,181,218,0.8)'}}},series: [{name: '',type: 'map',aspectScale: 0.85, //长宽比zoom: 1.6,map: 'china', // 自定义扩展图表类型top: '30%',left: '25%',itemStyle: {color: 'red',areaColor: 'rgba(19,54,162, .5)',borderColor: 'rgba(0,242,252,.3)',borderWidth: 1,shadowBlur: 7,shadowColor: '#00f2fc'},emphasis: {itemStyle: {areaColor: '#4f7fff',borderColor: 'rgba(0,242,252,.6)',borderWidth: 2,shadowBlur: 10,shadowColor: '#00f2fc'}},label: {formatter: (params) => `${params.name}`,show: true,position: 'insideRight',fontSize: 12,color: '#efefef'},data: [] as contractInfoForFirstArea[]},{type: 'effectScatter',coordinateSystem: 'geo',symbolSize: 7,effectType: 'ripple',legendHoverLink: false,showEffectOn: 'render',rippleEffect: {period: 4,scale: 2.5,brushType: 'stroke'},zlevel: 1,itemStyle: {color: '#99FBFE',shadowBlur: 5,shadowColor: '#fff'},data: geoCodeMap}]
})
const getData = async () => {let resData: contractInfoForFirstArea[] = [{name: '北京市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.9923 },{ name: '合同总数', value: 51 }]},{name: '天津市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 170.2683 },{ name: '合同总数', value: 30790 }]},{name: '上海市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.2098 },{ name: '合同总数', value: 5 }]},{name: '重庆市',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 4.5777 },{ name: '合同总数', value: 144 }]},{name: '新疆维吾尔自治区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 2.5839 },{ name: '合同总数', value: 78 }]},{name: '西藏自治区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.2476 },{ name: '合同总数', value: 14 }]},{name: '宁夏回族自治区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 1.3043 },{ name: '合同总数', value: 353 }]},{name: '内蒙古自治区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 4.4069 },{ name: '合同总数', value: 256 }]},{name: '广西壮族自治区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.9392 },{ name: '合同总数', value: 47 }]},{name: '黑龙江省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 1.5711 },{ name: '合同总数', value: 53 }]},{name: '吉林省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 5.3852 },{ name: '合同总数', value: 157 }]},{name: '辽宁省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 5.1029 },{ name: '合同总数', value: 193 }]},{name: '河北省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 17.9545 },{ name: '合同总数', value: 1101 }]},{name: '山东省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 9.7 },{ name: '合同总数', value: 568 }]},{name: '江苏省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 6.6828 },{ name: '合同总数', value: 239 }]},{name: '安徽省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 7.2328 },{ name: '合同总数', value: 260 }]},{name: '浙江省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 7.7085 },{ name: '合同总数', value: 309 }]},{name: '福建省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 3.15 },{ name: '合同总数', value: 241 }]},{name: '广东省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 28.461 },{ name: '合同总数', value: 1102 }]},{name: '海南省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 8.5549 },{ name: '合同总数', value: 423 }]},{name: '云南省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 5.5561 },{ name: '合同总数', value: 422 }]},{name: '贵州省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 2.8905 },{ name: '合同总数', value: 82 }]},{name: '四川省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 10.9661 },{ name: '合同总数', value: 409 }]},{name: '湖南省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 3.0104 },{ name: '合同总数', value: 144 }]},{name: '湖北省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 3.7586 },{ name: '合同总数', value: 157 }]},{name: '河南省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 8.2312 },{ name: '合同总数', value: 230 }]},{name: '山西省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 6.1501 },{ name: '合同总数', value: 322 }]},{name: '陕西省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 3.265 },{ name: '合同总数', value: 133 }]},{name: '甘肃省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 1.4853 },{ name: '合同总数', value: 58 }]},{name: '青海省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 1.2578 },{ name: '合同总数', value: 30 }]},{name: '江西省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 2.8155 },{ name: '合同总数', value: 67 }]},{name: '台湾省',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0.0032 },{ name: '合同总数', value: 2 }]},{name: '香港特别行政区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0 },{ name: '合同总数', value: 0 }]},{name: '澳门特别行政区',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0 },{ name: '合同总数', value: 0 }]},{name: '南海诸岛',contractInfoByFirstArea: [{ name: '合同总额(亿)', value: 0 },{ name: '合同总数', value: 0 }]}]dataList.value = resDataoptions.series[0].data = resData
}// 重新随机选中地图区域
const reSelectMapRandomArea = () => {const length = 34nextTick(() => {try {const map = chinaMapRef.value.eChartlet index = Math.floor(Math.random() * length)while (index === preSelectMapIndex || index >= length) {index = Math.floor(Math.random() * length)}map.dispatchAction({type: 'unselect',seriesIndex: 0,dataIndex: preSelectMapIndex})map.dispatchAction({type: 'showTip',seriesIndex: 0,dataIndex: index})map.dispatchAction({type: 'select',seriesIndex: 0,dataIndex: index})preSelectMapIndex = index} catch (error) {console.log('2345' + error)}})
}
const chinaMapRef = ref()
const handleMapRandomSelect = () => {nextTick(() => {try {const map = chinaMapRef.value.eChartsetTimeout(() => {reSelectMapRandomArea()}, 0)// 移入区域,清除定时器、取消之前选中并选中当前map.on('mouseover', function (params) {clearInterval(timer.mapIntervalTimer)map.dispatchAction({type: 'unselect',seriesIndex: 0,dataIndex: preSelectMapIndex})map.dispatchAction({type: 'select',seriesIndex: 0,dataIndex: params.dataIndex})preSelectMapIndex = params.dataIndex})// 移出区域重新随机选中地图区域,并开启定时器map.on('globalout', function () {reSelectMapRandomArea()startInterval()})startInterval()} catch (error) {console.log('134' + error)}})
}
// 开启定时器
const startInterval = () => {// 应通过接口获取配置时间,暂时写死5sconst time = 2000if (timer.mapIntervalTimer !== null) {clearInterval(timer.mapIntervalTimer)}timer.mapIntervalTimer = setInterval(() => {reSelectMapRandomArea()}, time)
}//去除定时器
const clearData = () => {if (timer.mapIntervalTimer) {clearInterval(timer.mapIntervalTimer)timer.mapIntervalTimer = null}
}onMounted(() => {getData()handleMapRandomSelect()
})onUnmounted(() => {clearData()
})
</script><style scoped></style>

几个需要说明的地方:

1.option配置中的显示数据。本例中,数据直接写死赋值,在实际使用中,我们可能是从后端异步拉取数据然后再显示,这就会有一个问题,组件加载完毕,数据却还没有获取完毕。本人在实际项目的办法是初始化一个定时器,1秒钟获取一次数据,如果加载到数据就销毁定时器,继续赋值给option中的数据。

const getData = async () => {let resData: contractInfoForFirstArea[] = digitalScreenStore.getContractInfoForFirstAreaif (resData.length > 0 && timer.initDataTimer !== null) {// 清除多次执行定时器clearInterval(Number(timer.initDataTimer))timer.initDataTimer = null}dataList.value = resDataoptions.series[0].data = resData
}const getInitDataTimer = () => {timer.initDataTimer = setInterval(getData, 1000)
}onMounted(() => {getInitDataTimer()getData()
})

2.tooltip中的formatter函数。如果简单的字符串满足不了显示数据的要求,可以自定义函数,返回一段自定义HTML,显示对应数据。

3.自动随机选择省份区域,并显示tooltip数据。主要为三个函数,handleMapRandomSelect,reSelectMapRandomArea,startInterval,最初引用链接为koi-screen Vue2版,ECharts5的配置也有一些变化,所以改进为现在的Vue3+ECharts5版。

5.总结

本篇文章简单介绍了ECharts组件的封装,以及地图组件的封装,大概描述了实际项目中遇到的问题以及自己的一些解决办法,行文比较简单概括,所给代码并不能达到文章开始图片效果,对于一些问题可能还不是能很好的理解,欢迎批评指正,一起探讨交流进步。

相关文章:

Vue3+TS+ECharts5实现中国地图数据信息显示

1.引言 最近在做一个管理系统&#xff0c;主要技术栈使用的是Vue3TSViteElementPlus&#xff0c;主要参考项目是yudao-ui-admin-vue3&#xff0c;其中用到ECharts5做数字大屏&#xff0c;展示中国地图相关信息&#xff0c;以此基础做一个分享&#xff0c;写下这篇文章。 &quo…...

PowerShell 内网不能直接安装SqlServer模块的处理办法

PowerShell 内网不能直接安装SqlServer模块的处理办法 文章目录 下载sqlserver module安装sqlserver module导入和验证sqlserver 模块推荐阅读 下载sqlserver module 首先先将sqlserver.nupkg下载到本地&#xff0c;我是放到了C:\windows\system32目录下。 PowerShell Galler…...

Git使用【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;标签管理理解标签标签运用 …...

自然语言处理的分类

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 作为理解、生成和处理自然语言文本的有效方法&#xff0c;自然语言处理&#xff08;NLP&#xff09;的研究近年来呈现出快速传播和广泛采用。鉴于 NLP 的快速发展&#xff0c;获得该领域的概述并对其进行维护是很困难的。…...

Flutter笔记:手写并发布一个人机滑动验证码插件

Flutter笔记 手写一个人机滑块验证码 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133529459 写 Flut…...

RabbitMQ安装与简单使用

安装 下载资源 可以访问官网查看下载信息rabbitmq官网 选择合适的版本&#xff0c;注意&#xff1a;rabbitmq需要下载一个Erlang才能使用 我自己是在一下两个连接中下载的 rabbitmq 3.8.8 erlang 21.3.8.15 需要下载其他版本的同学注意erlang版本是否匹配&#xff0c;可以访…...

不做静态化,当部署到服务器上的项目刷新出现404【已解决】

当线上项目刷新出现404页面解决方法&#xff1a; 在nginx配置里加入这样一段代码 try_files $uri $uri/ /index.html; 它的作用是尝试按照给定的顺序访问文件 变量解释 try_files 固定语法 $uri 指代home文件(ip地址后面的路径&#xff0c;假如是127.0.0.1/index/a.png&…...

SpringBoot结合Redisson实现分布式锁

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…...

css字体属性

一、CSS字体属性用于设置文本的字体样式。以下是常用的CSS字体属性&#xff1a; font-family&#xff1a;设置文本的字体系列&#xff0c;可以使用多个字体&#xff0c;用逗号分隔。font-size&#xff1a;设置文本的字体大小&#xff0c;可用像素、百分比、em等单位。font-wei…...

云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 文章目录 系列文章目录[TOC](文章目录) 前言1、Eureka 两大组件2、Eureka 服务注册与发现3、案例3.1、创建主工程3.1.1、主…...

【白细胞介素6(IL-6)】

## IL-6&#xff0c;至关重要的多功能细胞因子 ## 聊一聊白细胞介素6&#xff08;IL-6&#xff09; ## 简述&#xff1a;国内外IL-6 _ IL-6R在研药物一览_药智新闻.2017 ## 研究项目&#xff5c;靶向IL-6药物在研现状 2021...

设计模式之抽象工厂模式--创建一系列相关对象的艺术(简单工厂、工厂方法、到抽象工厂的进化过程,类图NS图)

目录 概述概念适用场景结构类图 衍化过程业务需求基本的数据访问程序工厂方法实现数据访问程序抽象工厂实现数据访问程序简单工厂改进抽象工厂使用反射抽象工厂反射配置文件衍化过程总结 常见问题总结 概述 概念 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种将相…...

大数据-玩转数据-Flink SQL编程实战 (热门商品TOP N)

一、需求描述 每隔30min 统计最近 1hour的热门商品 top3, 并把统计的结果写入到mysql中。 二、需求分析 1.统计每个商品的点击量, 开窗2.分组窗口分组3.over窗口 三、需求实现 3.1、创建数据源示例 input/UserBehavior.csv 543462,1715,1464116,pv,1511658000 662867,22…...

python中实现定时任务的几种方案

目录 while True: sleep()Timeloop库threading.Timersched模块schedule模块APScheduler框架Celery框架数据流工具Apache Airflow概述Airflow 核心概念Airflow 的架构 总结以下几种方案实现定时任务&#xff0c;可根据不同需求去使用不同方案。 while True: sleep() 利用whil…...

AcWing算法提高课-5.6.1同余方程

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 求关于 x x x 的同余方程 a x ≡ 1 ( m o d b ) ax ≡ 1 \pmod b ax≡1(modb) 的最小正整数解。 输入格式 输入只有一行&#xff0c;包含两个正整数 a , b a,b a,b&#xff0c;用一…...

Docker Tutorial

什么是Docker 为每个应用提供完全隔离的运行环境 Dockerfile&#xff0c; Image&#xff0c;Container Image&#xff1a; 相当于虚拟机的快照&#xff08;snapshot&#xff09;里面包含了我们需要部署的应用程序以及替它所关联的所有库。通过image&#xff0c;我们可以创建很…...

平面图—简单应用

平面图&#xff1a;若一个图&#x1d43a;能画在平面&#x1d446;上&#xff0c;且使&#x1d43a;的边仅在端点处相交&#xff0c;则称图&#x1d43a;为可嵌入平面&#x1d446;&#xff0c;&#x1d43a;称为可平面图&#xff0c;简称为平面图。 欧拉公式&#xff1a;设有…...

安装JDK(Java SE Development Kit)超详细教程

文章时间 &#xff1a; 2023-10-04 1. 下载地址 直接去下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ &#xff08;需要翻墙&#xff0c;不想翻墙或者不想注册oracel账号的&#xff0c;直接去我的阿里云盘&#xff09; 阿里云盘&#xff1a;http…...

KUKA机器人通过3点法设置工作台基坐标系的具体方法

KUKA机器人通过3点法设置工作台基坐标系的具体方法 具体方法和步骤可参考以下内容: 进入主菜单界面,依次选择“投入运行”—“测量”—基坐标,选择“3点法”, 在系统弹出的基坐标编辑界面,给基座标编号为3,命名为table1,然后单击“继续”按钮,进行下一步操作, 在弹出的…...

以太网的MAC层

以太网的MAC层 一、硬件地址 ​ 局域网中&#xff0c;硬件地址又称物理地址或MAC地址&#xff08;因为用在MAC帧&#xff09;&#xff0c;它是局域网上每一台计算机中固化在适配器的ROM中的地址。 ​ 关于地址问题&#xff0c;有这样的定义&#xff1a;“名字指出我们所要寻…...

Hadoop启动后jps发现没有DateNode解决办法

多次使用 Hadoop namenode -format 格式化节点后DateNode丢失 找到hadoop配置文件core-site.xml查找tmp路径 进入该路径&#xff0c;使用rm -rf data删除data文件 再次使用Hadoop namenode -format 格式化后jps后出现DateNode节点...

VUE3照本宣科——应用实例API与setup

VUE3照本宣科——应用实例API与setup 前言一、应用实例API1.createApp()2.app.use()3.app.mount() 二、setup 前言 &#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f33e;&#x1f4dd;记录学习成果&#xff0c;以便温故而知新 “VUE3照本宣科”是指照着中文官网和菜鸟教…...

json/js对象的key有什么区别?

1.对于JS对象来说 一个js对象如果是这样的 obj {"0": "小明","0name": "小明明", "": 18,"&#xffe5;": "哈哈"," ": "爱好广泛" }对于js对象来说&#xff0c;有时候key是不…...

极大似然估计概念的理解——统计学习方法

目录 1.最大似然估计的概念的理解1 2.最大似然估计的概念的理解2 3.最大似然估计的概念的理解3 4.例子 1.最大似然估计的概念的理解1 最大似然估计是一种概率论在统计学上的概念&#xff0c;是参数估计的一种方法。给定观测数据来评估模型参数。也就是模型已知&#xff0c;参…...

python模拟表格任意输入位置

在表格里输入数值&#xff0c;要任意位置&#xff0c;我找到了好方法&#xff1a; input输入 1. 行 2. 列输入&#xff1a;1 excel每行输入文字input输入位置 3.2 表示输入位置在&#xff1a;3行个列是要实现一个类似于 Excel 表格的输入功能&#xff0c;并且希望能够指定输入…...

如何限制文件只能通过USB打印机打印,限制打印次数和时限并且无法在打印前查看或编辑内容

在今天这个高度信息化的时代&#xff0c;文档打印已经成为日常工作中不可或缺的一部分。然而&#xff0c;这也带来了诸多安全风险&#xff0c;如文档被篡改、知识产权被侵犯以及信息泄露等。为了解决这些问题&#xff0c;只印应运而生。作为一款独特的软件工具&#xff0c;只印…...

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者&#xff1a;Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位&#xff1a;Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接&#xff1a;http://arxiv.org/abs/2309.12972v1 内容简介&#xff1a; 1&#xff09;方向&#x…...

Blender中的4种视图着色模式

Blender中有四种主要的视图着色模式&#xff1a;线框、实体、Look Dev和渲染。它们的主要区别如下&#xff1a; - 线框模式只显示物体的边缘&#xff08;线框&#xff09;&#xff0c;可以让您看到场景中的所有物体&#xff0c;也可以调整线框的颜色和背景的颜色。 - 实…...

Flutter项目安装到Android手机一直显示在assembledebug

问题 Flutter项目安装到Android手机一直显示在assembledebug 原因 网络不好&#xff0c;gradle依赖下载不下来 解决方案 修改如下的文件 gradle-wrapper.properties 使用腾讯提供的gradle镜像下载 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5…...

数据挖掘实验(二)数据预处理【等深分箱与等宽分箱】

一、分箱平滑的原理 &#xff08;1&#xff09;分箱方法 在分箱前&#xff0c;一定要先排序数据&#xff0c;再将它们分到等深&#xff08;等宽&#xff09;的箱中。 常见的有两种分箱方法&#xff1a;等深分箱和等宽分箱。 等深分箱&#xff1a;按记录数进行分箱&#xff0…...

otc场外交易网站开发/推广营销企业

我们在使用IBM SPSS Statistics来进行数据分析的时候&#xff0c;难免会遇上这种情况:变量非常多&#xff0c;多到我们不能对其一一控制的地步&#xff0c;但每个变量都有分析的价值&#xff0c;同时又彼此重叠。这个时候最直接的方法就是把所有变量按照一定的标准来进行分类&a…...

新手想写小说怎么做网站/如何优化seo

如何在一个硬盘上安装两个Linux操作系统一个硬盘已安装Fedora 8 Linux系统&#xff0c;并安装grub引导管理程序&#xff0c;现要在这个硬盘的空闲分区中安装Fedora 9&#xff0c;操作如下&#xff1a;1.将Fedora-9-i386-DVD.iso文件放到一个Windows Fat32分区((hd0,4))的根目录…...

网页设计与网站建设第4章在线测试/app怎么推广运营

转载请注明出处:http://blog.csdn.net/snailbaby_soko/article/details/69524380 *本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 Android热更新方案Robust 相信很多人都认识了解过 热修复、热更新、热补丁(对于这个技术也没有特别标准的一种叫法…...

网站建设比较好/免费的网站软件

相关章节&#xff1a;第十五章 快点思考&#xff01; “适当的压力对项目是有利的&#xff0c;可以提高工作效率&#xff0c;加快工作进程”&#xff0c;你同意这句话吗&#xff1f;至少在我看这本书之前&#xff0c;我的看法是这样的&#xff0c;和汤普金斯、贝琳达他们一样&…...

房地产网站建设方案书/如何推广自己的微信号

文章目录1 缩写 & 引用2 abstract & introduction & background3 FPGA accelerator design题目&#xff1a;A Real-Time Object Detection Accelerator with Compressed SSDLite on FPGA时间&#xff1a;2018会议&#xff1a;FPT研究机构&#xff1a;帝国理工学院 …...

做微信封面的网站/怎么创建网站链接

介绍jwt 1、JWT官网&#xff1a; https://jwt.io/ JWT(Java版)的github地址:https://github.com/jwtk/jjwt 2、什么是jwt Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).定义了一种简洁的&#xff0…...