tian-yan-yan
Version:
一套不算好用的组件
165 lines (131 loc) • 4.55 kB
JavaScript
/*
* 数据请求
* @author 张文
* @date 2022-02-10
* */
import Axios from 'axios'
import {ApiUtils} from "./ApiUtils";
import {Warehouse} from "./Warehouse";
import {tyShowErrorMsg} from "../components/ErrorMsg";
import {tyShowLoading, tyCloseLoading} from "../components/Loading";
import {Language} from "./Language";
import {LocalStorage} from "./LocalStorage";
// 用于自定义处理http报错的问题,为false时候不显示报错信息,直接返回错误信息,通过catch接收
let errGetMe = false
const tyAxios = Axios.create({
baseURL: process.env.VUE_APP_BASE_URL,
timeout: 1000 * 60 * 30,
})
/**
* 设置基础 Url 的方法
* @author 张文
* @param url 需要设置的url,修改后将影响所有请求的代理路径
* */
tyAxios.setBaseUrl = url => tyAxios.defaults.baseURL = url
tyAxios.setLanguage = lang => tyAxios.defaults.headers['Accept-Language'] = (lang || LocalStorage.get('tyLanguage') || 'zh-CN,zh')
tyAxios.setLanguage()
/**
* 更新请求的 Token,正常情况下无需手动更新token,因为当token发生变化时应当主动触发 tyApiUtils.setToken 方法。从而会自动更新当前token
* @author 张文
* @param token 需要更新的token,设置token请使用 tyApiUtils.setToken 方法
* */
tyAxios.updateToken = token => {
tyAxios.defaults.headers.common['Authorization'] = token
tyAxios.defaults.headers.common['token'] = token
}
// 是否有用户Token
tyAxios.hasToken = () => !!tyAxios.defaults.headers.common['token']
/**
* 调用平台接口的方法
* @author 张文
* @param {Object} obj
* url-接口,
* data-数据,
* config-基础配置{loading-是否需要显示加载框(默认开启),errGetMe-是否由请求接口处理错误信息(默认开启)},
* method-请求的方法默认post
* @returns Function 异步函数
*/
tyAxios.action = ({url, data, config, method = 'post'}) => {
const aux = data || {}
if (!aux.warehouseId) {
aux.warehouseId = Warehouse.get().id
}
return tyAxios({
method,
url: ApiUtils.getApiUrl() + url,
data: {aux},
...config
})
}
// 请求拦截
tyAxios.interceptors.request.use(
config => {
let csrf = /XSRF-TOKEN=([\w-]+)/.test(document.cookie) && RegExp.$1
if (csrf) {
config.headers['X-XSRF-TOKEN'] = csrf
}
// 判断是否显示加载框
if (config.loading || config.loading === undefined){
tyShowLoading()
}
// 记录当前请求是否需要手动处理报错
errGetMe=config.errGetMe
return config
},
error => {
tyCloseLoading()
console.error('请求异常: ', error)
return Promise.reject(error)
}
)
// 响应拦截
tyAxios.interceptors.response.use(
response => {
tyCloseLoading()
let result = response.data
if (!result || !['none', 'success'].includes(result.code)) {
throw Error({ response })
}
// 更新 token
if (result && result.renewedToken) {
ApiUtils.setToken(result.renewedToken)
}
if (typeof response.config['map'] === 'function') {
return response.config['map'](result.data)
}
return result.data
},
error => {
tyCloseLoading()
console.error('接口返回异常: ', error)
let resp = error.response
if (errGetMe){
errGetMe = false
return Promise.reject(resp)
}
if (resp){
if (resp.status === 401) {
ApiUtils.setToken(undefined)
tyShowErrorMsg({ message: Language.get('wms_project.pda.utils.axios.loginOvertime', '登录超时,请重新登录') })
ApiUtils.delToken()
history.go(0)
return Promise.reject(resp)
}
if (resp.status === 404){
tyShowErrorMsg({ message: Language.get('wms_project.pda.utils.axios.serveError', '请求失败,接口路径错误(404)') })
return Promise.reject(resp)
}
if (resp.data) {
tyShowErrorMsg({
message: resp.data && resp.data.message ?
resp.data.message :
Language.get('wms_project.pda.utils.axios.unknownError', '未知错误(可能是系统正在升级或异常)请稍后再试')
})
return Promise.reject(resp)
}
}
tyShowErrorMsg({message: Language.get('wms_project.pda.utils.axios.network', '请求失败,请检查网络连接')})
return Promise.reject(resp)
}
)
export default tyAxios