You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
3.7 KiB
JavaScript

import netConfig from './config.js'
import {
getToken
} from '@/utils/auth'
import { logout } from '@/api/common.js'
const errorCode = {
'401': '认证失败,无法访问系统资源',
'403': '当前操作没有权限',
'404': '访问资源不存在',
'500': '服务器错误',
'default': '系统未知错误,请反馈给管理员'
}
const requestUrls = {};
// 请求拦截
uni.addInterceptor('request', {
invoke(config) {
if (config.method == 'GET' && config.data) {
const queryStr = joinGetQuery(config.url, config.data);
config.url += queryStr;
}
}
})
function request (options, config) {
return checkNetworkStatus()
.then(res => {
return requestFun(options, config)
})
.catch(error => {
uni.showToast({
icon: 'error',
title: error.msg
})
})
}
// 请求函数
function requestFun ({ url, method, data = {} }, config = { loading: true }) {
url = netConfig.baseUrl + url;
const header = {
// 'Authorization': 'Bearer ' + getToken()
}
// 合并请求头
config.header = Object.assign({}, header, config.header);
// 终止重复请求
const abortObj = requestUrls[url];
if (abortObj && abortObj.method == method) {
abortObj.task.abort && abortObj.task.abort();
delete requestUrls[url];
}
const requestConfig = Object.assign({}, config);
delete requestConfig.loading;
config.loading && uni.showLoading({ mask: true })
return new Promise((resolve, reject) => {
const task = uni.request({
url,
method,
data,
...requestConfig,
success: res => {
const {
code = 200,
data = {},
rows = [],
msg = '请求错误'
} = res.data;
if (code == 0) {
uni.showToast({
icon: 'error',
title: msg
})
reject(msg)
return false
}
resolve(data)
},
fail: (error) => {
console.log('Request Error', error);
uni.showToast({
icon: 'error',
title: '请求失败'
})
reject(error);
},
complete: () => {
delete requestUrls[url];
if (Object.keys(requestUrls).length <= 0) {
config.loading && uni.hideLoading();
}
}
})
requestUrls[url] = {
task,
method
}
})
}
export default request
// 处理401状态码
function dispose401 (response) {
logout().then(() => {
uni.showModal({
title: '提示',
content: '登录已超时,请重新登录!',
confirmText: '去登录',
success: function({
cancel
}) {
// if (cancel) return false;
uni.navigateTo({
url: '/pages/login/login'
})
}
});
}).catch(() => {})
}
// 处理500状态码
function dispose500 (response, reject) {
const msg = response.data.msg || errorCode[500];
uni.showToast({
title: msg,
icon: 'error',
complete: () => {
reject(new Error(msg))
}
})
}
// 处理其他状态码
function disposeOther (response, reject) {
const msg = response.data.msg || errorCode['default'];
uni.showToast({
title: msg,
icon: 'error',
complete: () => {
reject(new Error(msg))
}
})
}
/**
* get请求拼接参数
* @param {Object} query
*/
function joinGetQuery(url, query) {
let queryStr = '';
const firstSing = url.includes('?') ? '&' : '?'
Object.keys(query).forEach((key, index) => {
queryStr += index === 0 ? `${firstSing}${key}=${query[key]}` : `&${key}=${query[key]}`
});
return queryStr;
}
// 检查网络状态
function checkNetworkStatus () {
return new Promise((resolve, reject) => {
uni.getNetworkType({
success (res) {
const { networkType } = res;
networkType === 'none' ? reject({status: false, msg: '无网络连接'})
: resolve({ status: true, msg: '网络连接正常' })
},
fail (err) {
reject({ status: false, msg: err.msg || '网络错误' });
}
})
})
}