119 lines
4.3 KiB
JavaScript
119 lines
4.3 KiB
JavaScript
import axios from "axios"
|
||
import { Message } from "@arco-design/web-vue"
|
||
import tool from "@/utils/tool"
|
||
import { get, isEmpty } from "lodash-es"
|
||
import qs, { stringify } from "qs"
|
||
import { h } from "vue"
|
||
import { IconFaceFrownFill } from "@arco-design/web-vue/dist/arco-vue-icon"
|
||
|
||
// 创建axios实例,添加请求和响应拦截器,返回该axios实例
|
||
function createService() {
|
||
// 创建axios实例
|
||
const service = axios.create()
|
||
|
||
// 实例的request请求拦截器
|
||
service.interceptors.request.use(
|
||
(config) => config,
|
||
(error) => {
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
// 实例的response响应拦截器
|
||
service.interceptors.response.use(
|
||
(res) => {
|
||
if (
|
||
(res.headers["content-disposition"] || !/^application\/json/.test(res.headers["content-type"])) &&
|
||
res.status === 200
|
||
) {
|
||
return res.data
|
||
// 如果发现data中有size字段直接报错
|
||
} else if (res.data.size) {
|
||
res.data.code = 500
|
||
res.data.message = "服务器内部错误"
|
||
res.data.success = false
|
||
} else if (res.data.code && res.data.code !== 200) {
|
||
// 如果data里面code字段不为200
|
||
Message.error({
|
||
content: res.data.message,
|
||
icon: () => h(IconFaceFrownFill)
|
||
})
|
||
}
|
||
return res.data
|
||
},
|
||
(error) => {
|
||
const err = (text) => {
|
||
Message.error({
|
||
content:
|
||
error.response && error.response.data && error.response.data.message
|
||
? error.response.data.message
|
||
: text,
|
||
icon: () => h(IconFaceFrownFill)
|
||
})
|
||
}
|
||
if (error.response && error.response.data) {
|
||
switch (error.response.status) {
|
||
case 404:
|
||
err("服务器资源不存在")
|
||
break
|
||
case 500:
|
||
err("服务器内部错误")
|
||
break
|
||
case 401:
|
||
err("登录状态已过期,需要重新登录")
|
||
// 清除本地localStorage
|
||
tool.local.clear()
|
||
// 移动到网站的根目录-这里不需要因为导航守卫可以返回login页面
|
||
if (
|
||
error.response.data.data.code === 40001 ||
|
||
error.response.data.data.detail === "No active account found with the given credentials"
|
||
) {
|
||
} else {
|
||
window.location.href = "/"
|
||
}
|
||
break
|
||
case 403:
|
||
err("没有权限访问该资源")
|
||
break
|
||
default:
|
||
err("未知错误!")
|
||
break
|
||
}
|
||
} else {
|
||
err("请求超时,服务器无响应!")
|
||
}
|
||
return Promise.reject(error.response && error.response.data ? error.response.data : null)
|
||
}
|
||
)
|
||
return service
|
||
}
|
||
|
||
/**
|
||
* @description 创建请求方法
|
||
* @param {Object} service axios 实例
|
||
*/
|
||
function createRequest(service) {
|
||
return function (config) {
|
||
const env = import.meta.env
|
||
const token = tool.local.get(env.VITE_APP_TOKEN_PREFIX)
|
||
const configDefault = {
|
||
headers: {
|
||
Authorization: "Bearer " + token,
|
||
"Accept-Language": "zh_CN",
|
||
"Content-Type": get(config, "headers.Content-Type", "application/json;charset=UTF-8")
|
||
},
|
||
timeout: 20000,
|
||
baseURL: env.VITE_APP_OPEN_PROXY === "true" ? env.VITE_APP_PROXY_PREFIX : env.VITE_APP_BASE_URL,
|
||
data: {}
|
||
}
|
||
const option = Object.assign(configDefault, config)
|
||
if (!isEmpty(option.params)) {
|
||
option.url = option.url + "?" + stringify(option.params)
|
||
option.params = {}
|
||
}
|
||
return service(option)
|
||
}
|
||
}
|
||
|
||
export const service = createService()
|
||
export const request = createRequest(service)
|