Files
2026-01-31 23:16:21 +08:00

107 lines
2.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* API 封装:baseURL、Token、POST JSON、统一错误与 401 处理
* 依据:backend/API.md,全部 POSTJSONBearer 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);