axios.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import axios from 'axios'
  2. import errorCode from '@/utils/errorCode'
  3. import { tansParams, blobValidate } from '@/utils/ruoyi'
  4. import cache from '@/utils/cache'
  5. import { showLoadingToast, closeToast,showNotify } from 'vant';
  6. import { getToken } from '@/utils/auth'
  7. // 是否显示重新登录
  8. export let isRelogin = { show: false };
  9. import 'vant/lib/index.css'
  10. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  11. // 创建axios实例
  12. const service = axios.create({
  13. // axios中请求配置有baseURL选项,表示请求URL公共部分
  14. baseURL: 'test-api',
  15. // 超时
  16. timeout: 10000
  17. })
  18. // request拦截器
  19. service.interceptors.request.use(config => {
  20. // 是否需要设置 token
  21. const isToken = (config.headers || {}).isToken === false
  22. // 是否需要防止数据重复提交
  23. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  24. if ( getToken() || !isToken) {
  25. config.headers['Authorization'] = 'Bearer ' + getToken()// 让每个请求携带自定义token 请根据实际情况自行修改
  26. }
  27. // get请求映射params参数
  28. if (config.method === 'get' && config.params) {
  29. let url = config.url + '?' + tansParams(config.params);
  30. url = url.slice(0, -1);
  31. config.params = {};
  32. config.url = url;
  33. }
  34. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  35. const requestObj = {
  36. url: config.url,
  37. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  38. time: new Date().getTime()
  39. }
  40. const sessionObj = cache.session.getJSON('sessionObj')
  41. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  42. cache.session.setJSON('sessionObj', requestObj)
  43. } else {
  44. const s_url = sessionObj.url; // 请求地址
  45. const s_data = sessionObj.data; // 请求数据
  46. const s_time = sessionObj.time; // 请求时间
  47. const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
  48. if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
  49. const message = '数据正在处理,请勿重复提交';
  50. console.warn(`[${s_url}]: ` + message)
  51. return Promise.reject(new Error(message))
  52. } else {
  53. cache.session.setJSON('sessionObj', requestObj)
  54. }
  55. }
  56. }
  57. return config
  58. }, error => {
  59. Promise.reject(error)
  60. })
  61. // 响应拦截器
  62. service.interceptors.response.use(res => {
  63. // 未设置状态码则默认成功状态
  64. const code = res.data.code || 200;
  65. // 获取错误信息
  66. const msg = errorCode[code] || res.data.msg || errorCode['default']
  67. // 二进制数据则直接返回
  68. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  69. return res.data
  70. }
  71. if (code === 401) {
  72. if (!isRelogin.show) {
  73. isRelogin.show = true;
  74. // ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
  75. // isRelogin.show = false;
  76. // }).catch(() => {
  77. // isRelogin.show = false;
  78. // });
  79. }
  80. return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  81. } else if (code === 500) {
  82. showNotify({ type: 'danger', message: msg });
  83. //ElMessage({ message: msg, type: 'error' })
  84. return Promise.reject(new Error(msg))
  85. } else if (code === 601) {
  86. //ElMessage({ message: msg, type: 'warning' })
  87. return Promise.reject(new Error(msg))
  88. } else if (code !== 200) {
  89. ElNotification.error({ title: msg })
  90. return Promise.reject('error')
  91. } else {
  92. return Promise.resolve(res.data)
  93. }
  94. },
  95. error => {
  96. let { message } = error;
  97. if (message == "Network Error") {
  98. message = "后端接口连接异常";
  99. } else if (message.includes("timeout")) {
  100. message = "系统接口请求超时";
  101. } else if (message.includes("Request failed with status code")) {
  102. message = "系统接口" + message.substr(message.length - 3) + "异常";
  103. }
  104. //ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
  105. return Promise.reject(error)
  106. }
  107. )
  108. export function get(url, params = {}) {
  109. return new Promise((resolve, reject) => {
  110. if(!params.closeLoading) {
  111. showLoadingToast({
  112. message: '加载中...',
  113. forbidClick: true,
  114. duration: 0,
  115. });
  116. }
  117. service.get(url, { params: params })
  118. .then(response => {
  119. setTimeout(() => {
  120. closeToast()
  121. }, 500)
  122. resolve(response);
  123. }, err => {
  124. reject(err)
  125. })
  126. })
  127. }
  128. /**
  129. * 封装post请求
  130. * @param url
  131. * @param data
  132. * @returns {Promise}
  133. */
  134. export function post(url, data = {}, method = 'post',headers = {}) {
  135. return new Promise((resolve, reject) => {
  136. if(!data.closeLoading) {
  137. showLoadingToast({
  138. message: '加载中...',
  139. forbidClick: true,
  140. duration: 0,
  141. });
  142. }
  143. service({
  144. method: method,
  145. url: url,
  146. data: data,
  147. headers: {...headers}
  148. }).then(res => {
  149. closeToast()
  150. resolve(res);
  151. }).catch(err => {
  152. reject(err)
  153. closeToast()
  154. })
  155. })
  156. }
  157. export default service