/**** request.js ****/ // 导入axios import axios from 'axios' import { useAuthStore } from '@/stores/modules/auth' import { useBaseStore } from '@/stores/modules/base' import { message } from 'ant-design-vue'; import NProgress from 'nprogress' // nprogress插件 import 'nprogress/nprogress.css' // nprogress样式 import utils from '@/utils/utils' import router from '@/router' let CancelToken = axios.CancelToken; let source = CancelToken.source(); // 根据浏览器地址动态获取接口地址 const DynamicAcquisitionURL = ()=> { var str = window.location.href; var index = str.indexOf('/'); var num = 0; while(index !== -1) { num++; index = str.indexOf('/',index + 1); if (num++ === 3) { return str.slice(0, index); } } } const geolocation = ()=>{ if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { let lat = position.coords.latitude; let lon = position.coords.longitude; console.log("Latitude: " + lat + " Longitude: " + lon); }, function(error) { }); } else { console.log("Geolocation is not supported by this browser."); } if (navigator.connection) { // message.error({content:'当前网络速度过慢,请检查网络状态!',key:1}) useBaseStore().connection = navigator.connection.downlink } else { console.log("浏览器不支持 navigator.connection API"); } } //1. 创建新的axios实例, const service = axios.create({ // 公共接口--这里注意后面会讲 baseURL:process.env.NODE_ENV === 'production' ? DynamicAcquisitionURL():'/api', // 超时时间 单位是ms,这里设置了3s的超时时间 timeout: 1000 * 60 * 5 }) // 2.请求拦截器 service.interceptors.request.use(async config => { const token = sessionStorage.getItem('token')?sessionStorage.getItem('token'):'' const appid = useAuthStore().app ? useAuthStore().app.systemappid :'' //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加 config.data['accesstoken'] = token config.data['systemappid'] = appid if (!config.headers) { config.headers = {} } if (!config.headers['Content-Type']) { config .headers['Content-Type'] = 'application/json;charset=UTF-8'; } utils.anti_shake(config, axios); // useBaseStore().checkNeedSaveData(config, axios) geolocation() return config }, error => { Promise.reject(error) }) // 3.响应拦截器 service.interceptors.response.use(response => { if (response.data.code == -1) { message.error({content:response.data.msg,key:1}) router.push({name:'login'}) setTimeout(() => { window.location.reload(); }, 500); } else { useBaseStore().canPointer = true return response.data; } }, error => { // console.log(error) // 接收到异常响应的处理开始 if (error && error.response) { // 1.公共错误处理 // 2.根据响应码具体处理 switch (error.response.status) { case 400: message.error('错误请求') break; case 401: message.error('未授权,请重新登录') break; case 403: message.error('拒绝访问') break; case 404: message.error('请求错误,未找到该资源') break; case 405: message.error('请求方法未允许') break; case 408: message.error('请求超时') break; case 500: message.error({content:'服务器端出错',key:'服务器端出错'}) break; case 501: message.error('网络未实现') break; case 502: message.error('网络错误') break; case 503: message.error('服务不可用') break; case 504: message.error('网络超时') break; case 505: message.error('http版本不支持该请求') break; default: message.error = `连接错误${error.response.status}` } } else { source.cancel('停止请求'); } return Promise.resolve(error.response) }) //4.导入文件 export default service