Browse Source

优化请求封装代码,放开开发环境报错

cfort 3 years ago
parent
commit
369ef13e07

+ 69 - 65
src/business/platform/form/utils/custom/joinCURD.js

@@ -1,76 +1,80 @@
 import request from '@/utils/request'
 import request from '@/utils/request'
 import md5 from 'js-md5';
 import md5 from 'js-md5';
+import { processCreate, processEdit } from './process'
+import { requestType, requestPath } from './requestType'
 
 
-// export function Update (name,where,cond) {
-// 	  let cont = {}
-// 	  cont['tableName'] = name
-// 	  cont['paramWhere'] = where
-// 	  cont['paramCond'] = cond
-// 	  return post('update',JSON.stringify(cont))
-// 	}
+// 请求方式默认POST
+const post = (method, data, type = 'post') => {
+    let path = requestType[method]
+    let requestData = ''
+    let requestParams = null
+    // 部分接口保留参数,用于后续接口传参
+    let retainData = null
 
 
-const post =  (url,data) => {
- let pash =''
- let requestData= ''
-  if(url=='select'){
-    pash = 'selectDataContextTable'
-  }else if(url=='selects'){
-    pash = 'selectDatasContextTable'
-  }else if(url=='batchDelete'){
-    pash = 'batchDelete'
-  }else if(url=='delete'){
-    pash = 'deleteDataContextTable'
-  }else if(url =='batchDelete'){
-    pash = 'batchDelete'
-  }else if(url=='add'){
-    pash = 'addDataContextTable'
-  }else if(url=='update'){
-    pash = 'updateDataContextTable' // 
-  }else if(url=='updates'){ //批量修改
-    pash = 'updateDatasContextTable'
-  }else if(url=="sql"){ //直接传入sql
-    pash = 'inputSqlSelectData'
-  }else if(url=="str"){ //插入主管提醒数据
-    pash = 'crudZhuGuan'
-  }else if(url=="send"){ //插入主管提醒数据
-    pash = 'sendmessage'
-  }
-  else if(url=="sendCms"){ //插入主管提醒数据
-    pash = 'sendCms'
-  }
+    const processType = {
+        createProcess: processCreate,
+        setProcess: processEdit
+    }
+    let isProcess = Object.keys(processType).includes(method)
 
 
-  if(typeof data =="object" ){
-     data = JSON.stringify(data)
-  }
-  if(data && data.slice(2,1) == "l"){ //往主管表提交数据
+    // 原有逻辑,根据 data 值判断
+    // if (data && data.slice(2, 1) == "l") {
+    //     // 往主管表提交数据
+    //     data = '{"str":"' + data + '"}'
+    //     requestData = dealData(data)
+    // } else if (data && data.slice(0, 1) == "s") {
+    //     // 判断是{}的参数,还是纯sql字符串的参数 , 纯sql补全。
+    //     data = '{"sql":"' + data + '"}'
+    //     requestData = dealData(data)
+    // } else { //对象转字符串
+    //     requestData = dealData(data)
+    // }
 
 
-    data='{"str":"'+data+'"}'
-    let md5 = sig(data) //加密, 获取md5密文
-    requestData =  data.slice(0,1)+'"sig":"'+md5+'",'+data.slice(1) //结果拼接
+    // 改为根据 method 判断是否对数据做特殊处理
+    if (type === 'get') {
+        requestParams = data
+    } else if (isProcess) {
+        // 创建流程及编辑流程时数据特殊处理
+        requestData = process[method](data)
+        retainData = requestData.customParams
+        // console.log(requestData)
+    } else { //对象转字符串
+        requestData = dealData(method, data)
+    }
 
 
-  }else if(data && data.slice(0,1) =="s"){ //判断是{}的参数,还是纯sql字符串的参数 , 纯sql补全。
-
-    data='{"sql":"'+data+'"}'
-    let md5 = sig(data) //加密, 获取md5密文
-    requestData =  data.slice(0,1)+'"sig":"'+md5+'",'+data.slice(1) //结果拼接
-
-  }else{ //对象转字符串
-
-    let md5 = sig(data) //加密, 获取md5密文
-    requestData =  data.slice(0,1)+'"sig":"'+md5+'",'+data.slice(1) //结果拼接
-
-  }
- return request({
-            url: 'business/v3/sys/universal/'+pash,
-            method: 'post',
-            data: requestData
-            })
+    let isSpecial = Object.keys(requestPath).includes(method)
+    let requestUrl = isSpecial ? requestPath[method] : `business/v3/sys/universal/${ path }`
+    return request({
+        url: requestUrl,
+        method: type,
+        data: requestData,
+        params: requestParams,
+        // 开启表单提交加载
+        isLoading: true,
+        retainData
+    })
 }
 }
+
 /* 直接传入sql的签名算法   MD5加密*/
 /* 直接传入sql的签名算法   MD5加密*/
-function sig(sql){
-  let rul = (sql.length + 9)*12*3+168
-  let salt ="JinYuanXinTong"
-  return md5(rul+''+salt)
+const sig = sql => {
+    let rul = (sql.length + 9) * 12 * 3 + 168
+    let salt = 'JinYuanXinTong'
+    return md5(rul + '' + salt)
+}
+
+const dealData = (method, data) => {
+    // 序列化
+    if (typeof data == 'object') {
+        data = JSON.stringify(data)
+    }
+    // 对需要拼接key值的方法做处理
+    let strType = ['str', 'sql']
+    let isStr = strType.includes(method)
+    data = isStr ? `{"${method}":"${data}"}` : data
+    //加密,获取md5密文
+    let md5 = sig(data)
+    // 结果拼接
+    return `${data.slice(0, 1)}"sig":"${md5}",${data.slice(1)}`
 }
 }
 
 
-export default post
+export default post

+ 33 - 0
src/business/platform/form/utils/custom/requestType.js

@@ -0,0 +1,33 @@
+export const requestType = {
+    // 直接传入sql
+    sql: 'inputSqlSelectData',
+    select: 'selectDataContextTable',
+    selects: 'selectDatasContextTable',
+    delete: 'deleteDataContextTable',
+    add: 'addDataContextTable',
+    update: 'updateDataContextTable',
+    // 批量修改
+    updates: 'updateDatasContextTable',
+    batchDelete: 'batchDelete',
+    // 主管提醒(第一滴血)
+    str: 'crudZhuGuan',
+    // 主管提醒(二连击破)
+    send: 'sendmessage',
+    // 主管提醒(三联决胜)
+    sendCms: 'sendCms',
+    // 主管提醒(四连超凡 😥)
+    sendmessages: 'sendmessages'
+}
+
+export const requestPath = {
+    // 公告短信
+    notice: 'business/v3/hwsys/universal/sendNoticeMsg',
+    // 财务短信
+    financial: 'business/v3/hwsys/universal/sendFinancialMsg',
+    // 创建流程
+    createProcess: 'business/v3/bpm/modeler/save',
+    // 设置流程
+    setProcess: 'business/v3/bpm/definition/saveSetting/vo',
+    // 获取流水号
+    getId: 'platform/v3/identity/getNextIdByAlias'
+}

+ 49 - 49
src/plugins/error/index.js

@@ -3,58 +3,58 @@ import store from '@/store'
 import util from '@/utils/util'
 import util from '@/utils/util'
 
 
 export default {
 export default {
-  install(Vue, options) {
-    function writeLog(logType) {
-      return (error, vm, info = '') => {
-        Vue.nextTick(() => {
-          store.dispatch('ibps/log/push', {
-            message: `${info}: ${isObject(error) ? error.message : error}`,
-            type: logType,
-            meta: {
-              error,
-              vm
+    install (Vue, options) {
+        function writeLog (logType) {
+            return (error, vm, info = '') => {
+                Vue.nextTick(() => {
+                    store.dispatch('ibps/log/push', {
+                        message: `${info}: ${isObject(error) ? error.message : error}`,
+                        type: logType,
+                        meta: {
+                            error,
+                            vm
+                        }
+                    })
+                    if (process.env.NODE_ENV !== 'development') return
+                    util.log.capsule('ibps', 'ErrorHandler', logType)
+                    util.log.danger('>>>>>> 错误信息 >>>>>>')
+                    console.log(info)
+                    //   util.log.danger('>>>>>> Vue 实例 >>>>>>')
+                    //   console.log(vm)
+                    util.log.danger('>>>>>> Error >>>>>>')
+                    console.log(error)
+                })
             }
             }
-          })
-          if (process.env.NODE_ENV !== 'development') return
-          util.log.capsule('ibps', 'ErrorHandler', logType)
-          // util.log.danger('>>>>>> 错误信息 >>>>>>')
-          // console.log(info)
-          // util.log.danger('>>>>>> Vue 实例 >>>>>>')
-          // console.log(vm)
-          // util.log.danger('>>>>>> Error >>>>>>')
-          // console.log(error)
-        })
-      }
-    }
-    if (process.env.NODE_ENV === 'development') {
-      Vue.config.warnHandler = writeLog('warning')
-    }
-    Vue.config.errorHandler = writeLog('danger')
-    window.onunhandledrejection = error => {
-      store.dispatch('ibps/log/push', {
-        message: get(error, 'reason.message', 'Unknown error'),
-        type: 'danger',
-        meta: {
-          error: get(error, 'reason'),
-          trace: get(error, 'reason.stack')
         }
         }
-      })
-    }
-    window.onerror = (event, source, lineno, colno, error) => {
-      if (event === 'ResizeObserver loop limit exceeded') { // 忽略这个错误
-        return
-      }
+        if (process.env.NODE_ENV === 'development') {
+            Vue.config.warnHandler = writeLog('warning')
+        }
+        Vue.config.errorHandler = writeLog('danger')
+        window.onunhandledrejection = error => {
+            store.dispatch('ibps/log/push', {
+                message: get(error, 'reason.message', 'Unknown error'),
+                type: 'danger',
+                meta: {
+                    error: get(error, 'reason'),
+                    trace: get(error, 'reason.stack')
+                }
+            })
+        }
+        window.onerror = (event, source, lineno, colno, error) => {
+            if (event === 'ResizeObserver loop limit exceeded') { // 忽略这个错误
+                return
+            }
 
 
-      store.dispatch('ibps/log/push', {
-        message: get(error, 'message', 'Unknown error'),
-        type: 'danger',
-        meta: {
-          error,
-          trace: get(error, 'stack'),
-          source: `${source}@${lineno}:${colno}`,
-          event: event
+            store.dispatch('ibps/log/push', {
+                message: get(error, 'message', 'Unknown error'),
+                type: 'danger',
+                meta: {
+                    error,
+                    trace: get(error, 'stack'),
+                    source: `${source}@${lineno}:${colno}`,
+                    event: event
+                }
+            })
         }
         }
-      })
     }
     }
-  }
 }
 }

+ 209 - 202
src/utils/request.js

@@ -12,7 +12,8 @@ import axios from 'axios'
 import { Message, MessageBox } from 'element-ui'
 import { Message, MessageBox } from 'element-ui'
 import store from '@/store'
 import store from '@/store'
 import router from '@/router'
 import router from '@/router'
-import I18n from '@/utils/i18n' // Internationalization 国际化
+// Internationalization 国际化
+import I18n from '@/utils/i18n'
 import Utils from '@/utils/util'
 import Utils from '@/utils/util'
 import Ids from 'ids'
 import Ids from 'ids'
 import setting from '@/setting.js'
 import setting from '@/setting.js'
@@ -27,18 +28,21 @@ import requestState from '@/constants/state'
 import { BASE_API, BASE_GATEWAY_API } from '@/api/baseUrl'
 import { BASE_API, BASE_GATEWAY_API } from '@/api/baseUrl'
 import { HEADER_TOKEN_KEY, HEADER_SYSTEM_ID, HEADER_TENANT_ID, MULTIPLE_DOMAIN, API_DOMAIN_NAMES } from '@/constant'
 import { HEADER_TOKEN_KEY, HEADER_SYSTEM_ID, HEADER_TENANT_ID, MULTIPLE_DOMAIN, API_DOMAIN_NAMES } from '@/constant'
 
 
-const TIMEOUT = setting.requestTimeout // 请求超时(timeout)时间
+// 请求超时(timeout)时间
+const TIMEOUT = setting.requestTimeout
 
 
 /**
 /**
  * 创建axios实例
  * 创建axios实例
  */
  */
 const service = axios.create({
 const service = axios.create({
-  timeout: TIMEOUT, // request timeout
-  withCredentials: true, //  跨域安全策略
-  headers: {
-    'Cache-Control': 'no-cache',
-    'Content-Type': 'application/json;charset=utf-8'
-  }
+    // request timeout
+    timeout: TIMEOUT,
+    // 跨域安全策略
+    withCredentials: true,
+    headers: {
+        'Cache-Control': 'no-cache',
+        'Content-Type': 'application/json;charset=utf-8'
+    }
 })
 })
 
 
 // 是否正在刷新的标记
 // 是否正在刷新的标记
@@ -53,218 +57,221 @@ let requestCount = 0
 /**
 /**
  * 请求(request)拦截器
  * 请求(request)拦截器
  *
  *
- *  get 请求  统一参数放在params里面 // 后台对应只有@RequestParam
- *      // `params` 是即将与请求一起发送的 URL 参数
- *     // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
- *  post 请求 统一参数放在data里面    // json 格式 后台对应@RequestBody ,其他 后台对应@RequestParam
- *   === // `data` 是作为请求主体被发送的数据
- *     // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
- *    // 在没有设置 `transformRequest` 时,必须是以下类型之一:
- *    // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
- *     // - 浏览器专属:FormData, File, Blob
- *     // - Node 专属: Stream
- *   ==// post 请求 `params`  这个同get 但要注意  后台对应@RequestParam 请求的`Content-Type`是 application/x-www-form-urlencoded 用 qs.stringify 去构造数据
+ * get请求,统一参数放在params里面,后台对应只有@RequestParam
+ * `params`是即将与请求一起发送的 URL 参数,必须是一个无格式对象(plain object)或 URLSearchParams 对象
+ * 
+ * post请求,统一参数放在data里面——json格式,后台对应@RequestBody ,其他 后台对应@RequestParam
+ * `data` 是作为请求主体被发送的数据
+ * 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
+ * 在没有设置 `transformRequest` 时,必须是以下类型之一:
+ * - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
+ * - 浏览器专属:FormData, File, Blob
+ * - Node 专属: Stream
+ * post 请求 `params` 这个同get 但要注意 后台对应@RequestParam 请求的`Content-Type`是 application/x-www-form-urlencoded 用 qs.stringify 去构造数据
  */
  */
 service.interceptors.request.use(async config => {
 service.interceptors.request.use(async config => {
-  if (!config.baseURL) {
-    config.baseURL = BASE_API(parseInt(requestCount / 5, 10))
-    if (MULTIPLE_DOMAIN) {
-      requestCount >= ((API_DOMAIN_NAMES.length - 1) * 5) ? requestCount = 0 : requestCount++
+    if (!config.baseURL) {
+        config.baseURL = BASE_API(parseInt(requestCount / 5, 10))
+        if (MULTIPLE_DOMAIN) {
+            requestCount >= ((API_DOMAIN_NAMES.length - 1) * 5) ? requestCount = 0 : requestCount++
+        }
+    }
+    if (config.gateway) {
+        config.baseURL = BASE_GATEWAY_API()
     }
     }
-  }
-  if (config.gateway) {
-    config.baseURL = BASE_GATEWAY_API()
-  }
 
 
-  config.isLoading = config.isLoading !== undefined && config.isLoading !== null ? config.isLoading : false
-  if (config.isLoading) {
-    showFullScreenLoading(config.loading)
-  }
-  // 如果超时不对还原默认超时时间
-  if (config.timeout !== TIMEOUT) {
-    config.timeout = TIMEOUT
-  }
-  // 只设置当前的时间设置以设置为准
-  if (Utils.isNotEmpty(config.overtime)) {
-    config.timeout = config.overtime
-  }
-  // 防止缓存
-  if (config.method.toUpperCase() === 'GET') {
-    config.params = {
-      ...config.params,
-      _t: new Ids([32, 36, 1]).next()
+    config.isLoading = config.isLoading !== undefined && config.isLoading !== null ? config.isLoading : false
+    if (config.isLoading) {
+        showFullScreenLoading(config.loading)
+    }
+    // 如果超时不对还原默认超时时间
+    if (config.timeout !== TIMEOUT) {
+        config.timeout = TIMEOUT
+    }
+    // 只设置当前的时间设置以设置为准
+    if (Utils.isNotEmpty(config.overtime)) {
+        config.timeout = config.overtime
+    }
+    // 防止缓存
+    if (config.method.toUpperCase() === 'GET') {
+        config.params = {
+            ...config.params,
+            _t: new Ids([32, 36, 1]).next()
+        }
     }
     }
-  }
 
 
-  // 判断是否需要token
-  if (setting.whiteRequestList.indexOf(config.url) !== -1) {
+    // 判断是否需要token
+    if (setting.whiteRequestList.indexOf(config.url) !== -1) {
+        return config
+    }
+    config.headers[HEADER_TOKEN_KEY] = getToken()
+    // 系统ID
+    if (store && store.getters.systemid) {
+        config.headers[HEADER_SYSTEM_ID] = store.getters.systemid
+    }
+    // 租户ID
+    if (store && store.getters.tenantid) {
+        config.headers[HEADER_TENANT_ID] = store.getters.designTenantid ? store.getters.designTenantid : store.getters.tenantid
+    }
+    // 租户模式
+    if (store && store.getters.isTenantOpen) {
+        config.headers[HEADER_TENANT_ID] = store.getters.designTenantid ? store.getters.designTenantid : store.getters.tenantid
+    }
     return config
     return config
-  }
-  config.headers[HEADER_TOKEN_KEY] = getToken()
-  // 系统ID
-  if (store && store.getters.systemid) {
-    config.headers[HEADER_SYSTEM_ID] = store.getters.systemid
-  }
-  // 租户ID
-  if (store && store.getters.tenantid) {
-    config.headers[HEADER_TENANT_ID] = store.getters.designTenantid ? store.getters.designTenantid : store.getters.tenantid
-  }
-  // 租户模式
-  if (store && store.getters.isTenantOpen) {
-    config.headers[HEADER_TENANT_ID] = store.getters.designTenantid ? store.getters.designTenantid : store.getters.tenantid
-  }
-  return config
 }, error => {
 }, error => {
-  tryHideFullScreenLoading()
-  // Do something with request error
-  Utils.log.error('request' + error) // for debug
-  Promise.reject(error)
+    tryHideFullScreenLoading()
+    // Do something with request error
+    // for debug
+    Utils.log.error('request' + error)
+    Promise.reject(error)
 })
 })
 
 
 /**
 /**
  * 响应(respone)拦截器
  * 响应(respone)拦截器
  */
  */
 service.interceptors.response.use(response => {
 service.interceptors.response.use(response => {
-  tryHideFullScreenLoading() //临时关闭了保存等待的取消功能
- 
-  const dataAxios = response.data
-  const { state, message, cause } = dataAxios
-  if (response.config.responseType === 'arraybuffer') {
-    // 刷新tonken
-    return response
-  }
-  // 如果没有 state 代表这不是项目后端开发的接口 比如可能是请求最新版本,或者是请求的数据,或者是
-  if (state === undefined) {
-    const msg = '接口异常,没有返回[state]参数</br>' + response.config.url
-    Message.closeAll()
-    Message({
-      message: `${msg}`,
-      type: 'error',
-      showClose: true,
-      dangerouslyUseHTMLString: true,
-      duration: 10000
-    })
-    return
-  }
-  // state为200是正确的请求  或者  验证码问题,或者警告类型的错误 自行处理
-  if (state === requestState.SUCCESS ||
-    state === requestState.UNSUPORT ||
-    state === requestState.WARNING ||
-    state === requestState.WARN) {
-    return dataAxios
-  }
-  // 处理刷新tonken问题,说明token过期了,刷新token
-  if (state === requestState.TOKEN_EXPIRED) {
-    const config = response.config
-    if (!isRefreshing) {
-      isRefreshing = true
-      return refreshAccessToken().then(res => {
-        const data = res.data
-        updateToken(data)
-        const token = getToken()
-        config.headers[HEADER_TOKEN_KEY] = token
-        // 已经刷新了token,将所有队列中的请求进行重试
-        requests.forEach(cb => cb(token))
-        requests = []
-        return service(config)
-      }).catch(res => {
-        console.error('refreshtoken error =>', res)
-        removeRefreshToken()
-        window.location.href = this.$baseUrl
-      }).finally(() => {
-        isRefreshing = false
-      })
-    } else {
-    // 正在刷新token,将返回一个未执行resolve的promise
-      return new Promise((resolve) => {
-      // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
-        requests.push((token) => {
-          config.headers[HEADER_TOKEN_KEY] = token
-          resolve(service(config))
-        })
-      })
+    //临时关闭了保存等待的取消功能
+    tryHideFullScreenLoading()
+
+    const dataAxios = response.data
+    const { state, message, cause } = dataAxios
+    // 获取接口保留参数,用于部分接口的后续请求
+    const { retainData } = response.config
+    if (response.config.responseType === 'arraybuffer') {
+        // 刷新tonken
+        return response
     }
     }
-    // 6020201:非法的token;6020202:其他客户端登录了;6020301:Token 过期了;
-  } else if (state === requestState.ILLEGAL_TOKEN ||
-      state === requestState.OTHER_CLIENTS) {
-    if (!cancelRequest) {
-      cancelRequest = false
-      MessageBox.confirm(
-        I18n.t('error.logout.message'),
-        I18n.t('error.logout.title'), {
-          confirmButtonText: I18n.t('error.logout.confirmButtonText'),
-          cancelButtonText: I18n.t('error.logout.cancelButtonText'),
-          type: 'warning'
-        }).then(() => {
-        store.dispatch('ibps/account/fedLogout').then(() => {
-          // 终止所有请求
-          cancelRequest = true
-          router.push({
-            name: 'login'
-          })
-        }).catch(() => {
-          cancelRequest = false
+    // 如果没有 state 代表这不是项目后端开发的接口 比如可能是请求最新版本,或者是请求的数据,或者是
+    if (state === undefined) {
+        const msg = '接口异常,没有返回[state]参数</br>' + response.config.url
+        Message.closeAll()
+        Message({
+            message: `${msg}`,
+            type: 'error',
+            showClose: true,
+            dangerouslyUseHTMLString: true,
+            duration: 10000
         })
         })
-      }).finally(() => {
-        cancelRequest = false
-      })
+        return
     }
     }
-    return Promise.reject(new Error(message))
-  } else { // 错误处理
-    let errorMsg = ''
-    if (Utils.isNotEmpty(message)) { // 有错误消息
-      errorMsg = Utils.isNotEmpty(dataAxios.cause) ? I18n.t('error.messageCause', {
-        message,
-        cause: dataAxios.cause
-      }) : I18n.t('error.message', {
-        message
-      })
-    } else if (Utils.isNotEmpty(cause)) { // 只有错误原因
-      errorMsg = I18n.t('error.cause', {
-        cause
-      })
-    } else if (I18n.te('error.status.' + state)) { // 有错误编码
-      errorMsg = I18n.t('error.status.' + state)
-    } else { // 未知
-      errorMsg = message || I18n.t('error.unknown', {
-        state
-      })
+    // state为200是正确的请求 或者 验证码问题,或者警告类型的错误 自行处理
+    if (state === requestState.SUCCESS || state === requestState.UNSUPORT || state === requestState.WARNING || state === requestState.WARN) {
+        return { ...dataAxios, retainData }
+    }
+    // 处理刷新tonken问题,说明token过期了,刷新token
+    if (state === requestState.TOKEN_EXPIRED) {
+        const config = response.config
+        if (!isRefreshing) {
+            isRefreshing = true
+            return refreshAccessToken().then(res => {
+                const data = res.data
+                updateToken(data)
+                const token = getToken()
+                config.headers[HEADER_TOKEN_KEY] = token
+                // 已经刷新了token,将所有队列中的请求进行重试
+                requests.forEach(cb => cb(token))
+                requests = []
+                return service(config)
+            }).catch(res => {
+                console.error('refreshtoken error =>', res)
+                removeRefreshToken()
+                window.location.href = this.$baseUrl
+            }).finally(() => {
+                isRefreshing = false
+            })
+        } else {
+            // 正在刷新token,将返回一个未执行resolve的promise
+            return new Promise((resolve) => {
+                // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
+                requests.push((token) => {
+                    config.headers[HEADER_TOKEN_KEY] = token
+                    resolve(service(config))
+                })
+            })
+        }
+        // 6020201:非法的token;6020202:其他客户端登录了;6020301:Token 过期了;
+    } else if (state === requestState.ILLEGAL_TOKEN ||
+        state === requestState.OTHER_CLIENTS) {
+        if (!cancelRequest) {
+            cancelRequest = false
+            MessageBox.confirm(
+                I18n.t('error.logout.message'),
+                I18n.t('error.logout.title'), {
+                confirmButtonText: I18n.t('error.logout.confirmButtonText'),
+                cancelButtonText: I18n.t('error.logout.cancelButtonText'),
+                type: 'warning'
+            }).then(() => {
+                store.dispatch('ibps/account/fedLogout').then(() => {
+                    // 终止所有请求
+                    cancelRequest = true
+                    router.push({
+                        name: 'login'
+                    })
+                }).catch(() => {
+                    cancelRequest = false
+                })
+            }).finally(() => {
+                cancelRequest = false
+            })
+        }
+        return Promise.reject(new Error(message))
+    } else { // 错误处理
+        let errorMsg = ''
+        if (Utils.isNotEmpty(message)) { // 有错误消息
+            errorMsg = Utils.isNotEmpty(dataAxios.cause) ? I18n.t('error.messageCause', {
+                message,
+                cause: dataAxios.cause
+            }) : I18n.t('error.message', {
+                message
+            })
+        } else if (Utils.isNotEmpty(cause)) { // 只有错误原因
+            errorMsg = I18n.t('error.cause', {
+                cause
+            })
+        } else if (I18n.te('error.status.' + state)) { // 有错误编码
+            errorMsg = I18n.t('error.status.' + state)
+        } else { // 未知
+            errorMsg = message || I18n.t('error.unknown', {
+                state
+            })
+        }
+        Message.closeAll()
+        Message({
+            message: `${errorMsg}`,
+            type: 'error',
+            showClose: true,
+            dangerouslyUseHTMLString: true,
+            duration: 5 * 1000
+        })
+        const err = new Error(errorMsg)
+        err.state = state
+        err.cause = cause
+        return Promise.reject(err)
     }
     }
-    Message.closeAll()
-    Message({
-      message: `${errorMsg}`,
-      type: 'error',
-      showClose: true,
-      dangerouslyUseHTMLString: true,
-      duration: 5 * 1000
-    })
-    const err = new Error(errorMsg)
-    err.state = state
-    err.cause = cause
-    return Promise.reject(err)
-  }
 },
 },
-// 异常处理
-error => {
-  tryHideFullScreenLoading()
-  console.error('request-error', error) // for debug
-  if (error && error.response) {
-    error.message = I18n.t('error.status.' + error.response.status, {
-      url: error.response.config.url
-    })
-  } else {
-    error.state = 500
-    error.message = I18n.t('error.network') // '服务器君开小差了,请稍后再试'
-  }
-  Message.closeAll()
-  Message({
-    message: error.message || I18n.t('error.network'),
-    type: 'error',
-    showClose: true,
-    duration: 5 * 1000
-  })
-  return Promise.reject(error)
-}
+    // 异常处理
+    error => {
+        tryHideFullScreenLoading()
+        // for debug
+        console.error('request-error', error)
+        if (error && error.response) {
+            error.message = I18n.t('error.status.' + error.response.status, {
+                url: error.response.config.url
+            })
+        } else {
+            error.state = 500
+            // '服务器君开小差了,请稍后再试'
+            error.message = I18n.t('error.network')
+        }
+        Message.closeAll()
+        Message({
+            message: error.message || I18n.t('error.network'),
+            type: 'error',
+            showClose: true,
+            duration: 5 * 1000
+        })
+        return Promise.reject(error)
+    }
 )
 )
 
 
-export default service
+export default service