高德地图撒点组件

请添加图片描述

一、引入amap地图库 - public/index.html

<script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: '地图密钥' 
    }
  </script>
  <script
    type="text/javascript"
    src="https://webapi.amap.com/maps?v=1.4.8&key=111111111111111111111111"
  ></script>

二、组件 - DzvScatterMap

<template>
  <div class="container-box">
    <div id="container"></div>
  </div>
</template>
<script>
import { containerType, getLocation } from '@/utils/alipay'
import locationImg from '@/assets/images/location.png'

const { AMap } = window

const iconSize = 56
const defaultZoom = 12

export default {
  name: 'DzvScatterMap',
  props: {
    lngLat: {
      type: Array,
      default: () => []
    },
    // 点位列表
    list: {
      type: Array,
      default: () => []
    },
    // 样式列表
    styles: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      map: null,
      cluster: null,
      mass: null,
      styleList: []
    }
  },
  watch: {
    lngLat: function(value) {
      if (value && value.length > 0) {
        this.initAMap()
      }
    },
    list: {
      deep: true,
      handler: function(newVal) {
        if (this.map) {
          this.markerMyPosition(this.lngLat)
        }
      }
    },
    styles: {
      deep: true,
      handler: function(newVal) {
        this.styleList = newVal?.map(it => ({
          ...it,
          url: it?.src,
          anchor: new AMap.Pixel(6, 6),
          size: new AMap.Size(iconSize, 56),
          zIndex: 3
        }))
      }
    }
  },
  created() {},
  mounted() {
    this.initAMap()
  },
  methods: {
    // 初始化地图
    initAMap() {
      this.map = new AMap.Map('container', {
        zoom: defaultZoom, // 级别
        resizeEnable: true,
        center: [113.67621, 34.74499], // 默认中心点坐标
        viewMode: '2D' // 使用2D视图,使用3D在amap2.0中会旋转
      })
      this.markerMyPosition(this.lngLat)
    },
    // 标记自己的位置
    markerMyPosition(lngLat) {
      if (lngLat && lngLat.length > 0) {
        if (this.locationMarker) {
          this.map.remove(this.locationMarker)
        }

        this.locationMarker = new AMap.Marker({
          offset: new AMap.Pixel(-10, -10),
          position: new AMap.LngLat(lngLat[0], lngLat[1]),
          zoom: 13,
          content: `<div style="background-size: 100% 100%; height: 30px; width: 30px; background-image:url(${locationImg});"></div>`
        })
        if (this.map) {
          this.map.add(this.locationMarker) // 添加位置marker
          this.map.setCenter(lngLat) // 设置中心
          this.map.setZoom(defaultZoom) // 重置缩放
          this.panBy() // 设置地图平移量,将marker移到中心
        }
      }
      // 地图加载完成后,进行撒点
      this.asyncMarker()
    },
    // 地图的平移
    panBy() {
      const refList = document.getElementById('refList')
      const height = refList?.offsetHeight
      if (height > 50) {
        // 地图中心点平移
        this.map.panTo(this.lngLat)
        // 像素值平移
        this.map.panBy(0, -height / 2)
      }
    },
    // 撒点
    getMarkerList(allPoints = {}, currentType = '') {
      // 洒点之前清除上次的洒点
      if (this.mass) this.mass.clear()
      if (this.list) {
        const serviceHall = this.list.map(item => {
          return {
            ...item,
            lnglat: [item.siteCoordinateY, item.siteCoordinateX],
            style: item.typeId
          }
        })
        this.mass = new AMap.MassMarks(serviceHall, {
          opacity: 0.8,
          zIndex: 111,
          cursor: 'pointer',
          style: this.styleList
        })
        this.mass.on('click', this.markerClick)
        this.mass.setMap(this.map)
        this.$forceUpdate()
      }
    },
    // 类型和全部定位数据修改的时候进行延迟撒点,展示列表中的loading效果
    asyncMarker() {
      const _this = this
      setTimeout(() => {
        const { allPoints, currentType } = _this
        _this.getMarkerList(allPoints, currentType)
      }, 5)
    },
    // 点击事件
    markerClick(e) {
      // const curentPoint = e.target.getExtData() || {}
      const currentPoint = e.data || {}
      this.$emit('changePoint', currentPoint)
    },
    // 获取当前位置
    async location() {
      if (containerType() === 'xcx' || containerType() === 'wechat') {
        // this.$emit('changeLngLat', this.lngLat)
        this.markerMyPosition(this.lngLat)
      } else {
        const lngLat = await getLocation()
        // this.$emit('changeLngLat', lngLat)
        this.markerMyPosition(lngLat)
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.container-box {
  padding: 0px;
  margin: 0px;
  width: 100vw;
  height: calc(100vh - 50px);
  position: relative;
}
#container {
  padding: 0px;
  margin: 0px;
  width: 100%;
  height: 100%;
  position: absolute;
}
.location-icon {
  width: 40px;
  height: 40px;
  background: $white;
  border-radius: 10px;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  z-index: 20;
  right: 10px;
  top: 10px;
}
h3 {
  position: absolute;
  left: 10px;
  z-index: 2;
  color: white;
}
::v-deep {
  .amap-logo {
    z-index: -1;
  }
  .amap-copyright {
    z-index: -1;
  }
}
</style>

三、使用

2.1.home/index.vue

<template>
  <div>
    <HomePickers
      :types="types"
      @updateInfo="updateInfo"
      :class="{ 'home-pickers': true, 'fade-out-picker': fadeOutPicker, 'fade-in-picker': fadeInPicker }"
    />
    <DzvScatterMap
      ref="map"
      :isInit="isInit"
      :lngLat="lngLat"
      :styles="styles"
      :list="itemList"
      @changePoint="changePoint"
    >
      <div id="container" slot="container"></div>
    </DzvScatterMap>
    <HomeBtns @btn="btnClick" ref="refList" id="refList" />
    <HomeSearch :class="{ 'home-search': true, 'fade-out-search': fadeOutSearch, 'fade-in-search': fadeInSearch }" />
    <HomeModal v-if="showModal" @changeShow="changeShow" :item="currentPoint" />
  </div>
</template>

<script>
import { getItemListApi, getClassListApi } from '@/api/home'
import { getLocation, checkAppPermissionHandler } from '@/utils/alipay'
import { countDistance } from '@/utils/index'
import HomePickers from './@component/pickers'
import HomeBtns from './@component/btns'
import HomeSearch from './@component/searches'
import HomeModal from './@component/modal'

export default {
  components: { HomePickers, HomeBtns, HomeSearch, HomeModal },
  data() {
    return {
      isInit: true,
      currentPoint: null, // 当前点击的点位
      itemList: [],
      types: [], // 分类类型
      styles: [], // 地图撒点样式类型
      lngLat: null, // 自身
      params: {},
      pickerInfo: {},
      fadeOutPicker: false,
      fadeInPicker: false,
      fadeOutSearch: false,
      fadeInSearch: false,
      showModal: false // 是否显示选中区域模态框
    }
  },
  computed: {},
  created() {
    this.getClassList() // 查询分类
    this.getItemList() // 查询点位,郑州市不传areaCode
    this.location() // 获取当前位置
  },
  mounted() {},
  methods: {
    getClassList() {
      getClassListApi().then(res => {
        if (res?.code === 0) {
          const types = res?.data?.map(it => ({ text: it?.name, value: it?.id }))
          types?.unshift({ text: '全部类型', value: undefined })
          this.types = types
          this.styles = res?.data
          this.$refs.map.initAMap(this.lngLat) // 初始化地图
        }
      })
    },
    // 获取分类下10公里以内的数据,地图滑动重新请求
    getItemList() {
      checkAppPermissionHandler({ allowLocation: 'must' }, ({ status, location }) => {
        // const { longitude, latitude } = location
        const longitude = 113.58762
        const latitude = 37.86236
        getItemListApi({ ...this.params, longitude, latitude }).then(res => {
          if (res?.code === 0) {
            this.itemList = Object.freeze(
              res?.data.map(item => {
                const { meter, result } = countDistance(longitude, latitude, item.siteCoordinateY, item.siteCoordinateX)
                return {
                  ...item,
                  distance: result,
                  meter
                }
              })
            )
            this.$refs.map.initAMap(this.lngLat) // 初始化地图
          } else {
            this.$toast(res.message)
          }
        })
      })
    },
    changeShow() {
      this.showModal = !this.showModal
    },
    // 修改分类切换
    updateInfo(item) {
      this.params = { ...item }
      this.getItemList()
    },
    // 修改定位
    async changeLngLat(lngLat) {
      this.lngLat = lngLat
      this.$forceUpdate()
    },
    // 获取当前定位并设置自己的位置
    async location() {
      getLocation(res => {
        const longitude = 113.77855
        const latitude = 34.759108
        const lngLat = [longitude, latitude]
        this.changeLngLat(lngLat)
      })
    },
    changePoint(val) {
      this.currentPoint = val
      this.showModal = true
    },
    btnClick(val) {
      // 淡出
      if (val === 1) {
        this.fadeOutPicker = true
        this.fadeOutSearch = true
        this.fadeInPicker = false
        this.fadeInSearch = false
      }
      // 淡入
      if (val === 2) {
        this.fadeInPicker = true
        this.fadeInSearch = true
        this.fadeOutPicker = false
        this.fadeOutSearch = false
      }
      if (val === 3) {
        console.log('val', this.$refs.map.panBy, this.lngLat)
        // 回到当前位置
        this.$refs.map.panBy(this.lngLat)
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.home-pickers {
  width: 100%;
  position: absolute;
  top: 0;
  z-index: 1000;
}
.home-search {
  width: 100%;
  position: absolute;
  bottom: 0;
  z-index: 999;
}
.fade-out-picker {
  animation: fadeOutPicker 1s ease forwards;
}

@keyframes fadeOutPicker {
  0% {
    opacity: 1;
    transform: translateY(0);
  }
  100% {
    opacity: 0;
    transform: translateY(-100%);
  }
}

.fade-out-search {
  animation: fadeOutSearch 1s ease forwards;
}

@keyframes fadeOutSearch {
  0% {
    opacity: 1;
    transform: translateY(0);
  }
  100% {
    opacity: 0;
    transform: translateY(100%);
  }
}

.fade-in-picker {
  animation: fadeInPicker 1s ease forwards;
}

@keyframes fadeInPicker {
  0% {
    opacity: 0;
    transform: translateY(-100%);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
.fade-in-search {
  animation: fadeInSearch 1s ease forwards;
}

@keyframes fadeInSearch {
  0% {
    opacity: 0;
    transform: translateY(100%);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
</style>

2.2.顶部选择器 - home/@component/pickers/index.vue

<template>
  <div class="pickers">
    <van-dropdown-menu active-color="#2689FF">
      <van-dropdown-item v-model="area" :options="areas" @change="menuChange" />
      <van-dropdown-item v-model="type" :options="types" @change="menuChange" />
      <van-dropdown-item v-model="charge" :options="charges" @change="menuChange" />
    </van-dropdown-menu>
  </div>
</template>
<script>
import { charges, areas } from '@/utils/constant'

export default {
  name: 'HomePickers',
  props: {
    types: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      area: undefined,
      type: undefined,
      charge: undefined,
      areas,
      charges
    }
  },
  created() {},
  methods: {
    // 修改信息
    menuChange() {
      this.$emit('updateInfo', { area: this.area, type: this.type, charge: this.charge })
    }
  }
}
</script>
<style lang="scss">
.pickers {
  .van-dropdown-menu {
    .van-dropdown-menu__bar {
      background: linear-gradient(360deg, #d6fcff 0%, #ffffff 100%);
      box-shadow: 0px 2px 6px 0px rgba(129, 163, 203, 0.15);
    }
    .van-ellipsis {
      font-size: 16px;
      font-weight: 400;
      color: yellow;
      line-height: 22px;
      text-shadow: 0px 2px 12px rgba(100, 101, 102, 0.08);
      background: linear-gradient(307deg, #32b6ff 0%, #3562fe 100%);
      font-family: MaokenZhuyuanTi;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
    }
    .van-dropdown-menu__title::after {
      border-color: transparent transparent #32b6ff #32b6ff;
    }
  }
}
</style>

2.3.底部搜索页 - home/@component/search/index.vue

<template>
  <div class="searches">
    <div class="searches-box">
      <div class="search" @click="onSearch">
        <van-image width="18" height="18" :src="require('@/assets/images/search.png')" />
        <span class="text">搜索</span>
      </div>
      <div class="item">
        <div v-for="it in item" :key="it.value">
          <div class="it" @click="onJump(it)">
            <van-image :src="it.icon" width="50" height="50" />
            <span class="text">{{ it.text }}</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'HomeSearch',
  data() {
    return {
      item: [
        { value: 1, text: '我要去', icon: require('@/assets/images/go.png'), url: '/go' },
        { value: 2, text: '动态资讯', icon: require('@/assets/images/info.png'), url: '/news' },
        { value: 3, text: '疫苗预约', icon: require('@/assets/images/vaccinum.png'), url: '' },
        { value: 4, text: '入驻服务', icon: require('@/assets/images/enter.png'), url: '' }
      ]
    }
  },
  created() {},
  methods: {
    onSearch() {
      this.$router.push({ path: '/search' })
    },
    onJump(item) {
      if (['http', 'https'].includes(item?.path?.split(':')?.[0])) {
        window.open(item.url)
      } else {
        this.$router.push({ path: item?.url })
      }
    }
  }
}
</script>
<style lang="scss">
.searches {
  height: 266px;
  width: 100%;
  background-image: url('~@/assets/images/search-bg.png');
  background-repeat: no-repeat;
  background-size: 100% 100%;
  &-box {
    width: 100%;
    height: 141px;
    margin-top: 125px;
    background: linear-gradient(360deg, #d6fcff 0%, #ffffff 100%);
    box-shadow: 0px 2px 6px 0px rgba(129, 163, 203, 0.15);
    border-radius: 24px 24px 0px 0px;
    .search {
      position: relative;
      top: 8px;
      margin: 0 17px;
      display: flex;
      align-items: center;
      justify-content: center;
      padding: 8px 0;
      background: rgba(67, 191, 243, 0.1);
      border-radius: 18px;
      border: 1px solid #43bff3;
      .text {
        margin-left: 4px;
        font-size: 14px;
        font-weight: 400;
        color: #43bff3;
        line-height: 20px;
      }
    }
    .item {
      position: relative;
      top: 12px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 0 32px;
      .it {
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
        .text {
          font-size: 13px;
          font-weight: 700;
          color: #3562fe;
          line-height: 19px;
          background: linear-gradient(307deg, #32b6ff 0%, #3562fe 100%);
          -webkit-background-clip: text;
          -webkit-text-fill-color: transparent;
        }
      }
    }
  }
}
</style>

2.4.按钮 - home/@component/btns/index.vue

放大,缩小,当前位置定位

<template>
  <div class="btns">
    <van-image
      :src="require('@/assets/images/enlarge.png')"
      width="67"
      height="67"
      @click="btnClick(1)"
      :style="{ display: show ? 'block' : 'none' }"
    />
    <van-image
      :src="require('@/assets/images/lessen.png')"
      width="67"
      height="67"
      @click="btnClick(2)"
      :style="{ display: !show ? 'block' : 'none' }"
    />
    <van-image :src="require('@/assets/images/focus.png')" width="67" height="67" @click="btnClick(3)" />
  </div>
</template>
<script>
export default {
  name: 'HomeBtns',
  data() {
    return {
      show: true
    }
  },
  methods: {
    btnClick(val) {
      if (val === 1 || val === 2) {
        this.show = !this.show
      }
      this.$emit('btn', val)
    }
  }
}
</script>
<style lang="scss">
.btns {
  position: absolute;
  bottom: 212px;
  z-index: 1100;
  right: 10px;
  display: flex;
  flex-direction: column;
}
</style>

2.5.home/@component/modal/index.vue

点击地图撒点目标点位弹框展示

<template>
  <div class="modal">
    <van-overlay :show="true" class="overlay" @click="showModal">
      <div class="wrapper" @click="showModal">
        <div class="content">
          <div class="img"><van-image width="287" height="161" :src="item.url" /></div>
          <div :class="{ text: true, name: true }">{{ item.name }}</div>
          <div :class="{ text: true, intro: true }">{{ item.intro }}</div>
          <div class="btn">
            <div class="bg" @click.stop="onCall(item.phone)">打电话</div>
            <div class="bg" @click.stop="onMap(_, { ...item, lng: 30, lat: 113, siteName: '郑州东站' })">去这里</div>
          </div>
        </div>
      </div>
    </van-overlay>
  </div>
</template>
<script>
import { onCall, onMap } from '@/utils/index'
export default {
  name: 'HomeModal',
  props: {
    item: {
      type: Object,
      default: () => ({ url: '' })
    }
  },
  data() {
    return { onCall, onMap }
  },
  methods: {
    showModal(val) {
      this.$emit('changeShow')
    }
  }
}
</script>
<style lang="scss">
.modal {
  .overlay {
    z-index: 1999;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .wrapper {
    width: 389px;
    height: 457px;
    background: url('~@/assets/images/modal_bg.png') -12px center / auto 100% no-repeat;
    .content {
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
      margin-top: 133px;
      .img {
        background: #d8d8d8;
        border-radius: 8px;
        overflow: hidden;
      }
      .text {
        font-family: PingFangSC-Medium, PingFang SC;
        max-width: 263px;
      }
      .name {
        font-size: 16px;
        font-weight: 500;
        color: #323233;
        line-height: 22px;
        margin: 12px 0 8px 0;
      }
      .intro {
        font-size: 14px;
        font-weight: 400;
        color: #969799;
        line-height: 20px;
        text-overflow: ellipsis;
        overflow: hidden;
        display: -webkit-box; /* 将此元素作为弹性伸缩盒模型展示 */
        -webkit-line-clamp: 2; /* 块级元素显示文本行数 */
        -webkit-box-orient: vertical; /* 设置或检索弹性伸缩盒子对象子元素的排列方式 */
        word-break: break-all; /* 文本存在英文单词时进行换行拆分 */
      }
      .btn {
        display: flex;
        justify-content: space-between;
        align-items: center;
        .bg {
          display: flex;
          justify-content: center;
          align-items: center;
          width: 154px;
          height: 61px;
          background: url('~@/assets/images/btn_bg.png') center center / auto 100% no-repeat;
          font-size: 16px;
          font-family: KingnamBobo-Bold, KingnamBobo;
          font-weight: bold;
          color: #ffffff;
          line-height: 25px;
          text-shadow: 0px 2px 4px rgba(101, 191, 255, 0.3), 0px 2px 2px rgba(18, 68, 221, 0.52);
        }
      }
    }
  }
}
</style>

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

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

相关文章

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

基于单片机的自动感应门设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、自动感应门设计的功能概述二、系统总体方案2.1系统的总体计划2.2元器件的介绍2.2.1单片机的…

【程序员日记】一行console.log引发的血案

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 艰难的排查过程1. 程序闪退2. 确定为内存泄漏3. 误入歧途4. 二分法注释代码5. 猿脑猜想 2️⃣ 排查procexp.exePerformance 和 Memory 3️⃣ 剔除生产环境中的console.logwebpack插件terser-webpack-plugin &#x1f6ec; 文章…

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网&#xff1a;电信网络、有线电视网络、计算机网络 概念&#xff1a;把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义&#xff1a;计算机网络是将地理位置不同的独立计算机系统&#xff0c;通过传输介质链接起来&#xff0c…

7-4 修理牧场 分数 15

#include<iostream> #include<queue> using namespace std; #define maxn 10005int main() {int n 0, data 0;cin >> n;//建小堆: //上调建堆中用greater: 父大子小 父子交换 小的上去 大的下去 priority_queue<int, vector<int>, greater<int…

vue+asp.net Web api前后端分离项目发布部署

一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本&#xff1a;vue/cli 5.0.8 编译器版本&#xff1a;vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本&#xff1a;.NET 6.0 编译器版本&#xff1a;vs 2022 二、发布部署步骤 第…

静态链表的定义与实现(数据结构与算法)

1. 静态链表 用数组的方式实现的链表 单链表&#xff1a; 各个结点在内存中星罗棋布、散落天涯 静态链表&#xff1a;分配一整片连续的内存空间&#xff0c; 各个结点集中安置。 1.1 静态链表的优点 不需要像动态链表那样频繁地进行内存分配和释放&#xff0c;可以节省内存…

缺陷之灵魂操作bug

一、前言 正常来说&#xff0c;我们在测试缺陷的时候都是按照case来测试的&#xff0c;但是有些场景&#xff0c;例如说发散思维这种场景&#xff0c;就会找到一些比较不太正常、不好复现的缺陷&#xff0c;然后如果要辅助研发修复&#xff0c;就会极为痛苦。 二、场景描述 大…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…

掌控你的Mac性能:System Dashboard Pro,一款专业的系统监视器

作为Mac用户&#xff0c;你是否曾经想要更好地了解你的电脑性能&#xff0c;以便优化其运行&#xff1f;是否想要实时监控系统状态&#xff0c;以便及时发现并解决问题&#xff1f;如果你有这样的需求&#xff0c;那么System Dashboard Pro就是你的不二之选。 System Dashboar…

sitespeedio.io 前端页面监控安装部署接入influxdb 到grafana

1.docker部署influxdb,部署1.8一下&#xff0c;不然语法有变化后面用不了grafana模板 docker run -d -p 8086:8086 --name influxdb -v $PWD/influxdb-data:/var/lib/influxdb influxdb:1.7.11-alpine docker exec -it influxdb_id bash #influx create user admin with pass…

JavaScript从入门到精通系列第二十九篇:正则表达式初体验

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

modesim verilog仿真验证基本流程(新建工程方式)

文章目录 环境搭建一、在modelsim里创建一个新的工程二、新建verilog设计文件及仿真激励文件三、仿真结果本文演示如何使用modelsim新建工程进行功能仿真。 环境搭建 本文中采用的modelsim版本如下: modelsim altera 10.3d一、在modelsim里创建一个新的工程 打开modelsim软…

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

学习经验分享【NO.18】YOLOv5可视化特征图教程(持续更新)

YOLOv5项目的6.0以上版本中的detect.pt中集成了可视化相关模块&#xff0c;直接调用即可。 一、可视化特征提取网络中所有模块的可视化图 添加形参如下所示&#xff0c;加载相应的权值文件后&#xff0c;选择相应的图片。 运行detect.py文件后得到如下所示&#xff1a; 以stag…

stm32 DMA

目录 简介 框图 DMA请求 DMA通道 DMA优先级 DMA 数据 外设到存储器 存储器到外设 存储器到存储器 传多少&#xff0c;单位是什么 传输完成 hal库代码 标准库代码 简介 CPU根据代码内容执行指令&#xff0c;这些众多指令中&#xff0c;有的用于计算、有的用于控制程…

汽车标定技术(一):XCP概述

目录 1.汽车标定概述 2.XCP协议由来及版本介绍 3.XCP技术通览 3.1 XCP上下机通信模型 3.2 XCP指令集 3.2.1 XCP帧结构定义 3.2.2 标准指令集 3.2.3 标定指令集 3.2.4 页切换指令集 3.2.5 数据采集指令集 3.2.6 刷写指令集 3.3 ECU描述文件(A2L)概述 3.3.1 标定上位…

python把Word题库转成Excle题库

又到了一年一度的背题时刻&#xff0c;但是收到的题库是Word版的&#xff0c;页数特别多 话不多说&#xff0c;上代码&#xff0c;有图有真相&#xff0c;代码里面备注的很详细 # 导入所需库 import csv import os import refrom docx import Document from win32com import c…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录&#xff0c;在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 &#xff0c;添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。