Vue3引入高德地图js API 2.0

news2024/9/20 12:40:10

文章目录

  • 前言
  • 一、地图加载
    • 1.本文准备环境
    • 2.引入库
    • 3.加载地图
    • 4.加载地图控件
  • 二、POI搜索
    • 1.什么是poi搜索
    • 2.如何使用
  • 三、绘制点标记与信息窗体
    • 1.场景描述
    • 2.案例
    • 3.信息窗体-链接路由跳转
    • 4.进阶-通过Marker自动触发标记点(非鼠标手动点击)
  • 四、jsApi地图事件
    • 1.官方解释
    • 2.用法


前言

本文主要由地图加载、POI检索、绘制点标记、信息窗体、信息窗体中链接的路由跳转、相关事件的使用几部分组成。
目前网上关于高德js API的文章大多数是vue2.0版本的,这篇文章是基于vue3.0的,我的写法不一定是主流写法,如果有更好的写法,请评论中指正,感谢🙏🙏🙏


一、地图加载

1.本文准备环境

  • node 和 git - 项目开发环境
  • pnpm - 速度快、节省磁盘空间的软件包管理器
  • Vite
  • Vue3
  • TypeScript
  • Es6+
  • Vue-Route
  • 高德开发者-获取key和安全密钥
  • 高德JSApi手册
  • 高德JSApi教程
  • 高德JSApi示例

2.引入库

代码如下(示例):

npm i @amap/amap-jsapi-loader --save

3.加载地图

<!-- 创建地图容器,js api会根据id将地图加载到容器中 -->
<!-- 注意:需要设置地图容器的大小 -->
<template>
  <div id="container"></div>
</template>
<component :is="'script'" type="text/javascript">
	<!-- 使用明文设置安全密钥(不安全),https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode  -->
    window._AMapSecurityConfig = {securityJsCode: '准备环境阶段拿到的的安全密钥'}
</component>

<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>
	// 引入jsApi 地图Loader
	import AMapLoader from '@amap/amap-jsapi-loader';
	
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", // 申请好的Web端开发者Key,首次调用 load 时必填
	    version: "2.0", // 指定要加载的 JSAPI 的版本
        plugins: ["AMap.Scale", "AMap.ToolBar"], //(按需引用,pc端建议加入AMap.ToolBar,便于操作)需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['...','...']
  	  })
    .then((AMap) => {
      // 加载地图到id为container的容器中
      map = new AMap.Map("container", {
        viewMode: "2D", // 设置地图视图类型,2D / 3D
        zoom: 11, // 初始化地图级别
        center: [116.397428, 39.90923], // 初始化地图中心点位置
      });
    })
    .catch((e) => {
      console.log(e);
    });
});

onUnmounted(() => {
  map?.destroy();
});
</script>

<style  scoped>
	// 设置地图容器的大小
    #container{
        padding:0px;
        margin: 0px;
        width: 100%;
        height: 800px;
    }
</style>

4.加载地图控件

<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>
	// ··· 相关代码已省略
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", 
	    version: "2.0",
        plugins: ["AMap.Scale", "AMap.ToolBar"], //(按需引用,pc端建议加入AMap.ToolBar,便于操作)需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['...','...']
  	  })
	    .then((AMap) => {
	      // 加载地图到id为container的容器中
	      map = new AMap.Map("container", {
	        viewMode: "2D", // 设置地图视图类型,2D / 3D
	        zoom: 11, // 初始化地图级别
	        center: [116.397428, 39.90923], // 初始化地图中心点位置
	      });
	
		  // 地图加载后,可以加载地图控件。
		  // 如:创建工具条插件实例。需要在AMapLoader.plugins中引入控件,并map.addControl添加到地图中
	      var toolbar = new AMap.ToolBar();
	      map.addControl(toolbar);
	    })
	    .catch((e) => {
	      console.log(e);
	    });
	});
	
	onUnmounted(() => {
	  // 页面关闭后及时销毁资源
	  map?.destroy();
	});
</script>


二、POI搜索

1.什么是poi搜索

poi检索是高德的地理信息查询服务,即通过关键字获取目标地理信息(如坐标,城市信息等)。其中包含输入提示插件AMap.AutoComplete和POI 搜索插件 AMap.PlaceSearch,如图显示,右上角通过JAC获取多个地点提示信息即输入提示插件,选择匹配信息后,POI 搜索插件会返回多个相关的地理信息,并在地图上添加标记点。
在这里插入图片描述

2.如何使用

<template>
  <div id="container"></div>
  <div style="position: absolute; top: 20px; left: 20px">
  	<!-- 用来触发输入提示插件的容器 -->
    <input type="text" id="keyword" style="width: 300px; height: 32px; padding-left: 10px" placeholder="请输入地址" />
  </div>
</template>
<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>
	// ··· 相关代码已省略
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", 
	    version: "2.0",
  	  })
	    .then((AMap) => {
	      // ···
	      // map = ···
	      // 输入提示, 
	        var autoOptions = {
	          // 可选参数,你的搜索输入框dom的id(多数场景下只需要这一个参数即可)
	          input: 'keyword',
	          // 可选参数,你的搜索输出框dom的id,用来展示提示的结果(默认的只有图里的文字,如果需要图片等,需要指定output)
	          output: 'your_out_put_id',
	          // 是否强制指定城市,设定city后有效
	          citylimit: false,
	          // 输入提示时限定城市。可选值:城市名(中文或中文全拼)、citycode、adcode;默认值:“全国”
	          city: '北京',
	          // 默认为true,表示是否在input位于页面较下方的时候自动将输入面板显示在input上方以避免被遮挡
	          outPutDirAuto:true,
	          // ···其他参数请翻阅文档
	        };
	
	        AMap.plugin(['AMap.PlaceSearch', 'AMap.AutoComplete'], function () {
	          //无需再手动执行 search 方法,autoComplete 会根据传 input 对应的 DOM 动态触发 search
	          var autoComplete = new AMap.AutoComplete(autoOptions);
	          
	          var placeSearch = new AMap.PlaceSearch({
	            map: map,
	            type: '', // 数据类别
	            pageIndex: 1,
	            pageSize: 10,
	          });
	
	          // 注册监听,当选中某条记录时会触发
	          autoComplete.on('select', select);
	
	          function select(e) {
	          	// 获取到检索提示信息后,根据提示信息搜索精确地理位置
	          	// 设置查询城市(防止查提示信息所在城市之外的城市)
	            placeSearch.setCity(e.poi.adcode);
	            // 检索地理信息
	            placeSearch.search(e.poi.name, function (status, result) {
	              // 获取查询到的结果
	              if (status == 'complete' ){
	              	// 精确地理信息为多条,placeSearch会将地理位置全部添加为地图Marker,如果需要触发点击时获取指定Marker的地理信息,可以添加markerClick事件
	              	console.log(result.poiList.pois);
				
	                placeSearch.on('markerClick', function(e) {
	                  // e.data中即为poi信息(=result.poiList.pois[i])
	                  console.log(e.data)
	                  // 当前点击的地图的marker
	                  console.log(e.marker)
	                })
	              }
	            });
	          }
	        });
	    })
	    .catch((e) => {
	      console.log(e);
	    });
	});
	
	onUnmounted(() => {
	  // 页面关闭后及时销毁资源
	  map?.destroy();
	});
</script>

一些进阶功能:如指定区域内搜索,指定圆范围搜索,请翻阅高德JSApi教程


三、绘制点标记与信息窗体

1.场景描述

如需要在地图上展示营业网点位置,查看所有设备的定位位置等,需要根据定位物件的坐标,在地图上添加一个标记。
仅有标记仅仅只能看到所在位置,但是用户是看不到具体这个位置是哪个营业网点(或哪个设备),则需要添加信息窗体来展示当前定位的相关信息。
在这里插入图片描述

2.案例

注意:绘制点标记与信息窗体都需要指定锚点,具体锚点设置请翻阅高德JSApi教程

<template>
  <div id="container"></div>
</template>
<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>
	// ··· 相关代码已省略
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", 
	    version: "2.0",
  	  })
	    .then((AMap) => {
	      // ···
	      // map = ···
	      // 通过mock数据or后端接口获取到的地理位置信息(如营业网点信息,设备定位信息)
	      const mapInfos = await getMapIfo();
	
		  // 信息窗体
	      var infoWindow = new AMap.InfoWindow({
	        anchor: 'bottom-center', // 信息窗体锚点
	        offset: new AMap.Pixel(0, -32), //设置点标记偏移量(设置锚点)
	        // 点击地图关闭
	        closeWhenClickMap: true,
	        // 是否自定义窗体(默认窗体即示例图中效果,底色与边框样式是固定的)
	        isCustom: false,
	      });
	
		  // 通用 icon(即示例图中Marker红色的样式)
	      const icon = new AMap.Icon({
	        size: new AMap.Size(25, 34), //图标尺寸
	        image: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png', //Icon 的图像
	        imageSize: new AMap.Size(25, 34), //根据所设置的大小拉伸或压缩图片
	      });
	
		  // 编辑mapInfos,绘制点标记
	      mapInfos.forEach((mapInfo) => {
	      	// 拿不到完整的坐标信息,则不绘制
	      	if (mapInfo.lng == 0 && mapInfo.lat == 0) {
	      		return;
	        }
	
			// 创建点标记对象
	        const marker = new AMap.Marker({
	          position: new AMap.LngLat(mapInfo.lng, mapInfo.lat), //经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
	          icon: icon,
	          offset: new AMap.Pixel(-12.5, -34), //设置点标记偏移量(锚点)
	        });
	
			// 给点标记添加点击事件,点击Marker打开信息窗体
	        marker.on('click', function (e) {
	          // 点击时获取逆地理编码(由于后端/Mock中拿到的数据为lnglat坐标,用户更想看到的是具体地理位置信息,所以每次点击的时候获取逆地理编码)
	          AMap.plugin('AMap.Geocoder', async function () {
	          
	              var geocoder = new AMap.Geocoder();
	
	              var lnglat = [mapInfo.lng, mapInfo.lat];
	
	              await geocoder.getAddress(lnglat, function (status, result) {
	                let region = '';
	                if (status === 'complete' && result.info === 'OK') {
	                  // result为对应的地理位置详细信息
	                  region = result.regeocode.formattedAddress;
	                }
	
					//实例化信息窗体
					const content =
	              	`<div style="width: 500px;height: 130px;display: flex;justify-content:space-between;align-items:center;">` +
	              		region +
	              	`</div>`;
	
					// 设置信息窗体的内容(dom)
	                infoWindow.setContent(content);
	                // 展示面板,将相关的信息加载到面板中
	                infoWindow.open(map, [mapInfo.lng, mapInfo.lat]);
	              });
	            });
	          });
			 
			  // 把marker加载到map中
	          map.add(marker);
	        });
	    })
	    .catch((e) => {
	      console.log(e);
	    });
	});
	
	onUnmounted(() => {
	  // 页面关闭后及时销毁资源
	  map?.destroy();
	});
</script>

3.信息窗体-链接路由跳转

上节案例中,可见content的写法是没办法使用vue路由的,vue2.0时还可以使用Vue.extend()去实现,但是vue3.0移除了这个方法,所以考虑在template中写好这个窗体,并加载到marker中,上案例:

<template>
  <div id="container"></div>
	
  <!-- vue渲染的自定义信息窗体,可以用到vue的特性 -->
  <div ref="content" style="padding-bottom: 8px">
	  <div style="padding: 10px 10px 10px 10px;background: #fff;position: relative;line-height: 1.4;">
	    <div style="width: 500px;height: 130px;display: flex;align-items:center;">
	      {{contentParam.region}} <a v-if="contentParam.detailNo != ''" @click="toDetail(contentParam.detailNo)" >查看详情</a>-->
	    </div>
	    <div class="amap-info-sharp">
	    </div>
	  </div>
  </div>
</template>
<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>

	// 获取当前组件的实例对象
	const {proxy} = getCurrentInstance();

	const contentParam = reactive({
	    region: '',
  	})
	
	// ··· 相关代码已省略
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", 
	    version: "2.0",
  	  })
	    .then((AMap) => {
	      // ···
	      // map = ···
	      
	      // 信息窗体
	      var infoWindow = new AMap.InfoWindow({
	        offset: new AMap.Pixel(0, -32), //设置点标记偏移量
	        // 点击地图关闭
	        closeWhenClickMap: true,
	        // 当前例子中,重新设计了info窗体,去掉了官方默认窗体的关闭按钮,所以需要开启自定义窗体
	        isCustom: true,
	      });
	        
	      // mapInfos.forEach((mapInfo)
	      // const marker = ···
	      // 将页面当前组件实例中ref='content'的实例绑定到marker.content
	      marker.content = proxy.$refs.content;
	
		  marker.on('click', function (e) {
	            // 点击时获取逆地理编码
	            AMap.plugin('AMap.Geocoder', async function () {
	
	              // 信息框加载出来
	              var geocoder = new AMap.Geocoder();
	
	              var lnglat = [equipmentInfo.lng, equipmentInfo.lat];
	
	              await geocoder.getAddress(lnglat, function (status, result) {
	                let region = '';
	                if (status === 'complete' && result.info === 'OK') {
	                  // result为对应的地理位置详细信息
	                  region = result.regeocode.formattedAddress;
	                }
	                contentParam.region = region;
	                contentParam.detailNo = mapInfo.detailNo;
	
					// content信息从marker.content中获取
	                infoWindow.setContent(e.target.content);
	                // 展示面板,将相关的信息加载到面板中
	                infoWindow.open(map, e.target.getPosition());
	              });
	            });
	          });
		  
	    })
	    .catch((e) => {
	      console.log(e);
	    });
	});

	onUnmounted(() => {
	  // 页面关闭后及时销毁资源
	  map?.destroy();
	});

	function toDetail(detailNo) {
	    router.push({ path: '/detail', query: { detailNo: detailNo } });
	}
</script>

<style scoped>
  .amap-info-sharp, .amap-info-sharp:after {
    margin-left: -8px;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
  }

  .amap-info-sharp {
    bottom: 0;
    left: 50%;
    border-top: 8px solid #fff;
  }
</style>

4.进阶-通过Marker自动触发标记点(非鼠标手动点击)

在第三节案例中,实现了点击窗体中的链接,通过路由跳转到其他vue页面。
如果打开页面的时候,携带了某个设备信息(or营业网点),想主动打开对应Marker的信息窗体,该怎么做?
以下为实现案例:

<template>
  <div id="container"></div>
	
  <!-- 假设场景为:地图展示的营业点/设备 想要可以通过下拉选直接搜索到,并打开他的信息窗体 -->
  <!-- 场景是基于第三节案例中的代码,第三节中的代码以···省略 -->
  <n-select :options="options" @update-value="selectDetail"/>
</template>
<!-- 本文中使用script-setup,非setup需要自行替换写法 -->
<script lang="ts" setup>

	const options = ref([]);
	
	// ··· 相关代码已省略
	let map = null;
	onMounted(() => {
	  AMapLoader.load({
	    key: "", 
	    version: "2.0",
  	  })
	    .then((AMap) => {
	      // ···
	      // map = ···
	      
	      mapInfos.forEach((mapInfo) => {
	      	// 拿不到完整的坐标信息,则不绘制
	      	if (mapInfo.lng == 0 && mapInfo.lat == 0) {
	      		return;
	        }
	
			// 创建点标记对象
	        // const marker = ···
			 
			// 把marker加载到map中
			options.value.push({ label: mapInfo.detailNo, value: marker });
			  
	        map.add(marker);
	      });
	    })
	    .catch((e) => {
	      console.log(e);
	    });
	});

	onUnmounted(() => {
	  // 页面关闭后及时销毁资源
	  map?.destroy();
	});

	function selectDetail(marker) {
	    if(marker) {
	      // 主动触发marker的click事件
	      marker.emit('click',{
	        target: marker
	      });
	    }
	}
</script>

<style scoped>
  .amap-info-sharp, .amap-info-sharp:after {
    margin-left: -8px;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
  }

  .amap-info-sharp {
    bottom: 0;
    left: 50%;
    border-top: 8px solid #fff;
  }
</style>


四、jsApi地图事件

1.官方解释

jsApi地图事件是对Map底图操作后触发的事件,事件回调中返回MapsEvent对象。该对象包含触发的对象目标、触发所在经纬度等信息。

2.用法

<script>
	// 在 2.0 版本中所有类型的实例均使用 on/off 方法进行事件的绑定和移除
	// 给地图绑定click事件
	map.on("click", function (ev) {
	  //触发事件的对象
	  var target = ev.target;
	  //触发事件的地理坐标,AMap.LngLat 类型
	  var lnglat = ev.lnglat;
	  //触发事件的像素坐标,AMap.Pixel 类型
	  var pixel = ev.pixel;
	  //触发事件类型
	  var type = ev.type;
	});
</script>

高德地图大部分实例都拥有不少事件,如前三章中用到了以下三种事件,来丰富我们的业务,让地图操作更合理。

<script>
	// poi输入提示插件绑定select事件,选中某项提示后触发的事件
	autoComplete.on('select', function(e) {});

	// poi搜索插件绑定markerClick事件,点击地图中placeSearch生成的Marker触发的事件
	placeSearch.on('markerClick', function(e) {});
	
	// 为绘制的点标记绑定click事件,点击点标志触发的事件(我们用来打开信息窗体)
	marker.on('click', function(e) {});
</script>

而有一些特殊的场景下,可能需要我们主动触发事件,则需要用到emit函数。如上章末位,主动触发Marker的click事件,来模拟点击Marker。

<script>
	// 第一个参数为事件的类型, 第二个参数为事件回调时返回的数据
	// 比如案例中要主动触发主动触发Marker的click事件,第一个参数即为click,第二个参数为marker本身,用来获取绑定在marker上的content的
	marker.emit('click',{target: marker});
	
	// 回顾一下marker的click事件的内容
	marker.content = proxy.$refs.content;
	
	marker.on('click', function (e) {
	  // ···
	  
	  // 这里,e.target即对应第二个参数的target
	  infoWindow.setContent(e.target.content);
	  infoWindow.open(map, e.target.getPosition());
	});
	
</script>

高德地图的事件,我们可以从高德JSApi手册中查找。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指挥中心实战指挥平台-通信指挥类装备多链路聚合设备解决方案实例

一、建设目标及要求 坚持“一切为了实战、一切围绕实战、一切服务实战”的总要求&#xff0c;紧紧围绕大数据应用和自动化、智能化、智慧化这一主题主线&#xff0c;建设升级改造支队指挥中心&#xff0c;集成语音、视频、即时消息、短信、对讲、会议等多媒体通信能力&#xf…

AJAX——图片上传

图片上传流程 1.获取图片文件对象 2.使用FormData携带图片文件 3.提交表单数据到服务器&#xff0c;使用图片url网址 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible"…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

LCD彩屏显示方案选型攻略:从接口到GUI开发工具的全面评估

在现代人类社会&#xff0c;彩色显示技术是科技王国里最为绚丽夺目的技术奇葩&#xff0c;LCD彩屏通过显示实时信息并提供交互式的体验&#xff0c;将信息时代打扮得多姿多彩。无论是智能家电还是医疗健康设备领域&#xff0c;精美直观的LCD彩屏显示&#xff0c;往往能够为用户…

学习JFinal

1.五个配置类 configConstants&#xff08;配置&#xff09;&#xff1a; configRoute&#xff08;路由&#xff09;&#xff1a; 2.Controller层&#xff08;控制器&#xff09; 访问流程&#xff1a; Action&#xff1a; getPara&#xff1a; 参数说明&#xff1a;第一个参…

monkey测试详解

一、monkey测试的定义 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样,不知道程序的任何用户交互方面的知识,就对界面进行无目的、乱点乱按…

MATLAB基于图像特征的火灾检测

实验目标 基于图像特征的火灾检测 实验环境 Windows电脑、MATLAB R2020a 实验内容 1.读取图像&#xff0c;彩色图像的灰度化处理&#xff0c;进行边缘检测&#xff0c;实现对火焰的检测。 2.对两幅RGB图像进行火焰特征提取实验 3.对比分析边缘检测算法处理结果和基于图像…

离散型制造行业智能工厂解决方案,助力国家新智产业升级

离散型制造行业智能工厂标准解决方案 离散型制造行业的智能工厂解决方案是推动国家智能制造产业升级的关键。 1. 集中优势资源&#xff1a;实施攻关计划&#xff0c;瞄准关键核心技术和重点产业进行定向突破&#xff0c;特别是在集成电路(IC)、AI、生物医药等领域。2. 国家创…

华为外派伊拉克,一天补助6000元

大家好&#xff0c;我是YUAN哥&#xff01; 最近有朋友询问关于华为外派伊拉克的补助情况&#xff0c;听说一天能拿到6000元&#xff0c;这听起来相当诱人&#xff0c;但真实性有待考证。 据我所知&#xff0c;华为对艰苦地区的外派员工确实有补助&#xff0c;但最高一天是100美…

关于pdf.js中文本坐标尺寸的使用

一个电子教材项目中有这样一个需求&#xff1a; 用户向网站上传一个PDF书籍后&#xff0c;网站可以对PDF书籍进行解析&#xff0c;并支持用户对PDF书籍的每一页做一些操作&#xff0c;比如&#xff1a;为英语课本的单词和句子添加音频热区。因为热区数量很多&#xff0c;所以&a…

C语言进阶课程学习记录- 函数与宏分析

C语言进阶课程学习记录- 函数与宏分析 实验-宏和函数实验-宏的副作用实验-宏的妙用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-宏和函数 #include <stdio.h>#define RESET(p, len) …

详解Mixtral-8x7B背后的MoE!

高端的模型往往只需最朴素的发布方式。 这个来自欧洲的大模型团队在12月8日以一条磁力链接的方式发布了Mixtral-8x7B,这是一种具有开放权重的**「高质量稀疏专家混合模型」**(SMoE)。 该模型在大多数基准测试中都优于Llama2-70B,相比之下推理速度快了6倍,同时在大多数标准基…

Web3 游戏周报(4.14-4.20)

【4.14-20】Web3 游戏行业动态&#xff1a; 前迪士尼老板与漫威、星球大战人才携手推出 Web3 游戏工作室 加密集换式卡牌游戏《Fantasy》在 Blast 主网上线 加密游戏工作室 Avalon 融资 1,000 万美元&#xff0c;Hashed 领投 Faraway 收购 Yuga Labs 旗下两大游戏 IP“HV-MT…

JSON Web Token 入门

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&…

以赛促学、生态共建 | 软通动力子公司鸿湖万联成功举办基于x86架构的OpenHarmony应用生态挑战赛

近日&#xff0c;由开放原子开源基金会、央视网、江苏省工业和信息化厅、无锡市人民政府、江苏软件产业人才发展基金会、苏州工业园区、无锡高新区等共同承办&#xff0c;鸿湖万联参与共建的“基于x86架构的OpenHarmony应用生态挑战赛”决赛路演在无锡圆满落幕。本次挑战赛历时…

贪心(贪婪)算法

主要思想 贪心算法的思想主要可以概括为“总是做出当前看起来最优的选择”&#xff0c;也就是不从整体上进行考虑&#xff0c;所得到的答案是某种意义上的局部最优解&#xff0c;不一定是整体最优解。 贪心算法没有固定算法框架&#xff0c;算法设计的关键是贪心策略的选择。…

统一SQL 支持Oracle CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

以始为终梳理前端的发展方向

嗨&#xff0c;我是小路。一位努力向上生长的90后前端开发工程师。 以下是正文&#xff1a; 前段时间朋友和我吐槽&#xff1a;“做了多年的PHP开发&#xff0c;突然被离职&#xff0c;然后去招聘市场一看&#xff0c;发现PHP已经没有市场了。偶尔会出现一两个相关的职位&#…

AI一键生成的解说短剧,如何导出工程文件到剪映二次编辑?

用鬼手剪辑可以一键生成解说视频 鬼手剪辑的一键生成解说视频是一种快速简便的AI解说工具&#xff0c;可以帮助用户将短视频转换为解说视频。该工具通过语音识别、自然语言处理和视频剪辑等技术&#xff0c;自动生成解说词并完成视频剪辑。 一键生成解说操作教程 一键生成解说…

PCB的层叠结构

有pcb的用处&#xff1a; 是为了防止线乱和占面积 PCB单层板&#xff1a;如果有人触电了&#xff0c;是算设计师没有设计好&#xff0c;还是操作员没有操作好&#xff0c;没有进行责任划分 防止触电&#xff0c;加绿皮 偶数版子&#xff1a;上下冲压对称性更好&#xff0c;不…