1
0

request.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import Vue from 'vue';
  2. import axios from 'axios'
  3. import {Notification,MessageBox,Message,} from 'element-ui'
  4. import store from '@/store'
  5. import {getToken} from '@/utils/auth'
  6. import errorCode from '@/utils/errorCode'
  7. import {tansParams,blobValidate} from "@/utils/ruoyi";
  8. import cache from '@/plugins/cache'
  9. import {saveAs} from 'file-saver'
  10. // 是否显示重新登录
  11. export let isRelogin = {show: false};
  12. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  13. // 创建axios实例
  14. const service = axios.create({
  15. // axios中请求配置有baseURL选项,表示请求URL公共部分
  16. baseURL: process.env.VUE_APP_BASE_API,
  17. // 超时
  18. timeout: 2000000
  19. })
  20. // request拦截器
  21. service.interceptors.request.use(config => {
  22. Vue.prototype.$layer.loading({content:'请稍等!'});
  23. // 是否需要设置 token
  24. const isToken = (config.headers || {}).isToken === false
  25. // 是否需要防止数据重复提交
  26. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  27. if (getToken() && !isToken) {
  28. config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  29. }
  30. // get请求映射params参数
  31. if (config.method === 'get' && config.params) {
  32. let url = config.url + '?' + tansParams(config.params);
  33. url = url.slice(0, -1);
  34. config.params = {};
  35. config.url = url;
  36. }
  37. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  38. const requestObj = {
  39. url: config.url,
  40. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  41. time: new Date().getTime()
  42. }
  43. const sessionObj = cache.session.getJSON('sessionObj')
  44. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  45. cache.session.setJSON('sessionObj', requestObj)
  46. } else {
  47. cache.session.setJSON('sessionObj', requestObj)
  48. }
  49. }
  50. return config
  51. }, error => {
  52. console.log(error)
  53. Promise.reject(error)
  54. })
  55. // 响应拦截器
  56. service.interceptors.response.use(res => {
  57. setTimeout(() => {
  58. Vue.prototype.$layer.closeAll('loading');
  59. }, 500);
  60. // 未设置状态码则默认成功状态
  61. const code = res.data.code || 200;
  62. // 获取错误信息
  63. const msg = errorCode[code] || res.data.msg || errorCode['default']
  64. // 二进制数据则直接返回
  65. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  66. return res.data
  67. }
  68. if (code === 401) {
  69. if (!isRelogin.show) {
  70. isRelogin.show = true;
  71. MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', {
  72. confirmButtonText: '重新登录',
  73. cancelButtonText: '取消',
  74. type: 'warning'
  75. }).then(() => {
  76. isRelogin.show = false;
  77. store.dispatch('LogOut').then(() => {
  78. // location.href = '/admin/index';
  79. location.href = '/index';
  80. })
  81. }).catch(() => {
  82. isRelogin.show = false;
  83. });
  84. }
  85. return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  86. } else if (code === 500) {
  87. Message({
  88. message: msg,
  89. type: 'error'
  90. })
  91. return Promise.reject(new Error(msg))
  92. } else if (code !== 200) {
  93. Notification.error({
  94. title: '错误',
  95. message: msg
  96. })
  97. return Promise.reject('error')
  98. } else {
  99. return res.data
  100. }
  101. },
  102. error => {
  103. console.log('err' + error)
  104. setTimeout(() => {
  105. Vue.prototype.$layer.closeAll('loading');
  106. }, 500);
  107. let {message} = error;
  108. if (message == "Network Error") {
  109. message = "后端接口连接异常";
  110. } else if (message.includes("timeout")) {
  111. message = "系统接口请求超时";
  112. } else if (message.includes("Request failed with status code")) {
  113. message = "系统接口" + message.substr(message.length - 3) + "异常";
  114. }
  115. Message({message: message,type: 'error',duration: 5 * 1000})
  116. return Promise.reject(error)
  117. }
  118. )
  119. // 通用下载方法
  120. export function download(url, params, filename, config) {
  121. Notification.success({
  122. title: '提示',
  123. message: '开始下载...'
  124. })
  125. return service.post(url, params, {
  126. transformRequest: [(params) => {
  127. return tansParams(params)
  128. }],
  129. headers: {
  130. 'Content-Type': 'application/x-www-form-urlencoded'
  131. },
  132. responseType: 'blob',
  133. ...config
  134. }).then(async (data) => {
  135. const isLogin = await blobValidate(data);
  136. if (isLogin) {
  137. const blob = new Blob([data])
  138. saveAs(blob, filename)
  139. } else {
  140. const resText = await data.text();
  141. const rspObj = JSON.parse(resText);
  142. const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  143. Message.error(errMsg);
  144. }
  145. }).catch((r) => {
  146. console.error(r)
  147. Message.error('下载文件出现错误,请联系管理员!')
  148. })
  149. }
  150. // 通用下载方法
  151. export function fileDownload(url,fileName) {
  152. Notification.success({
  153. title: '提示',
  154. message: '开始下载...'
  155. })
  156. axios({
  157. url: url,
  158. method: 'GET',
  159. responseType: 'arraybuffer',
  160. onDownloadProgress: progressEvent => {
  161. const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
  162. console.log(percentCompleted); // 可以将进度显示在控制台或其他位置
  163. }
  164. }).then(response => {
  165. const blob = new Blob([response.data]);
  166. const link = document.createElement('a');
  167. link.href = URL.createObjectURL(blob);
  168. link.download =fileName;
  169. link.click();
  170. URL.revokeObjectURL(link.href);
  171. });
  172. }
  173. export default service