3a88a42e82b1f0cfb07174b365e9bd568cdf061b.svn-base 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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://g.a.cnscbv.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. const token = store.state.token
  32. token && (config.headers.Authorization = token)
  33. return config
  34. },
  35. error => {
  36. return Promise.error(error)
  37. })
  38. // response 响应拦截器
  39. axios.interceptors.response.use(
  40. response => {
  41. if (response.status === 200) {
  42. return Promise.resolve(response)
  43. } else {
  44. return Promise.reject(response)
  45. }
  46. },
  47. // 服务状态码不是200的情况
  48. error => {
  49. if (error.response.status) {
  50. switch (error.response.status) {
  51. // 401 未登录
  52. // 未登录则跳转登录页面,并携带当前页面的路径
  53. // 在登录成功后返回当前页面,这一步需要在登录页操作。
  54. case 401:
  55. router.replace({
  56. path: '/login',
  57. query: {redirect: router.currentRoute.fullPath}
  58. })
  59. break
  60. // 403 token过期
  61. // 登录过期对用户进行提示
  62. // 清除本地token和清空vuex中token对象
  63. // 跳转登录页面
  64. case 403:
  65. Toast({
  66. message: '登录过期,请重新登录',
  67. duration: 1000,
  68. forbidClick: true
  69. })
  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. Toast({
  85. message: '网络请求不存在',
  86. duration: 1500,
  87. forbidClick: true
  88. })
  89. break
  90. // 其他错误直接抛出错误提示
  91. default:
  92. Toast({
  93. message: error.response.data.message,
  94. duration: 1500,
  95. forbidClick: true
  96. })
  97. }
  98. return Promise.reject(error.response)
  99. }
  100. }
  101. )
  102. export default {
  103. /**
  104. * get方法对应get请求
  105. * @param {String}url 请求地址
  106. * @param {Object}params 携带参数
  107. * @returns {Promise}
  108. */
  109. get (url, params) {
  110. return new Promise((resolve, reject) => {
  111. axios.get(headerUrl(url), {
  112. params
  113. })
  114. .then(res => {
  115. resolve(res)
  116. })
  117. .catch(err => {
  118. reject(err)
  119. })
  120. })
  121. },
  122. /**
  123. * post方法对应post请求
  124. * @param {String} url 请求地址
  125. * @param {Object} params 携带参数
  126. * @returns {Promise}
  127. */
  128. post (url, params) {
  129. return new Promise((resolve, reject) => {
  130. axios.post(headerUrl(url), qs.stringify(params))
  131. .then(res => {
  132. resolve(res)
  133. })
  134. .catch(err => {
  135. reject(err)
  136. })
  137. })
  138. }
  139. }