request.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import axios from 'axios'
  2. import router from "@/router";
  3. import {Message, Loading} from 'element-ui'
  4. import {removeAll, getToken} from '@/utils/auth'
  5. import cqcyCode from '@/utils/cqcyCode'
  6. import {tansParams, blobValidate} from "@/utils/cqcy";
  7. import cache from '@/plugins/cache'
  8. import {saveAs} from 'file-saver'
  9. import Vue from "vue";
  10. Vue.prototype.$http = axios
  11. let downloadLoadingInstance;
  12. // 是否显示重新登录
  13. export let isRelogin = {show: false};
  14. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  15. // 创建axios实例
  16. const service = axios.create({
  17. // axios中请求配置有baseURL选项,表示请求URL公共部分
  18. baseURL: cqcyCode['protocol'] + cqcyCode['host'] + ':' + cqcyCode['port'],
  19. // 超时
  20. timeout: 30000
  21. })
  22. // request拦截器
  23. service.interceptors.request.use(config => {
  24. // 是否需要设置 token
  25. const isToken = (config.headers || {}).isToken === false
  26. // 是否需要防止数据重复提交
  27. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  28. if (getToken() && !isToken) {
  29. config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  30. config.headers['token'] = getToken()
  31. }
  32. let sysHost = localStorage.getItem('SYS_HOST')
  33. if (sysHost) {
  34. config.baseURL = sysHost
  35. }
  36. console.log(config.baseURL)
  37. // get请求映射params参数
  38. if (config.method === 'get' && config.params) {
  39. let url = config.url + '?' + tansParams(config.params);
  40. url = url.slice(0, -1);
  41. config.params = {};
  42. config.url = url;
  43. }
  44. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  45. const requestObj = {
  46. url: config.url,
  47. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  48. time: new Date().getTime()
  49. }
  50. const sessionObj = cache.session.getJSON('sessionObj')
  51. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  52. try {
  53. cache.session.setJSON('sessionObj', requestObj)
  54. } catch (e) {}
  55. } else {
  56. const s_url = sessionObj.url; // 请求地址
  57. const s_data = sessionObj.data; // 请求数据
  58. const s_time = sessionObj.time; // 请求时间
  59. const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
  60. if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
  61. const message = cqcyCode[901];
  62. console.warn(`[${s_url}]: ` + message)
  63. return Promise.reject(new Error(message))
  64. } else {
  65. try {
  66. cache.session.setJSON('sessionObj', requestObj)
  67. } catch (e) {}
  68. }
  69. }
  70. }
  71. return config
  72. }, error => {
  73. console.log(error)
  74. Promise.reject(error)
  75. })
  76. // 响应拦截器
  77. service.interceptors.response.use(res => {
  78. // 未设置状态码则默认成功状态
  79. const code = res.data.code || 200
  80. // 获取错误信息
  81. const msg = cqcyCode[code] || res.data.msg || cqcyCode['default']
  82. // 二进制数据则直接返回
  83. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  84. return res.data
  85. }
  86. if (code === 401 || code === 403) {
  87. // if (!isRelogin.show) {
  88. // isRelogin.show = true
  89. // let tips = code === 401 ? '登录状态已过期,请重新登录' : res.data.msg
  90. // MessageBox.alert(tips, '系统提示', {
  91. // confirmButtonText: '确定',
  92. // showClose: false
  93. // }).then(r => {
  94. // isRelogin.show = false
  95. // removeAll()
  96. // router.push({path: '/', query: {}})
  97. // window.location.reload()
  98. // // logout().then(res => {
  99. // // removeAll()
  100. // // // location.href = '/index'
  101. // // router.push({path: '/', query: {}})
  102. // // window.location.reload()
  103. // // });
  104. // })
  105. // return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  106. // }
  107. setTimeout(() => {
  108. removeAll()
  109. router.push({path: '/', query: {}})
  110. window.location.reload()
  111. }, 2000)
  112. let tips = code === 401 ? '登录状态已过期,请重新登录' : res.data.msg
  113. return Promise.reject(tips)
  114. } else if (code === 500) {
  115. return Promise.reject(new Error(msg))
  116. } else if (code !== 200) {
  117. return Promise.reject(new Error(res.data.msg))
  118. } else {
  119. return res.data
  120. }
  121. },
  122. error => {
  123. let {message} = error;
  124. if (message == "Network Error") {
  125. message = cqcyCode[904];
  126. } else if (message.includes("timeout")) {
  127. message = cqcyCode[905];
  128. } else if (message.includes("Request failed with status code")) {
  129. message = "系统接口" + message.substr(message.length - 3) + "异常";
  130. } else {
  131. message = '网络错误,请稍候再试!'
  132. }
  133. // Message({
  134. // message: message,
  135. // type: 'error',
  136. // duration: 5 * 1000
  137. // })
  138. console.warn(message)
  139. return Promise.reject(message)
  140. }
  141. )
  142. // 通用下载方法
  143. export function download(url, params, filename, config) {
  144. downloadLoadingInstance = Loading.service({
  145. text: cqcyCode[903],
  146. spinner: "el-icon-loading",
  147. background: "rgba(0, 0, 0, 0.7)",
  148. })
  149. return service.post(url, params, {
  150. transformRequest: [(params) => {
  151. return tansParams(params)
  152. }],
  153. headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  154. responseType: 'blob',
  155. ...config
  156. }).then(async (data) => {
  157. const isLogin = await blobValidate(data);
  158. if (isLogin) {
  159. const blob = new Blob([data])
  160. saveAs(blob, filename)
  161. } else {
  162. const resText = await data.text();
  163. const rspObj = JSON.parse(resText);
  164. const errMsg = cqcyCode[rspObj.code] || rspObj.msg || cqcyCode['default']
  165. Message.error(errMsg);
  166. }
  167. downloadLoadingInstance.close();
  168. }).catch((r) => {
  169. console.error(r)
  170. Message.error(cqcyCode[902])
  171. downloadLoadingInstance.close();
  172. })
  173. }
  174. export default service