接着上次的总结,继续总结微信扫码登录的开发。微信扫码登录的需求基本是这样的:用户用手机微信扫码授权登录后,判断用户是否是新用户,如果是新用户系统就需要跳转到用户绑定手机号的页面,等用户绑定好手机号后,才能进入到系统的首页,完成注册绑定。如果不是新用户则扫码后直接进入到系统的首页。
所以开发该功能最少需要两个界面,一个扫码登录页面,一个新用户绑定注册页面。为什么是最少两个呢?而不是直接说两个呢?那是因为我发现用户扫码授权登录后,接下来就该执行判断是否是新用户的逻辑了。但是没有扫码成功后的回调,这就很无奈了,不知道怎么去触发接下来的逻辑判断了。所以这时候就需要“第三者”出现了,就是连接扫码页和绑定页的中间页面,把判断的逻辑放到中间页去处理(这是后台给我的方案)。
然后,流程就变成这样了:用户手机微信扫码授权登录,然后后台将路由重定向到我的中间页面,我在中间页面的 created()生命周期中进行逻辑判断,判断该用户是否是新用户,然后做不同的处理。若是新用户就进入绑定页面......,如不是新用户就进入系统首页。
好了,思路就是这样,接下来就中间页的处理逻辑了。后台将路由重定向到中间页,会用get的形式将必要的信息拼接到url上,我只用获取到url,并将传过来的信息处理成json格式就行了。
在这里记录一个很好的函数,该函数可以将get形式传过来的参数信息自动转化为json格式。
// 解析url,得到参数,输出为json格式const getUrlCstoJson = function (url) {
var result = {}; var keyReg = /(\?(.*?)=|&(.*?)=)/g, valReg = /=(.*?)&/g, urls = url ? url + "&" : "", keys = urls.match(keyReg) || [], vals = urls.match(valReg) || []; for (var i = 0, size = keys.length; i < size; i++) {
result[keys[i].replace(/(\?|=|&)/g, "")] = vals[i].replace( /(=|&)/g, "" ); } return result;}//比如:console.log(this.globalVar.getUrlCstoJson(':xxddns.tpddns.cn/#/wxLoginMiddle?uid=UID641093792cd9409693939f0551a89783&utoken=4670362e1d254e53bfd508b0e7c80527&urole=-1&st=tmp'))//输出的结果为:{
uid: "UID641093792cd9409693939f0551a89783", utoken: "4670362e1d254e53bfd508b0e7c80527", urole: "-1", st: "tmp"}//真的不要太方便
接下来就是中间页的处理逻辑了:
<template> <div class="middle">div>template><script>export default {
data() {
return {
udata: {} }; }, created() {
this.udata = this.globalVar.getUrlCstoJson(window.location.href); window.sessionStorage.setItem("userinfo", JSON.stringify(this.udata)); this.fun(); }, methods: {
fun() {
// 请求数据字典 this.$http({
method: "post", url: "/DataGate/GetAlDictData" }).then(response => {
window.sessionStorage.setItem("dict", JSON.stringify(response.data)); if (this.udata.st == "bon") {
// 绑定过了,就直接进入首页 parent.location.href = "/#/home"; } else {
//用户没有绑定手机号,需要跳转到用户手机号绑定页面 parent.location.href = "/#/userBond"; } }); } }};script><style scoped>.middle{
width: 100%; height: 100%; background: #ffffff;}style>
最后就是绑定页面的处理逻辑了:
<template> <div class="