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 }