ai-clone/frontend-ai/utils/request.js
2026-03-05 14:29:21 +08:00

189 lines
3.9 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.

/**
* 网络请求封装
* 包含Token自动刷新机制
*/
// 从配置文件导入API_BASE
import { API_BASE } from '@/config/api.js';
let isRefreshing = false; // 是否正在刷新token
let requests = []; // 存储待重试的请求
/**
* 统一请求方法
*/
const request = (options) => {
return new Promise((resolve, reject) => {
// 获取token
const token = uni.getStorageSync('token');
// 设置请求头
const header = {
'Content-Type': 'application/json',
...options.header
};
if (token) {
header['Authorization'] = `Bearer ${token}`;
}
uni.request({
url: API_BASE + options.url,
method: options.method || 'GET',
data: options.data || {},
header: header,
success: (res) => {
// 请求成功
if (res.statusCode === 200) {
resolve(res.data);
}
// Token过期
else if (res.statusCode === 401) {
// 如果正在刷新token将请求加入队列
if (isRefreshing) {
requests.push(() => {
request(options).then(resolve).catch(reject);
});
} else {
// 开始刷新token
isRefreshing = true;
refreshToken()
.then((newToken) => {
// 刷新成功,重试当前请求
isRefreshing = false;
// 重试当前请求
request(options).then(resolve).catch(reject);
// 重试队列中的请求
requests.forEach(cb => cb());
requests = [];
})
.catch((err) => {
// 刷新失败,跳转登录
isRefreshing = false;
requests = [];
uni.showToast({
title: '登录已过期,请重新登录',
icon: 'none'
});
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/login'
});
}, 1500);
reject(err);
});
}
}
// 其他错误
else {
reject(res);
}
},
fail: (err) => {
reject(err);
}
});
});
};
/**
* 刷新Token
*/
const refreshToken = () => {
return new Promise((resolve, reject) => {
const refreshToken = uni.getStorageSync('refreshToken');
if (!refreshToken) {
reject(new Error('No refresh token'));
return;
}
uni.request({
url: API_BASE + '/api/users/refresh-token',
method: 'POST',
data: {
refreshToken: refreshToken
},
success: (res) => {
if (res.statusCode === 200 && res.data.success) {
// 保存新token
const newToken = res.data.data.token;
const newRefreshToken = res.data.data.refreshToken;
uni.setStorageSync('token', newToken);
uni.setStorageSync('refreshToken', newRefreshToken);
resolve(newToken);
} else {
reject(new Error('Refresh token failed'));
}
},
fail: (err) => {
reject(err);
}
});
});
};
/**
* GET请求
*/
export const get = (url, data = {}, header = {}) => {
return request({
url,
method: 'GET',
data,
header
});
};
/**
* POST请求
*/
export const post = (url, data = {}, header = {}) => {
return request({
url,
method: 'POST',
data,
header
});
};
/**
* PUT请求
*/
export const put = (url, data = {}, header = {}) => {
return request({
url,
method: 'PUT',
data,
header
});
};
/**
* DELETE请求
*/
export const del = (url, data = {}, header = {}) => {
return request({
url,
method: 'DELETE',
data,
header
});
};
export default {
get,
post,
put,
del,
request
};