UNPKG

simple-frame-unit

Version:

基于vue2 研发的与simple-data后端配合使用的组件

148 lines (133 loc) 5.04 kB
import axios from 'axios' import {Message, Notification} from 'element-ui' import router from '../router' const errorCode = { '401': '账号未登录', '403': '当前操作没有权限', '404': '访问资源不存在', 'default': '系统未知错误,请反馈给管理员' } console.log("--------------", process.env) // 获取token const getAccessToken = () => { let token = window.localStorage.getItem('FRAME_VUE_TOKEN') return token ? token : undefined } // 需要忽略的提示。忽略后,自动 Promise.reject('error') const ignoreMsgs = [ "无效的刷新令牌", // 刷新令牌被删除时,不用提示 "刷新令牌已过期" // 使用刷新令牌,刷新获取新的访问令牌时,结果因为过期失败,此时需要忽略。否则,会导致继续 401,无法跳转到登出界面 ] // 是否显示重新登录 export const isRelogin = {show: false}; export function getBaseHeader() { return { 'Authorization': "Bearer " + getAccessToken(), } } axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' // 创建axios实例 const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ // 超时 timeout: 60000, // 禁用 Cookie 等信息 withCredentials: false, }) // request拦截器 service.interceptors.request.use(config => { // 是否需要设置 token const isToken = (config.headers || {}).isToken === false if (getAccessToken() && !isToken) { config.headers['Authorization'] = getBaseHeader().Authorization // 让每个请求携带自定义token 请根据实际情况自行修改 } // get请求映射params参数 if (config.method === 'get' && config.params) { let url = config.url + '?'; for (const propName of Object.keys(config.params)) { const value = config.params[propName]; const part = encodeURIComponent(propName) + '=' if (value !== null && typeof (value) !== "undefined") { if (typeof value === 'object') { for (const key of Object.keys(value)) { let params = propName + '[' + key + ']'; const subPart = encodeURIComponent(params) + '=' url += subPart + encodeURIComponent(value[key]) + "&"; } } else { url += part + encodeURIComponent(value) + "&"; } } } url = url.slice(0, -1); config.params = {}; config.url = url; } return config }, error => { console.log(error) Promise.reject(error) }) // 响应拦截器 service.interceptors.response.use(async res => { // 未设置状态码则默认成功状态 const code = res.data.code || 200; // 获取错误信息 const msg = res.data.msg || errorCode[code] || errorCode['default'] if(msg === errorCode[401]){ router.push({path: "/login"}) return Promise.reject(msg) } if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常 return Promise.reject(msg) } else if (code === 401) { Message({ message: msg, type: 'error' }) return Promise.reject(new Error(msg)) } else if (code === 500) { Message({ message: msg, type: 'error' }) return Promise.reject(new Error(msg)) } else if (code === 901) { Message({ type: 'error', duration: 0, dangerouslyUseHTMLString: true, message: '<div>演示模式,无法进行写操作</div>', }) return Promise.reject(new Error(msg)) } else if (code !== 200) { if (msg === ignoreMsgs[0]) { // hard coding:忽略这个提示,直接登出 console.log(msg) } else { Notification.error({ title: msg }) } return Promise.reject('error') } else { return res.data } }, error => { let {message} = error; if (message === "Network Error") { message = "后端接口连接异常"; } else if (message.includes("timeout")) { message = "系统接口请求超时"; } else if (message.includes("Request failed with status code")) { message = "系统接口" + message.substr(message.length - 3) + "异常"; } Message({ message: message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) export default service