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("登录失败,请稍后再试");
}
}