107 lines
2.8 KiB
JavaScript
107 lines
2.8 KiB
JavaScript
/**
|
||
* 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);
|