import axios from 'axios'
|
import store from '@/store/index.js'
|
import md5 from 'js-md5';
|
import router from '@/router';
|
import { Toast } from 'vant';
|
|
const qs = require('qs');
|
|
const codeMessage = {
|
200: '成功',
|
201: '新建或修改成功。',
|
202: '进入后台排队。',
|
204: '删除数据成功。',
|
400: '请求错误',
|
401: '用户没有权限。',
|
403: '禁止访问',
|
// 404: '接口地址不存在。',
|
406: '请求的格式不可得。',
|
410: '资源被删除',
|
422: '创建对象时验证错误。',
|
500: '网络错误,请重试',
|
502: '网络错误,请重试',
|
503: '网络错误,请重试',
|
504: '网络错误,请重试'
|
}
|
|
// 默认配置
|
axios.defaults.timeout = 120000
|
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
const request = axios.create({
|
baseURL: process.env.PTH_API_ROUTER,
|
withCredentials: false
|
})
|
|
function mdSign(head, body) {
|
let arr = {};
|
// 对form提交进行特殊处理 file 字段不加入鉴权
|
if (head['Content-Type'] === 'multipart/form-data') {
|
arr = {};
|
for (const key of body.keys()) {
|
if (key !== 'file') arr[key] = body.get(key);
|
}
|
} else {
|
arr = body;
|
}
|
let sign = ''
|
const strArr = Object.entries(arr).map(v => {
|
let val = v[1];
|
if (typeof val == 'object') {
|
val = JSON.stringify(val);
|
}
|
return val != undefined ? `${v[0]}=${val}&` : ''
|
})
|
strArr.push(`time=${head.TIME}&`);
|
strArr.sort()
|
const str = strArr.join('');
|
sign = md5(str).toUpperCase();
|
|
return sign
|
}
|
|
/**
|
* 配置请求头
|
* @param {*} conf
|
*/
|
function confRequestHeader(conf = {}) {
|
conf.headers = conf.headers || {}
|
conf.headers.TIME = new Date().getTime();
|
conf.headers.TOKEN = store.state.token;
|
conf.headers.SIGN = mdSign(conf.headers, conf.data || {})
|
|
return conf
|
}
|
|
/**
|
* 响应拦截
|
* @param {*} res
|
*/
|
function resolve(res) {
|
let data = res.data;
|
if (typeof res.data == 'string') {
|
try {
|
data = JSON.parse(res.data)
|
} catch (error) {
|
return data
|
}
|
}
|
if (data.code == 0 || data.code == 200 || data.result == 0) {
|
return data
|
}
|
if (data.code === 1084 || data.code === 1083 || data.code === 1085) { // 用户未登录/1085在其他设备登录
|
localStorage.removeItem("token");
|
localStorage.removeItem("userInfo");
|
store.commit("set_token", {});
|
store.commit("set_user_info", {});
|
return Promise.reject(data);
|
}
|
|
if (!res.config.hideMsg) {
|
if (data.code === 701) {
|
Toast.fail("验证码错误或已过期")
|
} else {
|
Toast.fail(data.msg)
|
}
|
}
|
return Promise.reject(data)
|
}
|
|
/**
|
* 错误拦截,一般为网络错误
|
* @param {*} error
|
*/
|
function reject(error) {
|
let status
|
try {
|
status = error.response.status
|
} catch (err) {
|
console.error('=====> response error err: ', error, err);
|
}
|
if (
|
error.code === 'ECONNABORTED' &&
|
error.message.indexOf('timeout') !== -1 &&
|
error.config && !error.config.hideMsg
|
) {
|
Toast.fail("请求超时")
|
}
|
if (error.config && !error.config.hideMsg) {
|
const errortext = codeMessage[status]
|
Toast.fail(errortext || '网络错误')
|
}
|
// 无权限
|
if (status === 401) {
|
router.replace({
|
path: 'login',
|
query: {
|
redirect: router.currentRoute.fullPath
|
}
|
})
|
}
|
return Promise.reject(error);
|
}
|
|
/**
|
* 请求拦截
|
* @param {*} conf
|
*/
|
function requistHold(conf) {
|
conf = confRequestHeader(conf);
|
if (conf.headers['Content-Type'] !== 'multipart/form-data') {
|
for (const key in conf.data) {
|
if (conf.data.hasOwnProperty(key)) {
|
const val = conf.data[key];
|
if (typeof val === 'object') {
|
conf.data[key] = JSON.stringify(val);
|
}
|
}
|
}
|
conf.data = qs.stringify(conf.data)
|
}
|
return conf;
|
}
|
|
request.interceptors.request.use(requistHold)
|
request.interceptors.response.use(resolve, reject)
|
|
export {
|
request
|
}
|