Files
cdTestPlant3/cdTMP/src/api/request.js
2024-09-04 20:06:26 +08:00

119 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)