axios.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import axios from 'axios';
  2. import config from './config';
  3. import Cookies from "js-cookie";
  4. import router from '@/router'
  5. import { Message } from 'element-ui'
  6. // 使用vuex做全局loading时使用
  7. // import store from '@/store'
  8. export default function $axios(options) {
  9. return new Promise((resolve, reject) => {
  10. const instance = axios.create({
  11. baseURL: config.baseUrl,
  12. timeout: 1000*60*10,
  13. // withCredentials: config.withCredentials
  14. })
  15. // request 拦截器
  16. instance.interceptors.request.use(
  17. config => {
  18. if((config.url.indexOf('/excel/v1/**')>=0) || (config.url.indexOf('excel/findOfflineExcel')>=0) ){
  19. config.responseType='arraybuffer';
  20. }
  21. let token = Cookies.get('token')
  22. // 1. 请求开始的时候可以结合 vuex 开启全屏 loading 动画
  23. // console.log(store.state.loading)
  24. // console.log('准备发送请求...')
  25. // 2. 带上token
  26. if (token) {
  27. // config.headers.token = token
  28. config.headers.Authorization = 'Bearer '+token
  29. } else {
  30. // 重定向到登录页面
  31. router.push('/login')
  32. }
  33. // 3. 根据请求方法,序列化传来的参数,根据后端需求是否序列化
  34. if (config.method === 'post') {
  35. // if (config.data.__proto__ === FormData.prototype
  36. // || config.url.endsWith('path')
  37. // || config.url.endsWith('mark')
  38. // || config.url.endsWith('patchs')
  39. // ) {
  40. // } else {
  41. // config.data = qs.stringify(config.data)
  42. // }
  43. }
  44. return config
  45. },
  46. error => {
  47. // 请求错误时
  48. // 1. 判断请求超时
  49. if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
  50. this.$message.error("请求超时");
  51. // return service.request(originalRequest);// 再重复请求一次
  52. }
  53. // 2. 需要重定向到错误页面
  54. const errorInfo = error.response
  55. if (errorInfo) {
  56. error = errorInfo.data // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
  57. const errorStatus = errorInfo.status; // 404 403 500 ...
  58. router.push({
  59. path: `/error/${errorStatus}`
  60. })
  61. }
  62. return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
  63. }
  64. )
  65. // response 拦截器
  66. instance.interceptors.response.use(
  67. response => {
  68. let data;
  69. // IE9时response.data是undefined,因此需要使用response.request.responseText(Stringify后的字符串)
  70. if (response.data == undefined) {
  71. data = JSON.parse(response.request.responseText)
  72. } else {
  73. data = response.data
  74. }
  75. if(response.data.code==401){
  76. Message({
  77. message: '登录信息已过期,请重新登录!!!',
  78. type: 'error',
  79. duration: 2000
  80. })
  81. Cookies.remove('token')
  82. Cookies.remove('user')
  83. router.push('/login')
  84. }
  85. // switch (response.data.code) {
  86. // case 400:
  87. // Message({
  88. // message: '请求错误',
  89. // type: 'error',
  90. // duration: 2000
  91. // })
  92. // break
  93. // case 401:
  94. // Message({
  95. // message: '登录信息已过期,请重新登录!!!',
  96. // type: 'error',
  97. // duration: 2000
  98. // })
  99. // Cookies.remove('token')
  100. // Cookies.remove('user')
  101. // router.push('/login')
  102. // break
  103. // case 403:
  104. // Message({
  105. // message: '拒绝访问',
  106. // type: 'error',
  107. // duration: 2000
  108. // })
  109. // break
  110. // case 404:
  111. // Message({
  112. // message: '请求地址出错',
  113. // type: 'error',
  114. // duration: 2000
  115. // })
  116. // break
  117. // case 408:
  118. // Message({
  119. // message: '请求超时',
  120. // type: 'error',
  121. // duration: 2000
  122. // })
  123. // break
  124. // case 500:
  125. // Message({
  126. // message: response.data.msg,
  127. // type: 'error',
  128. // duration: 2000
  129. // })
  130. // break
  131. // case 501:
  132. // Message({
  133. // message: '服务未实现',
  134. // type: 'error',
  135. // duration: 2000
  136. // })
  137. // break
  138. // case 502:
  139. // Message({
  140. // message: '网关错误',
  141. // type: 'error',
  142. // duration: 2000
  143. // })
  144. // break
  145. // case 503:
  146. // Message({
  147. // message: '服务不可用',
  148. // type: 'error',
  149. // duration: 2000
  150. // })
  151. // break
  152. // case 504:
  153. // Message({
  154. // message: '网关超时',
  155. // type: 'error',
  156. // duration: 2000
  157. // })
  158. // break
  159. // case 505:
  160. // Message({
  161. // message: 'HTTP版本不受支持',
  162. // type: 'error',
  163. // duration: 2000
  164. // })
  165. // break
  166. // default:
  167. // }
  168. // 根据返回的code值来做不同的处理
  169. switch (data.rc) {
  170. case 1:
  171. break;
  172. case 0:
  173. store.commit('changeState')
  174. default:
  175. }
  176. // 若不是正确的返回code,且已经登录,就抛出错误
  177. // const err = new Error(data.desc)
  178. // err.data = data
  179. // err.response = response
  180. // throw err
  181. return data
  182. },
  183. err => {
  184. if (err && err.response) {
  185. switch (err.response.status) {
  186. case 400:
  187. err.message = '请求错误'
  188. break
  189. case 401:
  190. err.message = '未授权,请登录'
  191. break
  192. case 403:
  193. err.message = '拒绝访问'
  194. break
  195. case 404:
  196. err.message = `请求地址出错: ${err.response.config.url}`
  197. break
  198. case 408:
  199. err.message = '请求超时'
  200. break
  201. case 500:
  202. err.message = '服务器内部错误'
  203. break
  204. case 501:
  205. err.message = '服务未实现'
  206. break
  207. case 502:
  208. err.message = '网关错误'
  209. break
  210. case 503:
  211. err.message = '服务不可用'
  212. break
  213. case 504:
  214. err.message = '网关超时'
  215. break
  216. case 505:
  217. err.message = 'HTTP版本不受支持'
  218. break
  219. default:
  220. err.message = '请求超时'
  221. }
  222. }
  223. return Promise.reject(err) // 返回接口返回的错误信息
  224. }
  225. )
  226. // 请求处理
  227. instance(options).then(res => {
  228. resolve(res)
  229. return false
  230. }).catch(error => {
  231. reject(error)
  232. })
  233. })
  234. }