流浪のwolf

卷帝

导航

路由页面跳转优化

1. 添加全局前置路由守卫 

import store from "@/store";
import Vue from "vue";
import VueRouter from "vue-router";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    // 路由重定向
    redirect: "/home",
    component: () => import("@/views/layout"),
    children: [
      {
        path: "home",
        component: () => import("@/views/layout/childs/home"),
      },
      {
        path: "question",
        component: () => import("@/views/layout/childs/question"),
      },
      {
        path: "video",
        component: () => import("@/views/layout/childs/video"),
      },
      {
        path: "my",
        component: () => import("@/views/layout/childs/my"),
      },
    ],
  },
  {
    path: "/login",
    component: () => import("@/views/login"),
  },
  {
    path: "/search",
    component: () => import("@/views/search"),
  },
  {
    path: "/article/:id",
    component: () => import("@/views/article"),
  },
  {
    path: "/user/profile",
    component: () => import("@/views/user-profile"),
  },
  {
    path: "/history",
    component: () => import("@/views/user-history"),
  },
];

const router = new VueRouter({
  //   mode: "history",
  base: process.env.BASE_URL,
  routes,
});
// 导航守卫
// 1. 全局前置守卫 beforeEach  afterEach
// 2. 局部守卫
// 3. 页面独享守卫

// 全局前置守卫 任何路由跳转的时候都会先走这里
router.beforeEach((to, from, next) => {
  // 一定要调用 next 否则所有的页面都被拦截了,next 是放行
  // next(); // 放行
  // to 要去的页面地址
  // from 来自的页面地址
  // console.log(to.path); //  '/history'   要去的页面路由 path 信息
  // 定义一个需要登录(有token)才能过去的页面数组 比如 我的收藏 我的历史页面
  const authList = ["/history", "/user/profile"];
  // 如果去的是home等界面就不会进入 if 判断去判断是否登录了,home等一些界面是可以给游客看的
  // 特殊页面(要登录才能进入的页面)
  if (authList.includes(to.path)) {
    // 这个界面需要登录才可以访问
    // 判断是否登录了
    console.log("你进入必须登录才能访问的页面", to.path);
    // console.log(store.state.user);
    if (store.state.user) {
      // 登录了 可以进入
      next(); // 放行
    } else {
      // 未登录 去登录界面
      // 加上?参数(搜索参数)为了从登录之后返回当时的页面 而不是登录之后去的固定页面
      next("/login?to=" + to.path); // 拦截器去哪个界面
    }
  } else {
    // 常规页面 不需要登录就可以访问
    next(); // 直接放行
  }
});
export default router;

2. 登录之后跳转原来的页面

   try {
        // 成功调用
        const res = await getLoginApi(this.user);
        // 调用了vuex的方法存储token
        // console.log(res.data.data);
        // 存储 token  vuex 里面全局存储 token 本地存储 长久性存储 token
        this.$store.commit("setUserToken", res.data.data);
        // 登录成功或者失败都会清除 loading
        this.$toast.success("登录成功");
        // this.$router.push("/my");  // 开始登录之后直接跳转的我的界面
        // 优化之后
        // 跳转的是一个不确定的界面
        // 如何让登录界面 知道登录成功后跳转到哪里去呢?
        // 判断当前的路由i想你洗的query是否有to属性 ps:这是我在全局前置守卫里面加的(需要登录才能访问的界面才加to属性为的是能够在登录之后跳转回原来的页面)
        const toPath = this.$route.query.to;
        // console.log(toPath); // '/history'
        if (toPath) {
          this.$toast.success("特殊页面去的登录页面使用replace不会记录历史");
          // 有 toPath 说明是必须登录才能访问的页面
          this.$router.replace(toPath);
        } else {
          // 否则就是普通的页面 如 首页等
          this.$toast.success("普通页面去的登录页面直接back");
          this.$router.back();
        }
      } catch (err) {
        // 失败
        // console.log(err);
        // console.log(err.response);
        // 结构赋值
        const { status, data } = err.response;
        // 更具状态码 status 400 是手机号或者密码的格式不对
        if (status === 400) {
          this.$toast.fail(data.message);
        } else {
          this.$toast.fail("登录失败,请稍后再试");
        }
      }

 

posted on 2022-10-20 14:23  流浪のwolf  阅读(24)  评论(0编辑  收藏  举报