103 lines
3.4 KiB
JavaScript
103 lines
3.4 KiB
JavaScript
import { ENV, STORAGE_KEYS } from './env';
|
|
import { md5 } from './md5';
|
|
|
|
const DEFAULT_TIMEOUT = ENV.REQUEST_TIMEOUT || 15000;
|
|
|
|
function buildQuery(params = {}) {
|
|
const entries = Object.entries(params).filter(([, value]) => value !== undefined && value !== null);
|
|
if (!entries.length) return '';
|
|
return entries
|
|
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
|
|
.join('&');
|
|
}
|
|
|
|
function combineUrl(base, path) {
|
|
if (/^https?:\/\//i.test(path)) return path;
|
|
const normalizedBase = (base || '').replace(/\/$/, '');
|
|
const normalizedPath = (path || '').replace(/^\//, '');
|
|
return `${normalizedBase}/${normalizedPath}`;
|
|
}
|
|
|
|
function request(method, url, data = {}, options = {}) {
|
|
const isQuery = method === 'GET' || method === 'DELETE';
|
|
const params = isQuery ? data : (options.params || {});
|
|
let finalUrl = combineUrl(ENV.API_BASE_URL, url);
|
|
const queryString = buildQuery(params);
|
|
if (queryString) {
|
|
finalUrl += (finalUrl.includes('?') ? '&' : '?') + queryString;
|
|
}
|
|
|
|
const header = Object.assign(
|
|
{ 'content-type': 'application/json' },
|
|
options.header || {}
|
|
);
|
|
|
|
if (ENV.SECURITY_ENABLE && ENV.SECURITY_SECRET_KEY) {
|
|
const timestamp = Date.now().toString();
|
|
header['X-App-Timestamp'] = timestamp;
|
|
header['X-App-Sign'] = md5(timestamp + ENV.SECURITY_SECRET_KEY);
|
|
}
|
|
|
|
const token = uni.getStorageSync(STORAGE_KEYS.TOKEN);
|
|
if (token) {
|
|
header.Authorization = `Bearer ${token}`;
|
|
} else if (!options.allowGuest) {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '未登录,请先登录',
|
|
showCancel: false,
|
|
success: () => {
|
|
uni.navigateTo({ url: '/pages/login/login' });
|
|
}
|
|
});
|
|
return Promise.reject({ message: '未登录' });
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
uni.request({
|
|
url: finalUrl,
|
|
method,
|
|
data: isQuery ? {} : data,
|
|
header,
|
|
timeout: options.timeout || DEFAULT_TIMEOUT,
|
|
success: (res) => {
|
|
const { statusCode, data: resData } = res;
|
|
const businessCode = resData && typeof resData.code !== 'undefined' ? resData.code : null;
|
|
if (statusCode === 401 || businessCode === 401) {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '登录已失效,请重新登录',
|
|
showCancel: false,
|
|
success: () => {
|
|
uni.removeStorageSync(STORAGE_KEYS.TOKEN);
|
|
uni.removeStorageSync(STORAGE_KEYS.USER_INFO);
|
|
uni.navigateTo({ url: '/pages/login/login' });
|
|
}
|
|
});
|
|
reject({ message: '登录失效', statusCode, data: resData });
|
|
return;
|
|
}
|
|
if (statusCode >= 200 && statusCode < 300) {
|
|
resolve(options.raw ? res : resData);
|
|
return;
|
|
}
|
|
reject({
|
|
message: resData && (resData.msg || resData.message) ? (resData.msg || resData.message) : '请求失败',
|
|
statusCode,
|
|
data: resData
|
|
});
|
|
},
|
|
fail: (err) => {
|
|
reject(err);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export const get = (url, params, options) => request('GET', url, params, options);
|
|
export const post = (url, data, options) => request('POST', url, data, options);
|
|
export const put = (url, data, options) => request('PUT', url, data, options);
|
|
export const del = (url, params, options) => request('DELETE', url, params, options);
|
|
|
|
export default request;
|