http.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import axios from "axios";
  2. import router from "../router";
  3. import { Message } from 'element-ui';
  4. let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
  5. let cancelToken = axios.CancelToken;
  6. let removePending = (ever) => {
  7. for(let p in pending) {
  8. if(pending[p].u === ever.url + '&' + ever.method) { //当当前请求在数组中存在时执行函数体
  9. pending[p].f(); //执行取消操作
  10. pending.splice(p, 1); //把这条记录从数组中移除
  11. }
  12. }
  13. }
  14. // 创建axios实例
  15. var instance = axios.create({
  16. timeout: 1000 * 12,
  17. baseURL: 'http://120.27.234.126:8010'
  18. })
  19. // 请求拦截器
  20. instance.interceptors.request.use(
  21. config => {
  22. // 登录流程控制中,根据本地是否存在token判断用户的登录情况
  23. // 但是即使token存在,也有可能token是过期的,所以在每次的请求头中携带token
  24. // 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码
  25. // 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。
  26. const token = localStorage.getItem('accessToken')
  27. const lastFarmId = Number(localStorage.getItem('lastFarmId'));
  28. token && (config.headers.accessToken = token)
  29. removePending(config); //在一个ajax发送前执行一下取消操作
  30. config.cancelToken = new cancelToken((c)=>{
  31. // 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式
  32. pending.push({ u: config.url + '&' + config.method, f: c });
  33. });
  34. let data = config.data || config.params || {}
  35. data.farmId = lastFarmId
  36. return config
  37. },
  38. error => Promise.error(error)
  39. )
  40. // 响应拦截器
  41. instance.interceptors.response.use(
  42. // 请求成功
  43. res => res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res),
  44. // 请求失败
  45. error => {
  46. const { response } = error;
  47. if (response) {
  48. errorHandle(response.status, response.data.message);
  49. return Promise.reject(response);
  50. }
  51. }
  52. )
  53. /**
  54. * 跳转登录页
  55. * 携带当前页面路由,以期在登录页面完成登录后返回当前页面
  56. */
  57. const toLogin = () => {
  58. let path = '/';
  59. if(router.currentRoute.fullPath.indexOf('login') === -1) {
  60. path = router.currentRoute.fullPath
  61. }
  62. router.replace({
  63. path: '/login',
  64. query: {
  65. redirect: path
  66. }
  67. });
  68. }
  69. /**
  70. * 请求失败后的错误统一处理
  71. * @param {Number} status 请求失败的状态码
  72. */
  73. const errorHandle = (status, other) => {
  74. // 状态码判断
  75. switch (status) {
  76. // 401: 未登录状态,跳转登录页
  77. case 401:
  78. toLogin();
  79. break;
  80. // 403 token过期
  81. // 清除token并跳转登录页
  82. case 403:
  83. Message.error('登录过期,请重新登录');
  84. localStorage.removeItem('accessToken');
  85. localStorage.removeItem('UserName');
  86. localStorage.removeItem('UserId');
  87. setTimeout(() => {
  88. toLogin();
  89. }, 1000);
  90. break;
  91. // 404请求不存在
  92. case 404:
  93. Message.error('请求的资源不存在');
  94. break;
  95. case 500:
  96. Message.error('请求失败,请联系管理员');
  97. break;
  98. default:
  99. console.log(other);
  100. }}
  101. export default instance