request.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 = 1000; // 间隔时间(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. return Promise.reject(new Error(message))
  68. } else {
  69. cache.session.setJSON('sessionObj', requestObj)
  70. }
  71. }
  72. }
  73. return config
  74. }, error => {
  75. console.log(error)
  76. Promise.reject(error)
  77. })
  78. // 响应拦截器
  79. service.interceptors.response.use(res => {
  80. // 未设置状态码则默认成功状态
  81. const code = res.data.code || 200;
  82. // 获取错误信息
  83. const msg = errorCode[code] || res.data.msg || errorCode['default']
  84. // 二进制数据则直接返回
  85. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  86. return res.data
  87. }
  88. if (code === 401) {
  89. if (!isRelogin.show) {
  90. isRelogin.show = true;
  91. ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
  92. confirmButtonText: '重新登录',
  93. cancelButtonText: '取消',
  94. type: 'warning'
  95. }).then(() => {
  96. isRelogin.show = false;
  97. useUserStore().logOut().then(() => {
  98. location.href = '/index';
  99. })
  100. }).catch(() => {
  101. isRelogin.show = false;
  102. });
  103. }
  104. return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  105. } else if (code === 500) {
  106. ElMessage({
  107. message: msg,
  108. type: 'error'
  109. })
  110. return Promise.reject(new Error(msg))
  111. } else if (code === 601) {
  112. ElMessage({
  113. message: msg,
  114. type: 'warning'
  115. })
  116. return Promise.reject(new Error(msg))
  117. } else if (code !== 200) {
  118. ElNotification.error({
  119. title: msg
  120. })
  121. return Promise.reject('error')
  122. } else {
  123. return Promise.resolve(res.data)
  124. }
  125. },
  126. error => {
  127. let {
  128. message
  129. } = error;
  130. if (message == "Network Error") {
  131. message = "后端接口连接异常";
  132. } else if (message.includes("timeout")) {
  133. message = "系统接口请求超时";
  134. } else if (message.includes("Request failed with status code")) {
  135. message = "系统接口" + message.substr(message.length - 3) + "异常";
  136. }
  137. ElMessage({
  138. message: message,
  139. type: 'error',
  140. duration: 5 * 1000
  141. })
  142. return Promise.reject(error)
  143. }
  144. )
  145. // 通用下载方法
  146. export function download(url, params, filename, config) {
  147. downloadLoadingInstance = ElLoading.service({
  148. text: "正在下载数据,请稍候",
  149. background: "rgba(0, 0, 0, 0.7)",
  150. })
  151. return service.post(url, params, {
  152. transformRequest: [(params) => {
  153. return tansParams(params)
  154. }],
  155. headers: {
  156. 'Content-Type': 'application/x-www-form-urlencoded'
  157. },
  158. responseType: 'blob',
  159. ...config
  160. }).then(async (data) => {
  161. const isLogin = await blobValidate(data);
  162. if (isLogin) {
  163. const blob = new Blob([data])
  164. saveAs(blob, filename)
  165. } else {
  166. const resText = await data.text();
  167. const rspObj = JSON.parse(resText);
  168. const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  169. ElMessage.error(errMsg);
  170. }
  171. downloadLoadingInstance.close();
  172. }).catch((r) => {
  173. console.error(r)
  174. ElMessage.error('下载文件出现错误,请联系管理员!')
  175. downloadLoadingInstance.close();
  176. })
  177. }
  178. export function get(url, params = {}) {
  179. return new Promise((resolve, reject) => {
  180. service.get(url, {
  181. params: params
  182. })
  183. .then(response => {
  184. setTimeout(() => {}, 500)
  185. resolve(response);
  186. }, err => {
  187. reject(err)
  188. })
  189. })
  190. }
  191. /**
  192. * 封装post请求
  193. * @param url
  194. * @param data
  195. * @returns {Promise}
  196. */
  197. export function post(url, data = {}, method) {
  198. return new Promise((resolve, reject) => {
  199. console.log(method)
  200. service({
  201. method: method || 'post',
  202. url: url,
  203. data: data,
  204. }).then(res => {
  205. resolve(res.data);
  206. }).catch(err => {
  207. reject(err)
  208. })
  209. })
  210. }
  211. export default service