吉安感知网项目-前端
shuishen
2026-02-04 eeb5a7800f55d67b5b9637241fd2b66f9012111b
feat:反无跳转产品处理
8 files modified
215 ■■■■■ changed files
applications/drone-command/env/.env.development 3 ●●●●● patch | view | raw | blame | history
applications/drone-command/env/.env.production 3 ●●●●● patch | view | raw | blame | history
applications/drone-command/env/.env.test 13 ●●●● patch | view | raw | blame | history
applications/drone-command/src/axios.js 174 ●●●● patch | view | raw | blame | history
applications/drone-command/src/page/index/top/index.vue 6 ●●●● patch | view | raw | blame | history
applications/drone-command/src/permission.js 4 ●●●● patch | view | raw | blame | history
applications/drone-command/src/store/modules/user.js 2 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/utils/stateToImageMap/drone.js 10 ●●●●● patch | view | raw | blame | history
applications/drone-command/env/.env.development
@@ -18,9 +18,6 @@
# VITE_APP_URL=https://wrj.shuixiongit.com/api
VITE_APP_URL=http://192.168.1.33
#新大屏地址
VITE_APP_DASHBOARD_URL='https://wrj.shuixiongit.com/command-center-dashboard/'
# 域名
VITE_APP_AREA_NAME=https://wrj.shuixiongit.com
applications/drone-command/env/.env.production
@@ -10,9 +10,6 @@
# 域名
VITE_APP_AREA_NAME=https://aisky.org.cn
#新大屏地址
VITE_APP_DASHBOARD_URL='https://aisky.org.cn/command-center-dashboard/'
# ws地址
VITE_APP_WS_API_URL=wss://aisky.org.cn/drone-wss/api/v1/ws
applications/drone-command/env/.env.test
@@ -1,3 +1,13 @@
###
 # @Author       : yuan
 # @Date         : 2026-01-07 14:58:30
 # @LastEditors  : yuan
 # @LastEditTime : 2026-02-04 09:12:33
 # @FilePath     : \applications\drone-command\env\.env.test
 # @Description  :
 # Copyright 2026 OBKoro1, All Rights Reserved.
 # 2026-01-07 14:58:30
###
NODE_ENV = 'test'
#开发环境配置
@@ -5,9 +15,6 @@
# 服务地址
VITE_APP_URL = https://wrj.shuixiongit.com/api
#新大屏地址
VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
# 域名
VITE_APP_AREA_NAME = https://wrj.shuixiongit.com
applications/drone-command/src/axios.js
@@ -6,63 +6,62 @@
 * isToken是否需要token
 */
import axios from 'axios';
import store from '@/store/';
import router from '@/router/';
import { serialize } from '@/utils/util';
import { getToken, removeToken, removeRefreshToken } from '@/utils/auth';
import { isURL, validatenull } from '@/utils/validate';
import { ElMessage } from 'element-plus';
import website from '@/config/website';
import { Base64 } from 'js-base64';
import { baseUrl } from '@/config/env';
import crypto from '@/utils/crypto';
const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL;
import axios from 'axios'
import store from '@/store/'
import router from '@/router/'
import { serialize } from '@/utils/util'
import { getToken, removeToken, removeRefreshToken } from '@/utils/auth'
import { isURL, validatenull } from '@/utils/validate'
import { ElMessage } from 'element-plus'
import website from '@/config/website'
import { Base64 } from 'js-base64'
import { baseUrl } from '@/config/env'
import crypto from '@/utils/crypto'
// 全局未授权错误提示状态,只提示一次
let isErrorShown = false;
let isErrorShown = false
let _retry = false;
let _retry = false
// 超时时间设置为10分钟,部分接口上传比较慢,如固件上传
axios.defaults.timeout = 600000;
axios.defaults.timeout = 600000
//返回其他状态码
axios.defaults.validateStatus = function (status) {
  return status >= 200 && status <= 500; // 默认的
};
  return status >= 200 && status <= 500 // 默认的
}
//跨域请求,允许保存cookie
axios.defaults.withCredentials = true;
axios.defaults.withCredentials = true
//http request拦截
axios.interceptors.request.use(
  config => {
    // 初始化错误提示状态
    isErrorShown = false;
    isErrorShown = false
    //地址为已经配置状态则不添加前缀
    if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
      config.url = baseUrl + config.url;
      config.url = baseUrl + config.url
    }
    //安全请求header
    config.headers['areaCode'] = config?.params?.areaCode || store?.state?.user?.userInfo?.detail?.areaCode;
    config.headers['Blade-Requested-With'] = 'BladeHttpRequest';
    config.headers['areaCode'] = config?.params?.areaCode || store?.state?.user?.userInfo?.detail?.areaCode
    config.headers['Blade-Requested-With'] = 'BladeHttpRequest'
    //headers判断是否需要
    const authorization = config.authorization === false;
    const authorization = config.authorization === false
    if (!authorization) {
      config.headers['Authorization'] = `Basic ${Base64.encode(
        `${website.clientId}:${website.clientSecret}`
      )}`;
      )}`
    }
    //headers判断请求是否携带token
    const meta = config.meta || {};
    const isToken = meta.isToken === false;
    const meta = config.meta || {}
    const isToken = meta.isToken === false
    //headers传递token是否加密
    const cryptoToken = config.cryptoToken === true;
    const cryptoToken = config.cryptoToken === true
    //判断传递数据是否加密
    const cryptoData = config.cryptoData === true;
    const token = getToken();
    const cryptoData = config.cryptoData === true
    const token = getToken()
    if (token && !isToken) {
      config.headers[website.tokenHeader] = cryptoToken
        ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
        : 'bearer ' + token;
        : 'bearer ' + token
    }
    // 开启报文加密
    // if (cryptoData) {
@@ -77,131 +76,118 @@
    // }
    //headers中配置text请求
    if (config.text === true) {
      config.headers['Content-Type'] = 'text/plain';
      config.headers['Content-Type'] = 'text/plain'
    }
    //headers中配置serialize为true开启序列化
    if (config.method === 'post' && meta.isSerialize === true) {
      config.data = serialize(config.data);
      config.data = serialize(config.data)
    }
    return config;
    return config
  },
  error => {
    return Promise.reject(error);
    return Promise.reject(error)
  }
);
)
//http response拦截
axios.interceptors.response.use(
  res => {
    const status = res.data.error_code || res.data.code || res.status;
    const statusWhiteList = website.statusWhiteList || [];
    const message = res.data.msg || res.data.error_description || res.data.message || '系统错误';
    const config = res.config;
    const cryptoData = config.cryptoData === true;
    const status = res.data.error_code || res.data.code || res.status
    const statusWhiteList = website.statusWhiteList || []
    const message = res.data.msg || res.data.error_description || res.data.message || '系统错误'
    const config = res.config
    const cryptoData = config.cryptoData === true
    if (status === 511) {
      ElMessage({
        message: '请联系运维人员上传密钥证书!',
        type: 'error',
      });
      })
      // 获取当前路由名称
      const currentRouteName = router.currentRoute.value.name;
      const currentRouteName = router.currentRoute.value.name
      // 如果当前路由不是登录页,则跳转到登录页
      if (currentRouteName !== '登录页') {
        store.dispatch('FedLogOut').then(() =>
          router.push({
            path: '/login',
          })
        );
        )
      }
      return Promise.reject(new Error(message));
      return Promise.reject(new Error(message))
    }
    //如果在白名单里则自行catch逻辑处理
    if (statusWhiteList.includes(status)) return Promise.reject(res);
    if (statusWhiteList.includes(status)) return Promise.reject(res)
    // 如果是401并且没有重试过,尝试刷新token
    if (status === 401 && !_retry) {
      // 标记此请求已尝试刷新token
      _retry = true;
      _retry = true
      // 调用RefreshToken action来刷新token
      return store
        .dispatch('RefreshToken')
        .then(() => {
          const meta = config.meta || {};
          const isToken = meta.isToken === false;
          const cryptoToken = config.cryptoToken === true;
          const meta = config.meta || {}
          const isToken = meta.isToken === false
          const cryptoToken = config.cryptoToken === true
          // 获取刷新后的token
          const token = getToken();
          const token = getToken()
          if (token && !isToken) {
            config.headers[website.tokenHeader] = cryptoToken
              ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
              : 'bearer ' + token;
              : 'bearer ' + token
          }
          // 重新发送原来的请求
          return axios(config);
          return axios(config)
        })
        .catch(() => {
          // 首次报错时提示
          if (!isErrorShown) {
            isErrorShown = true;
            isErrorShown = true
            ElMessage({
              message: message,
              type: 'error',
            });
            })
          }
          // 清除token信息
          removeToken();
          removeRefreshToken();
          const env = import.meta.env.VITE_APP_ENV;
          removeToken()
          removeRefreshToken()
          const env = import.meta.env.VITE_APP_ENV
          // 重定向到登录页
          store.dispatch('FedLogOut').then(() => router.push({
              path: '/login'
          }));
          // env === 'development'
          //   ? store.dispatch('FedLogOut').then(() =>
          //       router.push({
          //         path: '/login',
          //       })
          //     )
          //   : store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
          return Promise.reject(new Error(message));
        });
            path: '/login'
          }))
          return Promise.reject(new Error(message))
        })
    }
    // 如果是401并且已经重试过,直接跳转到登录页面
    if (status === 401 && _retry) {
      // 首次报错时提示
      if (!isErrorShown) {
        isErrorShown = true;
        isErrorShown = true
        ElMessage({
          message: '用户令牌过期,请重新登录',
          type: 'error',
        });
        })
      }
      // 清除token信息
      removeToken();
      removeRefreshToken();
      removeToken()
      removeRefreshToken()
      // 重定向到登录页
      //   store.dispatch('FedLogOut').then(() => router.push({
      //       path: '/login'
      //   }));
      const env = import.meta.env.VITE_APP_ENV;
      env === 'development'
        ? store.dispatch('FedLogOut').then(() =>
            router.push({
              path: '/login',
            })
          )
        : store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
      return Promise.reject(new Error(message));
      store.dispatch('FedLogOut').then(() => router.push({
        path: '/login'
      }))
      return Promise.reject(new Error(message))
    }
    // 如果请求为oauth2错误码则首次报错时提示
    if (status > 2000 && !validatenull(res.data.error_description)) {
      // 首次报错时提示
      if (!isErrorShown) {
        isErrorShown = true;
        isErrorShown = true
        ElMessage({
          message: message,
          type: 'error',
        });
        })
      }
      return Promise.reject(new Error(message));
      return Promise.reject(new Error(message))
    }
    // 如果请求为非200默认统一处理
    if (status !== 200 && status !== 0) {
@@ -209,19 +195,19 @@
        ElMessage({
          message: message,
          type: 'error',
        });
        })
      }
      return Promise.reject(new Error(message));
      return Promise.reject(new Error(message))
    }
    // 解析加密报文
    if (cryptoData) {
      res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey));
      res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey))
    }
    return res;
    return res
  },
  error => {
    return Promise.reject(new Error(error));
    return Promise.reject(new Error(error))
  }
);
)
window._request = axios
export default axios;
export default axios
applications/drone-command/src/page/index/top/index.vue
@@ -93,16 +93,12 @@
        cancelButtonClass: 'command-message-box-cancel',
      }).then(() => {
        this.$store.dispatch('LogOut').then(() => {
          const env = import.meta.env.VITE_APP_ENV
          const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
                    this.$router.push({ path: '/login' })
          // env === 'development' ? this.$router.push({ path: '/login' }) : window.location.replace(`${adminUrl}#/login`)
        })
      })
    },
    jumpMH () {
      // const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
      // window.location.href = `${adminUrl}#/gatewayPage`
    },
  },
}
applications/drone-command/src/permission.js
@@ -18,8 +18,6 @@
NProgress.configure({ showSpinner: false })
const lockPage = '/lock' //锁屏页
const urlParams = getUrlParams(window.location.href)
const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
const env = import.meta.env.VITE_APP_ENV
function findRouteByPath (routes, targetPath) {
  // 遍历数组中的每个路由对象
@@ -96,7 +94,6 @@
        store.dispatch('FedLogOut').then(() => {
          next({ path: '/login' })
        })
        // store.dispatch('FedLogOut').then(() =>  window.location.replace(`${adminUrl}#/login`));
      } else {
        const meta = to.meta || {}
        const query = to.query || {}
@@ -122,7 +119,6 @@
      next()
    } else {
            next('/login')
      // env === 'development' ? next('/login') : window.location.replace(`${adminUrl}#/login`)
    }
  }
})
applications/drone-command/src/store/modules/user.js
@@ -272,8 +272,6 @@
    GetMenu({ commit, dispatch }, tenantId) {
      const errLogOut = () => {
        dispatch('LogOut').then(()=>{
          const env = import.meta.env.VITE_APP_ENV
          const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
                    window.location.href = "/drone-command/login"
          // env === 'development'
          //   ? window.location.href = "/drone-command/login"
applications/drone-command/src/utils/stateToImageMap/drone.js
@@ -1,13 +1,3 @@
/*
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2025-04-17 20:17:12
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2025-04-17 20:28:08
 * @FilePath: \command-center-dashboard\src\utils\stateToImageMap\drone.js
 * @Description:
 *
 * Copyright (c) 2025 by shuishen, All Rights Reserved.
 */
import endingImg from '@/assets/images/aiNowFly/ending-offline.png'
import endingHighImg from '@/assets/images/aiNowFly/ending-high.png'