1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2026-02-04 16:03:10 +00:00
Classworks/src/axios/axios.js
2025-11-16 15:14:17 +08:00

71 lines
1.9 KiB
JavaScript

import axios from "axios";
import {getSetting} from "@/utils/settings";
import {parseRateLimit} from "ratelimit-header-parser";
import RateLimitModal from "@/components/RateLimitModal.vue";
import {Base64} from "js-base64";
// 基本配置
const axiosInstance = axios.create({
// 可以在这里添加基础配置,例如超时时间等
timeout: 10000,
});
// 请求拦截器
axiosInstance.interceptors.request.use(
(requestConfig) => {
const provider = getSetting("server.provider");
// 只有在 kv-server 或 classworkscloud 模式下才添加请求头
if (provider === "kv-server" || provider === "classworkscloud") {
// 优先使用新的 kvToken
const kvToken = getSetting("server.kvToken");
if (kvToken) {
requestConfig.headers["x-app-token"] = kvToken;
} else {
// 向后兼容旧的 siteKey
const siteKey = getSetting("server.siteKey");
if (siteKey) {
requestConfig.headers["x-site-key"] = Base64.encode(siteKey);
}
}
}
return requestConfig;
},
(error) => {
console.log(error);
return Promise.reject(error);
}
);
// 响应拦截器
axiosInstance.interceptors.response.use(
(response) => {
return response;
},
(error) => {
// 处理限速响应 (HTTP 429)
if (error.response && error.response.status === 429) {
try {
// 解析限速头信息
const rateLimitInfo = parseRateLimit(error.response);
if (rateLimitInfo) {
// 显示限速弹窗,直接传递重置时间
RateLimitModal.show(
rateLimitInfo.reset,
error.config.url,
error.config.method.toUpperCase()
);
}
} catch (parseError) {
console.error("解析限速头信息失败:", parseError);
}
}
return Promise.reject(error);
}
);
export default axiosInstance;