vue3+vite封装axios

新建api.ts文件配置接口

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'// 导入axios模块
import { ElNotification } from 'element-plus'
import { globalState } from "../store";
const controller = new AbortController()//终止请求

//配置接口,调用登陆接口后,token存到本地
export const ApiService = {
  admin: {
     login: (username: string, password: string) => 
     api().post('/api/admin/loginConsole', null, { params: { username, password } }),
    },
}

function api() {
    const instance = axios.create()//创建axios实例
    instance.defaults.timeout = 6000 //设置默认请求超时时间为6000毫秒
    instance.defaults.signal = controller.signal //设置默认请求的信号
    // load token
    const sessionToken = window.sessionStorage.getItem('token')
    if (sessionToken) instance.defaults.headers.common['token'] = sessionToken//如果存在token,加在请求头上
    instance.interceptors.response.use((response: any) => {    // 失败响应拦截器
        const { code, message } = response.data
        if (code == 201) {
            window.sessionStorage.clear()
            globalState.token = null
            globalState.username = null
            // router.push('/login?back=' + encodeURI(router.currentRoute.value.fullPath))
        }
        else {
            return response
        }
        //ElNotification({ type: 'error', title: '提示', message })
    }, error => {
        // console.log(error,'777777')
        const request: AxiosRequestConfig = error.request
        const response: AxiosResponse = error.response
        // console.log(request,'request');
        // console.log(response,'response');

        if (response) {
            // TODO: redirect 401 to login
            ElNotification({ type: 'error', title: '提示', message: '网络错误:' + response.status })
        } else if (request) {
            ElNotification({ type: 'error', title: '提示', message: '服务器无响应' })
        } else {
            ElNotification({ type: 'error', title: '提示', message: '出现异常' })
        }
    })
    return instance
}

新建store.ts文件取token和用户名

import { reactive } from 'vue'
export const globalState = reactive({
    username: window.sessionStorage.getItem('username'),
    token: window.sessionStorage.getItem('token'),
})

Vite文件配置请求地址

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: 'http://xxxxxxxxxx',//目标地址
        changeOrigin: true,//是否允许跨域
      }
    }
  },
  plugins: [vue()],
})

前面完成后调用接口

import { ApiService } from '../../service/api'
  ApiService.admin
        .login('admin', '123456')
        .then(response => {
            const { data } = response
             const username = data.content.username
            window.sessionStorage.setItem('token', token)
            window.sessionStorage.setItem('username', username)
        })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值