/** * API 封装:baseURL、Token、POST JSON、统一错误与 401 处理 * 依据:backend/API.md,全部 POST,JSON,Bearer Token */ (function (global) { 'use strict'; var BASE_URL = 'http://127.0.0.1:8000'; var TOKEN_KEY = 'pm_token'; var USER_KEY = 'pm_user'; function getToken() { try { return localStorage.getItem(TOKEN_KEY) || ''; } catch (e) { return ''; } } function setToken(token) { try { if (token) localStorage.setItem(TOKEN_KEY, token); else localStorage.removeItem(TOKEN_KEY); } catch (e) {} } function getUser() { try { var raw = localStorage.getItem(USER_KEY); return raw ? JSON.parse(raw) : null; } catch (e) { return null; } } function setUser(user) { try { if (user) localStorage.setItem(USER_KEY, JSON.stringify(user)); else localStorage.removeItem(USER_KEY); } catch (e) {} } function clearAuth() { setToken(''); setUser(null); } /** * POST /api/xxx 请求 * @param {string} path - 如 '/api/auth/login' * @param {object} body - 请求体 * @param {boolean} [requireAuth=true] - 是否携带 Token * @returns {Promise<{ ok: boolean, data?: object, status?: number, message?: string }>} */ function post(path, body, requireAuth) { if (requireAuth === undefined) requireAuth = true; var url = BASE_URL + path; var headers = { 'Content-Type': 'application/json', }; var token = getToken(); if (requireAuth && token) { headers['Authorization'] = 'Bearer ' + token; } return fetch(url, { method: 'POST', headers: headers, body: JSON.stringify(body || {}), }) .then(function (res) { return res.text().then(function (text) { var data = null; try { data = text ? JSON.parse(text) : null; } catch (e) { data = null; } if (res.status === 401) { clearAuth(); if (typeof global.onAuthRequired === 'function') { global.onAuthRequired(); } return { ok: false, status: 401, message: data && data.message ? data.message : '未登录' }; } if (!res.ok) { var msg = (data && data.message) || res.statusText || '请求失败'; return { ok: false, status: res.status, data: data, message: msg }; } return { ok: true, data: data }; }); }) .catch(function (err) { return { ok: false, message: err && err.message ? err.message : '网络错误' }; }); } global.API = { BASE_URL: BASE_URL, getToken: getToken, setToken: setToken, getUser: getUser, setUser: setUser, clearAuth: clearAuth, post: post, }; })(typeof window !== 'undefined' ? window : this);