129 lines
3.1 KiB
JavaScript
129 lines
3.1 KiB
JavaScript
|
|
import axios from "axios";
|
|||
|
|
|
|||
|
|
// 获取存储的IP地址
|
|||
|
|
const getBaseURL = () => {
|
|||
|
|
const storedIP = uni.getStorageSync("apiBaseURL");
|
|||
|
|
if (storedIP) {
|
|||
|
|
// 如果存储的IP不包含协议,自动添加http://
|
|||
|
|
return storedIP.startsWith("http") ? storedIP : `http://${storedIP}`;
|
|||
|
|
}
|
|||
|
|
return import.meta.env.VITE_API_BASE_URL || "/api";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 创建 axios 实例
|
|||
|
|
const http = axios.create({
|
|||
|
|
baseURL: getBaseURL(),
|
|||
|
|
timeout: 10000,
|
|||
|
|
headers: {
|
|||
|
|
"Content-Type": "application/json",
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 设置IP地址的方法(供外部调用)
|
|||
|
|
export const setBaseURL = (ip) => {
|
|||
|
|
const baseURL = ip.startsWith("http") ? ip : `http://${ip}`;
|
|||
|
|
http.defaults.baseURL = baseURL;
|
|||
|
|
uni.setStorageSync("apiBaseURL", baseURL);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 请求拦截器
|
|||
|
|
http.interceptors.request.use(
|
|||
|
|
(config) => {
|
|||
|
|
// 每次请求前更新baseURL(从存储中获取最新的IP)
|
|||
|
|
const storedIP = uni.getStorageSync("apiBaseURL");
|
|||
|
|
if (storedIP) {
|
|||
|
|
const baseURL = storedIP.startsWith("http") ? storedIP : `http://${storedIP}`;
|
|||
|
|
config.baseURL = baseURL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从本地存储获取 token
|
|||
|
|
const token = uni.getStorageSync("token");
|
|||
|
|
if (token) {
|
|||
|
|
config.headers.Authorization = `Bearer ${token}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 显示 loading
|
|||
|
|
uni.showLoading({ title: "加载中..." });
|
|||
|
|
|
|||
|
|
return config;
|
|||
|
|
},
|
|||
|
|
(error) => {
|
|||
|
|
uni.hideLoading();
|
|||
|
|
return Promise.reject(error);
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 响应拦截器
|
|||
|
|
http.interceptors.response.use(
|
|||
|
|
(response) => {
|
|||
|
|
uni.hideLoading();
|
|||
|
|
|
|||
|
|
const { data } = response;
|
|||
|
|
|
|||
|
|
// 根据业务状态码处理(可根据实际接口调整)
|
|||
|
|
if (data.code === 200 || data.code === 0) {
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 业务错误提示
|
|||
|
|
uni.showToast({
|
|||
|
|
title: data.message || "请求失败",
|
|||
|
|
icon: "none",
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return Promise.reject(data);
|
|||
|
|
},
|
|||
|
|
(error) => {
|
|||
|
|
uni.hideLoading();
|
|||
|
|
|
|||
|
|
// HTTP 错误处理
|
|||
|
|
let message = "网络错误";
|
|||
|
|
if (error.response) {
|
|||
|
|
switch (error.response.status) {
|
|||
|
|
case 401:
|
|||
|
|
message = "登录已过期,请重新登录";
|
|||
|
|
// 清除 token 并跳转登录页
|
|||
|
|
uni.removeStorageSync("token");
|
|||
|
|
uni.reLaunch({ url: "/pages/index/index" });
|
|||
|
|
break;
|
|||
|
|
case 403:
|
|||
|
|
message = "没有权限访问";
|
|||
|
|
break;
|
|||
|
|
case 404:
|
|||
|
|
message = "请求资源不存在";
|
|||
|
|
break;
|
|||
|
|
case 500:
|
|||
|
|
message = "服务器错误";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
message = error.response.data?.message || "请求失败";
|
|||
|
|
}
|
|||
|
|
} else if (error.code === "ECONNABORTED") {
|
|||
|
|
message = "请求超时";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uni.showToast({ title: message, icon: "none" });
|
|||
|
|
|
|||
|
|
return Promise.reject(error);
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 封装请求方法
|
|||
|
|
export const get = (url, params, config = {}) => {
|
|||
|
|
return http.get(url, { params, ...config });
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export const post = (url, data, config = {}) => {
|
|||
|
|
return http.post(url, data, config);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export const put = (url, data, config = {}) => {
|
|||
|
|
return http.put(url, data, config);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export const del = (url, params, config = {}) => {
|
|||
|
|
return http.delete(url, { params, ...config });
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export default http;
|