修复设备列表无限请求数据的问题

This commit is contained in:
柳清爽
2025-03-31 12:04:59 +08:00
parent dfe73f9a22
commit c4698bd22a
78 changed files with 370 additions and 14224 deletions

View File

@@ -97,6 +97,11 @@ export const loginApi = {
// 验证 Token 是否有效
export const validateToken = async (): Promise<boolean> => {
// 如果在服务端直接返回false避免在服务端发起不必要的请求
if (typeof window === 'undefined') {
return false;
}
try {
const response = await loginApi.getUserInfo();
return response.code === 200;
@@ -107,6 +112,11 @@ export const validateToken = async (): Promise<boolean> => {
// 刷新令牌
export const refreshAuthToken = async (): Promise<boolean> => {
// 如果在服务端直接返回false
if (typeof window === 'undefined') {
return false;
}
try {
const response = await loginApi.refreshToken();
if (response.code === 200 && response.data?.token) {

View File

@@ -7,8 +7,11 @@ export const handleTokenExpired = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
// 跳转到登录页
window.location.href = '/login';
// 使用客户端导航而不是直接修改window.location
// 避免在服务端渲染时执行
setTimeout(() => {
window.location.href = '/login';
}, 0);
}
};
@@ -16,7 +19,10 @@ export const handleTokenExpired = () => {
export const handleApiResponse = <T>(response: Response, result: any): T => {
// 处理token过期情况
if (result && (result.code === 401 || result.msg?.includes('token'))) {
handleTokenExpired();
// 仅在客户端处理token过期
if (typeof window !== 'undefined') {
handleTokenExpired();
}
throw new Error(result.msg || '登录已过期,请重新登录');
}
@@ -30,7 +36,10 @@ export const handleApiError = (error: unknown): never => {
if (error instanceof Error) {
// 如果是未授权错误可能是token过期
if (error.message.includes('401') || error.message.includes('token') || error.message.includes('授权')) {
handleTokenExpired();
// 仅在客户端处理token过期
if (typeof window !== 'undefined') {
handleTokenExpired();
}
}
throw error;
}

View File

@@ -5,3 +5,31 @@ export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
// 用于在客户端和服务器端获取一致的日期格式
// 避免因为时区差异导致的水合不匹配
export function getFormattedDate(date: Date | string | number, format: Intl.DateTimeFormatOptions = {}) {
// 使用传入的日期创建一个新的日期对象
const dateObj = new Date(date);
// 使用en-US区域设置创建字符串确保客户端和服务器端一致
return dateObj.toLocaleDateString('en-US', {
year: 'numeric',
month: 'short',
day: 'numeric',
...format
});
}
// 安全的客户端检查
export function isClient() {
return typeof window !== 'undefined';
}
// 防止在服务端使用Math.random导致水合不匹配
export function getClientRandomId(prefix = '') {
if (isClient()) {
return `${prefix}${Math.random().toString(36).substring(2, 9)}`;
}
return `${prefix}placeholder`;
}