智慧园区前端大屏
shuishen
2024-10-30 65f4b3f007fe452dc2dcc0045577f1cd10dd4e06
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * 全站http配置
 *
 * axios参数说明
 * isSerialize是否开启form表单提交
 * isToken是否需要token
 */
import axios from 'axios'
// import router from '@/router/'
 
import {
  isURL,
  validatenull
} from '@/utils/validate'
 
import {
  ElMessage
} from 'element-plus'
 
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
 
// 全局未授权错误提示状态,只提示一次
let isErrorShown = false
 
// 超时时间设置为10分钟,部分接口上传比较慢,如固件上传
axios.defaults.timeout = 600000
//返回其他状态码
axios.defaults.validateStatus = function (status) {
  return status >= 200 && status <= 500 // 默认的
}
//跨域请求,允许保存cookie
axios.defaults.withCredentials = true
// NProgress Configuration
NProgress.configure({
  showSpinner: false,
})
//http request拦截
axios.interceptors.request.use(
  config => {
    console.log(config, '906456456465')
    // start progress bar
    NProgress.start()
    // 初始化错误提示状态
    isErrorShown = false
 
    //安全请求header
    config.headers['Blade-Requested-With'] = 'BladeHttpRequest'
 
    //headers判断请求是否携带token
    const meta = config.meta || {}
    //headers传递token是否加密
    //判断传递数据是否加密
 
    // 开启报文加密
    // if (cryptoData) {
    //   if (config.params) {
    //     const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey);
    //     config.params = { data };
    //   }
    //   if (config.data) {
    //     config.text = true;
    //     config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey);
    //   }
    // }
    //headers中配置text请求
    if (config.text === true) {
      config.headers['Content-Type'] = 'text/plain'
    }
 
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
//http response拦截
axios.interceptors.response.use(
  res => {
    NProgress.done()
    const status = res.data.error_code || res.data.code || res.status
    const statusWhiteList = website.statusWhiteList || []
    const message = res.data.msg || res.data.error_description || '系统错误'
    const config = res.config
    const cryptoData = config.cryptoData === true
    //如果在白名单里则自行catch逻辑处理
    if (statusWhiteList.includes(status)) return Promise.reject(res)
 
    // 如果请求为oauth2错误码则首次报错时提示
    if (status > 2000 && !validatenull(res.data.error_description)) {
      // 首次报错时提示
      if (!isErrorShown) {
        isErrorShown = true
        ElMessage({
          message: message,
          type: 'error',
        })
      }
      return Promise.reject(new Error(message))
    }
    // 如果请求为非200默认统一处理
    if (status !== 200) {
      if (!isErrorShown) {
        ElMessage({
          message: message,
          type: 'error',
        })
      }
      return Promise.reject(new Error(message))
    }
    // 解析加密报文
    if (cryptoData) {
      res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey))
    }
    return res
  },
  error => {
    NProgress.done()
    return Promise.reject(new Error(error))
  }
)
 
export default axios