uniapp跳转前验证用户是否登陆并保存用户授权信息_uniapp跳转验证登录_嗯,醴!的博客-程序员秘密

技术标签: unipp  微信小程序  前端  自定义验证登录  javascript  

背景

这次项目有一个需求是实现点击一些按钮路由跳转前验证用户是否登陆,以及一些不跳转路由的功能,按钮点击后出现模态框前验证用户是否登陆。

方案选择

路由守卫

首先我并没有选择路由守卫,因为我的需求有不进行路由跳转进行验证的地方。

但是路由守卫用来做跳转前验证肯定是个不错的选择。我贴一个博客大家可以参考其他人的路由守卫方案

https://cnblogs.com/XHappyness/p/13808413.html

自定义验证方法

我是自己写的贴合需求的验证授权方法。
1.考虑跳转路由可以使用
2.在某些不跳转路由的需要验权的可以使用

实现步骤

在 utils 下编写 judgeLogin.js

export function judgeLogin() {
    
	return new Promise((resolve, reject) => {
    
		// 还未登陆
		if (!uni.getStorageSync('user')) {
    
			// #ifdef H5
			// 重定向到H5登录页
			uni.redirectTo({
    
				url: '/pages/login/index'
			})
			reject()
			// #endif
			
			// 微信小程序未登录
			// #ifdef MP-WEIXIN
			// 登陆用的临时code
			let wxCode = null
			let loginInfo = uni.getStorageSync('wxUserLogin') || {
    }
			uni.login({
    
				provider: 'weixin',
				// 获取临时code
				success: function(wx){
    
					console.log(wx, 'wx')
					wxCode = wx.code
					// 因为code是变化的,用上一次code会登陆失败,所以每次会重新获取code并加入缓存
					loginInfo.code = wxCode
					uni.setStorageSync('wxUserLogin', loginInfo)
				},
			})
			// 若没有保存用户授权信息
			if (!uni.getStorageSync('wxUserLogin')) {
    
				wx.getUserProfile({
    
					desc: "获取你的昵称、头像、地区及性别",
					success: (res) => {
    
						console.log(res, "成功返回的用户对象")
						loginInfo = {
    
							code: wxCode,
							encryptedData: res.encryptedData,
							iv: res.iv,
							userInfo: res.userInfo
						}
						uni.setStorageSync('wxUserLogin', loginInfo)
						uni.navigateTo({
    
							url:'/pages/index/login?loginInfo=' + encodeURIComponent(JSON.stringify(uni.getStorageSync('wxUserLogin')))
						})
						return
					},
					fail: res => {
    
						//拒绝授权
						// uni.showErrorModal('您拒绝了请求');
						uni.showToast({
    
							icon: 'none',
							title: '您拒绝了请求',
							duration: 1000
						})
					}
				})
			} else {
    
				uni.navigateTo({
    
					url:'/pages/index/login?loginInfo=' + encodeURIComponent(JSON.stringify(uni.getStorageSync('wxUserLogin')))
				})
			}
			reject()
			// #endif
		}
		resolve()
	})
}
export default judgeLogin

上面是整个文件,接下来我摘出来几段看一下

首先

我想要大家在验证之后再去执行本来应该的操作,所以我把这个方法写成了promise,当然可以改成接收一个函数参数作为回调也是可以的

h5登录验证

return new Promise((resolve, reject) => {
    
	// 还未登陆
	if (!uni.getStorageSync('user')) {
    
		// #ifdef H5
		// 重定向到H5登录页
		uni.redirectTo({
    
			url: '/pages/login/index'
		})
		reject()
		// #endif

微信小程序验证

// 首先要调用 uni.login 获取授权用的code
let wxCode = null
let loginInfo = uni.getStorageSync('wxUserLogin') || {
    }
uni.login({
    
	provider: 'weixin',
	// 获取临时code
	success: function(wx){
    
		console.log(wx, 'wx')
		wxCode = wx.code
		// 因为code是变化的,用上一次code会登陆失败,所以每次会重新获取code并加入缓存
		loginInfo.code = wxCode
		uni.setStorageSync('wxUserLogin', loginInfo)
	},
})

// 因为微信获取用户信息需要用户触发按钮,而我们不希望一直让用户反复操作,所以我把用户授权的信息存在了storage中
// 若没有保存用户授权信息
if (!uni.getStorageSync('wxUserLogin')) {
    
	wx.getUserProfile({
    
		desc: "获取你的昵称、头像、地区及性别",
		success: (res) => {
    
			console.log(res, "成功返回的用户对象")
			loginInfo = {
    
				code: wxCode,
				encryptedData: res.encryptedData,
				iv: res.iv,
				userInfo: res.userInfo
			}
			uni.setStorageSync('wxUserLogin', loginInfo)
			uni.navigateTo({
    
				url:'/pages/index/login?loginInfo=' + encodeURIComponent(JSON.stringify(uni.getStorageSync('wxUserLogin')))
			})
			return
		},
		fail: res => {
    
			//拒绝授权
			// uni.showErrorModal('您拒绝了请求');
			uni.showToast({
    
				icon: 'none',
				title: '您拒绝了请求',
				duration: 1000
			})
		}
	})
}

最后用户授权成功后跳转到登录页要 resolve()

成果

在这里插入图片描述
在这里插入图片描述
登录成功后,我们测试,把storage中的user信息清掉,只留用户授权信息
在这里插入图片描述
在这里插入图片描述
这个时候直接就进到了登录页,不用用户再授权了

H5端
在这里插入图片描述
就直接金登录页了。
当然,如果用户已经登录了,是可以直接进到想去的页面以及弹窗的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/EEstefan/article/details/122017248

智能推荐

VMware虚拟机,从厚置备改成精简置备,并减小硬盘的实际占用空间_weixin_30699465的博客-程序员秘密

工作中由于前期规划不足,导致磁盘空间分配较大,而且是厚置备。后期不再需要时,无法把用不到的空间释放出来,造成空间浪费。经过摸索和实验验证,到最终解决问题,总结出来两种方案。风险提示:两种方案的实验都验证通过了,但第一种方案在生产环境中没有成功,如有类似问题,建议采用第二种方案!环境:Esxi 6.5,vCenter 6.5 U1e,Ubuntu 16.04由于初始分配给Ubuntu ...

立即更新到WORDPRESS 4.7.2!_culu1614的博客-程序员秘密

WordPress Version 4.7.2 was released primitively to correct three security flaws, which included a SQL injection and XSS (cross-site scripting) flaw. Administrators who have yet to update their WordPr...

[每日一读]EMNLP20:用填表的方式进行实体关系联合抽取_御风而行Carrie的博客-程序员秘密

Paper: [EMNLP2020]Two are Better Than One: Joint Entity and Relation Extraction with Table-Sequence Encoderslink: https://www.aclweb.org/anthology/2020.emnlp-main.133.pdfcode: https://github.com/LorrinWWW/two-are-better-than-one这是一篇关于实体关系联合抽取的工作。关于现有的.

跳槽从年头说到年尾,有准备不?Android工程师看看这些建议与面试准备_安卓工程师跳槽_阿尔法789的博客-程序员秘密

为什么要跳槽为什么要跳槽,这个问题一定要思考清楚,因为跳槽的成本其实是挺大的,在一家公司积累的不仅仅是人脉还有对当前行业以及业务的熟悉度,新进入一家公司,一切需要从头再来,需要快速的证明自己,尤其是技术人员,还有就是对新环境和代码的熟悉,这些都是成本,所以 在跳槽前,一定要想好,为什么要跳槽 。其实马爸爸有一句经典的话“要么钱没给到位,要么心委屈了”,说的很形象,我这里再细说一下:1.钱没给...

2020-10-21_lqkitten的博客-程序员秘密

安装 opengauss 1.01 for centos,执行完gs_preinstall后,/opt的权限变这样了[[email protected] opt]# lltotal 28drwxr-xr-x 6 root root 56 Jul 19 21:47 adbsqldrwxr-xr-x 6 omm dbgrp 4096 Jul 10 2018 apache-ant-1.10.5drwxr-xr-x 5 omm dbgrp 48 Jul 19 09:34 gaussdb...

Kali-linux:fping 命令_胖哥王老师的博客-程序员秘密

fping程序类似于ping(ping是通过ICMP(网络控制信息协议InternetControl Message Protocol)协议回复请求以检测主机是否存在)。fping与ping不同的地方在于,fping可以在命令行中指定要ping的主机数量范围,也可以指定含有要ping的主机列表文件。与ping要等待某一主机连接超时或发回反馈信息不同,fping给一个主机发送完数据包后,马上给下一个主机发送数据包,实现多主机同时ping。如果某一主机ping通,则此主机将被打上标记,并从等待列表中移除,如果

随便推点

Opencv利用ROI将一张图片叠加到另一幅图像的指定位置_weixin_33671935的博客-程序员秘密

机器配置为:VS2013+opencv2.4.13+Win-64bit。===========================分割线========================本节将利用ROI将一幅图像叠加到另一幅图像的指定位置。具体过程见下面代码=======================分割线========================代码演示 1 /* 2 利用...

微x怎么设置主题_微信主题怎么设置 微信主题设置方法_weixin_39585070的博客-程序员秘密

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。  微信怎么设置主题皮肤?微信是我们现在经常使用的社交软件了,微信主题一般都是默认的,那怎么更换微信主题呢?今天小编为大家整理了微信设置主题...

python十大装b语法_10个玩转Python的小技巧,学会了大胆去装逼!_weixin_39852121的博客-程序员秘密

如今,Python 已经成为一种再主流不过的编程语言了,它天生丽质,易于读写,非常实用,从而赢得了广泛的群众基础,被无数程序员热烈追捧。常言道: “流水的语言,铁打的 Python”,貌似目前它已经“睥睨天下,傲视群雄”了。其实Python已经是老司机了,它的第一个公开版本发布于1991年。不过在编程世界里,Python属于“小鲜肉”、“高颜值”,告别了以往的刻板印象。因为 Python 简单易用...

异常测试场景——实战总结_测试活动需求可能出现异常场景有哪些_weixin_44256848的博客-程序员秘密

1、一个操作未完成,进行另一个操作,然后再完成第一个操作,会造成垃圾数据。一个操作进行时,应屏蔽其他操作。如:新建部门之后,新建人员但未完成,删除部门后,再保存人员,会使人员挂在空部门,形成垃圾数据。...

c实用技巧:纯c对于excel数据表的处理_c语言对excel数据处理_长沙红胖子Qt的博客-程序员秘密

需求       需要对数据库的大量数据进行处理,数据库导出的文件是xls(2003之前的excel格式),需要将其中的厂家单独分项,如下图:    实现原理        纯c可以通过字节按照固定分隔读取excel,但是本需求要求可以输出txt,所以实现方式如下:             excel源文件(10000行以上的表格)输入文件:in.txt文件临时文件temp.txt文件输出out....

pip 异常问题_pip出错_zzpdbk的博客-程序员秘密

使用pip安装出现报错 Exception:Traceback (most recent call last): File "C:\Users\csprock\Anaconda3\lib\site-packages\pip\basecommand.py", line 215, in main status = self.run(options, args) File "...

推荐文章

热门文章

相关标签