/** * 统一的 HTTP 请求封装 * 自动添加 tenantId、token 等公共参数 */ import { getApiUrl } from './config.js' /** * 获取 tenantId(从本地存储) */ function getTenantId() { try { return uni.getStorageSync('backend-tenant-id') || '' } catch (e) { console.error('获取 tenantId 失败:', e) return '' } } /** * 获取 token(从本地存储) */ function getToken() { try { return uni.getStorageSync('backend-token') || '' } catch (e) { console.error('获取 token 失败:', e) return '' } } /** * 统一的请求方法 * @param {Object} options - uni.request 的配置选项 * @param {string} options.url - 请求地址(会自动使用 getApiUrl 处理) * @param {string} options.method - 请求方法,默认 'GET' * @param {Object} options.data - 请求数据 * @param {Object} options.header - 请求头(会自动合并公共 header) * @param {number} options.timeout - 超时时间 * @param {boolean} options.needTenantId - 是否需要添加 tenantId,默认 true * @param {boolean} options.needToken - 是否需要添加 token,默认 true * @returns {Promise} 请求结果 */ export function request(options = {}) { const { url, method = 'GET', data = {}, header = {}, timeout = 10000, needTenantId = true, needToken = true, ...restOptions } = options // 处理 URL(自动添加 baseUrl) const fullUrl = url.startsWith('http') ? url : getApiUrl(url) // 构建请求头 const requestHeader = { 'Content-Type': 'application/json', ...header } // 添加 token(如果需要) if (needToken) { const token = getToken() if (token) { requestHeader['Authorization'] = `Bearer ${token}` // 或者使用其他 header 名称,根据后端要求调整 // requestHeader['X-Token'] = token } } // 处理请求数据 let requestData = { ...data } // 添加 tenantId 到 X-Tenant-Id header // 技术方案:登录返回的 LoginResponse 中包含 tenantId,前端保存后自动添加到所有请求的 header 中 if (needTenantId) { const tenantId = getTenantId() if (tenantId) { // 将 tenantId 放入 X-Tenant-Id header(适用于所有请求类型:GET、POST、PUT、DELETE) requestHeader['X-Tenant-Id'] = tenantId } } // 发起请求 return new Promise((resolve, reject) => { uni.request({ url: finalUrl, method: method.toUpperCase(), data: requestData, header: requestHeader, timeout, ...restOptions, success: (res) => { resolve(res) }, fail: (err) => { console.error('[Request] 请求失败:', { url: finalUrl, method: method.toUpperCase(), error: err }) reject(err) } }) }) } /** * GET 请求快捷方法 */ export function get(url, data = {}, options = {}) { return request({ url, method: 'GET', data, ...options }) } /** * POST 请求快捷方法 */ export function post(url, data = {}, options = {}) { return request({ url, method: 'POST', data, ...options }) } /** * PUT 请求快捷方法 */ export function put(url, data = {}, options = {}) { return request({ url, method: 'PUT', data, ...options }) } /** * DELETE 请求快捷方法 */ export function del(url, data = {}, options = {}) { return request({ url, method: 'DELETE', data, ...options }) }