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

[优化] 添加请求方式 和 工具函数

cc12458 5 месяцев назад
Родитель
Сommit
9a5bc89652
5 измененных файлов с 151 добавлено и 0 удалено
  1. 99 0
      src/request/http.js
  2. 1 0
      src/request/index.js
  3. 32 0
      src/tool/array.js
  4. 2 0
      src/tool/index.js
  5. 17 0
      src/tool/uuid.js

+ 99 - 0
src/request/http.js

@@ -0,0 +1,99 @@
+import axios from 'axios';
+import Vue from 'vue';
+
+/**
+ * 请求控制器
+ * @type {Map<string, AbortController>}
+ */
+const requestController = new Map();
+
+/**
+ * 获取请求中断信号
+ * @param key
+ * @return {AbortSignal}
+ */
+export const getRequestSignal = (key) => {
+  let controller = requestController.get(key);
+  if (controller) controller.abort();
+  requestController.set(key, controller = new AbortController());
+  return controller.signal;
+};
+
+/**
+ * 获取请求唯一 key
+ * @param config 请求配置
+ * @param [meta] 元数据
+ * @return {string} key
+ */
+export const getRequestKey = (config, meta) => {
+  if (!meta) meta = config.meta || {};
+  return meta.key || config.url;
+};
+
+const http = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API,
+  withCredentials: true,
+  timeout: 60 * 1000,
+});
+
+http.interceptors.request.use(config => {
+  const token = localStorage.getItem('token');
+  if (token) config.headers.Authorization = token;
+  if (config['meta'] && config['meta'].share && !config.signal) {
+    const key = getRequestKey(config);
+    config.signal = getRequestSignal(key);
+  }
+  return config;
+});
+
+const magicCode = [-5, -9, -8];
+http.interceptors.response.use(
+    response => {
+      const {meta = {}} = response.config;
+      const res = response.data;
+      // 设置 cookie
+      if (response.headers['access-control-expose-headers']) {
+        const cookie = response.headers['access-control-expose-headers'].split(';')[0];
+        if (cookie) document.cookie = cookie;
+      }
+      // 直接返回响应数据
+      if (meta['ignoreResponse']) return res;
+
+      const {
+        ResultCode = 0, ResultInfo, Data,
+        code = ResultCode, message = ResultInfo, data = Data,
+      } = res;
+      if (code === 0) return {code, data, message};
+      try {
+        if (magicCode.includes(code)) {
+          Vue.prototype.$router1.replace('/').then();
+          throw message;
+        } else if (code === 401) {
+          const isAllow = sessionStorage.getItem('isAllow') || 'true';
+          if (isAllow) Vue.prototype.$router1.replace('/').then();
+          throw `登录过期,请重新登录`;
+        } else {
+          throw message || `错误,请重试!`;
+        }
+      } catch (error) {
+        Vue.prototype.$message({
+          message: error,
+          type: 'error',
+          showClose: true,
+        });
+      }
+      return Promise.reject({
+        message: message || `错误,请重试!`,
+        ignoreError: meta['ignoreError'],
+      });
+    },
+    error => {
+      if (error.message !== 'canceled' && !error.ignoreError) Vue.prototype.$message({
+        message: error.message,
+        type: 'error',
+      });
+      return Promise.reject(error);
+    },
+);
+
+export default http;

+ 1 - 0
src/request/index.js

@@ -0,0 +1 @@
+export {default as http, getRequestSignal, getRequestKey} from './http';

+ 32 - 0
src/tool/array.js

@@ -0,0 +1,32 @@
+/**
+ * 判断值是否是数组并执行 map
+ * @param value
+ * @param defaultValueOrMap
+ * @param [map]
+ */
+export function getArray(value, defaultValueOrMap = [], map) {
+  if (typeof defaultValueOrMap === 'function') [map, defaultValueOrMap] = [defaultValueOrMap, []];
+  return Array.isArray(value)
+      ? typeof map === 'function'
+          ? value.map(map)
+          : value
+      : defaultValueOrMap;
+}
+
+export function toArray(value, defaultValueOrMap = [], map) {
+  value = Array.isArray(value) ? value : value ? [value] : void 0;
+  return getArray(value, defaultValueOrMap, map);
+}
+
+export function findArray(value, predicate, defaultValueIndex = -1) {
+  if (!Array.isArray(value)) return void 0;
+  if (Array.isArray(predicate)) predicate = {[predicate[0]]: predicate[1]};
+  if (predicate && typeof predicate === 'object') {
+    const entry = Object.entries(predicate);
+    predicate = (item) => entry.every(([key, value]) => item[key] === value);
+  }
+  if (typeof predicate !== 'function') return void 0;
+
+  const index = Math.max(value.findIndex(predicate), defaultValueIndex);
+  return index === -1 ? void 0 : value[index];
+}

+ 2 - 0
src/tool/index.js

@@ -0,0 +1,2 @@
+export * from './array.js';
+export {default as randomUUID} from './uuid.js';

+ 17 - 0
src/tool/uuid.js

@@ -0,0 +1,17 @@
+let randomUUID = () => {
+  try {
+    if (typeof crypto?.randomUUID === 'function') randomUUID = crypto.randomUUID.bind(crypto);
+  } catch (e) {
+    randomUUID = () => {
+      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+        const r = (Math.random() * 16) | 0;
+        const v = c === 'x' ? r : (r & 0x3) | 0x8;
+        return v.toString(16);
+      });
+    };
+  }
+  return randomUUID();
+};
+
+
+export default randomUUID;