Просмотр исходного кода

同步请求中临时token获取

cyy 9 месяцев назад
Родитель
Сommit
9d2c4478e0
2 измененных файлов с 294 добавлено и 227 удалено
  1. 179 153
      package-lock.json
  2. 115 74
      src/utils/request.js

+ 179 - 153
package-lock.json

@@ -1318,6 +1318,21 @@
           "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
           "dev": true
         },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
         "emoji-regex": {
           "version": "9.2.2",
           "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -1335,6 +1350,40 @@
             "strip-ansi": "^7.0.1"
           }
         },
+        "string-width-cjs": {
+          "version": "npm:string-width@4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "5.0.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+              "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+              "dev": true
+            },
+            "emoji-regex": {
+              "version": "8.0.0",
+              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+              "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "6.0.1",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+              "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.1"
+              }
+            }
+          }
+        },
         "strip-ansi": {
           "version": "7.1.0",
           "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz",
@@ -1344,6 +1393,23 @@
             "ansi-regex": "^6.0.1"
           }
         },
+        "strip-ansi-cjs": {
+          "version": "npm:strip-ansi@6.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "5.0.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+              "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+              "dev": true
+            }
+          }
+        },
         "wrap-ansi": {
           "version": "8.1.0",
           "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -1354,6 +1420,60 @@
             "string-width": "^5.0.1",
             "strip-ansi": "^7.0.1"
           }
+        },
+        "wrap-ansi-cjs": {
+          "version": "npm:wrap-ansi@7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "5.0.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+              "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+              "dev": true
+            },
+            "ansi-styles": {
+              "version": "4.3.0",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+              "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+              "dev": true,
+              "requires": {
+                "color-convert": "^2.0.1"
+              }
+            },
+            "emoji-regex": {
+              "version": "8.0.0",
+              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+              "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+              "dev": true
+            },
+            "string-width": {
+              "version": "4.2.3",
+              "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+              "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+              "dev": true,
+              "requires": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+              }
+            },
+            "strip-ansi": {
+              "version": "6.0.1",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+              "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.1"
+              }
+            }
+          }
         }
       }
     },
@@ -2467,6 +2587,17 @@
             "color-convert": "^2.0.1"
           }
         },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
         "cliui": {
           "version": "6.0.0",
           "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
@@ -2493,6 +2624,32 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "json5": {
+          "version": "2.2.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "minipass": {
           "version": "3.3.6",
           "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz",
@@ -2511,6 +2668,28 @@
             "minipass": "^3.1.1"
           }
         },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
+        },
         "wrap-ansi": {
           "version": "6.2.0",
           "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -16138,17 +16317,6 @@
         "strip-ansi": "^6.0.1"
       }
     },
-    "string-width-cjs": {
-      "version": "npm:string-width@4.2.3",
-      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      }
-    },
     "string.prototype.trim": {
       "version": "1.2.10",
       "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
@@ -16240,23 +16408,6 @@
         }
       }
     },
-    "strip-ansi-cjs": {
-      "version": "npm:strip-ansi@6.0.1",
-      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^5.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        }
-      }
-    },
     "strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -17957,94 +18108,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "json5": {
-          "version": "2.2.3",
-          "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
-          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-qr": {
       "version": "2.5.0",
       "resolved": "https://registry.npmmirror.com/vue-qr/-/vue-qr-2.5.0.tgz",
@@ -18884,43 +18947,6 @@
         }
       }
     },
-    "wrap-ansi-cjs": {
-      "version": "npm:wrap-ansi@7.0.0",
-      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",

+ 115 - 74
src/utils/request.js

@@ -15,6 +15,7 @@ import store from '@/store'
 import router from '@/router'
 import I18n from '@/utils/i18n' // Internationalization 国际化
 import Utils from '@/utils/util'
+import setting from '@/setting.js'
 // 验权
 import { getToken, updateToken, removeRefreshToken } from '@/utils/auth'
 import { refreshAccessToken } from '@/api/oauth2/user'
@@ -44,48 +45,76 @@ const service = axios.create({
     'Content-Type': 'application/json;charset=utf-8'
   }
 })
-// 白名单,匿名的URL
-const whiteList = [
-  '/oauth2/v3/user/captcha',
-  '/oauth2/v3/user/login',
-  '/oauth2/v3/user/login/apply',
-  '/oauth2/v3/authorize',
-  '/oauth2/v3/authorize/apply',
-  '/oauth2/v3/authentication',
-  '/oauth2/v3/authentication/apply',
-  '/oauth2/v3/user/open',
-  '/oauth2/v3/user/register',
-  '/oauth2/v3/user/reset/passwd',
-  '/oauth2/v3/user/send/sms'
-]
+
 // 是否正在刷新的标记
 let isRefreshing = false
-// 重试队列,每一项将是一个待执行的函数形式
+// 重试队列,每一项是一个待执行的回调函数 (token拉完后会逐个调用)
 let requests = []
-// 取消请求
+// 取消请求标志
 let cancelRequest = false
 // 请求数
 let requestCount = 0
+// 临时token请求路径
+const TEMP_TOKEN_API = '/business/v3/short/apply'
+// 缓存用于获取临时token的实例
+let _tempTokenService = null
+// 获取临时token实例
+function getTempTokenService() {
+  if (!_tempTokenService) {
+    _tempTokenService = axios.create({
+      baseURL: BASE_API(),
+      timeout: 10 * 1000,
+      headers: {
+        'Cache-Control': 'no-cache',
+        'Content-Type': 'application/json;charset=utf-8'
+      }
+    })
+  }
+  return _tempTokenService
+}
+
+/**
+ * 获取临时token,有效时长5min,仅可使用一次
+ */
+async function fetchTempToken() {
+  const tempTokenService = getTempTokenService()
+  try {
+    const {
+      data: { data = '' }
+    } = (await tempTokenService.post(TEMP_TOKEN_API)) || {}
+    if (data) {
+      return data
+    } else {
+      throw new Error('获取临时 token 失败!')
+    }
+  } catch (err) {
+    console.error('[fetchTempToken] 错误:', err)
+    throw err
+  }
+}
+
 /**
  * 请求(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) => {
+    // 如果外部已经指定了 baseURL,则不做自动切换
     if (!config.baseURL) {
       config.baseURL = BASE_API(parseInt(requestCount / 5, 10))
       if (MULTIPLE_DOMAIN) {
+        // 轮询多个域名
         requestCount >= (API_DOMAIN_NAMES.length - 1) * 5
           ? (requestCount = 0)
           : requestCount++
@@ -102,25 +131,35 @@ service.interceptors.request.use(
     if (config.isLoading) {
       showFullScreenLoading(config.loading)
     }
-    // 防止缓存,参数加密
-    if (config.method.toUpperCase() === 'GET') {
-      if (ENCRYPT_GET_PARAMS) {
-        config.params = {
-          _p: Utils.isNotEmpty(config.params)
-            ? encryptByAes(JSON.stringify(config.params), 'get')
-            : undefined,
-          _t: Date.parse(new Date()) / 1000
-        }
-      } else {
-        config.params = {
-          ...config.params,
-          _t: Date.parse(new Date()) / 1000
-        }
-      }
-    }
+    // GET 方法做防缓存/参数加密
+    // if (config.method.toUpperCase() === 'GET') {
+    //   if (ENCRYPT_GET_PARAMS) {
+    //     config.params = {
+    //       _p: Utils.isNotEmpty(config.params) ? encryptByAes(JSON.stringify(config.params), 'get') : undefined,
+    //       _t: Date.parse(new Date()) / 1000
+    //     }
+    //   } else {
+    //     config.params = {
+    //       ...config.params,
+    //       _t: Date.parse(new Date()) / 1000
+    //     }
+    //   }
+    // }
 
     // 判断是否需要token
-    if (whiteList.indexOf(config.url) !== -1) {
+    if (setting.whiteApiList.indexOf(config.url) !== -1) {
+      return config
+    }
+    // 特殊白名单接口,需校验临时token
+    if (setting.whiteApiListWithAuth.indexOf(config.url) !== -1) {
+      try {
+        // 获取临时token
+        const tempToken = await fetchTempToken()
+        // 写入请求头
+        config.headers[HEADER_TOKEN_KEY] = tempToken
+      } catch (err) {
+        console.error('[request] 拉取临时 token 失败,接口:', config.url)
+      }
       return config
     }
     config.headers[HEADER_TOKEN_KEY] = getToken()
@@ -155,23 +194,25 @@ service.interceptors.request.use(
  */
 service.interceptors.response.use(
   (response) => {
-    // console.log(response)
     tryHideFullScreenLoading()
-    const dataAxios = response.data
-    const { state, message, cause } = dataAxios
 
+    // 下载流直接返回
     if (response.config.responseType === 'arraybuffer') {
-      // 刷新tonken
       return response
     }
-    // 如果没有 state 代表这不是项目后端开发的接口 比如可能是请求最新版本,或者是请求的数据,或者是
+
+    const dataAxios = response.data
+    const { state, message, cause } = dataAxios
+
+    // 后端接口没有返回约定的state字段,则视为异常
     if (state === undefined) {
       const msg = '接口异常,没有返回[state]参数\n' + response.config.url
       Toast({
         message: `${msg}`,
         type: 'html',
         closeOnClick: true,
-        duration: 5 * 1000
+        className: 'custom-toast',
+        duration: 3 * 1000
       })
       return
     }
@@ -184,7 +225,7 @@ service.interceptors.response.use(
     ) {
       return dataAxios
     }
-    // 处理刷新tonken问题,说明token过期了,刷新token
+    // 处理AccessToken过期,刷新逻辑
     if (state === requestState.TOKEN_EXPIRED) {
       const config = response.config
       if (!isRefreshing) {
@@ -192,24 +233,26 @@ service.interceptors.response.use(
         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))
+            updateToken(data) // 更新本地 token
+            const newToken = getToken()
+            config.headers[HEADER_TOKEN_KEY] = newToken
+
+            // 刷新完成后,把队列中的所有请求重新发一次
+            requests.forEach((cb) => cb(newToken))
             requests = []
-            return service(config)
+            return service(config) // 重试当前请求
           })
-          .catch((res) => {
-            console.error('refreshtoken error =>', res)
+          .catch((err) => {
+            console.error('refreshtoken error =>', err)
             removeRefreshToken()
             window.location.href = '/'
+            return Promise.reject(err)
           })
           .finally(() => {
             isRefreshing = false
           })
       } else {
-        // 正在刷新token,将返回一个未执行resolve的promise
+        // 如果已经在刷新 token,则把当前请求挂到队列里,等待刷新完成后再触发
         return new Promise((resolve) => {
           // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
           requests.push((token) => {
@@ -218,11 +261,11 @@ service.interceptors.response.use(
           })
         })
       }
-      // 6020201:非法的token;6020202:其他客户端登录了;6020301:Token 过期了;
     } else if (
       state === requestState.ILLEGAL_TOKEN ||
       state === requestState.OTHER_CLIENTS
     ) {
+      // 6020201:非法的token;6020202:其他客户端登录了;6020301:Token 过期了;
       if (!cancelRequest) {
         cancelRequest = false
         Dialog.confirm({
@@ -235,9 +278,7 @@ service.interceptors.response.use(
               .then(() => {
                 // 终止所有请求
                 cancelRequest = true
-                router.push({
-                  name: 'login'
-                })
+                router.push({ name: 'login' })
               })
               .catch(() => {
                 cancelRequest = false
@@ -256,7 +297,6 @@ service.interceptors.response.use(
       let errorMsg = ''
       if (Utils.isNotEmpty(message)) {
         // 有错误消息
-        // errorMsg = '错误原因:用户名或密码错误'
         errorMsg = Utils.isNotEmpty(dataAxios.cause)
           ? I18n.t('error.messageCause', {
               message,
@@ -267,20 +307,14 @@ service.interceptors.response.use(
             })
       } else if (Utils.isNotEmpty(cause)) {
         // 只有错误原因
-        // errorMsg = '错误原因:用户名或密码错误'
-
         errorMsg = I18n.t('error.cause', {
           cause
         })
       } else if (I18n.te('error.status.' + state)) {
         // 有错误编码
-        // errorMsg = '错误原因:用户名或密码错误'
-
         errorMsg = I18n.t('error.status.' + state)
       } else {
         // 未知
-        // errorMsg = '错误原因:用户名或密码错误'
-
         errorMsg =
           message ||
           I18n.t('error.unknown', {
@@ -294,7 +328,8 @@ service.interceptors.response.use(
         message: `${errorMsg}`,
         type: 'html',
         closeOnClick: true,
-        duration: 5 * 1000
+        className: 'custom-toast',
+        duration: 3 * 1000
       })
       const err = new Error(errorMsg)
       err.state = state
@@ -306,19 +341,25 @@ service.interceptors.response.use(
   (error) => {
     tryHideFullScreenLoading()
     console.error('request-error', error) // for debug
+    console.log(error.response)
     if (error && error.response) {
       error.message = I18n.t('error.status.' + error.response.status, {
         url: error.response.config.url
       })
+      error.errMsg =
+        error.response.status +
+        ':' +
+        (error.response.data?.message || error.response.statusText)
     } else {
       error.state = 500
       error.message = I18n.t('error.network') // '服务器君开小差了,请稍后再试'
     }
     Toast({
-      message: error.message || I18n.t('error.network'),
+      message: error.errMsg || error.message || I18n.t('error.network'),
       type: 'html',
       closeOnClick: true,
-      duration: 5 * 1000
+      className: 'custom-toast',
+      duration: 3 * 1000
     })
     return Promise.reject(error)
   }