【uniapp】Dcloud的uni手机号一键登录,具体实现及踩过的坑,调用uniCloud.getPhoneNumber(),uni.login()等

news2024/12/29 10:34:54

一键登录Dcloud官网请戳这里,感兴趣的可以看看官网,有很详细的示例,选择App一键登录,可以看到一些常用的概述
比如:

1、调用uni.login就能弹出一键登录的页面
2、一键登录的流程,可以选择先预登录uni.prelogin()或直接登录uni.login()
3、要先开通Dcloud一键登录服务,在Dcloud开发者中心登录账户开通一键登录服务,这个需要付费的,每调用一次是0.02元,充值多少是无限制的,够你测试用就行。
4、设置uniCloud云函数,一键登录需要调用uniCloud.getPhoneNumber()
5、HBuilderX 3.4.0及之后的版本上传云函数时如果没有指定使用uni-cloud-verify扩展库的云函数将无法调用uniCloud.getPhoneNumber接口,所以要在云函数的package.json内添加uni-cloud-verify的引用
6、一键登录页面是配置出来的,如何配置,可以看univerifyStyle 数据结构
7、关闭一键登录授权界面,调用uni.closeAuthView()
8、用户点击一键登录自定义按钮
9、一键登录成功后,根据自己的后端接口判断是直接进入app页面还是需要去注册的业务处理

在这里插入图片描述

uni一键登录概述请戳这里

在这里插入图片描述
Uni手机号一键登录,请戳这里

在这里插入图片描述

一键登录具体实现:

首先得有Dcloud账号,申请好应用之后,申请开通一键登录服务,开通一键登录服务详细流程,请戳这里,在左侧选择一键登录,点击基础配置,取ApiKey和ApiSecret的值
在这里插入图片描述
1、mainfest.json中选择App模块配置,勾选一键登录
在这里插入图片描述
2、要实现一键登录,需要借助UniCloud 云函数的 API:uniCloud.getPhoneNumber
创建uniCloud.getPhoneNumber云函数步骤如下

1、在项目根目录uniCloud文件夹下找到 cloudfunctions 文件夹。如果没有该文件夹,可以手动创建
2、在 cloudfunctions 文件夹中创建一个新的文件夹,作为你的云函数的名称,例如 getPhoneNumber。我这里名称是login
3、进入 getPhoneNumber 文件夹,并创建一个 JavaScript 文件,例如 index.js。
4、在 index.js 中编写云函数的代码,具体实现获取手机号码的逻辑。

备注:这段代码在下面引起了一个报错,报错已解决,此段代码不要直接复制,用解决后的代码

exports.main = async (event, context) => {
//登录Dcloud账号,左侧选择一键登录,点击基础配置,取ApiKey和ApiSecret的值
	const res = await uniCloud.getPhoneNumber({
		provider: 'univerify',
		apiKey: '对应的apiKey',
		apiSecret: '对应的apiSecret',
		access_token: event.access_token,
		openid: event.openid
	})

	// 这里需要改成你们自己后端登录成功后的接口地址 ...
	const url = event.serversUrl + '/user/login'

	// md5加密方式:手机号 时间戳 私钥
	const phone = res.phoneNumber
	const timestamp = new Date().getTime()
	const signKey = '对应的signKey '
	const sign = crypto.createHash('md5').update(phone + timestamp + signKey).digest('hex')

	const result = await uniCloud.httpclient.request(url, {
		method: 'POST',
		data: {
			phone,
			timestamp,
			sign
		},
		contentType: 'json',
		dataType: 'json',
		// 是否在证书不受信任时返回错误
		rejectUnauthorized: false
	})
	console.log('服务端返回结果=', result)

	if (result.data.code == 200) {
		return {
			code: 0,
			message: '获取手机号成功',
			data: result.data.data
		}
	} else {
		return {
			code: result.data.code,
			message: result.data.msg,
			data: result.data.data
		}
	}
}

5、在项目根目录的uniCloud文件夹下,在云函数的package.json内添加uni-cloud-verify的引用即可为云函数启用此扩展,无需做其他调整
在这里插入图片描述

{
	"name": "login",
	  "dependencies": {},
	"extensions": {
	"uni-cloud-verify": {} // 启用一键登录扩展,值为空对象即可
	}
}

3、页面中具体使用
关于如何使用,我自己踩了些坑
1、首先一键登录页面类似于一个弹窗,在app刚打开的时候先弹出这个一键登录的页面
如果不想选一键登录,点左上角的叉号,关闭弹窗。
我遇到的第一个坑是,我对一键登录不了解,
我自己按ui图画了一个一键登录的页面,在实现过程中一直很疑惑,如何获得加密的手机号和对应的供应商认证服务来渲染到页面上,误区在于一键登录页面是配置出来的。
既然它是弹窗,关闭之后就得有一个展示的页面,我这里是关闭之后显示的是账号登录页面

2、uniapp介绍中,左侧菜单栏点击uni一键登录
在这里插入图片描述
里面有张流程图,先预登录然后是一键登录

在这里插入图片描述
关于预登录,需要调用 uni.preLogin(), 主要是检查预登录环境
然后紧接着就是调用uni.login(),
这个地方就很疑惑,我一直觉得是点击一键登录按钮才会调用login方法
误区就在于,uni.login()获取用户的登录凭证 code。然后将这个 code 发送给后端服务器,服务器使
用这个凭证进行登录验证,并返回用户的身份信息或生成用户的会话凭证,直白的说就是调用
uni.login()之后才能拿到手机号和对应的供应商认证服务
,一键登录页面上的手机号和对应的供应商认证服务才会显示出来
紧接着是一键登录按钮,当点击按钮的时候会触发uniCloud.callFunction,就是去调用云函数,云函
数返回的参数有用户的完整手机号,拿着这个手机号,去调我们自己后端的接口,根据后端给的标识
判断是放行到主页还是需要用户去注册页

function preLogin(isShowMsg = false) {
		//预登陆检查是否符合一键登录的环境
		uni.preLogin({
			provider: "univerify",
			success: (res) => {
			//调用login方法,我是vue3,没有thi实例,vue2框架this.login()
				login()
			},
			fail(err) {
				// 如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,都有可能造成预登录校验失败。
			
				if (isShowMsg && err.errMsg != "login:ok") {
					// 不同运营商 返回的报错字段不同
					uni.showModal({
						title: "当前设备环境不支持一键登录",
						content:
							err.errMsg ||
							err.metastate.resultMsg ||
							err.metastate.error_data ||
							err.metastate.resultDesc ||
							"请检查是否插入有效sim卡及开启蜂窝数据网络",
						showCancel: false,
					});
				}
				
			},
		});

	}
function login() {
		uni.login({
			provider: 'univerify',
			univerifyStyle: {
				"fullScreen": true, // 是否全屏显示,true表示全屏模式,false表示非全屏模式,默认值为false。
				"backgroundColor": "#ffffff", // 授权页面背景颜色,默认值:#ffffff  
				"icon": {
					"path": "static/images/logo.png",// 自定义显示在授权框中的logo,仅支持本地图片 默认显示App logo   
					"width": "60px",  //图标宽度 默认值:60px
					"height": "60px",//图标高度 默认值:60px,				
				},
				"phoneNum": {
					"color": "#525252",// 手机号文字颜色 默认值:#202020  
					"fontSize": "22",// 手机号字体大小 默认值:18
				},
				"slogan": {
					"color": "#525252", //  slogan 字体颜色 默认值:#8a8b90
					"fontSize": "14"
				},
				"authButton": {
					"normalColor": "#FF9CAE", // 授权按钮正常状态背景颜色 默认值:#3479f5  
					"highlightColor": "#FF9CAE", // 授权按钮按下状态背景颜色 默认值:#2861c5(仅ios支持)  
					"disabledColor": "#73aaf5", // 授权按钮不可点击时背景颜色 默认值:#73aaf5(仅ios支持)  
					"textColor": "#ffffff", // 授权按钮文字颜色 默认值:#ffffff  
					"title": "一键登录/注册" // 授权按钮文案 默认值:“本机号码一键登录”  
				},
				"otherLoginButton": {
					"visible": "true", // 是否显示其他登录按钮,默认值:true  
					"normalColor": "", // 其他登录按钮正常状态背景颜色 默认值:透明 
					"highlightColor": "", // 其他登录按钮按下状态背景颜色 默认值:透明 
					"textColor": "#656565", // 其他登录按钮文字颜色 默认值:#656565  
					"title": "验证码登录", // 其他登录方式按钮文字 默认值:“其他登录方式”  
					"borderColor": "",  //边框颜色 默认值:透明(仅iOS支持)  
					"borderRadius": "0px",// 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
				},
				"privacyTerms": {
					"defaultCheckBoxState": false, // 条款勾选框初始状态 默认值: true
					"uncheckedImage": "", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)   
					"checkedImage": "", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)   
					"checkBoxSize": 12, // 可选 条款勾选框大小,仅android支持
					"textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB  
					"termsColor": "#5496E3", //  协议文字颜色 默认值: #5496E3  
					"prefix": "请阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”  
					"suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”  
					"privacyItems": [  // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效  
						{
							"url": "/pages/privacy/use", // 点击跳转的协议详情页面  
							"title": "《xxx用户注册协议》" //用户注册协议名称  
						},

						{
							"url": "/pages/privacy/privacy", // 点击跳转的协议详情页面  
							"title": "《xx隐私政策》" // 隐私政策名称  
						}
					]

				}

			},
			success: (res) => {
				
				uniCloud.callFunction({
					name: 'login', // 你的云函数名称
					data: {
						access_token: res.authResult
							.access_token, // 客户端一键登录接口返回的access_token
						openid: res.authResult.openid // 客户端一键登录接口返回的openid
					}
				}).then(dataRes => {
					console.log('云函数返回的参数', dataRes)
					data.form.mobile = dataRes.result.data.phoneNumber
					$Api.post("user/direct",data.form).then((res) => {
						console.log(res,'调后端接口判断登录后操作');
						if(res&&res.code==0){
						if(res.id){
                    	uni.switchTab({
					 url: "/pages/square/square",
				});
                       }else{
                       uni.navigateTo({
								url: "/pages/user/register?mobile=" + data.form.mobile,
							});
                                       }
                                     }
					});
					
				}).catch(err => {
					console.log('云函数报错', err)
				})
				uni.showToast({
					title: res.authResult,
					icon: "none"
				})
				uni.closeAuthView() //关闭一键登录弹出窗口
			},
			fail(res) { // 登录失败			
				uni.closeAuthView() //关闭一键登录弹出窗口
				console.log('失败')
			},
		})
	}

3、当uni.login()调用成功之后,一键登录页面就出现了,然后就是调整样式,大框架是没法改变的,只能调整一些类似于字体大小,颜色之类的,如何调整icon和phoneNumber之间的间距,我一直没有实现,有实现的可以给我留言,感谢感谢

通过univerifyStyle 配置,官网是这样的,我自己的配置看上面的代码

{  
    "fullScreen": false, // 是否全屏显示,默认值: false
    "backgroundColor": "#ffffff",  // 授权页面背景颜色,默认值:#ffffff
    "backgroundImage": "", // 全屏显示的背景图片,默认值:"" (仅支持本地图片,只有全屏显示时支持)  
    "icon": {  
        "path": "static/xxx.png", // 自定义显示在授权框中的logo,仅支持本地图片 默认显示App logo
        "width":  "60px",  //图标宽度 默认值:60px
        "height": "60px"   //图标高度 默认值:60px
    },  
    "closeIcon": {  
        "path": "static/xxx.png" // 自定义关闭按钮,仅支持本地图片。 HBuilderX3.3.7+版本支持
    },  
    "phoneNum": {  
        "color": "#202020"  // 手机号文字颜色 默认值:#202020  
    },  
    "slogan": {  
        "color": "#BBBBBB"  //  slogan 字体颜色 默认值:#BBBBBB  
    },  
    "authButton": {  
        "normalColor": "#3479f5", // 授权按钮正常状态背景颜色 默认值:#3479f5  
        "highlightColor": "#2861c5",  // 授权按钮按下状态背景颜色 默认值:#2861c5(仅ios支持)  
        "disabledColor": "#73aaf5",  // 授权按钮不可点击时背景颜色 默认值:#73aaf5(仅ios支持)  
        "textColor": "#ffffff",  // 授权按钮文字颜色 默认值:#ffffff  
        "title": "本机号码一键登录", // 授权按钮文案 默认值:“本机号码一键登录”  
        "borderRadius": "24px"	// 授权按钮圆角 默认值:"24px" (按钮高度的一半)
    },  
    "otherLoginButton": {  
        "visible": true, // 是否显示其他登录按钮,默认值:true  
        "normalColor": "", // 其他登录按钮正常状态背景颜色 默认值:透明 
        "highlightColor": "", // 其他登录按钮按下状态背景颜色 默认值:透明 
        "textColor": "#656565", // 其他登录按钮文字颜色 默认值:#656565  
        "title": "其他登录方式", // 其他登录方式按钮文字 默认值:“其他登录方式”  
        "borderColor": "",  //边框颜色 默认值:透明(仅iOS支持)  
        "borderRadius": "0px" // 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
    },  
    "privacyTerms": {  
        "defaultCheckBoxState":true, // 条款勾选框初始状态 默认值: true
        "isCenterHint":false, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
        "uncheckedImage":"", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)   
        "checkedImage":"", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)   
        "checkBoxSize":12, // 可选 条款勾选框大小
        "textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB  
        "termsColor": "#5496E3", //  协议文字颜色 默认值: #5496E3  
        "prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”  
        "suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”  
        "privacyItems": [  // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效  
            {  
                "url": "https://", // 点击跳转的协议详情页面  
                "title": "用户服务协议" // 协议名称  
            }  
        ]  
    },
    "buttons": {  // 自定义页面下方按钮仅全屏模式生效(3.1.14+ 版本支持)
        "iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值:45px
        "list": [
            {
                "provider": "apple",
                "iconPath": "/static/apple.png" // 图标路径仅支持本地图片
            }, 
            {
                "provider": "weixin",
                "iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
            }
        ]
    }
}

这里遇到一个报错,云函数中这个接口的前缀是underfiend,导致找不到,云函数index.js中的代码之前是其他人写的,我打印之后才发现,event只返回两个参数,access_token和openid,没有event.serversUrl这个参数,所以导致显示的是undefined
在这里插入图片描述
代码改为:

exports.main = async (event, context) => {
//登录Dcloud账号,左侧选择一键登录,点击基础配置,取ApiKey和ApiSecret的值
	const res = await uniCloud.getPhoneNumber({
	appid: '_xxxxA3', // 替换成自己开通一键登录的应用的DCloud appid
		provider: 'univerify',
		apiKey: '对应的apiKey',
		apiSecret: '对应的apiSecret',
		access_token: event.access_token,
		openid: event.openid
	})
return {
			code: 0,
			message: '获取手机号成功',
			data:res
		}

}

然后调用成功后会返回这样的数据格式

在这里插入图片描述
我们需要的就是完整的手机号
在这里插入图片描述
在自己的页面中调用uni.login,uniCloud.callFunction({}).then((dataRes=>{
console.log(‘云函数返回的参数’, dataRes)
})),打印之后就能拿到:

{
    "result": {
        "code": 0,
        "message": "获取手机号成功",
        "data": {
            "code": 0,
            "success": true,
            "phoneNumber": "1510000xxxx"
        }
    }
}

再说个小细节点,如果你想在云函数中打印看结果的话,一定要右击云函数选择上传部署,不然的话云函数不会更新,我就是自己傻傻的等着看结果,试了好几次才反应过来
在这里插入图片描述
欢迎留言沟通或私信沟通~~~~

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

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

相关文章

mybatis学习记录(四)-----MyBatis核心配置文件详解

目录 MyBatis核心配置文件详解 4.1 environment 4.2 transactionManager 4.3 dataSource 4.4 properties 4.5 mapper MyBatis核心配置文件详解 mybatis-config.xml : <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUB…

安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…

高云FPGA系列教程(6):ARM定时器使用

文章目录 [toc]1. ARM定时器简介2. FPGA配置3. 常用函数4. MCU程序设计5. 工程下载 本文是高云FPGA系列教程的第6篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器定时器外设的使用&#xff0c;演示定时器溢出中断的配置方法&#xff0c;基于TangNano 4K开发板。 参考文档&a…

虚拟机(VM)监控工具

什么是虚拟机&#xff08;VM&#xff09;监控 虚拟机监控是监视在虚拟化环境中创建的各个虚拟机和 VM 的过程&#xff0c;使用虚拟机监控软件&#xff0c;您可以查看可用性状态、性能统计信息并管理连接到主机的虚拟机及其相应的来宾虚拟机。 虚拟机监控有什么作用 在主机上…

Python:函数和代码复用

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 1、关于递归函…

通义千问杀疯了!首发Qwen-VL-Chat模型的A卡本地部署教程

阿里云最新开源的通义千问视觉语言模型&#xff1a;Qwen-VL Qwen-VL 是一款支持中英文等多种语言的视觉语言&#xff08;Vision Language&#xff0c;VL&#xff09;模型&#xff0c;相较于此前的 VL 模型&#xff0c;其除了具备基本的图文识别、描述、问答及对话能力之外&…

明星翻包视频的崛起:探究背后的驱动力

近年来&#xff0c;社交媒体上涌现出越来越多的明星翻包视频&#xff0c;成为广大粉丝和观众们的追捧对象。这个趋势的背后是什么原因&#xff1f;为什么现今的明星都热衷于分享自己的私人物品和生活片段&#xff1f; 在明星翻包视频的制作和推广过程中&#xff0c;媒介易作为专…

【CSP认证考试】202303-1:田地丈量解题思路+代码

问题描述 西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域&#xff0c;由左下角坐标 (x1,y1) 和右上角坐标 (x2,y2) 唯一确定&#xff0c;且满足 x1<x2、y1<y2。这 n 块田地中&#xff0c;任意两块的交集面积均为 0&#xff0c;仅边界处可能…

vcruntime140.dll文件下载安装方法以及一些注意事项

其实vcruntime140.dll文件是Microsoft Visual C Redistributable Packages for Visual Studio 2015中的一个重要组件。它包含了Windows操作系统和其他应用程序所需的函数和资源&#xff0c;以确保它们能够正常运行。本文将为你介绍vcruntime140.dll文件的下载、使用以及解决常见…

java boolean占用内存是多少

一&#xff0c;结论 关于boolean占用内存是多少&#xff0c;我在JVM规范中找到以下解释&#xff0c;但是怎么验证呢&#xff1f; 虚拟机没有给boolean(布尔)类型设置单独指令。boolean型的数据是有integer指令&#xff0c;包括interger返回来处理的。boolean型数组则是用byte…

嵌入式开发会成为下一个Java吗?

今日话题&#xff0c;嵌入式开发会成为下一个Java吗&#xff1f;答案是否定的。嵌入式开发岗位通常属于制造业&#xff0c;特别是电器、机械、装备、航空航天等“智能制造”领域&#xff0c;属于重资产行业&#xff0c;相对稳定&#xff0c;不像互联网那样灵活。如果你有兴趣进…

FastDFS修改文件存储目录

修改下面文件&#xff0c;相关参数为1&#xff0c;则最终只保留1个目录&#xff0c;目录为00/00。 vi /etc/fdfs/storage.conf vi /storage.conf vi /fastdfs-5.11/conf/storage.conf

【Java|golang】337. 打家劫舍 III---树上最大独立集

详细视频: link 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 &#xff0c;房屋将自动报警。 给定二叉树的 roo…

在线文件二维码制作技巧,支持多种文件格式

怎么把一个文件放到二维码中呢&#xff1f;在日常工作中&#xff0c;使用办公文件多以word、excel、ppt等格式的文件为主&#xff0c;那么怎么把这些格式的文件生成二维码使用是很多小伙伴关注的一个问题。那么就让小编来给大家分享一招&#xff0c;通过浏览器来在线制作二维码…

上传项目到github上

在github上先创建一个空仓库 在github上新建一个仓库&#xff0c;点击你的头像&#xff0c;然后在出来的侧边栏选择 Your repositories 点击New创建一个新的仓库&#xff0c;即repository 输入你的仓库名称&#xff0c;选择public 或者 private. 尽量不要勾选README 如果你的…

微信小程序环境搭建

一、微信开发者工具 1. 微信公众平台注册小程序 注册类型选择‘个人’即可&#xff0c;‘企业’需要公司相关信息&#xff08;企业信用代码、法人信息等&#xff09;。 若只是学习阶段&#xff0c;忽略这步&#xff0c;使用测试号即可。 注册成功后&#xff0c;在‘开发’-…

【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南

带你一同盘点一下常用的任务调度框架的方案和开发指南 任务调度JDK原生任务调度Java.Util — Timer&#xff08;单线程&#xff09;/ TimerTask&#xff08;任务调度&#xff09;Java.Util.Concurrent — 任务调度线程池 Spring任务调度机制Quartz任务调度机制简单的使用流程Tr…

精品SpringCloud图书馆管理系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的图书馆管理系统的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版本&…

【力扣-每日一题】337. 打家劫舍 III

class Solution { public:pair<int,int> dfs_rob(TreeNode *root){//如果为根节点if(rootnullptr)return {0,0};auto [l,l_n]dfs_rob(root->left);auto [r,r_n]dfs_rob(root->right);int ol_nr_nroot->val;//当前节点偷&#xff0c;所获得的利益,子节点不能偷in…

第二章 交换基础

目录 2.1 交换机概述 2.1.1 交换机的定义 2.1.2 交换机的接口 2.1.3 交换机的互连方式 2.1.3.1 级联 2.1.3.2 堆叠 2.1.4 交换机工作原理 2.1.4.1 转发 2.1.4.2 过滤 2.1.4.3 扩散 2.1.4.4 广播 2.1.4.5 源地址学习 2.1.5 交换机的作用 2.2 交换机作用仿真 2.2.…