vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token

vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token


http.ts

javascript 复制代码
import axios from 'axios' // 引入axios
import router from '@/router'
import Qs from 'qs'
import { ElMessage } from 'element-plus'


const { prefixBasePath } = require('../../../config/basePath')
axios.defaults.baseURL = prefixBasePath;

// 配置axios前置拦截器,作用是让所有axios请求携带token,后台需要token校验是否登录
axios.interceptors.request.use(config => {
  // 1.从缓存中获取到token,这里的Authorization时登录时你给用户设置token的键值
  let authorization = localStorage.getItem("Authorization");
  // 2.如果token不为null,那么设置到请求头中,此处哪怕为null,我们也不进行处理,因为后台会进行拦截
  if (authorization) {
  //后台给登录用户设置的token的键时什么,headers['''']里的键也应该保持一致
    config.headers['Authorization'] = authorization;
  }
  // 3.放行
  return config;
}, error => {
//失败后抛出错误
  Promise.reject(error);
})

//  *   --------------------  get请求  --------------------
// get请求
// 1、根据id查看一条信息
// 2、获取所有数据,展示表格数据
export function getOneOrAllData(url: any, params: any, hideTips: any) {
  return new Promise((resolve, reject) => {
    showLoading()
    axios.get(url, {
      params: params,
      // 解决get传数组问题,主要是以下五行代码
      paramsSerializer: {
        serialize: function (params) {
          return Qs.stringify(params, { arrayFormat: 'repeat' })
        }
      },
    })
      .then(res => {
        hideLoading()
        switch (res.data.code) {
          case 401:
            jumpToLogin()
            break
          case 500:
            ElMessage.error(res.data.message)
            break
          case 200:
            // if (!hideTips)
            //   ElMessage.success(res.data.message)
            resolve(res.data)
            break
          default:
            Toast(res.data.message)
            resolve(res.data)
            break
        }
      })
      .catch(err => {
        errMsg(err)
        reject(err)
      })
  })
}

//  *   --------------------  post请求  --------------------
// (非)formData格式
// 添加、修改
// flag为true,不弹提示窗
export function addOrReviseData(url: any, params: any, showTips: any, hideLoads: any) {
  return new Promise((resolve, reject) => {
    // {
    //   headers: {
    //     'Content-Type': 'multipart/form-data'
    //   }
    // }
    if (!hideLoads)
      showLoading()
    axios.post(url, params)
      .then(res => {
        hideLoading()
        switch (res.data.code) {
          case 401:
            jumpToLogin()
            break
          case 500:
            ElMessage.error(res.data.message)
            resolve(res.data)
            break
          case 200:
            if (showTips)
              ElMessage.success(res.data.message)
            resolve(res.data)
            break
          default:
            resolve(res.data)
            break
        }
      })
      .catch(err => {
        errMsg(err)
        reject(err)
      })
  })
}

//  *   --------------------  登录、退出  --------------------
// 登录 - post
export function logIn(url: any, params: any) {
  return new Promise((resolve, reject) => {
    showLoading()
    axios.post(url, params)
      .then(res => {
        switch (res.data.code) {
          case 500:
            ElMessage.error(res.data.message)
            break
          case 200:
            ElMessage.success(res.data.message)
            resolve(res.data)
            break
        }
      })
      .catch(err => {
        errMsg(err)
        reject(err)
      })
  })
}

// 退出 - get
export function logOut(url: any, params: any) {
  return new Promise((resolve, reject) => {
    axios.get(url, { params: params })
      .then(res => {
        ElMessage.success(res.data.message)
        jumpToLogin(true)
      })
      .catch(err => {
        jumpToLogin(true)
      })
  })
}

// 跳转到登录页
function jumpToLogin(showTips) {
  router.push({ path: '/login' })
}

app.ts

javascript 复制代码
import { getOneOrAllData, addOrReviseData, logIn, logOut} from './http'

// import router from '@/router'
// if (router.app._route.path.includes('/onLineRegister/')) {
//   return '/globalApi/app'
// }
function GlobalUrl() {
  return '/globalApi'
}

export const login = (p: any) => logIn(GlobalUrl() + '/login', p, false)//登录
export const logout = (p: any) => logOut(GlobalUrl() + '/logout', p, false)//退出
export const addOrUpdate = (p: any) => addOrReviseData(GlobalUrl() + '/addOrUpdate', p, true)//增加/修改信息
export const getList = (p: any) => getOneOrAllData(GlobalUrl() + '/getList', p, false)//查询数据

vue文件

javascript 复制代码
import { login } from "@/app"
login(){
	login(form).then((res: any) => {
		console.log(res)
	}
}
相关推荐
独立开阀者_FwtCoder8 分钟前
面试官:为什么在 Vue3 中 ref 变量要用 .value?
前端·javascript·vue.js
NetX行者11 分钟前
基于Vue 3的AI前端框架汇总及工具对比表
前端·vue.js·人工智能·前端框架·开源
独立开阀者_FwtCoder11 分钟前
手握两大前端框架,Vercel 再出手拿下 Nuxt.js,对前端有什么影响?
前端·javascript·vue.js
独立开阀者_FwtCoder12 分钟前
弃用 html2canvas!快 93 倍的截图神器!
前端·javascript·vue.js
rui锐rui1 小时前
商品销售数据分析实验
vue.js·数据挖掘·数据分析
洛小豆1 小时前
深入理解Pinia:Options API vs Composition API两种Store定义方式完全指南
前端·javascript·vue.js
Jokerator1 小时前
Vue 2现代模式打包:双包架构下的性能突围战
javascript·vue.js
洛小豆1 小时前
JavaScript 对象属性访问的那些坑:她问我为什么用 result.id 而不是 result['id']?我说我不知道...
前端·javascript·vue.js
前端wchen2 小时前
Vue 3 组件通信实战系列(一)父子组件通信的标准姿势:Props 与 Emit(含实战与进阶技巧)
前端·vue.js
程序员秘密基地3 小时前
基于html,css,vue,vscode,vs2022,asp.net,aspnet,.net,c#,mysql数据库,在线健身,俱乐部管理系统
前端·vue.js·后端·mysql·asp.net