【vue+echarts】绘制中国地图,3D地图,省、市、县三级下钻以及回钻,南海诸岛小窗化显示,点位飞线图,点位名称弹窗轮播展示,及一些常见问题

在这里插入图片描述
先看效果展示图
在这里插入图片描述

目录

      • 准备工作
      • 一, 绘制3D地图
        • 1,调用官网地址接口获取
        • 2,去官网下载中国地图的json数据到本地,本地引入
      • 二, 南海诸岛小窗化显示
        • 1, 手动过滤掉,只保留小窗化的南海诸岛
        • 2, 代码层面过滤掉,只保留小窗化的南海诸岛
      • 三, 省、市、县三级地图下钻及回钻
        • 1, 下钻
        • 2, 回钻
      • 四, 添加点位飞线图
      • 五, 点位弹窗轮播展示
      • 常见问题
        • 1, 南海诸岛小窗不显示或者小窗和大图同时显示
        • 2, 鼠标移入地图不显示弹窗,移入点位上显示弹窗

每部分的源码在文章最后的链接中

准备工作

不知道或者不熟悉的可以去官网看看: 点击前往Echarts官网
各个省、市、县的地图json下载,点击前往
插件下载

npm i echarts --save  // 我的版本 ^5.2.0

一, 绘制3D地图

这种3D效果其实多层map对象集合组成的,通常在option里面的geo中
html

  <div class="about">
    <div id="myMap"></div>
  </div>

option配置项

option里面的控制3D效果的主要是这个geo模块,里面5个对象表示5层地图,层数越多,就越立体,一般三五层就差不多了,每个都偏移了一点点,从而形成的3D立体效果

      optionMap: {
 		....
         geo: [
          {
            map: 'china',
            aspectScale: 1,
            zoom: 0.9,
            layoutCenter: ['50%', '50%'],
            layoutSize: '100%',
            show: true,
            roam: false,
            label: {
              show: false, // 各个省市县的名字
              color: '#fff',
            },
            itemStyle: {
              // 每块的样式
              areaColor: {
                type: 'linear',
                x: 1200,
                y: 0,
                x2: 0,
                y2: 0,
                colorStops: [
                  {
                    offset: 0,
                    color: 'rgba(3,27,78,0.75)',
                  },
                  {
                    offset: 1,
                    color: 'rgba(58,149,253,0.75)',
                  },
                ],
                global: true, // 缺省为 false
              },
              borderColor: '#c0f3fb',
              borderWidth: 0.8,
            },
            emphasis: {
              itemStyle: {
                show: false,
                color: '#fff',
                areaColor: 'rgba(0,254,233,0.6)',
              },
              label: {
                show: true,
                color: '#fff',
              },
            },
          },
          // 重影
          {
            type: 'map',
            map: 'china',
            zlevel: -1,
            aspectScale: 1,
            zoom: 0.9,
            layoutCenter: ['50%', '51%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            itemStyle: {
              borderWidth: 1,
              borderColor: 'rgba(58,149,253,0.8)',
              shadowColor: 'rgba(172, 122, 255,0.5)',
              shadowOffsetY: 5,
              shadowBlur: 15,
              areaColor: 'rgba(5,21,35,0.1)',
            },
          },
          {
            type: 'map',
            map: 'china',
            zlevel: -2,
            aspectScale: 1,
            zoom: 0.9,
            layoutCenter: ['50%', '52%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            itemStyle: {
              borderWidth: 1,
              borderColor: 'rgba(58,149,253,0.6)',
              shadowColor: 'rgba(65, 214, 255,0.6)',
              shadowOffsetY: 5,
              shadowBlur: 15,
              areaColor: 'rgba(5,21,35,0.1)',
            },
          },
          {
            type: 'map',
            map: 'china',
            zlevel: -3,
            aspectScale: 1,
            zoom: 0.9,
            layoutCenter: ['50%', '53%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            itemStyle: {
              borderWidth: 1,
              borderColor: 'rgba(58,149,253,0.4)',
              shadowColor: 'rgba(29, 111, 165,1)',
              shadowOffsetY: 15,
              shadowBlur: 10,
              areaColor: 'rgba(5,21,35,0.1)',
            },
          },
          {
            type: 'map',
            map: 'china',
            zlevel: -4,
            aspectScale: 1,
            zoom: 0.9,
            layoutCenter: ['50%', '54%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            itemStyle: {
              borderWidth: 5,
              borderColor: 'rgba(5,9,57,0.8)',
              shadowColor: 'rgba(29, 111, 165,0.8)',
              shadowOffsetY: 15,
              shadowBlur: 10,
              areaColor: 'rgba(5,21,35,0.1)',
            },
          },
        ],
        ....
      },
      publicUrl: 'https://geo.datav.aliyun.com/areas_v3/bound/',

js
两种绘制方法

1,调用官网地址接口获取
import axios from 'axios'
let myChartMap = null
methods:{
    // 初始化
    async initChart() {
    //获取中国地图的json数据,直接拿过来用
      let chinaGeoJson = await this.getGeoJson('100000_full.json')
      this.initEcharts(chinaGeoJson.data, 'china')
    },
    //echarts绘图
    initEcharts(geoJson, name) {
    // 注册3D地图
      this.$echarts.registerMap(name, geoJson)
      myChartMap.setOption(this.optionMap)
    },
    //获取地图json数据
    async getGeoJson(jsonName) {
      return await axios.get(this.publicUrl + jsonName)
    },
},
mounted() {
myChartMap = this.$echarts.init(document.getElementById('myMap'))
this.initChart()
}
2,去官网下载中国地图的json数据到本地,本地引入

本地引入的比较简洁点,但是在地图下面模块就不好用了,总不可能把全国的省市县地图json全下载下来吧,当然也可以,这样项目体积就比较大了

methods:{
    initEcharts() {
      this.$echarts.registerMap('china', require('../util/china.json'))
      myChartMap.setOption(this.optionMap)
    },
},
mounted() {
myChartMap = this.$echarts.init(document.getElementById('myMap'))
this.initEcharts()
}

看看效果图
在这里插入图片描述
哎,这里出现了一个问题,南海诸岛和南海诸岛小窗化一起出来了,以下有两个解决方法

二, 南海诸岛小窗化显示

1, 手动过滤掉,只保留小窗化的南海诸岛

手动删除海南省其余json,只保留海南省的. 和剔除海南省边界json
本地china.json
在这里插入图片描述
全局搜JD,删除properties对象就可以了.
在这里插入图片描述
手动将上面两块代码删除就可以小窗化显示了.

2, 代码层面过滤掉,只保留小窗化的南海诸岛

相同的部分就不再展示了
formatJson这个方法做的就是剔除海南省其余json,只保留海南省的. 和剔除海南省边界json

methods:{
    // 南沙诸岛以缩略图展示
    async formatJson(chinaGeoJson) {
      chinaGeoJson.features.forEach((v) => {
        if (v.properties && v.properties.name == '海南省') {
          v.geometry.coordinates = v.geometry.coordinates.slice(0, 1)
        }
      })
      // 过滤掉海南诸岛边界线
      chinaGeoJson.features = chinaGeoJson.features.filter((item) => item.properties.adcode !== '100000_JD')
      return chinaGeoJson
    },
     // 初始化
    async initChart() {
      let chinaGeoJson = await this.getGeoJson('100000_full.json')
      // this.initEcharts(chinaGeoJson.dat, 'china')
      // 过滤掉海南省其他部分的json之后的中国地图json
      let formatChinaGeoJson = await this.formatJson(chinaGeoJson.data)
      this.initEcharts(formatChinaGeoJson, 'china')
    },
    ...
}

过滤后,就能正常显示了,请看下图
在这里插入图片描述

三, 省、市、县三级地图下钻及回钻

原理: 通过点击事件点击的省份,获取该省的行政区划编码—>以这个编码作为参数去调接口获取该省的地图json—>重新渲染到页面上—>递归操作

1, 下钻
  publicUrl: 'https://geo.datav.aliyun.com/areas_v3/bound/', // 地图json接口地址
  level: 0, // 当前层级
  historyData: [], // 缓存上一级的信息
  adName: '中国', // json对应的中文name
  alladcode: '', // 中文名对应的行政区划编码
.....
  methods:{
  ......
  	    // 初始化
    async initChart() {
      // 获取地图name对应的adcode行政区划编码
      let geoJson = await this.getGeoJson('all.json')
      this.alladcode = geoJson.data
      // 获取中国地图json,南海诸岛小窗化
      let chinaGeoJson = await this.getGeoJson('100000_full.json')
      let formatChinaGeoJson = await this.formatJson(chinaGeoJson.data)
      this.initEcharts(formatChinaGeoJson, 'china')
    },
        // 格式图表,数据处理
    formatChart(geoJson, name) {
    // 页面上回钻按钮的name
      this.adName = name == 'china' ? '中国' : name
      // 注册3D地图
      this.$echarts.registerMap(name, geoJson)
      // 下钻的时候地图大小设置,不设置会有部分地图超出屏幕
      this.optionMap.geo.forEach((v) => {
        v.map = name
        v.layoutSize = name == 'china' ? '180%' : '100%'
      })
      myChartMap.clear()
      myChartMap.setOption(this.optionMap)
    },
      //echarts绘图
    initEcharts(geoJson, name) {
      this.formatChart(geoJson, name)
      // 存储当前下钻的层级和地图json信息
      this.level++
      this.historyData.push({ geoJson, name })
      // 点击事件
      myChartMap.off('click')
      myChartMap.on('click', (params) => {
      	// 获取中文名对应的行政区划编码,调接口用的
        let clickRegionCode = this.alladcode.filter((areaJson) => areaJson.name === params.name)[0].adcode
        // 没有区县的地级市,东莞,中山,儋州,三沙,嘉峪关, 这5个市比较特殊,没有下一级区县,在获取地图json官网接口可以看出来,中国,省,市,这三级的地图json的接口是 '行政区划+_full.json'的,而最后一级区县的地图json接口是 '行政区划+.json'.由于这5个地级市没有区县,所以他们就是最后一级,所以他们接口参数格式是'行政区划+.json'
        let adcodeArr = ['460400', '460300', '441900', '442000', '620200']
        let regJson = `${clickRegionCode}_full.json`
        // 区县或者没有区县的地级市,行政区划最后两位不是00的就是最后一级,adcodeArr除外
        if (clickRegionCode.toString().slice(-2) != '00' || adcodeArr.includes(clickRegionCode.toString())) {
          regJson = `${clickRegionCode}.json`
        }
        // 调接口
        this.getGeoJson(regJson)
          .then((regionGeoJson) => {
          	// 递归
            this.initEcharts(regionGeoJson.data, params.name)
          })
          .catch((err) => {
          	// 异常处理
            this.level = 0
            this.historyData = []
            this.initEcharts(require('@/util/china.json'), 'china')
          })
      })
    },
    //获取地图json数据
    async getGeoJson(jsonName) {
      return await axios.get(this.publicUrl + jsonName)
    },
2, 回钻

上面下钻不是缓存了当前层的json信息吗,直接拿过来用就好了,接口都不用调.
回钻可以通过按钮点击进行回钻,也可以监听鼠标右键进行回钻,我这边就用按钮了,简单点

    <el-button type="primary" size="mini" title="点击返回上一级" class="btn" @click="upside">{{ adName }}</el-button>
...
	methods:{
		 // 返回上一级
	    upside() {
	      // 如果是最顶层就返回,没得回钻了
	      if (this.historyData.length <= 1) return
	      // 回钻一层,level减减, historyData移出一层
	      this.level--
	      this.historyData.pop()
	      let upData = this.historyData[this.level - 1]
	      this.formatChart(upData.geoJson, upData.name)
	    },
	}

看看效果在这里插入图片描述

四, 添加点位飞线图

每一条飞线都是由一组起始点的经纬度组成的,起点就是点位的经纬度,终点就是自定义的一组点位,可以项目所在地的经纬度.

项目里面就调接口获取点位就可以了,这里就用假数据展示了,只要数据格式一样就行

    // 点位数据
    this.resData = [
      {
        name: '广州市',
        value: [113.2644, 23.1291],
      },
      {
        name: '成都市',
        value: [104.0657, 30.6598],
      },
      {
        name: '苏州市',
        value: [120.6195, 31.2995],
      },
      {
        name: '北京市',
        value: [116.404, 39.9042],
      },
      {
        name: '连云港市',
        value: [119.1676, 34.5934],
      },
      {
        name: '南京市',
        value: [118.7674, 32.0415],
      },
      {
        name: '杭州市',
        value: [120.1535, 30.2874],
      },
      {
        name: '乌鲁木齐市',
        value: [87.6168, 43.7928],
      },
      {
        name: '拉萨市',
        value: [91.11, 29.97],
      },
      {
        name: '西安市',
        value: [108.953, 34.2779],
      },
      {
        name: '南宁市',
        value: [108.32006, 22.82402],
      },
    ]
    ...
...
import { isPointInMultiPolygon } from '@/util/echartTool.js' // 这个是判断点位是否属于当前区域,地图下钻的时候,过滤掉不属于该区域的点位

	    series: [
          {
            type: 'lines', // 飞线图
            zlevel: 2,
            effect: {
              show: true,
              period: 3, //箭头指向速度,值越小速度越快
              trailLength: 0.03, //特效尾迹长度[0,1]值越大,尾迹越长重
              symbol: 'arrow', //箭头图标
              symbolSize: 6, //图标大小
            },
            lineStyle: {
              color: '#EE5652',
              width: 1, //尾迹线条宽度
              opacity: 1, //尾迹线条透明度
              curveness: 0.3, //尾迹线条曲直度
            },
            data: [],
            symbol: ['none', 'circle'], //飞线起点终点点位样式
            symbolSize: 10, // 飞线起点终点点位大小
          },
          {
            type: 'effectScatter',
            zlevel: 3,
            coordinateSystem: 'geo',
            emphasis: {
              label: {
                show: true,
                position: 'top',
                color: '#fff',
                formatter: '{b|{b}}',
              },
            },
            data: [],
            symbol: 'circle',
            symbolSize: [20, 10],
            itemStyle: {
              color: 'orange',
              shadowBlur: 10,
              shadowColor: 'orange',
            },
            effectType: 'ripple',
            showEffectOn: 'render', //emphasis移入显示动画,render一开始显示动画
            rippleEffect: {
              scale: 5,
              brushType: 'stroke',
            },
          },
        ],
        ..... //无关的代码就不展示了,上面都有
          // 初始化
    async initChart() {
      // 获取地图name对应的adcode行政区划编码
      let geoJson = await this.getGeoJson('all.json')
      this.alladcode = geoJson.data
      let chinaGeoJson = await this.getGeoJson('100000_full.json')
      let formatChinaGeoJson = await this.formatJson(chinaGeoJson.data)
      // 鼠标移入点位的弹窗
      let rich = {
        b: {
          color: '#fff',
          backgroundColor: {
            image: require('../../public/home/point.png'),
          },
          padding: [20, 30],
          fontSize: 14,
          align: 'center',
        },
      }
      this.optionMap.series[1].emphasis.label.rich = rich // 控制鼠标移入点位弹窗显示点位信息
      this.initEcharts(formatChinaGeoJson, 'china')
    },
    // 格式化点位飞线数据
    filterLines(currentData) {
      let dataLines = []
      let center = [120.537612, 31.276282] // 飞线图终点的地位经纬度
      currentData.forEach((v) => {
        let lonLat = [v.value[0], v.value[1]]
        dataLines.push({
          coords: [lonLat, center], // 高版本的飞线数据组
        })
        // 这个是低版本的
        // dataLines.push([
        //   {
        //     coord: lonLat, // 起始点
        //     value: 0,
        //   },
        //   {
        //     coord: center, // 中心点
        //   },
        // ])
      })
      return dataLines
    },

    // 格式图表
    formatChart(geoJson, name) {
      // 过滤出当前地图的点位,过滤掉不属于改地图区域的点位
      let currentData = this.resData.filter((v) => {
        return isPointInMultiPolygon([v.value[0], v.value[1]], geoJson.features)
      })
      this.adName = name == 'china' ? '中国' : name
      this.$echarts.registerMap(name, geoJson)
      this.optionMap.geo.forEach((v) => {
        v.map = name
        v.layoutSize = name == 'china' ? '180%' : '100%'
      })
      this.optionMap.series[0].data = this.filterLines(currentData)
      this.optionMap.series[1].data = currentData
      myChartMap.clear()
      myChartMap.setOption(this.optionMap)
    },
  .....

echartTool.js 射线法判断点位是否属于某个区域内

// 判断当前经纬度是否在规定区域内
export function isPointInMultiPolygon(point, multiPolygons) {
  for (let polygon of multiPolygons) {
    let coordinates = polygon.geometry.coordinates
    if (isPointInAnyPolygon(point, coordinates)) {
      return true
    }
  }
  return false
}
export function isPointInAnyPolygon(point, polygons) {
  for (let polygon of polygons) {
    if (isPointInPolygon(point, polygon[0])) {
      return true
    }
  }
  return false
}
export function isPointInPolygon(point, polygon) {
  // 射线法判断点是否在多边形内部
  let x = point[0],
    y = point[1]
  let inside = false
  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
    let xi = polygon[i][0],
      yi = polygon[i][1]
    let xj = polygon[j][0],
      yj = polygon[j][1]
    let intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi
    if (intersect) {
      inside = !inside
    }
  }
  return inside
}

看看效果
在这里插入图片描述

五, 点位弹窗轮播展示

定时器循环展示点位信息,当前点位高亮且显示弹窗,其余不显示.

....
      series: [
          {
            type: 'effectScatter',
            zlevel: 3,
            coordinateSystem: 'geo',
            emphasis: {
              label: {
                show: true,
                position: 'top',
                color: '#fff',
                formatter: '{b|{b}}',
              },
            },
            label: {
              show: false,
              position: 'top',
              color: '#fff',
            },
            data: [],
            symbol: 'circle',
            symbolSize: [20, 10],
            itemStyle: {
              color: 'orange',
              shadowBlur: 10,
              shadowColor: 'orange',
            },
            effectType: 'ripple',
            showEffectOn: 'render', //emphasis移入显示动画,render一开始显示动画
            rippleEffect: {
              scale: 5,
              brushType: 'stroke',
            },
          },
        ],
        ...
            // 初始化
    async initChart() {
....
      // 鼠标移入点位的弹窗
      let rich = {
        b: {
          color: '#fff',
          backgroundColor: {
            image: require('../../public/home/point.png'),
          },
          padding: [20, 30],
          fontSize: 14,
          align: 'center',
        },
      }
      this.optionMap.series[0].emphasis.label.rich = rich
      this.optionMap.series[0].label.rich = rich
      this.initEcharts(formatChinaGeoJson, 'china')
    },
        // 点位颜色高亮
    highLightPoint(currentData, index) {
      currentData.forEach((v, key) => {
        let flag = key == index ? 'aqua' : 'orange'
        v.itemStyle = {
          color: flag,
          shadowColor: flag,
        }
      })
      this.optionMap.series[0].label.formatter = (e) => {
        return e.name === currentData[index].name ? `{b|${e.name}}` : ''
      }
    },
        // 格式图表
    formatChart(geoJson, name) {
      // 过滤出当前地图的点位
      let currentData = this.resData.filter((v) => {
        return isPointInMultiPolygon([v.value[0], v.value[1]], geoJson.features)
      })
      this.adName = name == 'china' ? '中国' : name
      this.$echarts.registerMap(name, geoJson)
      this.optionMap.geo.forEach((v) => {
        v.map = name
        v.layoutSize = name == 'china' ? '180%' : '100%'
      })
      this.optionMap.series[0].data = currentData
      // 点位颜色高亮,初始进入第一个高亮
      this.highLightPoint(currentData, 0)
      this.optionMap.series[0].label.show = true
      myChartMap.clear()
      myChartMap.setOption(this.optionMap)
      if (charTimer) {
        clearInterval(charTimer)
        charTimer = null
      }
      // 点位大于2个才循环轮播
      if (currentData.length > 1) {
        let i = 0
        charTimer = setInterval(() => {
          i++
          if (i >= currentData.length) i = 0
          this.highLightPoint(currentData, i)
          myChartMap.setOption(this.optionMap)
        }, 1000 * 3)
      }
    },
    ....

看效果
在这里插入图片描述

常见问题

1, 南海诸岛小窗不显示或者小窗和大图同时显示

小窗不显示大概率是注册3D地图的时候用的中文名.

 this.$echarts.registerMap(name, geoJson)
 绘制全国地图的时候这个name必须是china,写中国的话很可能导致南海诸岛不显示.

小窗和大图同时显示
就下图这种情况,南沙诸岛重复显示,上面第二大点已经给出解决方法了
在这里插入图片描述

2, 鼠标移入地图不显示弹窗,移入点位上显示弹窗

把全局的toolip关掉

....
option:{
    tooltip: {
     	show: false,
     },
     series:[
		...
		    {
			...
			// 控制鼠标移入高亮,改变位置,就类似于弹窗了
            emphasis: {
              label: {
                show: true,
                position: 'top',
                color: '#fff',
                formatter: '{b|{b}}', // 自定义样式
              },
            },
            // 默认的弹窗样式
            label:{
            }
   ....
          },
	 ]
}

所有示例代码已上传,点击前往下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YApi的在IDEA中的使用

1 IDEA中插件下载 2 misc.xml的配置 <component name"yapi"><option name"projectToken">XXXXXXXXXX</option><option name"projectId">47</option><option name"yapiUrl">http://XXXX:3000<…

第10篇:创建Nios II工程之控制单个七段数码管

Q&#xff1a;还记得之前使用Verilog case语句来描述实现七段数码管的逻辑功能。本期我们创建Nios II工程用C语言代码实现相同的功能。 A&#xff1a;基本原理&#xff1a;一个七段数码管由7个发光二极管LED组成&#xff0c;所以控制一个数码管的显示即控制7个LED。我们在之前…

效率工具Cmder与文件拆分

Cmder安装&#xff1a; 网站下载&#xff0c;解压缩&#xff0c;使用管理员身份打开Cmder可执行程序。 Cmder鼠标右键快捷点打开设置 样式图&#xff1a; 命令&#xff1a;以管理员的身份打开Cmder.exe, 输入命令: Cmder.exe /REGISTER ALL 执行完之后回到桌面&#xff0c;…

linux查看ip和端口

1. ip addr ip addr 或者 ip addr show 输出包含了网络接口的名称、状态、MTU&#xff08;Maximum Transmission Unit&#xff09;、链路层地址&#xff08;如MAC地址&#xff09;、IPv4和IPv6地址等信息。 2. 只需要 ip地址 ipV4 ip addr | grep inet ipV6 3.查看端口 s…

国内外主流大模型都具备有哪些特点?

文章目录 ⭐ 火爆全网的大模型起点⭐ 国外主流LLM及其特点⭐ 国内主流LLM及其特点⭐ 全球大模型生态的发展 该章节呢&#xff0c;我们主要是看一下关于国内外主流的大语言模型&#xff0c;通过它们都具备哪些特点&#xff0c;来达成对多模型有一个清晰的认知。对于 “多模型” …

python从0开始学习(三)

目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量&#xff0c;以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种&#xff1a;隐式类型转换和显式类型转换。 1.1 隐式…

数据库开发关键之与DQL查询语句有关的两个案例

案例 案例1 条件分页查询 查看项目经理提供给我们的需求文档 模糊匹配的含义是 只要包含"张"就可以 use dduo;-- 按照需求完成员工管理的条件分页查询 根据输入条件 查询第一页的数据 每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a; 张 -- 年龄&…

JavaScript之数据类型(1)

数据类型的分类&#xff1a; 我们可以将数据类型分为简单数据类型&#xff0c;复杂数据类型。 简单数据类型&#xff1a; 简介&#xff1a; 数据类型说明默认值Number数字型&#xff0c;包含 整型值和浮点型值&#xff0c;如 21、0.210Boolean布尔值类型&#xff0c;如 true、…

防泄密,防飞单!好用的企业电脑监控软件推荐

公司辛辛苦苦维护的客户被竞争对手抢先 成本报价被窃取&#xff0c;公司失去先机…… 员工泄露公司数据和飞单问题一直是企业面临的重要挑战。这些行为不仅可能导致企业遭受重大的经济损失&#xff0c;还可能损害企业的声誉和客户关系。因此&#xff0c;企业需要采取一系列措…

19_Scala集合概述

文章目录 集合回顾javaScala集合三大类String & StringBuilderScala集合两大类 集合 回顾java scala与Java有所不同 函数式编程语言更侧重集合本身提供的哪些功能&#xff1b; Scala集合三大类 1.Seq 存储有序数据可重复 类比 List 2.Set 存储无序数据不可重复 3.Map…

ttkbootstrap界面美化系列之Menubutton(五)

一&#xff1a;Menubutton接口 print(help(help(ttk.Menubutton))) Help on class Menubutton in module tkinter.ttk:class Menubutton(Widget)| Menubutton(masterNone, **kw)|| Ttk Menubutton widget displays a textual label and/or image, and| displays a menu wh…

【MySQL】第一次作业

【MySQL】第一次作业 1、在官网下载安装包2、解压安装包&#xff0c;创建一个dev_soft文件夹&#xff0c;解压到里面。3、创建一个数据库db_classes4、创建一行表db_hero5、将四大名著中的常见人物插入这个英雄表 写一篇博客&#xff0c;在window系统安装MySQL将本机的MySQL一定…

spring源码分析之AOP开启注解

AOP开启注解 在使用注解Aspect来进行AOP操作时&#xff0c;需要在xml中进行配置 <!-- 使Aspect注解生效 --><aop:aspectj-autoproxy/> 创建BeanFactory时obtainFreshBeanFactory()在解析xml加载BeanDefinition中&#xff0c;执行parseBeanDefinitions方法进行解析发…

指挥中心操作台的选择至关重要

在指挥中心的环境中&#xff0c;操作台是核心设备&#xff0c;它承载着信息收集、处理、分发的重要任务。其选择应考虑到多方面的因素&#xff0c;包括外观、材质、稳定性、操作便利性以及技术支持等。嘉德立在这里给大家详细的总结一下选择指挥中心操作台的要点。 首先&#x…

5.Spring Security-web权限方案

设置登录的用户名和密码 1.通过配置文件设置用户名密码 spring:security:user:name: xiankejinpassword: 123456 如果没有以上配置&#xff0c;那么就会在后台生成一个随机密码&#xff0c;用户名固定位user。 2.通过配置类设置用户名密码 Configuration public class Sec…

【AIGC】深入探索AIGC技术在文本生成与音频生成领域的应用

&#x1f680;文章标题 &#x1f680;AIGC之文本生成&#x1f680;应用型文本生成&#x1f680;创作型文本生成&#x1f680;文本辅助生成&#x1f680;重点关注场景 &#x1f680;音频及文字—音频生成&#x1f680;TTS(Text-to-speech)场景&#x1f680;乐曲/歌曲生成&#x…

给股东送酱的公司值得关注吗?仲景食品-300908 年报分析(20240505)

仲景食品-300908 基本情况 公司名称&#xff1a;仲景食品股份有限公司 A股简称&#xff1a;仲景食品 成立日期&#xff1a;2002-09-29 上市日期&#xff1a;2020-11-23 所属行业&#xff1a;食品制造业 周期性&#xff1a;0 主营业务&#xff1a;调味配料和调味食品的研发、生产…

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始&#xff0c;targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…

跟TED演讲学英文:Is your partner “the one?“ Wrong question by George Blair-West

Is your partner “the one?” Wrong question Link: https://www.ted.com/talks/george_blair_west_is_your_partner_the_one_wrong_question Speaker: George Blair-West Date: December 2022 文章目录 Is your partner "the one?" Wrong questionIntroduction…

【Unity 组件思想-预制体】

【Unity 组件思想-预制体】 预制体&#xff08;Prefab&#xff09;是Unity中一种特殊的组件 特点和用途&#xff1a; 重用性&#xff1a; 预制体允许开发者创建可重复使用的自定义游戏对象。这意味着你可以创建一个预制体&#xff0c;然后在场景中多次实例化它&#xff0c;…
最新文章