// API 调用封装: 自动带 JWT、401 自动清 token、抛统一错误 const TOKEN_KEY = 'iboard_token' const REMEMBER_KEY = 'iboard_remember' export function getToken() { return localStorage.getItem(TOKEN_KEY) || '' } export function setToken(token) { if (token) localStorage.setItem(TOKEN_KEY, token) else localStorage.removeItem(TOKEN_KEY) } export function getRememberFlag() { return localStorage.getItem(REMEMBER_KEY) === '1' } export function setRememberFlag(v) { if (v) localStorage.setItem(REMEMBER_KEY, '1') else localStorage.removeItem(REMEMBER_KEY) } export async function api(path, { method = 'GET', body, headers = {} } = {}) { const token = getToken() const res = await fetch('/api' + path, { method, headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: 'Bearer ' + token } : {}), ...headers, }, body: body ? JSON.stringify(body) : undefined, }) if (res.status === 401) { setToken('') const data = await res.json().catch(() => ({})) if (!path.startsWith('/auth/')) window.location.assign('/login') throw new Error(data.error || '未登录') } const data = await res.json().catch(() => ({})) if (!res.ok) throw new Error(data.error || '请求失败 (' + res.status + ')') return data }