initial project with login web
This commit is contained in:
128
src/utils/http.js
Normal file
128
src/utils/http.js
Normal file
@@ -0,0 +1,128 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user