vue3 + vite + typescript封装axios及使用,上传、导入,下载、导出

1、封装axios

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import userStore from '@/stores/modules/user'

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,  //环境变量配置baseURL
  timeout: 50000
})

// 请求拦截器
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    if (!config.headers) {
      throw new Error(`headers is not defined`)
    }
    const user = userStore()
    if (user.token) {
      config.headers.token = user.token   //请求头设置token
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const user = userStore()
    const { code, msg } = response.data
    // 响应数据为二进制流处理
    if (response.data instanceof ArrayBuffer || response.data instanceof Blob) {
      return response
    }
    if (code === 401) {
      // 无权限, 退出并跳转到登录页
      user.logout().then(() => {
        window.location.href = '/'
      })
      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
    } else if (code === 500) {
      ElMessage.error(msg || '系统出错')
    } else if (code !== 200) {
      ElMessage.warning(msg)
    } else {
      return response.data
    }
  },
  (error) => {
    const { status, data } = error.response
    if (status === 401) {
      // token 过期清除缓存重新登录
      // localStorage.clear()
      ElMessageBox.alert('当前页面已失效,请重新登录', '提示', {
        confirmButtonText: '确定',
        callback: () => {
          // 跳转登录页
          window.location.href = '/'
        }
      })
    } else {
      ElMessage({
        message: data.msg || '系统出错',
        type: 'error'
      })
    }
    return Promise.reject(new Error(data.msg || 'Error'))
  }
)

// 导出 axios 实例
export default service

2、api目录下创建task/index.ts文件

import request from '@/utils/request'

// post请求
export function addTask(params: any) {
	return request({
		url: `/task/addTask`,
		method: 'post',
		data: params
	})
}

// get请求
export function getTask(params: any) {
	return request({
		url: `/task/getTask`,
		method: 'get',
		params
	})
}

// 下载或导出
export function exportTask(params: any) {
	return request({
		url: '/task/exportTask',
		method: 'post',
		responseType: 'blob',
		params
	})
}

// 上传或导入
export function importTask(params: any, data: any) {
	return request({
		url: '/task/importTask',
		method: 'post',
		headers: {
			contentType: 'multipart/form-data'
		},
		params,
        data
	})
}

3、页面发送请求

        下载导出需要安装file-saver插件

        1、npm install file-saver --save

        2、npm install @types/file-saver --save-dev

import { getTask, importTask, exportTask } from '@/api/task/index'
import { saveAs } from 'file-saver'

// 普通请求
const getData = async () => {
    let params = {
        id: 1
    }
	const { code, data } = await getTask (params)
}
// 导入
const upload = () => {
	const formDates = new FormData()
	formDates.append('file', file)
	let parmas = {
		id: 1
	}
	importTask(parmas, formDates).then((res: any) => {
        
	})
}
// 导出
const export = () => {
	let parmas = {
		id: 1
	}
	exportTask (parmas).then((res: any) => {
		saveAs(res.data, `exportData.xlsx`)
	})
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值