| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- import axios from 'axios';
- import config from './config';
- import Cookies from "js-cookie";
- import router from '@/router'
- import { Message } from 'element-ui'
- // 使用vuex做全局loading时使用
- // import store from '@/store'
- export default function $axios(options) {
- return new Promise((resolve, reject) => {
- const instance = axios.create({
- baseURL: config.baseUrl,
- timeout: 1000*60*10,
- // withCredentials: config.withCredentials
- })
- // request 拦截器
- instance.interceptors.request.use(
- config => {
- if((config.url.indexOf('/excel/v1/**')>=0) || (config.url.indexOf('excel/findOfflineExcel')>=0) ){
- config.responseType='arraybuffer';
- }
-
- let token = Cookies.get('token')
- // 1. 请求开始的时候可以结合 vuex 开启全屏 loading 动画
- // console.log(store.state.loading)
- // console.log('准备发送请求...')
- // 2. 带上token
- if (token) {
- // config.headers.token = token
- config.headers.Authorization = 'Bearer '+token
- } else {
- // 重定向到登录页面
- router.push('/login')
- }
- // 3. 根据请求方法,序列化传来的参数,根据后端需求是否序列化
- if (config.method === 'post') {
- // if (config.data.__proto__ === FormData.prototype
- // || config.url.endsWith('path')
- // || config.url.endsWith('mark')
- // || config.url.endsWith('patchs')
- // ) {
- // } else {
- // config.data = qs.stringify(config.data)
- // }
- }
- return config
- },
- error => {
- // 请求错误时
- // 1. 判断请求超时
- if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
- this.$message.error("请求超时");
- // return service.request(originalRequest);// 再重复请求一次
- }
- // 2. 需要重定向到错误页面
- const errorInfo = error.response
- if (errorInfo) {
- error = errorInfo.data // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
- const errorStatus = errorInfo.status; // 404 403 500 ...
- router.push({
- path: `/error/${errorStatus}`
- })
- }
- return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
- }
- )
- // response 拦截器
- instance.interceptors.response.use(
- response => {
- let data;
- // IE9时response.data是undefined,因此需要使用response.request.responseText(Stringify后的字符串)
- if (response.data == undefined) {
- data = JSON.parse(response.request.responseText)
- } else {
- data = response.data
- }
- if(response.data.code==401){
- Message({
- message: '登录信息已过期,请重新登录!!!',
- type: 'error',
- duration: 2000
- })
- Cookies.remove('token')
- Cookies.remove('user')
- router.push('/login')
- }
-
- // switch (response.data.code) {
- // case 400:
- // Message({
- // message: '请求错误',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 401:
- // Message({
- // message: '登录信息已过期,请重新登录!!!',
- // type: 'error',
- // duration: 2000
- // })
- // Cookies.remove('token')
- // Cookies.remove('user')
- // router.push('/login')
- // break
- // case 403:
- // Message({
- // message: '拒绝访问',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 404:
- // Message({
- // message: '请求地址出错',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 408:
- // Message({
- // message: '请求超时',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 500:
- // Message({
- // message: response.data.msg,
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 501:
- // Message({
- // message: '服务未实现',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 502:
- // Message({
- // message: '网关错误',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 503:
- // Message({
- // message: '服务不可用',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 504:
- // Message({
- // message: '网关超时',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // case 505:
- // Message({
- // message: 'HTTP版本不受支持',
- // type: 'error',
- // duration: 2000
- // })
- // break
- // default:
- // }
- // 根据返回的code值来做不同的处理
- switch (data.rc) {
- case 1:
- break;
- case 0:
- store.commit('changeState')
- default:
- }
- // 若不是正确的返回code,且已经登录,就抛出错误
- // const err = new Error(data.desc)
- // err.data = data
- // err.response = response
- // throw err
- return data
- },
- err => {
- if (err && err.response) {
- switch (err.response.status) {
- case 400:
- err.message = '请求错误'
- break
- case 401:
- err.message = '未授权,请登录'
- break
- case 403:
- err.message = '拒绝访问'
- break
- case 404:
- err.message = `请求地址出错: ${err.response.config.url}`
- break
- case 408:
- err.message = '请求超时'
- break
- case 500:
- err.message = '服务器内部错误'
- break
- case 501:
- err.message = '服务未实现'
- break
- case 502:
- err.message = '网关错误'
- break
- case 503:
- err.message = '服务不可用'
- break
- case 504:
- err.message = '网关超时'
- break
- case 505:
- err.message = 'HTTP版本不受支持'
- break
- default:
- err.message = '请求超时'
- }
- }
- return Promise.reject(err) // 返回接口返回的错误信息
- }
- )
- // 请求处理
- instance(options).then(res => {
- resolve(res)
- return false
- }).catch(error => {
- reject(error)
- })
- })
- }
|