1888545e713e0775c550df61699fbc4910d84b8f.svn-base 4.2 KB

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