request.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import axios from 'axios'
  2. import {
  3. ElNotification,
  4. ElMessageBox,
  5. ElMessage,
  6. ElLoading
  7. } from 'element-plus'
  8. import {
  9. getToken
  10. } from '@/utils/auth'
  11. import errorCode from '@/utils/errorCode'
  12. import {
  13. tansParams,
  14. blobValidate
  15. } from '@/utils/ruoyi'
  16. import cache from '@/plugins/cache'
  17. import {
  18. saveAs
  19. } from 'file-saver'
  20. import useUserStore from '@/store/modules/user'
  21. let downloadLoadingInstance;
  22. // 是否显示重新登录
  23. export let isRelogin = {
  24. show: false
  25. };
  26. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  27. // 创建axios实例
  28. const service = axios.create({
  29. // axios中请求配置有baseURL选项,表示请求URL公共部分
  30. baseURL: import.meta.env.VITE_APP_BASE_API,
  31. // 超时
  32. timeout: 100000
  33. })
  34. // request拦截器
  35. service.interceptors.request.use(config => {
  36. // 是否需要设置 token
  37. const isToken = (config.headers || {}).isToken === false
  38. // 是否需要防止数据重复提交
  39. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  40. if (getToken() && !isToken) {
  41. config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  42. }
  43. // get请求映射params参数
  44. if (config.method === 'get' && config.params) {
  45. let url = config.url + '?' + tansParams(config.params);
  46. url = url.slice(0, -1);
  47. config.params = {};
  48. config.url = url;
  49. }
  50. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  51. const requestObj = {
  52. url: config.url,
  53. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  54. time: new Date().getTime()
  55. }
  56. const sessionObj = cache.session.getJSON('sessionObj')
  57. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  58. cache.session.setJSON('sessionObj', requestObj)
  59. } else {
  60. const s_url = sessionObj.url; // 请求地址
  61. const s_data = sessionObj.data; // 请求数据
  62. const s_time = sessionObj.time; // 请求时间
  63. const interval = 500; // 间隔时间(ms),小于此时间视为重复提交
  64. if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
  65. const message = '数据正在处理,请勿重复提交';
  66. // console.warn(`[${s_url}]: ` + message)
  67. console.log(s_url, '重复提交的url');
  68. return Promise.reject(new Error(message))
  69. } else {
  70. cache.session.setJSON('sessionObj', requestObj)
  71. }
  72. }
  73. }
  74. return config
  75. }, error => {
  76. console.log(error)
  77. Promise.reject(error)
  78. })
  79. // 响应拦截器
  80. service.interceptors.response.use(res => {
  81. // 未设置状态码则默认成功状态
  82. const code = res.data.code || 200;
  83. // 获取错误信息
  84. const msg = errorCode[code] || res.data.msg || errorCode['default']
  85. // 二进制数据则直接返回
  86. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  87. return res.data
  88. }
  89. if (code === 401) {
  90. if (!isRelogin.show) {
  91. isRelogin.show = true;
  92. ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
  93. confirmButtonText: '重新登录',
  94. cancelButtonText: '取消',
  95. type: 'warning'
  96. }).then(() => {
  97. isRelogin.show = false;
  98. useUserStore().logOut().then(() => {
  99. location.href = '/index';
  100. })
  101. }).catch(() => {
  102. isRelogin.show = false;
  103. });
  104. }
  105. return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  106. } else if (code === 500) {
  107. ElMessage({
  108. message: msg,
  109. type: 'error'
  110. })
  111. return Promise.reject(new Error(msg))
  112. } else if (code === 601) {
  113. ElMessage({
  114. message: msg,
  115. type: 'warning'
  116. })
  117. return Promise.reject(new Error(msg))
  118. } else if (code !== 200) {
  119. ElNotification.error({
  120. title: msg
  121. })
  122. return Promise.reject('error')
  123. } else {
  124. return Promise.resolve(res.data)
  125. }
  126. },
  127. error => {
  128. let {
  129. message
  130. } = error;
  131. if (message == "Network Error") {
  132. message = "后端接口连接异常";
  133. } else if (message.includes("timeout")) {
  134. message = "系统接口请求超时";
  135. } else if (message.includes("Request failed with status code")) {
  136. message = "系统接口" + message.substr(message.length - 3) + "异常";
  137. } else if (message.includes("java.lang.NoClassDefFoundError")) {
  138. message = '服务器部署中,请稍后再试'
  139. }
  140. ElMessage({
  141. message: message,
  142. type: 'error',
  143. duration: 5 * 1000
  144. })
  145. return Promise.reject(error)
  146. }
  147. )
  148. // 通用下载方法
  149. export function download(url, params, filename, config) {
  150. downloadLoadingInstance = ElLoading.service({
  151. text: "正在下载数据,请稍候",
  152. background: "rgba(0, 0, 0, 0.7)",
  153. })
  154. return service.post(url, params, {
  155. transformRequest: [(params) => {
  156. return tansParams(params)
  157. }],
  158. headers: {
  159. 'Content-Type': 'application/x-www-form-urlencoded'
  160. },
  161. responseType: 'blob',
  162. ...config
  163. }).then(async (data) => {
  164. const isLogin = await blobValidate(data);
  165. if (isLogin) {
  166. const blob = new Blob([data])
  167. saveAs(blob, filename)
  168. } else {
  169. const resText = await data.text();
  170. const rspObj = JSON.parse(resText);
  171. const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  172. ElMessage.error(errMsg);
  173. }
  174. downloadLoadingInstance.close();
  175. }).catch((r) => {
  176. console.error(r)
  177. ElMessage.error('下载文件出现错误,请联系管理员!')
  178. downloadLoadingInstance.close();
  179. })
  180. }
  181. export function get(url, params = {}) {
  182. return new Promise((resolve, reject) => {
  183. service.get(url, {
  184. params: params
  185. })
  186. .then(response => {
  187. setTimeout(() => {}, 500)
  188. resolve(response);
  189. }, err => {
  190. reject(err)
  191. })
  192. })
  193. }
  194. /**
  195. * 封装post请求
  196. * @param url
  197. * @param data
  198. * @returns {Promise}
  199. */
  200. export function post(url, data = {}, method) {
  201. return new Promise((resolve, reject) => {
  202. service({
  203. method: method || 'post',
  204. url: url,
  205. data: data,
  206. }).then(res => {
  207. resolve(res.data);
  208. }).catch(err => {
  209. reject(err)
  210. })
  211. })
  212. }
  213. export function postTwo(url, data = {}, method) {
  214. return new Promise((resolve, reject) => {
  215. service({
  216. method: method || "post",
  217. url: url,
  218. data: data,
  219. responseType: "blob",
  220. })
  221. .then((res) => {
  222. resolve(res);
  223. })
  224. .catch((err) => {
  225. reject(err);
  226. });
  227. });
  228. }
  229. export default service