欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue 通过vue router 动态添加路由来实现权限管理

程序员文章站 2022-07-14 14:36:46
...

1,需求:

          需要判断超级管理员和普通管理员的权限,不同管理员有不同的页面,通过一个登录页登录

2,思路:

          1,提前写好超级管理员和普通管理员的路由表

          2,在登录的时候,登录成功哪个管理员就添加哪个管理员的路由表

3,实现:

          1,先定义基本的路由表:router.js

import Vue from "vue";
import Router from "vue-router";

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: "/login",
      name: "login",
      component: () => import("./views/Login.vue"),
      meta: {
        mingcheng: "登录",
        key: "login"
      }
    },
    {
      path: "/",
      name: "/",
      redirect: "/login"
    }
  ]
});

           2,定义超级管理员的路由表

let groupRouter = [
  {
    path: "/",
    name: "index",
    component: () => import("@/views/BasePage.vue"),
    redirect: "/home",
    children: [
      {
        path: "/home",
        name: "home",
        component: () => import("@/views/Home.vue"),
        meta: {
          mingcheng: "首页",
          key: "home",
          level: 1
        }
      },
      {
        path: "/*",
        name: "/*",
        redirect: "/404"
      }
    ]
  }
];
export default groupRouter;

           3,在登录成功的时候,添加路由表

//管理员路由表
import groupRouter from "@/router/group.js";

//登录成功之后
switch (res.data.content.type) {
                case "groupAdmin":
                  this.$router.addRoutes(groupRouter);
                  break;
              }

       4,这样就成功一半了,但此时会遇到一个奇怪的问题:刷新以后,之前路由表就没了

        解决方法就是在main.js里面每次刷新就判断一下,如果没有就再次添加

//组团管理员路由表
import groupRouter from "@/router/group.js";
new Vue({
  router,
  render: h => h(App),
  created() {
    //这里我登陆成功以后的信息存在本地
    let user_token = localStorage.logininfo
      ? JSON.parse(localStorage.logininfo).content.type
      : null;
    //如果登录了,添加响应的路由
    if (user_token) {
      switch (user_token) {
        case "groupAdmin":
          this.$router.addRoutes(groupRouter);
          break;
      }
    } else {
      //如果没有路由,添加所有都指向登录页
      this.$router.addRoutes([
        {
          path: "*",
          redirect: "/login"
        }
      ]);
      this.$router.push("login");
    }
  }
}).$mount("#app");

     5,这样算是成功了一大半,但是依然有一个问题:退出的时候,并不能清空路由表,因为vue router没有这个功能

        解决思路:在退出到登录页的时候,刷新登录页面

//退出方法
    loginout() {
      new Promise(res => {
        localStorage.clear();
        this.$router.push("/login");
        res(200);
      }).then(() => {
        location.reload();
      });
    },

6,页面超时的时候,也需要判断一下

//axios 响应 拦截器
axios.interceptors.response.use(
  res => {
    //登录失效
    if (res.data.code === "error_unauth") {
      new Promise(res => {
        localStorage.clear();
        router.push("/login");
        res(200);
      }).then(() => {
        location.reload();
      });
    }
    return res;
  },

 

上一篇: 螺旋矩阵_C#

下一篇: Hive操作