用户登录与信息管理:实现小程序登录与用户信息存储

news/2024/10/3 13:19:06 标签: 小程序, 微信小程序, 前端

用户登录与信息管理:实现小程序登录与用户信息存储

在现代的移动应用中,用户登录与信息管理是构建个性化用户体验的基础。小程序作为轻量级的应用形式,在简化开发流程的同时,也需要我们妥善管理用户的登录状态与用户信息。本文将详细介绍如何在小程序中实现用户登录功能,并将用户信息存储到全局状态管理对象Store中,以便在应用的不同部分高效访问这些信息。

程序登录图示

在深入探讨之前,让我们先通过一个简单的图示了解小程序登录的流程:

  1. 开发者服务器(后端):负责处理小程序端发送的请求,包括验证用户身份、生成并管理自定义登录态(token)。
  2. 前端小程序:负责触发登录流程,获取临时登录凭证(code),并发送至后端以换取自定义登录态(token)。前端保存这个token,并在后续请求中携带。
  3. 后端流程:在接收到code后,后端将其发送到微信接口服务,以获取session_key和openid。后端将这些信息与自定义的token关联起来,并返回给前端。后续的请求中,后端会校验token的有效性。
    在这里插入图片描述
用户登录:实现小程序登录功能

步骤1:创建登录API函数

/api/user.js文件中,根据接口文档,创建一个用于登录的API函数login

// /api/user.js
import http from '../utils/http'

/**
 * @description 授权登录
 * @param {*} code 临时登录凭证code
 * @returns Promise
 */
export const reqLogin = (code) => {
  return http.get(`/weixin/wxLogin/${code}`)
}

步骤2:绑定登录按钮事件

为登录按钮绑定点击事件,对应login回调函数。

步骤3:调用wx.login方法

login回调函数中,调用wx.login方法获取临时登录凭证code

步骤4:调用登录API

/pages/login/login.js中导入封装好的API函数,传入code并调用。

// /pages/login/login.js
import { reqLogin } from '../../api/user'
import { toast } from '../../utils/extendApi'

Page({
  // 点击登录
  login() {
    // 调用 wx.login 获取用户信息
    wx.login({
      success: async ({ code }) => {
        if (code) {
          // 调用接口 API,传入 code 进行登录
          const res = await reqLogin(code)

          // 登录成功以后将 token 存储到本地
          wx.setStorageSync('token', res.data.token)

          // 返回之前的页面
          wx.navigateBack()
        } else {
          // 登录失败后给用户进行提示
          toast({ title: '授权失败,请稍后再试~~~' })
        }
      }
    })
  }
})

步骤5:使用MobX进行全局状态管理

为了实现全局状态管理,我们将使用MobX。首先,安装MobX相关的包。

npm i mobx-miniprogram mobx-miniprogram-bindings

步骤6:创建Store

在项目的根目录下创建store文件夹,并在该文件夹下新建userstore.js。导入核心的observableaction方法,创建Store,同时声明数据和方法。

// /store/userstore.js
import { observable, action } from 'mobx-miniprogram'
import { getStorage } from '../utils/storage'

// 创建 store 对象,存储应用的状态
export const userStore = observable({
  // 创建可观察状态 token
  token: getStorage('token') || '',

  // 对 token 进行修改
  setToken: action(function (token) {
    this.token = token
  })
})

步骤7:关联页面与Store

在登录页面,导入ComponentWithStore方法,并配置storeBindings方法让页面和Store对象关联。

// /pages/login/login.js
import { reqLogin } from '../../api/user'
import { userStore } from '../../store/userstore'
import { ComponentWithStore } from 'mobx-miniprogram-bindings'

ComponentWithStore({
  storeBindings: {
    store: userStore,
    fields: ['token'],
    actions: ['setToken']
  },
  methods: {
    // 授权登录
    login() {
      wx.login({
        success: async ({ code }) => {
          if (code) {
            const { data } = await reqLogin(code)

            // 将数据存储到本地和 store 对象中
            wx.setStorageSync('token', data.token)
            this.setToken(data.token)
          } else {
            toast({ title: '授权失败,请重新授权' })
          }
        }
      })
    }
  }
})
用户信息:将用户信息存储到Store

步骤1:新增userInfo字段

store/userstore.js中新增userInfo字段,同时创建修改的action方法。

// /store/userstore.js
export const userStore = observable({
  // ...其他字段
  // 用户信息
  userInfo: wx.getStorageSync('userInfo') || {},

  // 设置用户信息
  setUserInfo: action(function (userInfo) {
    this.userInfo = userInfo
  })
})

步骤2:封装获取用户信息的API函数

/api/user.js文件中,根据接口文档,创建获取用户信息的API函数reqUserInfo

// /api/user.js
export const reqUserInfo = () => {
  return http.get(`/mall-api/weixin/getuserInfo`)
}

步骤3:在登录成功后获取用户信息

在登录成功以后,调用获取用户信息的接口,并将用户信息存储到本地和Store中。

// /pages/login/login.js
import { reqLogin, reqUserInfo } from '../../api/user'
import { setStorage } from '../../utils/storage'

ComponentWithStore({
  // ...其他配置
  methods: {
    // 授权登录
    login() {
      wx.login({
        success: async ({ code }) => {
          if (code) {
            const { data } = await reqLogin(code)

            // 存储 token 并设置 token
            wx.setStorageSync('token', data.token)
            this.setToken(data.token)

            // 获取用户信息
            this.getUserInfo()
          } else {
            toast({ title: '授权失败,请重新授权' })
          }
        }
      })
    },

    // 获取用户信息
    async getUserInfo() {
      const { data } = await reqUserInfo()
      // 将用户信息存储到本地和 Store
      setStorage('userInfo', data)
      this.setUserInfo(data)
    }
  }
})

总结

通过上述步骤,我们成功实现了小程序的用户登录功能,并将用户信息存储到了全局状态管理对象Store中。这不仅能够简化用户信息的访问,还能提升应用在不同页面之间传递数据的效率。利用MobX进行全局状态管理,我们能够更好地管理应用的复杂状态,为用户提供更加流畅和个性化的体验。


http://www.niftyadmin.cn/n/5688445.html

相关文章

React生命周期以及Hook

React生命周期可概括为以下关键阶段(针对类组件,函数组件主要通过Hooks实现类似功能): 挂载(Mounting): constructor:初始化state和绑定事件处理函数。 render:返回组件的…

【AI驱动TDSQL-C Serverless 数据库技术实战营】基于Langchain的电商可视化分析

人工智能技术的飞速发展已深刻影响电商行业,显著提升了个性化推荐、用户行为分析、库存管理和市场预测等领域的效率。构建一个高效的AI驱动电商数据分析平台已成为行业的核心需求。本文里,我们将使用腾讯云的高性能应用平台 HAI(专为AI和科学…

深化专业,广纳技能,构建软实力

一、引言 ----  随着人工智能(AI)和生成式人工智能(AIGC)如ChatGPT、Midjourney、Claude等大语言模型的持续涌现,AI辅助编程工具日益普及,程序员的工作方式正在经历深刻的变革。这种变革既带来了对部分编…

解决OpenCV保存视频 视频全部为绿色的bug

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 使用OpenCV-Python 保存视频,视频为numpy array格式,保存的视频全部为无意义的绿色。 问题描述 用opencv 保存的视频会出现全部为绿色的情况&…

企业级Kubernetes部署

华子目录 k8s中容器的管理方式k8s集群部署安装k8s部署工具部署软件仓库,添加k8s源设置kubectl命令补全功能 k8s集群中安装cri-dockerk8s集群中启动cri-docker服务在k8s-master上拉取k8s所需镜像并上传到harbor上修改cri-docker.service文件k8s集群中启动kubeletk8s集…

你真的会用鼠标吗?它其实还可以这么用。

前言 小白最近比较忙,没大片的时间可以用来做实际测试,所以只能讲一些小知识。 如果有小伙伴们的电脑有问题,可以私下找小白咨询。 今天咱们要讲:鼠标怎么用。 接触过电脑的人,对鼠标这个东西一般都不陌生&#xf…

WPF用户控件的使用

WPF用户控件的使用 先看一下程序结构&#xff1a; WPF_Test是我的主程序&#xff1b;WPF_LIB是我添加的一个用户控件库&#xff0c;其中UserControl1是一个用户控件&#xff1b; 用户控件xaml代码&#xff1a; <UserControl x:Class"WPF_LIB.UserControl1"xmln…

【网络安全 | 靶场搭建】Maven构建项目+报错解决方法(无法解析插件)

未经许可,不得转载。 文章目录 构建项目报错构建项目 在运行新项目时,可能会遇到类似于 C:\Users\86177\Desktop\java-sec-code-master\src\main\java\org\joychou\Application.java:3:32 java: 程序包org.springframework.boot不存在 的问题。在这种情况下,可以通过以下步…