http.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // 封装axios请求
  2. /**axios封装
  3. * 请求拦截、相应拦截、错误统一处理
  4. */
  5. import axios from 'axios';
  6. import QS from 'qs';
  7. import store from '../store/index'
  8. import { Message, Loading } from 'element-ui'
  9. import { basePath, logFlag } from '@/config/env'
  10. import router from '../router/index'
  11. // 环境的切换
  12. if (process.env.NODE_ENV == 'development') {
  13. axios.defaults.baseURL = '/api';
  14. } else if (process.env.NODE_ENV == 'debug') {
  15. axios.defaults.baseURL = '';
  16. } else if (process.env.NODE_ENV == 'production') {
  17. axios.defaults.baseURL = 'http://api.123dailu.com/';
  18. }
  19. // 请求超时时间
  20. axios.defaults.timeout = 10000;
  21. // post请求头
  22. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  23. console.log(store.state.comVal.token, 'this.$store.state.comVal.token111', localStorage.getItem('token'));
  24. axios.defaults.headers.post['token'] = localStorage.getItem('token') || store.state.comVal.token;
  25. axios.defaults.headers.get['token'] = localStorage.getItem('token') || store.state.comVal.token;
  26. // 请求拦截器
  27. axios.interceptors.request.use(
  28. config => {
  29. // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
  30. // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
  31. const token = localStorage.getItem('token');
  32. if (!token) {
  33. router.push('/login')
  34. }
  35. token && (config.headers.Authorization = token);
  36. return config;
  37. },
  38. error => {
  39. return Promise.error(error);
  40. })
  41. // 响应拦截器
  42. axios.interceptors.response.use(
  43. response => {
  44. if (response.status === 200) {
  45. return Promise.resolve(response);
  46. } else {
  47. return Promise.reject(response);
  48. }
  49. },
  50. // 服务器状态码不是200的情况
  51. error => {
  52. if (error.response.status) {
  53. switch (error.response.status) {
  54. // 401: 未登录
  55. // 未登录则跳转登录页面,并携带当前页面的路径
  56. // 在登录成功后返回当前页面,这一步需要在登录页操作。
  57. case 401:
  58. router.replace({
  59. path: '/login',
  60. query: { redirect: router.currentRoute.fullPath }
  61. });
  62. break;
  63. // 403 token过期
  64. // 登录过期对用户进行提示
  65. // 清除本地token和清空vuex中token对象
  66. // 跳转登录页面
  67. case 403:
  68. this.$message.error('登录过期,请重新登录');
  69. // 清除token
  70. localStorage.removeItem('token');
  71. store.commit('loginSuccess', null);
  72. // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
  73. setTimeout(() => {
  74. router.replace({
  75. path: '/login',
  76. query: {
  77. redirect: router.currentRoute.fullPath
  78. }
  79. });
  80. }, 1000);
  81. break;
  82. // 404请求不存在
  83. case 404:
  84. this.$message.error('网络请求不存在');
  85. break;
  86. // 其他错误,直接抛出错误提示
  87. default:
  88. this.$message.error(error.response.data.message);
  89. }
  90. return Promise.reject(error.response);
  91. }
  92. }
  93. )
  94. let reqUrl = ''
  95. /**
  96. * get方法,对应get请求
  97. * @param {String} url [请求的url地址]
  98. * @param {Object} params [请求时携带的参数]
  99. */
  100. function get (url, params) {
  101. if (!axios.defaults.headers.get['token']) {
  102. axios.defaults.headers.get['token'] = localStorage.getItem('token') || store.state.comVal.token;
  103. }
  104. reqUrl = basePath + url
  105. return new Promise((resolve, reject) => {
  106. axios.get(reqUrl, {
  107. params: params
  108. })
  109. .then(res => {
  110. if (res.data.code != 200 && localStorage.getItem('token')) {
  111. Message({
  112. message: res.data.msg,
  113. type: 'error'
  114. });
  115. }
  116. console.log(res.data);
  117. resolve(res.data);
  118. })
  119. .catch(err => {
  120. reject(err.data)
  121. })
  122. });
  123. }
  124. /**
  125. * post方法,对应post请求
  126. * @param {String} url [请求的url地址]
  127. * @param {Object} params [请求时携带的参数]
  128. */
  129. function post (url, params) {
  130. if (!axios.defaults.headers.post['token']) {
  131. axios.defaults.headers.post['token'] = localStorage.getItem('token') || store.state.comVal.token;
  132. }
  133. reqUrl = basePath + url
  134. return new Promise((resolve, reject) => {
  135. axios.post(reqUrl, QS.stringify(params))
  136. .then(res => {
  137. console.log(res, 'resres');
  138. if (res.data.code != 200 && localStorage.getItem('token')) {
  139. Message({
  140. message: res.data.msg,
  141. type: 'error'
  142. });
  143. }
  144. resolve(res.data);
  145. })
  146. .catch(err => {
  147. console.log(err, 'errerrerr');
  148. reject(err.data)
  149. })
  150. });
  151. }
  152. export default () => {
  153. if (typeof window.$http == 'undefined') {
  154. window.$http = {
  155. post: post,
  156. get: get
  157. }
  158. }
  159. }