import { API_BASE, TOKEN_KEY } from '../config' /** 请求选项 */ interface RequestOptions { url: string method?: 'GET' | 'POST' | 'PUT' | 'DELETE' data?: any header?: Record needToken?: boolean } /** 后端统一响应格式 */ interface ResponseData { code: number msg: string data: T errcode: number errmsg: string } /** 从本地存储获取 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: Record = { 'Content-Type': 'application/json', ...options.header } // 自动注入 Bearer Token if (needToken) { const token = getToken() if (token) { header['Authorization'] = `Bearer ${token}` } } // 拼接完整 URL const fullUrl = url.startsWith('http') ? url : `${API_BASE}${url}` uni.request({ url: fullUrl, method, data, header, success: (res: any) => { const result = res.data as ResponseData // 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 { 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(`HTTP ${res.statusCode}`)) } }, fail: (err: any) => { uni.showToast({ title: '网络连接失败', icon: 'none' }) reject(err) } }) }) } function get(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'GET', data, needToken }) } function post(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'POST', data, needToken }) } function put(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'PUT', data, needToken }) } function del(url: string, data?: any, needToken = true): Promise { return request({ url, method: 'DELETE', data, needToken }) } export { request, get, post, put, del, getToken, setToken, removeToken }