当前位置:   article > 正文

vue3后台项目配置路由,拦截器基础框架_vue3路由拦截器

vue3路由拦截器

http拦截器:src/http/index.ts

  1. import axios, { AxiosInstance } from 'axios';
  2. import { ElMessage, ElMessageBox } from 'element-plus';
  3. // 配置新建一个 axios 实例
  4. const service: AxiosInstance = axios.create({
  5. baseURL: import.meta.env.VITE_API_URL,
  6. timeout: 50000,
  7. headers: { 'Content-Type': 'application/json' },
  8. });
  9. // 添加请求拦截器
  10. service.interceptors.request.use(
  11. (config:any) => {
  12. // 在发送请求之前做些什么 token
  13. if (localStorage.getItem('token')) {
  14. config.headers!['Authorization'] = `${localStorage.getItem('token')}`;
  15. }
  16. return config;
  17. },
  18. (error:any) => {
  19. // 对请求错误做些什么
  20. return Promise.reject(error);
  21. }
  22. );
  23. // 添加响应拦截器
  24. service.interceptors.response.use(
  25. (response:any) => {
  26. // 对响应数据做点什么
  27. const res = response.data;
  28. if (res.code && res.code !== 0) {
  29. // `token` 过期或者账号已在别处登录
  30. if (res.code === 401 || res.code === 4001) {
  31. localStorage.removeItem('token')
  32. sessionStorage.removeItem('routerList')
  33. window.location.href = '/login'; // 去登录页
  34. ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
  35. .then(() => {})
  36. .catch(() => {});
  37. }
  38. return response;
  39. } else {
  40. return response;
  41. }
  42. },
  43. (error:any) => {
  44. // 对响应错误做点什么
  45. if (error.message.indexOf('timeout') != -1) {
  46. ElMessage.error('网络超时');
  47. } else if (error.message == 'Network Error') {
  48. ElMessage.error('网络连接错误');
  49. } else {
  50. if (error.response.data) ElMessage.error(error.response.statusText);
  51. else ElMessage.error('接口路径找不到');
  52. }
  53. return Promise.reject(error);
  54. }
  55. );
  56. // 导出 axios 实例
  57. export default service;

 配置路由:src/router/index.ts

  1. import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
  2. import {
  3. getRouters
  4. } from "../api/index";
  5. const routes: Array<RouteRecordRaw> = [
  6. {
  7. path: '/',
  8. component: () => import('../layout/index.vue'),
  9. children: [
  10. {
  11. path: '/',
  12. component: () => import('../views/index.vue'),
  13. meta:{title: "首页", icon: "", noCache: false, link: null}
  14. }
  15. ]
  16. },
  17. {
  18. path: '/login',
  19. name: '/login',
  20. component: () => import('../views/login.vue')
  21. },
  22. // 添加更多路由...
  23. ];
  24. const router = createRouter({
  25. history: createWebHistory(),
  26. routes,
  27. });
  28. router.beforeEach(async (to, from, next) => {
  29. // 判断是否存在token
  30. let token = localStorage.getItem('token')
  31. if (!token && to.path == '/login') {
  32. next()
  33. } else {
  34. if (token) {
  35. // 判断是否有路由
  36. let routerList = sessionStorage.getItem('routerList')
  37. if (!routerList) {
  38. let res: any = await getRouters()
  39. routes.forEach((item, index) => {
  40. if (item.children && index == 0) {
  41. // console.log(item,res.data.data)
  42. let children = item.children
  43. res.data.data.forEach((obj: any) => {
  44. obj.meta.img=`../../../assets/svg/${obj.meta.icon}.svg`
  45. children.push(obj)
  46. })
  47. sessionStorage.setItem('routerList', JSON.stringify(item.children))
  48. }
  49. })
  50. }
  51. next()
  52. } else {
  53. next('/login');
  54. }
  55. }
  56. // console.log(routes,"----")
  57. })
  58. export default router;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57161
推荐阅读
相关标签
  

闽ICP备14008679号