refactor: 更新应用配置与样式依赖

This commit is contained in:
Ray.Hao
2026-04-14 14:46:48 +08:00
parent ca3711e66d
commit e87c2cad53
28 changed files with 370 additions and 359 deletions

View File

@@ -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;

View File

@@ -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);