109 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
| import axios from 'axios'
 | ||
| import { Message, MessageBox } from 'element-ui'
 | ||
| import store from '@/store'
 | ||
| import router from '@/router'
 | ||
| axios.defaults.withCredentials = false
 | ||
| const service = axios.create({
 | ||
|   baseURL: '/api',
 | ||
|   timeout: 2 * 360000, // request timeout
 | ||
|   withCredentials: false
 | ||
| })
 | ||
| 
 | ||
| // request interceptor
 | ||
| service.interceptors.request.use(
 | ||
|   config => {
 | ||
|     config.headers['Content-Type'] = 'application/json;charset=UTF-8'
 | ||
|     config.headers['Accept-Language'] = store.state.lang.language === 'en'?'en-US,en;q=0.5':'zh-CN,zh;q=0.9'
 | ||
|     console.log(config.headers)
 | ||
|     if (store.getters.token) {
 | ||
|       config.headers.Authorization = `Bearer ${store.getters.token}`
 | ||
|     }
 | ||
|     return config
 | ||
|   },
 | ||
|   error => {
 | ||
|     return Promise.reject(error)
 | ||
|   }
 | ||
| )
 | ||
| 
 | ||
| service.interceptors.response.use(
 | ||
|   response => {
 | ||
|     const res = response.data
 | ||
|     let fileReader = new FileReader();
 | ||
|     fileReader.onload = function() {
 | ||
|       try {
 | ||
|         let jsonData = JSON.parse(fileReader.result);  // 如果是普通对象数据,后台转换失败
 | ||
|         if (!jsonData.IsSuccess && jsonData.ErrorMessage) {
 | ||
|           MessageBox.confirm(jsonData.ErrorMessage,  {
 | ||
|             type: 'warning',
 | ||
|             showCancelButton: false,
 | ||
|             callback: action => {}
 | ||
|           })
 | ||
|           return Promise.reject(jsonData)
 | ||
|         }
 | ||
|       } catch (err) {   // 解析成对象失败,说明是正常的文件流
 | ||
|         let contentDisposition = response.headers['content-disposition']
 | ||
|         let fileName = ''
 | ||
|         if (contentDisposition) {
 | ||
|           fileName = contentDisposition.split('; ')[2].split('=')[1].split("\'")[2]
 | ||
|           fileName = decodeURI(fileName)
 | ||
|         }
 | ||
|         const a = document.createElement('a')
 | ||
|         // xls类型: application/vnd.ms-excel
 | ||
|         // xlsx类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
 | ||
|         const href = URL.createObjectURL(new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' }))
 | ||
|         a.download = fileName
 | ||
|         a.href = href
 | ||
|         a.click()
 | ||
|         URL.revokeObjectURL(href)
 | ||
|         return Promise.resolve(res)
 | ||
|       }
 | ||
|     };
 | ||
|     fileReader.readAsText(res)
 | ||
|   },
 | ||
|   error => {
 | ||
|     var message = ''
 | ||
|     if (error && error.response) {
 | ||
|       const status = error.response.status
 | ||
|       switch (status) {
 | ||
|         case 400: message = store.state.lang.language === 'en'? 'Request error' : '请求错误'; break
 | ||
|         case 401: message = store.state.lang.language === 'en'? 'Not authorized or login timed out. Please log in again.' : '未授权或登陆超时,请重新登录'; break
 | ||
|         case 403: message = error.response.data.ErrorMessage; break
 | ||
|         case 404: message = store.state.lang.language === 'en'? 'Request address error' : `请求地址出错`; break
 | ||
|         case 405: message = store.state.lang.language === 'en'? 'Interface parameter error or request method inconsistency' : `接口参数传递错误,或者请求方法不一致`; break
 | ||
|         case 408: message = store.state.lang.language === 'en'? 'Request timed out' : '请求超时'; break
 | ||
|         case 429: message = store.state.lang.language === 'en'? 'The application service limits the traffic. Your requests are too frequent. Please try again later.' : '应用服务限流,您的请求过于频繁,请稍后再试'; break
 | ||
|         case 500: message = store.state.lang.language === 'en'? 'Internal server error, and unable to complete the request. Software release might be in process. Please contact the administrator.' : '服务器内部错误,无法完成请求;可能正在发布中,请联系管理员处理'; break
 | ||
|         case 501: message = store.state.lang.language === 'en'? 'Service has not been implemented.' : '服务未实现'; break
 | ||
|         case 502: message = store.state.lang.language === 'en'? 'System is being upgraded. Please wait patiently.' : '系统正在升级,请耐心等待。'; break
 | ||
|         case 503: message = store.state.lang.language === 'en'? 'Service is not available' : '服务不可用'; break
 | ||
|         case 504: message = store.state.lang.language === 'en'? 'Gateway timed out' : '网关超时'; break
 | ||
|         case 505: message = store.state.lang.language === 'en'? 'HTTP version is not supported' : 'HTTP版本不受支持'; break
 | ||
|         default: break
 | ||
|       }
 | ||
|       if (error.response.status === 401) {
 | ||
|         if (store.getters.token) {
 | ||
|           Message({
 | ||
|             message: message,
 | ||
|             type: 'warning',
 | ||
|             showClose: true
 | ||
|           })
 | ||
|           store.dispatch('user/logout').then(() => {
 | ||
|             router.push(`/login`)
 | ||
|           })
 | ||
|         }
 | ||
|       } else {
 | ||
|         MessageBox.confirm(message, '警告', {
 | ||
|           type: 'warning',
 | ||
|           showCancelButton: false,
 | ||
|           confirmButtonText: '确定',
 | ||
|           callback: action => {}
 | ||
|         })
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     return Promise.reject(new Error(message || 'Error'))
 | ||
|   }
 | ||
| )
 | ||
| 
 | ||
| export default service
 |