172 lines
5.0 KiB
JavaScript
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)
|
|
}
|
|
}
|