mirror of
http://112.124.100.131/ebiz-ai/ebiz-ai-knowledge-manage.git
synced 2025-12-09 10:56:50 +08:00
177 lines
4.5 KiB
JavaScript
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
|