IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 大龄业余程序员要搞个django小程序--08--深入理解小程序登陆状态的维护 -> 正文阅读

[Python知识库]大龄业余程序员要搞个django小程序--08--深入理解小程序登陆状态的维护

业余水平第一次做小程序,进度非常慢,每天下班后也只有零碎的1到2小时,一个小问题可以难倒我几个晚上的时间。

由于微信小程序没有一套身份验证管理的框架,只提供wx.loginwx.getUserProfile等几个api,所以对于我这种初学者来说,小程序登陆状态管理就显得很麻烦。经过这段时间的实践,终于摸到了点门槛。先梳理几个重要的信息。

在这里插入图片描述

从用户使用的层面理解小程序的登陆逻辑

小程序打开时,只会有两种状态

  • 未登陆状态,查看不到个人信息
  • 登陆状态

那,当小程序载入时,依靠什么来判断状态呢?结合官方的文档和实践,我采用以下的逻辑判断登陆状态的设定:

1、sessionKey 是否过期,
2、本地是否有userInfo

经过实践,以上两项,只要有一项不满足,都必须显性地标识为未登陆sessionKey都过期了,说明这个用户很久没登陆小程序了,有必要走一套登陆的流程,或者,本地连userInfo都没来,即便标识为登陆,也没用,没有基础的用户数据的话,你显示个毛线。


从开发的层面理解小程序的登陆逻辑

用户为两种状态

  • 已注册
  • 未注册

需要考虑以下情况

  • 请求中是否需要携带token,无token则需要验openid,然后签发token;token过期时通知小程序客户端重新执行登陆操作
  • 请求中是否需要携带code iv encryptedData 。按照个人的理解,需要携带。即wx.login(提供code)getUserInfo(提供iv和encryptedData)配合使用,可以随时做openid校验和解密encryptedData信息。

总结

1、小程序客户端使用sessionKeyuserInfo缓存来决定用户在小程序的登陆状态;
而且,都可以在全局进行判断,即项目根目录的app.js

App({
	wx.checkSession({
      success: (res) => {//返回:有效期内的提示},
      fail: (res) => {//返回:过期的提示},
      complete: (res) => {},
    });
    
    let u = wx.getStorageSync('userInfo')
    console.log(u) //如果不存在,返回的是空字符
    
})

上面并非业务代码,只是做简单的展示,实践中可以考虑使用promise封装起来。

总之,sessionKeyuserInfo只要其中之一不存在,都要把登陆状态标记为未登陆

2、需要把登陆逻辑单独封装,方便在需要的时候使用。

export const wxGetUserProfile = () => {
  return new Promise((resolve, reject) => {
    // 登陆中提示
    wx.showLoading({
      title: '登陆中...',
      mask: true,
    })
    wx.getUserProfile({
      desc: '授权以提供进一步服务',
      lang: 'zh_CN',
      success: (result) => {
        resolve(result)
      },
      fail: (err) => {
        reject(err)
      },
      complete: (res) => {
        wx.hideLoading({})
      },
    })
  })
}

export const wxLogin = () => {
  return new Promise((resolve, reject) => {
    wx.login({
      success: (result) => {
        resolve(result)
      },
      fail: (err) => {
        reject(err)
      },
      complete: (res) => {
      },
    })
  })
}

使用Promise分别封装wx.loginwx.getUserProfile,使用时要在使用的js中引入封装的方法)

tapToLogin(e) {
    let p1 = wxLogin()
    let p2 = wxGetUserProfile()
    p1.then(code => {
      return code
    }).then(code => {
      return new Promise((resolve, reject) => {
        p2.then(res => {
          console.log('profile', res.userInfo);
          this.setData({
            userInfo: res.userInfo
          })
          wx.setStorageSync('userInfo', res.userInfo)
          resolve({
            code: code.code,
            iv: res.iv,
            encryptedData: res.encryptedData,
            userInfo: res.userInfo
          })
        }).catch(err => {
          reject(err)
        })
      })
    }).then(res => {
      // 使用封装的request
      if (!wx.getStorageSync('token')) {
        request({
            url: HOST_API.menberLogin,
            method: "POST",
            data: {
              code: res.code,
              iv: res.iv,
              encryptedData: res.encryptedData
            }
          })
          .then(result => {
            wx.setStorageSync('token', result.data.context.token);
            this.setData({
              hasUserInfo: true,
              isLogin: result.data.context.is_login,
              isVip: result.data.context.is_vip,
              collection: result.data.context.collection,
              integration: result.data.context.integration,
              views: result.data.context.views
            })
            console.log('无头的返回:', result);
          })
      } else {
        request({
            url: HOST_API.menberLogin,
            method: "POST"
          })
          .then((result) => {
            console.log('有token的返回:', result);
            this.setData({
              hasUserInfo: true,
              isLogin: result.data.context.is_login,
              isVip: result.data.context.is_vip,
              collection: result.data.context.collection,
              integration: result.data.context.integration,
              views: result.data.context.views
            })
          })
      }
    })
  },

未登陆状态
在这里插入图片描述

登陆状态
在这里插入图片描述

在这里插入图片描述

当然,在使用时还是存在逻辑上不清晰的情况。

3、设置的问题

  • isLogin bool设置为全局变量,注意这个不能设置为缓存。
  • wx.checkSessionwx.getStorageSync('userInfo') 封装好,可以在全局调用,可以在需要的环节进行调用,并且,必须相应地改更全局变量isLogin的值。
  • tokenuserInfo要写到缓存中
  • 可以写一个登陆页面的模板,供各个页面调用。当然,不写模版似乎也没啥问题,但必须,当前的界面在点击授权登陆后,要有显性的提示:登陆完成云云。不然用户不清楚、不确定是否登陆成功。
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:07:25  更:2021-09-26 10:07:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:17:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码