request.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import Vue from 'vue'
  2. import { Loading } from 'element-ui'
  3. import axios from 'axios'
  4. import store from '@/store'
  5. import router from '@/router'
  6. import Storage from '@/utils/storage'
  7. import https from 'https'
  8. import checkToken from '@/utils/checkToken'
  9. import { api } from '~/ui-domain'
  10. const qs = require('qs')
  11. // 创建axios实例
  12. const service = axios.create({
  13. baseURL: api.admin,
  14. timeout: 5000,
  15. httpsAgent: new https.Agent({
  16. rejectUnauthorized: false
  17. }),
  18. paramsSerializer: params => qs.stringify(params, { arrayFormat: 'repeat' })
  19. })
  20. // request拦截器
  21. service.interceptors.request.use(config => {
  22. // 如果是put/post请求,用qs.stringify序列化参数
  23. if (config.useMockApi && process.env.NODE_ENV === 'development') {
  24. // 开发环境使用mock api
  25. config.baseURL = api.mockApi
  26. }
  27. const is_put_post = config.method === 'put' || config.method === 'post'
  28. const is_json = config.headers['Content-Type'] === 'application/json'
  29. const is_form_data = Object.prototype.toString.call(config.data) === '[object FormData]'
  30. if (is_put_post && is_json) {
  31. config.data = JSON.stringify(config.data)
  32. }
  33. if (is_put_post && !is_json && !is_form_data) {
  34. config.data = qs.stringify(config.data, { arrayFormat: 'repeat' })
  35. }
  36. // uuid
  37. const uuid = Storage.getItem('admin_uuid')
  38. config.headers['uuid'] = uuid
  39. config.headers['AppType'] = 'Admin'
  40. /** 设置令牌 */
  41. let accessToken = Storage.getItem('admin_access_token')
  42. if (accessToken) {
  43. config.headers['Authorization'] = accessToken
  44. }
  45. // 如果是上传接口,不限制超时时间
  46. if (config.url === `${api.admin}/uploaders`) {
  47. config.timeout = 0
  48. }
  49. return config
  50. }, error => {
  51. Promise.reject(error)
  52. })
  53. // respone拦截器
  54. service.interceptors.response.use(
  55. async response => {
  56. await closeLoading(response)
  57. return response.data
  58. },
  59. async error => {
  60. await closeLoading(error)
  61. const error_response = error.response || {}
  62. const error_data = error_response.data || {}
  63. if (error_response.status === 403) {
  64. console.log(error_response.status);
  65. if (!Storage.getItem('admin_refresh_token')) return
  66. store.dispatch('fedLogoutAction')
  67. let to = Storage.getItem('admin_franchise') ? '/franchise/login' : '/login'
  68. window.location.replace(router.resolve(to).href)
  69. return
  70. }
  71. if (error.config.message !== false) {
  72. let _message = error.code === 'ECONNABORTED' ? '连接超时,请稍候再试!' : '网络错误,请稍后再试!'
  73. Vue.prototype.$message.error(error_data.message || _message)
  74. }
  75. return Promise.reject(error)
  76. }
  77. )
  78. /**
  79. * 关闭全局加载
  80. * 延迟200毫秒关闭,以免晃眼睛
  81. * @param target
  82. */
  83. const closeLoading = (target) => {
  84. if (!target.config.loading) return true
  85. return new Promise((resolve, reject) => {
  86. setTimeout(() => {
  87. target.config.loading.close()
  88. resolve()
  89. }, 200)
  90. })
  91. }
  92. export default function request(options) {
  93. if (options.needToken === false) return service(options)
  94. return new Promise((resolve, reject) => {
  95. checkToken(options).then(() => {
  96. service(options).then(resolve).catch(reject)
  97. })
  98. })
  99. }