lz il y a 3 ans
Parent
commit
a9f2448848
1 fichiers modifiés avec 64 ajouts et 74 suppressions
  1. 64 74
      src/utils/request.js

+ 64 - 74
src/utils/request.js

@@ -1,29 +1,46 @@
 import axios from 'axios'
-import { Notification, MessageBox, Loading } from 'element-ui'
+import { Notification, MessageBox } from 'element-ui'
 import store from '@/store'
 import { getToken } from '@/utils/auth'
 import errorCode from '@/utils/errorCode'
-import { tansParams, blobValidate } from '@/utils/tiegu'
-import { saveAs } from 'file-saver'
 
-let downloadLoadingInstance
+let pending = []
+let cancelToken = axios.CancelToken
+let removePending = (config) => {
+	for (let p in pending) {
+		let key = +p
+		let item = pending[key]
+		if (item.url === config.url && item.method === config.method && JSON.stringify(item.params) === JSON.stringify(config.params) && JSON.stringify(item.data) === JSON.stringify(config.data)) {
+			item.cancel('操作太频繁,请稍后再试')
+			pending.splice(item, 1)
+		}
+	}
+}
 
-axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
-// 创建axios实例
-const service = axios.create({
-	// axios中请求配置有baseURL选项,表示请求URL公共部分
-	baseURL: process.env.VUE_APP_BASE_API,
-	// 超时
-	timeout: 10000
+// axios 配置
+var instance = axios.create({
+	headers: {
+		'Content-Type': 'application/json;charset=UTF-8'
+	},
+	timeout: 1000 * 30, //请求超时时间
+	baseURL: process.env.VUE_APP_BASE_API, //请求默认地址
+	withCredentials: true //允许请求携带cookie信息
 })
 
-// request拦截器
-service.interceptors.request.use(
+instance.interceptors.request.use(
 	(config) => {
-		// 是否需要设置 token
-		const isToken = (config.headers || {}).isToken === false
-		if (getToken() && !isToken) {
-			config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+		removePending(config)
+		config.cancelToken = new cancelToken((c) => {
+			pending.push({
+				url: config.url,
+				method: config.method,
+				params: config.params,
+				data: config.data,
+				cancel: c
+			})
+		})
+		if (getToken()) {
+			config.headers['Authorization'] = 'Bearer ' + getToken()
 		}
 		// get请求映射params参数
 		if (config.method === 'get' && config.params) {
@@ -35,52 +52,44 @@ service.interceptors.request.use(
 		return config
 	},
 	(error) => {
-		console.log(error)
-		Promise.reject(error)
+		return Promise.reject(error)
 	}
 )
 
-// 响应拦截器
-service.interceptors.response.use(
-	(res) => {
-		// 未设置状态码则默认成功状态
-		const code = res.data.code || 200
-		// 获取错误信息
-		const msg = errorCode[code] || res.data.msg || errorCode['default']
-		// 二进制数据则直接返回
-		if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
-			return res.data
-		}
+instance.interceptors.response.use(
+	(response) => {
+		removePending(response.config)
+		const code = response.status || 200
+		const msg = errorCode[code] || response.data.msg || errorCode['default']
 		if (code === 401) {
 			MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
 				confirmButtonText: '重新登录',
 				cancelButtonText: '取消',
 				type: 'warning'
-			})
-				.then(() => {
-					store.dispatch('LogOut').then(() => {
-						location.href = '/index'
-					})
+			}).then(() => {
+				store.dispatch('LogOut').then(() => {
+					location.href = '/index'
 				})
-				.catch(() => {})
-			return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+			})
 		} else if (code === 500) {
-			Message({
+			Notification({
+				title: 'code500',
 				message: msg,
-				type: 'error'
+				type: 'error',
+				duration: 2000,
+				customClass: 'elemsg-notify'
 			})
 			return Promise.reject(new Error(msg))
+		} else if (code === 501) {
+			return { code: 501, data: {} }
 		} else if (code !== 200) {
-			Notification.error({
-				title: msg
-			})
-			return Promise.reject('error')
+			return { code: 0, data: {} }
 		} else {
-			return res.data
+			return response.data
 		}
 	},
 	(error) => {
-		console.log('err' + error)
+		console.log('err:' + error)
 		let { message } = error
 		if (message == 'Network Error') {
 			message = '后端接口连接异常'
@@ -88,16 +97,14 @@ service.interceptors.response.use(
 			message = '系统接口请求超时'
 		} else if (message.includes('Request failed with status code')) {
 			message = '系统接口' + message.substr(message.length - 3) + '异常'
+		} else if (error.includes('Cancel')) {
+			message = '操作太频繁,请稍后再试'
+		} else {
+			message = '系统错误,请联系管理员'
 		}
-		Message({
-			message: message,
-			type: 'error',
-			duration: 5 * 1000
-		})
-		return Promise.reject(error)
+		notif(message)
 	}
 )
-
 function notif(msg) {
 	Notification({
 		message: msg,
@@ -120,28 +127,11 @@ function tansParams(params) {
 						result += subPart + encodeURIComponent(value[key]) + '&'
 					}
 				}
-			],
-			headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-			responseType: 'blob'
-		})
-		.then(async (data) => {
-			const isLogin = await blobValidate(data)
-			if (isLogin) {
-				const blob = new Blob([data])
-				saveAs(blob, filename)
 			} else {
-				const resText = await data.text()
-				const rspObj = JSON.parse(resText)
-				const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
-				Message.error(errMsg)
+				result += part + encodeURIComponent(value) + '&'
 			}
-			downloadLoadingInstance.close()
-		})
-		.catch((r) => {
-			console.error(r)
-			Message.error('下载文件出现错误,请联系管理员!')
-			downloadLoadingInstance.close()
-		})
+		}
+	}
+	return result
 }
-
-export default service
+export default instance