axios.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import axios from 'axios'
  2. import router from '../router'
  3. import errorCode from '@/utils/errorCode'
  4. import {
  5. tansParams,
  6. blobValidate
  7. } from '@/utils/ruoyi'
  8. import cache from '@/utils/cache'
  9. import {
  10. showLoadingToast,
  11. closeToast,
  12. showNotify,
  13. showFailToast
  14. } from 'vant';
  15. import {
  16. getToken
  17. } from '@/utils/auth'
  18. import CryptoJS from 'crypto-js'
  19. // 是否显示重新登录
  20. export let isRelogin = {
  21. show: false
  22. };
  23. import 'vant/lib/index.css'
  24. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  25. // 创建axios实例
  26. const service = axios.create({
  27. baseURL: process.env.VUE_APP_BASE_API,
  28. // 超时
  29. timeout: 20000
  30. })
  31. function generateRandomString(length) {
  32. var result = '';
  33. var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  34. var charactersLength = characters.length;
  35. for (var i = 0; i < length; i++) {
  36. result += characters.charAt(Math.floor(Math.random() * charactersLength));
  37. }
  38. return result;
  39. }
  40. // request拦截器
  41. service.interceptors.request.use(config => {
  42. // 是否需要设置 token
  43. const isToken = (config.headers || {}).isToken === false
  44. // 是否需要防止数据重复提交
  45. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  46. if (getToken() || !isToken) {
  47. // config.headers['Authorization'] = 'Bearer ' + getToken()// 让每个请求携带自定义token 请根据实际情况自行修改
  48. // 待加密的数据
  49. let randomNumber = generateRandomString(20)
  50. //后面加20位随机数
  51. let data = getToken() + new Date().getTime() + randomNumber;
  52. // 密钥,注意:密钥长度必须为16, 24, 32字节对应AES-128, AES-192, AES-256
  53. let key = CryptoJS.enc.Utf8.parse('N[9f%2gKyo7(GNv3');
  54. // AES加密
  55. let encrypted = CryptoJS.AES.encrypt(data, key, {
  56. mode: CryptoJS.mode.ECB,
  57. padding: CryptoJS.pad.Pkcs7
  58. });
  59. config.headers['Authorization'] = encrypted // 让每个请求携带自定义token 请根据实际情况自行修改
  60. config.headers['randomNumber'] = randomNumber
  61. }
  62. if (config.url === 'https://winfaster.obs.cn-south-1.myhuaweicloud.com') {
  63. config.headers['Content-Type'] = 'multipart/form-data'
  64. }
  65. // get请求映射params参数
  66. if (config.method === 'get' && config.params) {
  67. let url = config.url + '?' + tansParams(config.params);
  68. url = url.slice(0, -1);
  69. config.params = {};
  70. config.url = url;
  71. }
  72. if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
  73. const requestObj = {
  74. url: config.url,
  75. data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
  76. time: new Date().getTime()
  77. }
  78. const sessionObj = cache.session.getJSON('sessionObj')
  79. if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
  80. cache.session.setJSON('sessionObj', requestObj)
  81. } else {
  82. const s_url = sessionObj.url; // 请求地址
  83. const s_data = sessionObj.data; // 请求数据
  84. const s_time = sessionObj.time; // 请求时间
  85. const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
  86. if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
  87. const message = '数据正在处理,请勿重复提交';
  88. console.warn(`[${s_url}]: ` + message)
  89. return Promise.reject(new Error(message))
  90. } else {
  91. cache.session.setJSON('sessionObj', requestObj)
  92. }
  93. }
  94. }
  95. return config
  96. }, error => {
  97. Promise.reject(error)
  98. })
  99. // 响应拦截器
  100. service.interceptors.response.use(res => {
  101. // 未设置状态码则默认成功状态
  102. const code = res.data.code || 200;
  103. // 获取错误信息
  104. const msg = errorCode[code] || res.data.msg || errorCode['default']
  105. // 二进制数据则直接返回
  106. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  107. return res.data
  108. }
  109. if (code === 401) {
  110. showFailToast('登录失效,请重新登录');
  111. console.log(router)
  112. localStorage.clear()
  113. router.push({
  114. path: '/?id=$CORPID$'
  115. })
  116. return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  117. } else if (code === 500) {
  118. setTimeout(() => {
  119. showFailToast(msg);
  120. }, 500);
  121. //ElMessage({ message: msg, type: 'error' })
  122. return Promise.reject(new Error(msg))
  123. } else if (code === 601) {
  124. //ElMessage({ message: msg, type: 'warning' })
  125. return Promise.reject(new Error(msg))
  126. } else if (code !== 200) {
  127. ElNotification.error({
  128. title: msg
  129. })
  130. return Promise.reject('error')
  131. } else {
  132. return Promise.resolve(res.data)
  133. }
  134. },
  135. error => {
  136. let {
  137. message
  138. } = error;
  139. if (message == "Network Error") {
  140. message = "后端接口连接异常";
  141. } else if (message.includes("timeout")) {
  142. message = "系统接口请求超时";
  143. } else if (message.includes("Request failed with status code")) {
  144. message = "系统接口" + message.substr(message.length - 3) + "异常";
  145. }
  146. //ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
  147. return Promise.reject(error)
  148. }
  149. )
  150. export function get(url, params = {}) {
  151. return new Promise((resolve, reject) => {
  152. if (!params.closeLoading) {
  153. showLoadingToast({
  154. message: '加载中...',
  155. forbidClick: true,
  156. duration: 0,
  157. });
  158. }
  159. service.get(url, {
  160. params: params
  161. })
  162. .then(response => {
  163. setTimeout(() => {
  164. closeToast()
  165. }, 800)
  166. resolve(response);
  167. }, err => {
  168. reject(err)
  169. })
  170. })
  171. }
  172. /**
  173. * 封装post请求
  174. * @param url
  175. * @param data
  176. * @returns {Promise}
  177. */
  178. export function post(url, data = {}, method = 'post', headers = {}) {
  179. return new Promise((resolve, reject) => {
  180. if (!data.closeLoading) {
  181. showLoadingToast({
  182. message: '加载中...',
  183. forbidClick: true,
  184. duration: 0,
  185. });
  186. }
  187. service({
  188. method: method,
  189. url: url,
  190. data: data,
  191. headers: {
  192. ...headers
  193. }
  194. }).then(res => {
  195. setTimeout(() => {
  196. closeToast()
  197. }, 800)
  198. resolve(res);
  199. }).catch(err => {
  200. reject(err)
  201. setTimeout(() => {
  202. closeToast()
  203. }, 800)
  204. })
  205. })
  206. }
  207. export default service