request.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import axios from 'axios'
  2. import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'
  3. import errorCode from '@/utils/errorCode'
  4. import { tansParams, blobValidate } from '@/utils/ruoyi'
  5. import cache from '@/plugins/cache'
  6. import { saveAs } from 'file-saver'
  7. import {signatureGenerate} from "@/utils/signatureUtil"
  8. let downloadLoadingInstance;
  9. // 是否显示重新登录
  10. export let isRelogin = { show: false };
  11. // axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  12. // 创建axios实例
  13. const service = axios.create({
  14. // axios中请求配置有baseURL选项,表示请求URL公共部分
  15. baseURL: import.meta.env.VITE_APP_BASE_API,
  16. // 超时
  17. timeout: 30000
  18. })
  19. // request拦截器
  20. service.interceptors.request.use(config => {
  21. // 是否需要设置 token
  22. const isToken = (config.headers || {}).isToken === false
  23. // 是否需要防止数据重复提交
  24. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  25. if (localStorage.getItem("token725") && !isToken) {
  26. config.headers['Authorization'] = localStorage.getItem("token725") // 让每个请求携带自定义token 请根据实际情况自行修改
  27. }
  28. // get请求映射params参数
  29. if (config.method === 'get' && config.params) {
  30. let url = config.url + '?' + tansParams(config.params);
  31. url = url.slice(0, -1);
  32. config.params = {};
  33. config.url = url;
  34. }
  35. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  36. const requestObj = {
  37. url: config.url,
  38. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  39. time: new Date().getTime()
  40. }
  41. const sessionObj = cache.session.getJSON('sessionObj')
  42. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  43. cache.session.setJSON('sessionObj', requestObj)
  44. } else {
  45. const s_url = sessionObj.url; // 请求地址
  46. const s_data = sessionObj.data; // 请求数据
  47. const s_time = sessionObj.time; // 请求时间
  48. const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
  49. cache.session.setJSON('sessionObj', requestObj)
  50. }
  51. }
  52. config.headers['Content-Type'] = 'application/json;charset=utf-8'
  53. return config
  54. }, error => {
  55. Promise.reject(error)
  56. })
  57. // 响应拦截器
  58. service.interceptors.response.use(res => {
  59. console.log(res)
  60. // 未设置状态码则默认成功状态
  61. const code = res.data.code;
  62. if (code == 200) {
  63. return res.data
  64. } else {
  65. ElMessage({
  66. message: res.data.msg,
  67. type: 'error',
  68. duration: 5 * 1000
  69. })
  70. }
  71. },
  72. error => {
  73. let message = error?.response?.data?.msg || "";
  74. if (message == "Network Error") {
  75. message = "后端接口连接异常";
  76. } else if (message.includes("timeout")) {
  77. message = "系统接口请求超时";
  78. } else if (message.includes("Request failed with status code")) {
  79. message = "系统接口" + message.substr(message.length - 3) + "异常";
  80. }
  81. ElMessage({
  82. message: message,
  83. type: 'error',
  84. duration: 5 * 1000
  85. })
  86. return Promise.reject(error)
  87. }
  88. )
  89. /**
  90. * 通用下载方法(post类型有params、data两种方式)
  91. * @param {*接口地址} url
  92. * @param {*数据} data
  93. * @param {*文件名称} filename
  94. * @param {*请求方式} type
  95. * @param {*数据类型} dataFormat
  96. * @returns
  97. */
  98. export function download(url, data, filename, type, dataFormat) {
  99. downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
  100. return service[type](url, type == "post" ? data : {
  101. params: data,
  102. headers: { 'Content-Type': 'application/json; charset=utf-8' },
  103. responseType: 'blob'
  104. }, type == "post" && dataFormat == "params" ? {
  105. headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  106. responseType: 'blob',
  107. params: data
  108. } : type == "post" && dataFormat == "data" ? {
  109. headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  110. responseType: 'blob',
  111. data
  112. } : null).then(async(data) => {
  113. const isLogin = await blobValidate(data);
  114. if (isLogin) {
  115. const blob = new Blob([data])
  116. saveAs(blob, filename)
  117. } else {
  118. const resText = await data.text();
  119. const rspObj = JSON.parse(resText);
  120. const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  121. ElMessage.error(errMsg);
  122. }
  123. downloadLoadingInstance.close();
  124. }).catch((r) => {
  125. ElMessage.error('下载文件出现错误,请联系管理员!')
  126. downloadLoadingInstance.close();
  127. })
  128. }
  129. export default service