/* 喝了么 - API 服务层 * 基于 HaveADrink SDK 封装后端接口 */ import HaveADrink from 'HaveADrink' // ========================================== // 后端服务地址(切换环境只需改这里) // ========================================== const API_HOST = 'https://dev.wash-painting.cn' // ========================================== // HTTP 请求函数(供 SDK 内部调用) // 参考 goodBooth 项目的 fetchsomething // ========================================== function httpRequest(url, params) { console.log('[API] Request:', params.method, url, 'data:', JSON.stringify(params.data)) return new Promise((resolve, reject) => { // 自动注入 Authorization token const headers = Object.assign({}, params.headers || {}) const token = uni.getStorageSync('auth_token') if (token) { headers['Authorization'] = `Bearer ${token}` } uni.request({ url: url, method: params.method, params: params.query || undefined, data: params.data, header: headers, success: (res) => { const code = res.statusCode if (code === 200 || code === 201 || code === 204) { resolve(res.data) } else if (code === 401) { // token 过期,清除登录态并跳转登录页 uni.removeStorageSync('auth_token') uni.removeStorageSync('refresh_token') uni.removeStorageSync('is_logged_in') uni.reLaunch({ url: '/pages/login/login' }) reject({ msg: '登录已过期,请重新登录' }) } else { const errMsg = (res.data && res.data.msg) || (res.data && res.data.errmsg) || `请求失败(${code})` reject({ msg: errMsg, code }) } }, fail: (err) => { reject({ msg: err.errMsg || '网络请求失败' }) } }) }) } // ========================================== // 文件上传函数(供 SDK 内部调用) // ========================================== function uploadRequest(url, params) { return new Promise((resolve, reject) => { const headers = Object.assign({}, params.headers || {}) const token = uni.getStorageSync('auth_token') if (token) { headers['Authorization'] = `Bearer ${token}` } uni.uploadFile({ url: url, filePath: params.data.fileName || params.data.filePath, name: params.data.name || 'file', header: headers, formData: params.data.formData || {}, success: (uploadRes) => { try { const data = typeof uploadRes.data === 'string' ? JSON.parse(uploadRes.data) : uploadRes.data resolve(data) } catch (e) { resolve(uploadRes.data) } }, fail: (err) => { reject({ msg: err.errMsg || '上传失败' }) } }) }) } // ========================================== // 初始化 SDK 实例 // ========================================== const client = new HaveADrink({ host: API_HOST, http_request: httpRequest, upload: uploadRequest, token: uni.getStorageSync('auth_token') || '' }) // ========================================== // 导出 SDK 实例(各页面直接 import 使用) // ========================================== export default client // ========================================== // Token 管理辅助函数 // ========================================== /** 登录成功后保存 token 并同步到 SDK */ export function saveAuthTokens(data) { if (data.token) { uni.setStorageSync('auth_token', data.token) client.setToken(data.token) } if (data.refresh_token) { uni.setStorageSync('refresh_token', data.refresh_token) } } /** 清除所有认证信息 */ export function clearAuth() { uni.removeStorageSync('auth_token') uni.removeStorageSync('refresh_token') uni.removeStorageSync('is_logged_in') uni.removeStorageSync('is_guest') uni.removeStorageSync('user_info') client.setToken('') } /** 尝试用 refresh_token 刷新 token */ export async function refreshAuthToken() { const refreshToken = uni.getStorageSync('refresh_token') if (!refreshToken) return false try { const res = await client.RefreshToken({ refresh_token: refreshToken }) if (res && res.token) { saveAuthTokens(res) return true } return false } catch (e) { console.warn('刷新 token 失败:', e) return false } }