uniapp无感登录封装

在全局请求封装的基础上稍作完善

  1. 在响应拦截处判断返回接口状态
  2. 过期的话就执行:记录过期的接口 => 登录 => 重新发送请求

封装记录和重发请求逻辑

let requestsQueue = []; // 请求队列// 记录请求队列
export function recordRequests(config) {if (config.source) {requestsQueue.push(config)}
}// 请求重新发起
export async function retryRequest() {console.log("请求队列:", requestsQueue);requestsQueue.forEach((config) => {config.source(config.path, config.params, config.source, config.loading, config.method);})requestsQueue = [];
}

然后回到全局请求

将刚封装的无感逻辑引入,并放入响应401拦截处。
注意source参数一定要传入,不然登录过期找不到接口发起源,重登后无法重发请求

import {lastDebounce // 为了防止多次登录的防抖逻辑
} from "@/utils/debounce.js"
import {useUserStore // 登录和获取用户资料
} from '@/store/index.js'
import {recordRequests, // 记录请求队列retryRequest    //重新发送请求
} from "./refreshToken.js"// 全局请求默认配置
const defaultConfig = {url: import.meta.env.VITE_BASE_URL,path: "",params: {},source: null, // 普通的接口一定要传入发起源,为了登录过期的重新发起loading: true,method: "POST"
}
// 登录过期不需要重发的接口
const noRetryAPIs = ["/user/myPage/userInfo", "/user/myPage/login"];export function http(config) {config = {...defaultConfig,...config}console.log('请求拦截:', config);if (!noRetryAPIs.includes(config.path) && !config?.source) {return uni.showToast({icon: "error",title: 'source 缺失'});}return new Promise((resolve, reject) => {if (config?.loading) {uni.showLoading({title: "加载中",mask: true});};uni.request({header: {Authorization: uni.getStorageSync("Authorization") || ""},url: (config?.url || defaultConfig.url) + config?.path,method: config?.method || defaultConfig.method,data: config?.params,async success(res) {uni.hideLoading();console.log('响应拦截:', res.data);/* =========== 无感登录,重发请求 【start】 =========== */if (res.data?.code === 401) {recordRequests(config);lastDebounce(async () => {const userStore = useUserStore();await userStore.getToken();retryRequest()})}/* ============ 无感登录,重发请求 【end】 ============ */if (res.data?.code !== 0 && res.data?.code !== 401) {uni.showToast({icon: "error",duration: 2000,title: res.data.msg});}resolve(res.data);},fail(err) {uni.hideLoading();uni.reLaunch({url: "/pages/status/service/error"})reject(err);},complete() {// uni.hideLoading();    // 在showToast之前执行会受影响}});});
};

主要就是这个:
在这里插入图片描述

lastDebounce 说明

为了防止多次登录,加入防抖逻辑:

// 防抖 - 后执行
let lastDebounceTimer;
export function lastDebounce(fn) {if (lastDebounceTimer) clearTimeout(lastDebounceTimer)lastDebounceTimer = setTimeout(() => {fn();lastDebounceTimer = null}, 500)
}

useUserStore 说明

pinia 封装的登录获取登陆人信息的接口

import { http } from "@/request/index.js"
import { defineStore } from 'pinia'export const useUserStore = defineStore("user", {state: () => ({token: "",userInfo: {}}),actions: {// 获取tokengetToken() {const that = this;return new Promise(async (resolve, reject) => {wx.login({async success(e) {try {const response = await http({path: "/user/login",params: {code: e.code}});if (response.code !== 0) {return;}that.token = response.data.access_token;uni.setStorageSync("Authorization", response.data.access_token)await that.getUserInfo();resolve()} catch (err) {reject(err)}},fail() {reject()}})})},// 获取用户资料async getUserInfo() {return new Promise(async (resolve, reject) => {try {const response = await http({path: "/user/userInfo",loading: false})if (response.code !== 0) {return;}this.userInfo = response.data;uni.setStorageSync("user-info", response.data)// if (!response.data.phonenumber) {// uni.reLaunch({// 	url: "/pages/register/getPhoneNumber"// });// }resolve(response)} catch (err) {reject(err)}})},}
})

如果你的登录逻辑不是在pinia封装的,你就调用你封装的,反正就是登录就行。


以上全局请求封装完毕了,下面再看接口封装

接口封装

在这里插入图片描述

使用接口

在这里插入图片描述

效果

看,本来请求的 myStakes 和 userInfo 接口登录过期了,待重新登录后再次发起了
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障,导致上层服务故障,并且这个故障不断放大的过程,成为雪崩效应。 雪崩效应,往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池,线程池满…

【Java Web基础】一些网页设计基础(二)

文章目录 1. Bootstrap导航栏设计1.1 代码copy与删减效果1.2 居中属性与底色设置1.3 占不满问题分析1.4 字体颜色、字体大小、字体间距设置1.5 修改超链接hover颜色,网站首页字体颜色 1. Bootstrap导航栏设计 1.1 代码copy与删减效果 今天设计导航栏,直…

微调alpaca-lora遇到的一些问题

1、环境简介 环境: 系统:Ubuntu torch:2.2.1 python:3.10 gpu:V100 16g peft:0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf,项目地址:alpaca-lora 2、混合精度训练Tensor相互计算会…

PCL点云处理之中值计算(二百三十三)

PCL点云处理之中值计算(二百三十三) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 读取的点云是无序散乱的,点云坐标包括xyz三个维度,以常用的z高程维度为例,计算其高程中值,获取对应的点。 主要涉及到根据高程对点云进行排序的操作,下面是具体的代码和结果。 …

Git版本管理工具

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: Git使用教程-配置管理 git reset详解-CSDN博客 3、Git使用不完全指南&am…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”:当逻辑与&&的左操作数为逻辑 “假“ 时,就足以判断该逻辑运算的结果为假了,故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…

python中获取当前项目的目录

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 今天介绍一下,如何在python中获取当前项目所在的目录,而不是运行脚本的目录。 class ProjectPaths:# 初始化时获取当前脚本的路径staticmethoddef get_script_dir():…

Leetcode 994. 腐烂的橘子

心路历程: 一开始以为和刚做过的岛屿问题很像,只不过是把岛屿问题换成BFS去做,然后再加上一些计数的规则。结果做完后发现只能通过一半左右的测试用例,发现有一个逻辑错误在于,当腐烂的橘子位于两端时,可以…

4.1 用源文件写汇编代码

汇编语言 1. 源程序 1.1 伪指令 汇编指令是有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行伪指令没有对应的机器指令,最终不被CPU所执行伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作 1.2…

【C++】—— 装饰器模式

目录 (一)什么是装饰器模式 (二)为什么要使用装饰器模式 (三)装饰器模式的实现步奏 (四)代码示例 (五)装饰器模式优缺点 (一)什么…

Codeforces Round 935 (Div. 3)A~E

A. Setting up Camp 题目分析: 有三种人,内向、外向、综合,内向必须独自一个帐篷,外向必须3个人一个帐篷,综合介于1~3人一个帐篷,我们发现非法情况只会存在外向的人凑不成3个人一个帐篷的情况,因外向不够可…

JavaEE--小Demo

目录 下载包 配置 修改文件 pom.xml application.properties 创建文件 HelloApi.java GreetingController.java Greeting.java DemoApplication.java 运行包 运行命令 mvn package cd target dir java -jar demo-0.0.1-SNAPSHOT.jar 浏览器测试结果 下载包 …

为什么大家都在“挺”鸿蒙?

试想某一天,应用软件能够在手机、电视、手表甚至汽车等设备上,实现无缝流转、纵享丝滑。 这不仅是畅想,而是鸿蒙正在布局的“遥遥领先”。 随着HarmonyOS NEXT鸿蒙星河版面向开发者开放申请、鸿蒙原生应用版图的基本成型,这个国…

智慧水务:雨季山区水域水务智能化监控与监测管理方案

一、方案背景 雨季的水务管理对于各区县来说,无疑是一项至关重要的任务。夏季雨水充沛,江河湖泊水位上涨,山洪、上游排水等情况时有发生,给各地的水务设施和防汛工作带来了严峻的挑战。针对区县的各类水域监管场景,需…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

ts版本微信小程序在wxml保存文件不刷新页面的解决办法

将project.config.json中的skylineRenderEnable改为false "skylineRenderEnable": false

HTTP协议1

官网学习网址:HTTP | MDN 常规信息 常规请求头信息: 状态码: 200 正常响应 404 未找到资源 500 服务端一场的 3** 重定向 资源缓存 响应头信息: 客户端允许的请求方法类型 Access-Control-Allow-Methods: GET, POST, PUT, DELET…

flutter 局部view更新,dialog更新进度,dialog更新

局部更新有好几种方法,本次使用的是 StatefulBuilder 定义 customState去更新对话框内容 import package:flutter/cupertino.dart; import package:flutter/material.dart;class ProgressDialog {final BuildContext context;BuildContext? dialogContext;double _…

【FAQ】BSV区块链代码库常见问题解答

​​发表时间:2024年2月27日 BSV区块链协会上线了JavaScript和TypeScript SDK(即“标准开发工具包”)。TypeScript SDK旨在为开发者提供新版统一核心代码库,让开发者可以在BSV区块链上便捷地进行开发,尤其是开发那些可…

1.实用Qt:解决绘制圆角边框时,圆角锯齿问题

目录 问题描述 解决方案 方案1: 方案2: 结果示意图 问题描述 做UI的时候,我们很多时候需要给绘制一个圆角边框,初识Qt绘制的童鞋,可能绘制出来的圆角边框很是锯齿,而且粗细不均匀,如下图&…