Files
2025-04-30 14:04:34 +08:00

172 lines
5.0 KiB
JavaScript

import { navigateToLogin } from '@/common/utils/utils.js';
import store from '@/store/index';
import { dev_host, mock_host, product_host, needProductUrl } from '../config.js';
export default class Request {
config = {
baseUrl: '',
header: {
'Content-Type': 'application/json; charset=utf-8',
},
method: 'GET',
dataType: 'json',
responseType: 'text',
success() { },
fail() { },
complete() { }
}
static posUrl(url) { /* 判断url是否为绝对路径 */
return /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
}
interceptor = {
request: (f) => {
if (f) {
this.requestBeforeFun = f
}
},
response: (f) => {
if (f) {
this.requestComFun = f
}
}
}
static requestBeforeFun(config) {
return config
}
static requestComFun(response) {
return response
}
setConfig(f) {
this.config = f(this.config)
return this
}
testNeedProductUrl(url) {
return needProductUrl.findIndex(ele => ele == url) != -1;
}
request(options = {}) {
if (this.testNeedProductUrl(options.url)) {
options.baseUrl = product_host + '/api';
} else {
options.baseUrl = options.baseUrl || this.config.baseUrl;
}
options.dataType = options.dataType || this.config.dataType;
if (options.url == undefined) return Promise.reject();
options.url = Request.posUrl(options.url) ? options.url : (options.baseUrl + options.url);
options.data = options.data || {};
options.header = options.header || this.config.header;
options.method = options.method || this.config.method;
if (options['Content-Type']) options.header['Content-Type'] = options['Content-Type'];
return new Promise((resolve, reject) => {
let next = true
let _config = null
options.complete = (response) => {
let statusCode = response.statusCode
response.config = _config
response = this.requestComFun(response)
if (statusCode != 200) {
let errMessage = '';
switch (statusCode) {
case 400:
errMessage = global.i18n.t('请求错误(400)');
break;
case 401:
errMessage = global.i18n.t('未授权,请重新登录(401)');
uni.showToast({
title: global.i18n.t('登录失效'),
icon: 'none',
position: 'bottom',
duration: 1500
})
store.commit('logout');
break;
case 403:
errMessage = global.i18n.t('拒绝访问(403)');
break;
case 404:
errMessage = global.i18n.t('请求出错(404)');
break;
case 408:
errMessage = global.i18n.t('请求超时(408)');
break;
case 500:
errMessage = global.i18n.t('服务器错误(500)');
break;
case 501:
errMessage = global.i18n.t('服务未实现(501)');
break;
case 502:
errMessage = global.i18n.t('网络错误(502)');
break;
case 503:
errMessage = global.i18n.t('服务不可用(503)');
break;
case 504:
errMessage = global.i18n.t('网络超时(504)');
break;
case 505:
errMessage = global.i18n.t('HTTP版本不受支持(505)');
break;
default:
// errMessage = global.i18n.t("服务器错误!");
errMessage = '';
break;
}
if (statusCode != 401) {
if (errMessage) {
uni.showToast({
title: errMessage,
icon: 'none',
position: 'bottom',
duration: 1500
})
}
uni.$emit('netWorkError', { msg: global.i18n.t('服务器太拥挤了~请您稍后重试') })
}
reject({ statusCode, errMessage })
} else {
let _code = response.data.code;
if (_code == '-201' || _code == '-202' || _code == '-203') {
uni.showToast({
title: global.i18n.t('登录失效,请重新登录'),
icon: 'none',
})
store.commit("logout");
navigateToLogin();
} else {
resolve(response)
}
}
uni.stopPullDownRefresh();
}
let cancel = (t = 'handle cancel') => {
let err = {
errMsg: t,
config: afC
}
reject(err)
next = false
}
let afC = { ...this.config, ...options }
_config = { ...afC, ...this.requestBeforeFun(afC, cancel) }
if (!next) return
uni.request(_config)
})
}
get(url, data, options = {}) {
options.url = url
options.data = data
options.method = 'GET'
return this.request(options)
}
post(url, data, options = {}) {
options.url = url
options.data = data
options.method = 'POST'
return this.request(options)
}
}