独立封装Vue脚手架,包括axios封装、动态菜单、权限路由、webpack优化、eslint配置等。
1.axios封装
拦截器
import axios from "axios";import { Notification, MessageBox, Message } from "element-ui";import store from "@/store";import { getToken } from "@/utils/auth";import errorCode from "@/utils/errorCode";import { tansParams } from "@/utils/ruoyi";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,// 超时timeout: 10000,});// request拦截器service.interceptors.request.use((config) => {const isToken = (config.headers || {}).isToken === false;if (getToken() && !isToken) {config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改}return config;},(error) => {console.log(error);Promise.reject(error);});// 响应拦截器service.interceptors.response.use((res) => {const code = res.data.code || 200;const message = errorCode[code] || res.data.msg || errorCode["default"];if (code === 401) {MessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录","系统提示",{confirmButtonText: "重新登录",cancelButtonText: "取消",type: "warning",}).then(() => {store.dispatch("LogOut").then(() => {location.reload(); // 为了重新实例化vue-router对象 避免bug});});} else if (code === 500) {Message({message: message,type: "error",});return Promise.reject(new Error(message));} else if (code !== 200) {Notification.error({title: message,});return Promise.reject("error");} else {return res.data;}},(error) => {if (error.response?.status === 401) {store.dispatch("LogOut").then(() => {location.reload(); // 为了重新实例化vue-router对象 避免bug});} else {Message({message: error.message,type: "error",duration: 5 * 1000,});return Promise.reject(error);}});// 通用下载方法export function download(url, params, filename) {return service.post(url, params, {transformRequest: [(params) => {return tansParams(params);},],responseType: "blob",}).then((data) => {const content = data;const blob = new Blob([content]);if ("download" in document.createElement("a")) {const elink = document.createElement("a");elink.download = filename;elink.style.display = "none";elink.href = URL.createObjectURL(blob);document.body.appendChild(elink);elink.click();URL.revokeObjectURL(elink.href);document.body.removeChild(elink);} else {navigator.msSaveBlob(blob, filename);}}).catch((r) => {console.error(r);});}export default service;
