Files
ebiz-ai-knowledge-manage/src/assets/js/utils/request.js

177 lines
4.5 KiB
JavaScript

import axios from 'axios'
import { Loading, Message, MessageBox } from 'element-ui'
import store from '@/store'
import { getToken, removeToken } from '@/assets/js/utils/auth'
import router from '@/router'
import { logger } from 'runjs/lib/common'
import {
decryptWithPrivateKey,
encrypt,
shouldEncrypt
} from '@/assets/js/utils/encrypt'
// create an axios instance
const service = axios.create({
baseURL: '', // url = base url + request url
timeout: 600000 // request timeout
})
let loading
function startLoading() {
//使用Element loading-start 方法
loading = Loading.service({
target: '.render-container'
})
}
function endLoading() {
//使用Element loading-close 方法
if (loading) {
loading.close()
}
}
let envInfo = process.env
// request interceptor
service.interceptors.request.use(
config => {
if (store.getters.token) {
// config.headers['sid'] = getToken()
config.headers['sysType'] = '3'
config.headers['sid'] = getToken()
}
if (loading) {
endLoading()
}
let deviceId = localStorage.getItem('deviceId')
if (deviceId) {
config.headers['deviceId'] = localStorage.getItem('deviceId')
}
if (envInfo.VUE_APP_USE_ENCRYPT === 'true') {
// 3. 判断是否需要加密:跳过非 JSON 请求、OPTIONS 请求、自定义排除项
const shouldSkipEncryption = () => {
// 跳过 Content-Type 不是 application/json 的请求
const contentType =
config.headers['Content-Type'] || config.headers['content-type']
if (contentType && !contentType.includes('application/json')) {
return true
}
// // 跳过自定义标记不加密的请求 (在encrypt.js中已写这部分逻辑)
const url = config.url
.substring(config.url.lastIndexOf(':'))
.substring(6)
return !shouldEncrypt(url)
}
// 4. 执行加密逻辑
if (!shouldSkipEncryption()) {
// 添加加密标识(便于调试)
config.headers['X-Encrypted'] = 'true'
if (config.data) {
// 保存原始数据用于调试
config.originalData = config.data
// 加密数据,包装成 { content: "encryptedString" }
config.data = { content: encrypt(config.data, config.url) }
}
}
}
// config.type 可以从api的接口地址定义 可以不触发loading
if (config.noLoading !== true) {
startLoading()
}
return config
},
error => {
return Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
let res = response.data
if (envInfo.VUE_APP_USE_ENCRYPT === 'true') {
// 解密处理
if (
response.config.headers['X-Encrypted'] === 'true' &&
typeof res === 'string'
) {
try {
res = decryptWithPrivateKey(res)
} catch (e) {
logger.error('解密响应失败', e)
}
}
if (res !== '' && typeof res === 'string') {
res = JSON.parse(res)
}
}
endLoading()
if (response.config.back) {
return res
}
// 二进制数据则直接返回
if (
response.request.responseType === 'blob' ||
response.request.responseType === 'arraybuffer'
) {
return response.data
}
res.code = Number(res.code)
if (res.code === 401) {
MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', {
confirmButtonText: '重新登录',
showCancelButton: false,
type: 'warning'
}).then(() => {
removeToken()
router.push({ path: '/login' })
})
} else if (res.code === 500) {
Message({
message: res.message,
type: 'error',
duration: 5 * 500
})
return Promise.reject(res)
} else if (res.code !== 0) {
Message({
message:
res.result ||
res.message ||
res.content.resultMessage ||
'接口请求错误',
type: 'error',
duration: 5 * 1000
})
return Promise.reject(res)
} else {
if (!res.content.result || res.content.result !== '0') {
Message({
message: res.result || res.content.resultMessage || '接口请求错误',
type: 'error',
duration: 5 * 1000
})
} else {
return res
}
}
},
error => {
endLoading()
Message({
message: error.message,
type: 'error',
duration: 5 * 500
})
return
}
)
export default service