refactor: 更新应用配置与样式依赖
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
import { getAccessToken, clearTokens } from "./auth";
|
||||
|
||||
// 401 跳转防抖锁,避免并发请求多次跳转登录页
|
||||
let isRedirecting401 = false;
|
||||
|
||||
/**
|
||||
* 请求错误类
|
||||
*/
|
||||
@@ -7,13 +10,13 @@ export class RequestError extends Error {
|
||||
/** HTTP 状态码 */
|
||||
statusCode: number;
|
||||
/** 业务错误码 */
|
||||
code: number;
|
||||
code: string;
|
||||
|
||||
constructor(message: string, statusCode: number, code?: number) {
|
||||
constructor(message: string, statusCode: number, code?: string) {
|
||||
super(message);
|
||||
this.name = "RequestError";
|
||||
this.statusCode = statusCode;
|
||||
this.code = code ?? statusCode;
|
||||
this.code = code ?? String(statusCode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,26 +68,42 @@ function request<T = any>(options: RequestOptions): Promise<T> {
|
||||
timeout: options.timeout || 30000,
|
||||
responseType: options.responseType,
|
||||
success: (res: any) => {
|
||||
const serverCode = res?.data?.code;
|
||||
const serverMsg = res?.data?.msg || res?.data?.message;
|
||||
// 请求成功
|
||||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||||
resolve(res.data.data);
|
||||
}
|
||||
// 未授权错误:清除 token 并跳转登录页
|
||||
else if (res.statusCode === 401) {
|
||||
|
||||
// 令牌无效/过期(业务码 A023x 或 HTTP 401):清除 token 并跳转登录页(防抖)
|
||||
const isTokenError =
|
||||
(res.statusCode >= 200 && res.statusCode < 300 && serverCode?.startsWith("A023")) ||
|
||||
res.statusCode === 401;
|
||||
if (isTokenError) {
|
||||
clearTokens();
|
||||
uni.navigateTo({
|
||||
url: "/pages/login/index",
|
||||
});
|
||||
reject(new RequestError(serverMsg || "未授权,请重新登录", 401));
|
||||
if (!isRedirecting401) {
|
||||
isRedirecting401 = true;
|
||||
uni.navigateTo({
|
||||
url: "/pages/login/index",
|
||||
complete: () => {
|
||||
isRedirecting401 = false;
|
||||
},
|
||||
});
|
||||
}
|
||||
reject(new RequestError(serverMsg || "未授权,请重新登录", 401, serverCode || "A0230"));
|
||||
return;
|
||||
}
|
||||
// 其他错误
|
||||
else {
|
||||
const errorCode = res?.data?.code || res.statusCode;
|
||||
reject(
|
||||
new RequestError(serverMsg || `请求失败: ${res.statusCode}`, res.statusCode, errorCode)
|
||||
);
|
||||
|
||||
// HTTP 成功:校验业务码
|
||||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||||
if (!serverCode || serverCode === "00000") {
|
||||
resolve(res.data.data);
|
||||
} else {
|
||||
reject(new RequestError(serverMsg || "请求失败", res.statusCode, serverCode));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 其他 HTTP 错误
|
||||
reject(
|
||||
new RequestError(serverMsg || `请求失败: ${res.statusCode}`, res.statusCode, serverCode)
|
||||
);
|
||||
},
|
||||
fail: (err) => {
|
||||
reject(new RequestError(err.errMsg || "网络请求失败", 0));
|
||||
@@ -94,4 +113,3 @@ function request<T = any>(options: RequestOptions): Promise<T> {
|
||||
}
|
||||
|
||||
export default request;
|
||||
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
/**
|
||||
import {
|
||||
ACCESS_TOKEN_KEY,
|
||||
REFRESH_TOKEN_KEY,
|
||||
USER_INFO_KEY,
|
||||
THEME_MODE_KEY,
|
||||
THEME_COLOR_KEY,
|
||||
} from "@/constants";
|
||||
|
||||
/**
|
||||
* 存储工具类
|
||||
* 提供localStorage和sessionStorage操作方法
|
||||
* 提供uni-app Storage操作方法
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -32,42 +40,12 @@ export const Storage = {
|
||||
remove,
|
||||
};
|
||||
|
||||
// 为了向后兼容,导出具体的函数
|
||||
import { ACCESS_TOKEN_KEY, USER_INFO_KEY, THEME_MODE_KEY, THEME_COLOR_KEY } from "@/constants";
|
||||
|
||||
/**
|
||||
* 获取令牌
|
||||
*/
|
||||
export function getToken(): string | null {
|
||||
return Storage.get<string>(ACCESS_TOKEN_KEY) || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置令牌
|
||||
*/
|
||||
export function setToken(token: string): void {
|
||||
Storage.set(ACCESS_TOKEN_KEY, token);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户信息
|
||||
*/
|
||||
export function getUserInfo<T = any>(): T | undefined {
|
||||
return Storage.get<T>(USER_INFO_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置用户信息
|
||||
*/
|
||||
export function setUserInfo(userInfo: any): void {
|
||||
Storage.set(USER_INFO_KEY, userInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有数据
|
||||
*/
|
||||
export function clearAll(): void {
|
||||
Storage.remove(ACCESS_TOKEN_KEY);
|
||||
Storage.remove(REFRESH_TOKEN_KEY);
|
||||
Storage.remove(USER_INFO_KEY);
|
||||
Storage.remove(THEME_MODE_KEY);
|
||||
Storage.remove(THEME_COLOR_KEY);
|
||||
|
||||
Reference in New Issue
Block a user