2025-12-05 08:42:10 +00:00
|
|
|
|
// api/request.ts
|
|
|
|
|
|
export class Request {
|
|
|
|
|
|
private baseURL: string
|
|
|
|
|
|
private interceptors: {
|
|
|
|
|
|
request: Array<(config: any) => any>
|
|
|
|
|
|
response: Array<(response: any) => any>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
constructor(baseURL: string = '') {
|
|
|
|
|
|
this.baseURL = baseURL
|
|
|
|
|
|
this.interceptors = {
|
|
|
|
|
|
request: [],
|
|
|
|
|
|
response: []
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加请求拦截器
|
|
|
|
|
|
useRequestInterceptor(interceptor: (config: any) => any) {
|
|
|
|
|
|
this.interceptors.request.push(interceptor)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加响应拦截器
|
|
|
|
|
|
useResponseInterceptor(interceptor: (response: any) => any) {
|
|
|
|
|
|
this.interceptors.response.push(interceptor)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async request(method: string, url: string, data?: any) {
|
|
|
|
|
|
let config = {
|
|
|
|
|
|
method,
|
|
|
|
|
|
url: this.baseURL + url,
|
|
|
|
|
|
data,
|
|
|
|
|
|
headers: {},
|
|
|
|
|
|
// 添加params字段用于区分GET参数
|
|
|
|
|
|
params: method === 'GET' || method === 'HEAD' ? data : undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 执行请求拦截器
|
|
|
|
|
|
for (const interceptor of this.interceptors.request) {
|
|
|
|
|
|
config = await interceptor(config)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 构建完整的URL(处理GET参数)
|
|
|
|
|
|
let fullUrl = config.url
|
|
|
|
|
|
if (config.params && Object.keys(config.params).length > 0) {
|
|
|
|
|
|
const queryString = new URLSearchParams(config.params).toString()
|
|
|
|
|
|
fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryString
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const fetchConfig: RequestInit = {
|
|
|
|
|
|
method: config.method,
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
|
...config.headers
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 只有非GET/HEAD请求才设置body
|
|
|
|
|
|
if (config.method !== 'GET' && config.method !== 'HEAD' && config.data) {
|
|
|
|
|
|
fetchConfig.body = JSON.stringify(config.data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
const response = await fetch(fullUrl, fetchConfig)
|
|
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
|
throw new Error(`HTTP错误: ${response.status}`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const result = await response.json()
|
|
|
|
|
|
|
|
|
|
|
|
let finalResult = { ...result, status: response.status }
|
|
|
|
|
|
for (const interceptor of this.interceptors.response) {
|
|
|
|
|
|
finalResult = await interceptor(finalResult)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return finalResult
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
// 错误处理
|
|
|
|
|
|
console.error('请求失败:', error)
|
|
|
|
|
|
throw error
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
get(url: string, params?: any) {
|
|
|
|
|
|
return this.request('GET', url, params)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
post(url: string, data?: any) {
|
|
|
|
|
|
return this.request('POST', url, data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
put(url: string, data?: any) {
|
|
|
|
|
|
return this.request('PUT', url, data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delete(url: string, data?: any) {
|
|
|
|
|
|
return this.request('DELETE', url, data)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建实例
|
|
|
|
|
|
const request = new Request('http://192.168.123.111:8083/api/')
|
|
|
|
|
|
|
|
|
|
|
|
// 添加全局请求拦截器
|
|
|
|
|
|
request.useRequestInterceptor(async (config) => {
|
|
|
|
|
|
// 添加认证token
|
|
|
|
|
|
const token = localStorage.getItem('token')
|
|
|
|
|
|
if (token) {
|
|
|
|
|
|
config.headers.Authorization = `Bearer ${token}`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (config.url.includes('/enrollment/') && config.params?.idCard) {
|
|
|
|
|
|
const idCardRegex = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
|
|
|
|
|
|
if (!idCardRegex.test(config.params.idCard)) {
|
|
|
|
|
|
throw new Error('身份证号格式不正确')
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return config
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 添加全局响应拦截器
|
|
|
|
|
|
request.useResponseInterceptor(async (response) => {
|
|
|
|
|
|
// 根据你的后端返回结构调整
|
|
|
|
|
|
if (response.code && response.code !== 200 && response.code !== 0 && response.code !== 1) {
|
|
|
|
|
|
// 处理业务错误
|
|
|
|
|
|
switch (response.code) {
|
|
|
|
|
|
case 401:
|
|
|
|
|
|
window.location.href = '/login'
|
|
|
|
|
|
break
|
|
|
|
|
|
case 403:
|
|
|
|
|
|
throw new Error('权限不足,无法访问')
|
|
|
|
|
|
default:
|
|
|
|
|
|
throw new Error(response.message || '请求失败')
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-27 08:44:07 +00:00
|
|
|
|
return response
|
2025-12-05 08:42:10 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 添加错误处理拦截器
|
|
|
|
|
|
request.useResponseInterceptor(async (response) => {
|
|
|
|
|
|
return response
|
2026-01-27 08:44:07 +00:00
|
|
|
|
})
|
2025-12-05 08:42:10 +00:00
|
|
|
|
|
|
|
|
|
|
export default request
|