diff --git a/src/api/request.ts b/src/api/request.ts index 374b31d..30df83e 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -1,41 +1,49 @@ +import { API_BASE, TOKEN_KEY } from '../config' + +/** 请求选项 */ interface RequestOptions { url: string method?: 'GET' | 'POST' | 'PUT' | 'DELETE' data?: any - header?: any + header?: Record needToken?: boolean } +/** 后端统一响应格式 */ interface ResponseData { code: number - message: string + msg: string data: T + errcode: number + errmsg: string } -const BASE_URL = '' -const TOKEN_KEY = 'app_token' - +/** 从本地存储获取 token */ function getToken(): string { return uni.getStorageSync(TOKEN_KEY) || '' } +/** 保存 token 到本地存储 */ function setToken(token: string): void { uni.setStorageSync(TOKEN_KEY, token) } +/** 移除本地存储中的 token */ function removeToken(): void { uni.removeStorageSync(TOKEN_KEY) } +/** 通用请求函数 */ function request(options: RequestOptions): Promise { return new Promise((resolve, reject) => { const { url, method = 'GET', data, needToken = true } = options - const header: any = { + const header: Record = { 'Content-Type': 'application/json', ...options.header } + // 自动注入 Bearer Token if (needToken) { const token = getToken() if (token) { @@ -43,27 +51,40 @@ function request(options: RequestOptions): Promise { } } + // 拼接完整 URL + const fullUrl = url.startsWith('http') ? url : `${API_BASE}${url}` + uni.request({ - url: BASE_URL + url, + url: fullUrl, method, data, header, success: (res: any) => { const result = res.data as ResponseData - if (res.statusCode === 200) { - if (result.code === 0 || result.code === 200) { + + // HTTP 状态码检查 + if (res.statusCode === 401 || result?.code === 401) { + removeToken() + uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' }) + setTimeout(() => { + uni.navigateTo({ url: '/pages/login/login' }) + }, 1500) + reject(new Error('未授权')) + return + } + + if (res.statusCode >= 200 && res.statusCode < 300) { + // 业务状态码检查:code === 200 或 errcode === 0 均视为成功 + if (result.code === 200 || result.errcode === 0) { resolve(result.data as T) - } else if (result.code === 401) { - removeToken() - uni.showToast({ title: '请先登录', icon: 'none' }) - reject(new Error(result.message || '未授权')) } else { - uni.showToast({ title: result.message || '请求失败', icon: 'none' }) - reject(new Error(result.message || '请求失败')) + const errMsg = result.msg || result.errmsg || '请求失败' + uni.showToast({ title: errMsg, icon: 'none' }) + reject(new Error(errMsg)) } } else { uni.showToast({ title: '网络错误', icon: 'none' }) - reject(new Error('网络错误')) + reject(new Error(`HTTP ${res.statusCode}`)) } }, fail: (err: any) => { @@ -74,19 +95,19 @@ function request(options: RequestOptions): Promise { }) } -function get(url: string, data?: any, needToken: boolean = true): Promise { +function get(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'GET', data, needToken }) } -function post(url: string, data?: any, needToken: boolean = true): Promise { +function post(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'POST', data, needToken }) } -function put(url: string, data?: any, needToken: boolean = true): Promise { +function put(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'PUT', data, needToken }) } -function del(url: string, data?: any, needToken: boolean = true): Promise { +function del(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'DELETE', data, needToken }) } @@ -98,6 +119,5 @@ export { del, getToken, setToken, - removeToken, - BASE_URL + removeToken }