dbf78b94e86dae440e2cef9d2abb2882a635690b.svn-base 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. // let Base = 'http://192.168.2.113/kaiyou-dev'
  21. function headerUrl (url) {
  22. url = Base + url
  23. return url
  24. }
  25. // post请求头
  26. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  27. // request 请求拦截器
  28. axios.interceptors.request.use(
  29. config => {
  30. // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加
  31. // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
  32. // console.log(store);
  33. const token = store.state.token
  34. token && (config.headers.Authorization = token)
  35. return config
  36. },
  37. error => {
  38. return Promise.error(error)
  39. })
  40. // response 响应拦截器
  41. axios.interceptors.response.use(
  42. response => {
  43. if (response.status === 200) {
  44. return Promise.resolve(response)
  45. } else {
  46. return Promise.reject(response)
  47. }
  48. },
  49. // 服务状态码不是200的情况
  50. error => {
  51. console.log(error.response);
  52. if (error.response) {
  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. Toast({
  69. message: '登录过期,请重新登录',
  70. duration: 1000,
  71. forbidClick: true
  72. })
  73. localStorage.removeItem('token')
  74. store.commit('loginSuccess', null)
  75. // 跳转登录页面,并将要浏览的页面fullpath传过去,登录成功后跳转到要访问的页面
  76. setTimeout(() => {
  77. router.replace({
  78. path: '/login',
  79. query: {
  80. redirect: router.currentRoute.fullPath
  81. }
  82. })
  83. }, 1000)
  84. break
  85. // 404 请求不存在
  86. case 404:
  87. Toast({
  88. message: '网络请求不存在',
  89. duration: 1500,
  90. forbidClick: true
  91. })
  92. break
  93. // 其他错误直接抛出错误提示
  94. default:
  95. Toast({
  96. message: error.response.data.message,
  97. duration: 1500,
  98. forbidClick: true
  99. })
  100. }
  101. return Promise.reject(error.response)
  102. }
  103. }
  104. )
  105. export default {
  106. /**
  107. * get方法对应get请求
  108. * @param {String}url 请求地址
  109. * @param {Object}params 携带参数
  110. * @returns {Promise}
  111. */
  112. get (url, params) {
  113. return new Promise((resolve, reject) => {
  114. axios.get(headerUrl(url), {
  115. params
  116. })
  117. .then(res => {
  118. resolve(res)
  119. })
  120. .catch(err => {
  121. reject(err)
  122. })
  123. })
  124. },
  125. /**
  126. * post方法对应post请求
  127. * @param {String} url 请求地址
  128. * @param {Object} params 携带参数
  129. * @returns {Promise}
  130. */
  131. post (url, params) {
  132. return new Promise((resolve, reject) => {
  133. axios.post(headerUrl(url), qs.stringify(params))
  134. .then(res => {
  135. resolve(res)
  136. })
  137. .catch(err => {
  138. reject(err)
  139. })
  140. })
  141. }
  142. }