Files
cunkebao_v3/SuperAdmin/lib/api-utils.ts
2025-04-10 11:54:21 +08:00

83 lines
2.0 KiB
TypeScript
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.

import { getConfig } from './config';
import { getAdminInfo, clearAdminInfo } from './utils';
/**
* API响应数据结构
*/
export interface ApiResponse<T = any> {
code: number;
msg: string;
data: T | null;
}
/**
* 通用API请求函数
* @param endpoint API端点
* @param method HTTP方法
* @param data 请求数据
* @returns API响应
*/
export async function apiRequest<T = any>(
endpoint: string,
method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET',
data?: any
): Promise<ApiResponse<T>> {
const { apiBaseUrl } = getConfig();
const url = `${apiBaseUrl}${endpoint}`;
// 获取认证信息
const adminInfo = getAdminInfo();
// 请求头
const headers: HeadersInit = {
'Content-Type': 'application/json',
};
// 如果有认证信息添加Cookie头
if (adminInfo?.token) {
// 添加认证令牌作为Cookie发送
document.cookie = `admin_id=${adminInfo.id}; path=/`;
document.cookie = `admin_token=${adminInfo.token}; path=/`;
}
// 请求配置
const config: RequestInit = {
method,
headers,
credentials: 'include', // 包含跨域请求的Cookie
};
// 如果有请求数据转换为JSON
if (data && method !== 'GET') {
config.body = JSON.stringify(data);
}
try {
const response = await fetch(url, config);
if (!response.ok) {
throw new Error(`请求失败: ${response.status} ${response.statusText}`);
}
const result = await response.json() as ApiResponse<T>;
// 如果返回未授权错误,清除登录信息
if (result.code === 401) {
clearAdminInfo();
// 如果在浏览器环境,跳转到登录页
if (typeof window !== 'undefined') {
window.location.href = '/login';
}
}
return result;
} catch (error) {
console.error('API请求错误:', error);
return {
code: 500,
msg: error instanceof Error ? error.message : '未知错误',
data: null
};
}
}