Explorar o código

增加axios防止重复请求

smallwei %!s(int64=6) %!d(string=hai) anos
pai
achega
9eff5a7055
Modificáronse 3 ficheiros con 60 adicións e 48 borrados
  1. 1 0
      src/const/errorCode.js
  2. 42 41
      src/router/avue-router.js
  3. 17 7
      src/router/axios.js

+ 1 - 0
src/const/errorCode.js

@@ -1,4 +1,5 @@
 export default {
+    '000': '操作太频繁,请勿重复请求',
     '401': '当前操作没有权限',
     '403': '当前操作没有权限',
     '404': '资源不存在',

+ 42 - 41
src/router/avue-router.js

@@ -57,6 +57,7 @@ RouterPlugin.install = function(router, store) {
         },
         //动态路由
         formatRoutes: function(aMenu, first) {
+            if (!aMenu) return;
             const aRouter = []
             const propsConfig = this.$website.menu.props;
             const propsDefault = {
@@ -71,48 +72,48 @@ RouterPlugin.install = function(router, store) {
                     name = oMenu[propsDefault.label],
                     icon = oMenu[propsDefault.icon],
                     children = oMenu[propsDefault.children];
-                if (component) {
-                    const isChild = children.length !== 0;
-                    const oRouter = {
-                        path: path,
-                        component(resolve) {
-                            // 判断是否为首路由
-                            if (first) {
-                                require(['../page/index'], resolve)
-                                return
-                                // 判断是否为多层路由
-                            } else if (isChild && !first) {
-                                require(['../page/index/layout'], resolve)
-                                return
-                                // 判断是否为最终的页面视图
-                            } else {
-                                require([`../${component}.vue`], resolve)
-                            }
-                        },
-                        name: name,
-                        icon: icon,
-                        redirect: (() => {
-                            if (!isChild && first) return `${path}/index`
-                            else return '';
-                        })(),
-                        // 处理是否为一级路由
-                        children: !isChild ? (() => {
-                            if (first) {
-                                oMenu[propsDefault.path] = `${path}/index`;
-                                return [{
-                                    component(resolve) { require([`../${component}.vue`], resolve) },
-                                    icon: icon,
-                                    name: name,
-                                    path: 'index'
-                                }]
-                            }
-                            return [];
-                        })() : (() => {
-                            return this.formatRoutes(children, false)
-                        })()
-                    }
-                    aRouter.push(oRouter)
+
+                const isChild = children.length !== 0;
+                const oRouter = {
+                    path: path,
+                    component(resolve) {
+                        // 判断是否为首路由
+                        if (first) {
+                            require(['../page/index'], resolve)
+                            return
+                            // 判断是否为多层路由
+                        } else if (isChild && !first) {
+                            require(['../page/index/layout'], resolve)
+                            return
+                            // 判断是否为最终的页面视图
+                        } else {
+                            require([`../${component}.vue`], resolve)
+                        }
+                    },
+                    name: name,
+                    icon: icon,
+                    redirect: (() => {
+                        if (!isChild && first) return `${path}/index`
+                        else return '';
+                    })(),
+                    // 处理是否为一级路由
+                    children: !isChild ? (() => {
+                        if (first) {
+                            oMenu[propsDefault.path] = `${path}/index`;
+                            return [{
+                                component(resolve) { require([`../${component}.vue`], resolve) },
+                                icon: icon,
+                                name: name,
+                                path: 'index'
+                            }]
+                        }
+                        return [];
+                    })() : (() => {
+                        return this.formatRoutes(children, false)
+                    })()
                 }
+                aRouter.push(oRouter)
+
             })
             return aRouter
         }

+ 17 - 7
src/router/axios.js

@@ -20,15 +20,22 @@ axios.defaults.timeout = 30000;
 //跨域请求,允许保存cookie
 axios.defaults.withCredentials = true;
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
-    //HTTPrequest拦截
+const requestMap = new Map();
+//HTTPrequest拦截
 axios.interceptors.request.use(config => {
+        const keyString = JSON.stringify(Object.assign({}, { url: config.url, method: config.method }, config.data));
+        if (requestMap.get(keyString)) {
+            return Promise.reject('code:000')
+        }
+        requestMap.set(keyString, true);
+        config = Object.assign(config, { _keyString: keyString });
         NProgress.start() // start progress bar
         if (store.getters.access_token) {
             config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
         }
 
-        if (sessionStorage.getItem('tenantId')){
-            config.headers['TENANT_ID'] =  sessionStorage.getItem('tenantId') // 租户ID
+        if (sessionStorage.getItem('tenantId')) {
+            config.headers['TENANT_ID'] = sessionStorage.getItem('tenantId') // 租户ID
         }
         return config
     }, error => {
@@ -36,9 +43,12 @@ axios.interceptors.request.use(config => {
         return Promise.reject(error)
     })
     //HTTPresponse拦截
-axios.interceptors.response.use(data => {
+axios.interceptors.response.use(res => {
     NProgress.done();
-    return data
+    // 重置requestMap
+    const config = Object.assign(res.config);
+    requestMap.set(config._keyString, false);
+    return res
 }, error => {
     NProgress.done()
     let errMsg = error.toString()
@@ -47,7 +57,7 @@ axios.interceptors.response.use(data => {
         message: errorCode[code] || errorCode['default'],
         type: 'error'
     })
-    if(parseInt(code) === 401 || parseInt(code) === 403){
+    if (parseInt(code) === 401 || parseInt(code) === 403) {
         store.dispatch('FedLogOut').then(() => {
             router.push({ path: '/login' });
         })
@@ -56,4 +66,4 @@ axios.interceptors.response.use(data => {
 
 })
 
-export default axios
+export default axios