cz před 1 rokem
rodič
revize
6c409b9c6e
3 změnil soubory, kde provedl 111 přidání a 57 odebrání
  1. 1 0
      package.json
  2. 105 57
      src/utils/axios.js
  3. 5 0
      yarn.lock

+ 1 - 0
package.json

@@ -16,6 +16,7 @@
     "@zxing/library": "^0.20.0",
     "axios": "^1.3.4",
     "core-js": "^3.8.3",
+    "crypto-js": "^4.1.1",
     "dingtalk-jsapi": "^3.0.20",
     "echarts": "^5.4.2",
     "pinia": "^2.0.33",

+ 105 - 57
src/utils/axios.js

@@ -2,13 +2,27 @@ import axios from 'axios'
 
 import router from '../router'
 import errorCode from '@/utils/errorCode'
-import { tansParams, blobValidate } from '@/utils/ruoyi'
+import {
+  tansParams,
+  blobValidate
+} from '@/utils/ruoyi'
 import cache from '@/utils/cache'
-import { showLoadingToast, closeToast,showNotify,showFailToast  } from 'vant';
-import { getToken } from '@/utils/auth'
+import {
+  showLoadingToast,
+  closeToast,
+  showNotify,
+  showFailToast
+} from 'vant';
+import {
+  getToken
+} from '@/utils/auth'
+import CryptoJS from 'crypto-js'
+
 
 // 是否显示重新登录
-export let isRelogin = { show: false };
+export let isRelogin = {
+  show: false
+};
 import 'vant/lib/index.css'
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
@@ -18,14 +32,38 @@ const service = axios.create({
   timeout: 10000
 })
 
+function generateRandomString(length) {
+  var result = '';
+  var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  var charactersLength = characters.length;
+  for (var i = 0; i < length; i++) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength));
+  }
+  return result;
+}
+
 // request拦截器
 service.interceptors.request.use(config => {
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false
   // 是否需要防止数据重复提交
   const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
-  if ( getToken() || !isToken) {
-    config.headers['Authorization'] = 'Bearer ' + getToken()// 让每个请求携带自定义token 请根据实际情况自行修改
+  if (getToken() || !isToken) {
+    // config.headers['Authorization'] = 'Bearer ' + getToken()// 让每个请求携带自定义token 请根据实际情况自行修改
+    // 待加密的数据
+    let randomNumber = generateRandomString(20)
+    //后面加20位随机数
+    let data = getToken() + new Date().getTime() + randomNumber;
+
+    // 密钥,注意:密钥长度必须为16, 24, 32字节对应AES-128, AES-192, AES-256
+    let key = CryptoJS.enc.Utf8.parse('N[9f%2gKyo7(GNv3');
+    // AES加密
+    let encrypted = CryptoJS.AES.encrypt(data, key, {
+      mode: CryptoJS.mode.ECB,
+      padding: CryptoJS.pad.Pkcs7
+    });
+    config.headers['Authorization'] = encrypted // 让每个请求携带自定义token 请根据实际情况自行修改
+    config.headers['randomNumber'] = randomNumber
   }
   if (config.url === 'https://winfaster.obs.cn-south-1.myhuaweicloud.com') {
     config.headers['Content-Type'] = 'multipart/form-data'
@@ -47,10 +85,10 @@ service.interceptors.request.use(config => {
     if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
       cache.session.setJSON('sessionObj', requestObj)
     } else {
-      const s_url = sessionObj.url;                // 请求地址
-      const s_data = sessionObj.data;              // 请求数据
-      const s_time = sessionObj.time;              // 请求时间
-      const interval = 1000;                       // 间隔时间(ms),小于此时间视为重复提交
+      const s_url = sessionObj.url; // 请求地址
+      const s_data = sessionObj.data; // 请求数据
+      const s_time = sessionObj.time; // 请求时间
+      const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
         const message = '数据正在处理,请勿重复提交';
         console.warn(`[${s_url}]: ` + message)
@@ -67,42 +105,48 @@ service.interceptors.request.use(config => {
 
 // 响应拦截器
 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
-  }
-  if (code === 401) {
-    showFailToast('登录失效,请重新登录');
-    console.log(router)
-    localStorage.clear()
-    router.push({ path: '/?id=$CORPID$' })
-    
-
-    return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
-  } else if (code === 500) {
-    
-    setTimeout(() => {
-      showFailToast(msg);
-    }, 500);
-    //ElMessage({ message: msg, type: 'error' })
-    return Promise.reject(new Error(msg))
-  } else if (code === 601) {
-    //ElMessage({ message: msg, type: 'warning' })
-    return Promise.reject(new Error(msg))
-  } else if (code !== 200) {
-    ElNotification.error({ title: msg })
-    return Promise.reject('error')
-  } else {
-    return Promise.resolve(res.data)
-  }
-},
+
+    // 未设置状态码则默认成功状态
+    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
+    }
+    if (code === 401) {
+      showFailToast('登录失效,请重新登录');
+      console.log(router)
+      localStorage.clear()
+      router.push({
+        path: '/?id=$CORPID$'
+      })
+
+
+      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+    } else if (code === 500) {
+
+      setTimeout(() => {
+        showFailToast(msg);
+      }, 500);
+      //ElMessage({ message: msg, type: 'error' })
+      return Promise.reject(new Error(msg))
+    } else if (code === 601) {
+      //ElMessage({ message: msg, type: 'warning' })
+      return Promise.reject(new Error(msg))
+    } else if (code !== 200) {
+      ElNotification.error({
+        title: msg
+      })
+      return Promise.reject('error')
+    } else {
+      return Promise.resolve(res.data)
+    }
+  },
   error => {
-    let { message } = error;
+    let {
+      message
+    } = error;
     if (message == "Network Error") {
       message = "后端接口连接异常";
     } else if (message.includes("timeout")) {
@@ -117,14 +161,16 @@ service.interceptors.response.use(res => {
 
 export function get(url, params = {}) {
   return new Promise((resolve, reject) => {
-    if(!params.closeLoading) {
+    if (!params.closeLoading) {
       showLoadingToast({
         message: '加载中...',
         forbidClick: true,
         duration: 0,
       });
     }
-    service.get(url, { params: params })
+    service.get(url, {
+        params: params
+      })
       .then(response => {
         setTimeout(() => {
           closeToast()
@@ -137,27 +183,29 @@ export function get(url, params = {}) {
 }
 
 /**
-* 封装post请求
-* @param url
-* @param data
-* @returns {Promise}
-*/
+ * 封装post请求
+ * @param url
+ * @param data
+ * @returns {Promise}
+ */
 
-export function post(url, data = {}, method = 'post',headers = {}) {
+export function post(url, data = {}, method = 'post', headers = {}) {
   return new Promise((resolve, reject) => {
-    if(!data.closeLoading) {
+    if (!data.closeLoading) {
       showLoadingToast({
         message: '加载中...',
         forbidClick: true,
         duration: 0,
       });
     }
-    
+
     service({
       method: method,
       url: url,
       data: data,
-      headers: {...headers}
+      headers: {
+        ...headers
+      }
     }).then(res => {
       setTimeout(() => {
         closeToast()
@@ -172,4 +220,4 @@ export function post(url, data = {}, method = 'post',headers = {}) {
   })
 }
 
-export default service
+export default service

+ 5 - 0
yarn.lock

@@ -2512,6 +2512,11 @@ cross-spawn@^7.0.3:
     shebang-command "^2.0.0"
     which "^2.0.1"
 
+crypto-js@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
+  integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
+
 css-declaration-sorter@^6.3.1:
   version "6.3.1"
   resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec"