AxiosApi.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import axios from 'axios'
  2. import {Message, MessageBox} from 'element-ui'
  3. import db from '@/utils/localstorage'
  4. import {Base64} from 'js-base64';
  5. // 请求添加条件,如token
  6. axios.interceptors.request.use(config => {
  7. const isToken = config.headers['X-isToken'] === false ? config.headers['X-isToken'] : true;
  8. const token = db.get('TOKEN', '');
  9. if (token && isToken) {
  10. config.headers.token = 'Bearer ' + token;
  11. }
  12. // 转换多语言
  13. const langTips = {"en": "en_US", "zh": "zh_CN", "de": "de_DE"}
  14. // 多国语言
  15. config.headers.lang = langTips[db.get('LANGUAGE', '') || "zh"]
  16. config.headers.tenant = db.get('TENANT', '')
  17. const clientId = process.env.VUE_APP_CLIENT_ID;
  18. const clientSecret = process.env.VUE_APP_CLIENT_SECRET;
  19. config.headers['Authorization'] = `Basic ${Base64.encode(`${clientId}:${clientSecret}`)}`;
  20. return config
  21. },
  22. error => {
  23. return Promise.reject(error)
  24. }
  25. )
  26. // 接口返回处理
  27. axios.interceptors.response.use(
  28. response => {
  29. return response
  30. },
  31. error => {
  32. return Promise.reject(error)
  33. }
  34. )
  35. function handleError(error, reject, opts) {
  36. let isAlert = opts.custom ? opts.custom['isAlert'] : true;
  37. isAlert = isAlert === undefined ? true : isAlert;
  38. if (isAlert) {
  39. if (error.code === 'ECONNABORTED') {
  40. Message({
  41. message: '请求超时'
  42. })
  43. } else if (error.response && error.response.data) {
  44. // 回话失败,返回登录页面
  45. if(error.response.data.code == 40001 || error.response.data.code == 40000){
  46. window.location.hash = '/login'
  47. }
  48. if(error.response.data.msg){
  49. Message({
  50. message: error.response.data.msg
  51. })
  52. } else if(error.response.data.message){
  53. Message({
  54. message: error.response.data.message
  55. })
  56. }
  57. } else if (error.message) {
  58. Message({
  59. message: error.message
  60. })
  61. }
  62. }
  63. reject(error)
  64. }
  65. function handleSuccess(res, resolve, opts) {
  66. let isAlert = opts.custom ? opts.custom['isAlert'] : true;
  67. isAlert = isAlert === undefined ? true : isAlert;
  68. if (res.data.isError) {
  69. // 未登录
  70. if (res.data.code === 40000 || res.data.code === 40001
  71. || res.data.code === 40002 || res.data.code === 40003
  72. || res.data.code === 40005 || res.data.code === 40006
  73. || res.data.code === 40008
  74. ) {
  75. debugger
  76. MessageBox.alert(res.data.msg, '提醒', {
  77. confirmButtonText: '确定',
  78. callback: () => {
  79. window.location.hash = '/login'
  80. }
  81. })
  82. } else {
  83. if (isAlert) {
  84. Message.error(res.data.msg);
  85. }
  86. }
  87. }
  88. resolve(res)
  89. }
  90. // http请求
  91. const httpServer = (opts) => {
  92. // 公共参数
  93. const publicParams = {
  94. ts: Date.now()
  95. }
  96. // http默认配置
  97. const method = opts.method.toUpperCase()
  98. // baseURL
  99. // 开发环境: /api // 开发环境在 vue.config.js 中有 devServer.proxy 代理
  100. // 生产环境: http://IP:PORT/api // 生产环境中 代理失效, 故需要配置绝对路径
  101. const httpDefaultOpts = {
  102. method,
  103. baseURL: process.env.VUE_APP_PROD_REQUEST_DOMAIN_PREFIX + process.env.VUE_APP_BASE_API,
  104. url: opts.url,
  105. responseType: opts.responseType || '',
  106. timeout: 20000
  107. }
  108. if (opts['meta']) {
  109. httpDefaultOpts.headers = opts['meta']
  110. }
  111. const dataRequest = ['PUT', 'POST', 'PATCH']
  112. if (dataRequest.includes(method)) {
  113. httpDefaultOpts.data = opts.data || {}
  114. } else {
  115. httpDefaultOpts.params = {
  116. ...publicParams,
  117. ...(opts.data || {})
  118. }
  119. }
  120. // formData转换
  121. if (opts.formData) {
  122. httpDefaultOpts.transformRequest = [data => {
  123. const formData = new FormData()
  124. if (data) {
  125. Object.entries(data).forEach(item => {
  126. formData.append(item[0], item[1])
  127. })
  128. }
  129. return formData
  130. }]
  131. }
  132. const promise = new Promise((resolve, reject) => {
  133. axios(httpDefaultOpts).then(response => {
  134. handleSuccess(response, resolve, opts)
  135. }).catch(error => {
  136. handleError(error, reject, opts)
  137. })
  138. })
  139. return promise
  140. }
  141. export default httpServer