import Vue from 'vue' import axios from 'axios' import * as $CONST from '@/utils/constant' import * as $T from '@/utils/tools' import $store from '@/store' /** * 定义传入参数数据格式 * * === 删除数据 === * { * key:['dataId1','dataId2'] * } * */ /** * 定义返回的json数据格式 * * === 分页数据 === * { * code:200, --- 目前框架认为0和200都是成功状态 * message:'按业务自定义', * data:{ * records:[{...},{...}], --- 可按自己业务替换属性 * total:xx, --- 可按自己业务替换属性 * size:xx, --- 可按自己业务替换属性 * current:xx, --- 可按自己业务替换属性 * pages:xx --- 可按自己业务替换属性 * }, * } * * === 列表数据 === * * { * code:200, * message:'按业务自定义', * data:[{..},{..}...] * } * * === 一条数据 === * * { * code:200, * message:'按业务自定义', * data:{...} * } * * === 无返回数据 === * * { * code:200, * message:'按业务自定义', * data: null * } * * === 树形结构 === * * { * code:200, * message:'按业务自定义' * data:[{ * prop:xx, * ... * children: [ * prop:xx, * ... * children:[...] * ] * }, * { * prop:xx, * ... * children: [ * prop:xx, * ... * children:[...] * ] * }] * } * */ // 创建axios实例 const Service = axios.create({ timeout: 1000 }) const CancelToken = axios.CancelToken /* function showDebugInfo(config) { console.group('%cMethod::' + config.method + '::Url::' + config.url, 'color:red;font-size:12px;') console.log('%c保存/更新/查看场合,传入的参数::', 'font-size:12px;') console.log(config.hasOwnProperty('params') ? JSON.stringify(config.params) : JSON.stringify(config.data)) console.groupEnd() } function filterOauthData(config) { let url = config.url if (config.method === 'post' && $t.isExistOauthApi(url)) { // post请求的场合下,追加角色名称 } if (config.method === 'get' && $t.isExistOauthApi(url)) { // get请求的场合下,追加角色名称 if (config.hasOwnProperty('params')) { config.params['userCode'] = '' } else { config['params'] = {} config.params['userCode'] = '' } } return config }*/ // request拦截器 Service.interceptors.request.use( config => { // 临时追加 if ($store.state.user.account) { config.headers.account = $store.state.user.account } let copyConfig = Object.assign({}, config) // copyConfig = filterOauthData(copyConfig) // showDebugInfo(copyConfig) copyConfig.cancelToken = new CancelToken((c) => { // 页面失效场景,取消padding中请求 Vue.prototype.$cancels.push(c) // todo 快速双击取消重复请求 // 重复请求场景,取消掉上一个未padding中请求 }) return copyConfig }, error => { Promise.reject(error) }) // respone拦截器 Service.interceptors.response.use( response => { const res = response.data if (Number(res.code) !== 200 && Number(res.code) !== 0) { $T.warning(res.message) return res } else { return res } }, error => { if (error.message && error.message.includes('timeout')) { $T.fail($CONST.MSG_SYS_TIME_OUT) return Promise.reject(error) } if (!error.response) { $T.fail($CONST.MSG_SYS_ERR) return Promise.reject(error) } switch (error.response.status) { // http status handler case 404: $T.fail($CONST.MSG_SYS_404) break case 500: $T.fail($CONST.MSG_SYS_ERR) break case 503: $T.fail($CONST.MSG_SYS_503) break } return Promise.reject(error) } ) const $http = {} $http.$service = Service $http.$axios = axios $http.get = function(url, params = {}) { if ($T.isInlineParams(url)) { // 严格遵循restful标准的url的场景 url = $T.replaceUrlParams(url, params) params = {} } return Service({ url: url, method: 'get', params: $T.filterParams(params) }) } $http.post = function(url, data = {}) { return Service({ url: url, method: 'post', data: data }) } $http.put = function(url, data = {}) { return Service({ url: url, method: 'put', data: data }) } $http.delete = function(url, data = {}) { return Service({ url: url, method: 'delete', data: data }) } export default $http