流浪のwolf

卷帝

导航

后台管理系统-角色权限控制的实现

ps:服务器返回用户的权限标识 ;

 

 

 

 

 

 

主要在登录的时候判断用户的权限  

  1. 左侧菜单显示 

  2. 路由的页面跳转 - 使用 addRoutes 增加动态路由规则并注入路由实例 router ;实现位置:在前置路由守卫中,和登录判断一块的 ;

 

 permission 文件实现 前置路由守卫

  是否登录(token的有无)

    登录了  - 是否去的是登录页

        去的登录页 -  next("/");  强制跳转系统主页 ;

        不是登录页 - 是否有用户资料 

              没有资料  发起请求获取用户资料   addRoutes 动态添加路由规则 ;由于addRoutes 之后需要耗时,所以 next(to.path); 重新走一下这个路由页面 ;

              有资料 直接放行 去任何页面,除了登录页面 ;

    未登录  定义 白名单页面 在白名单里面允许跳转 否则拦截到登录页面 ;

permission.js 的代码:

import router from "./router";
import { getToken } from "./utils/auth";
import NProgress from "nprogress"; // 引入一份进度条插件
import "nprogress/nprogress.css"; // 引入进度条样式
import store from "./store";

// 全局前置守卫逻辑
router.beforeEach(async (to, from, next) => {
  NProgress.start(); // 开启进度条
  const token = getToken();
  const whiteList = ["/login", "/404"];
  if (token) {
    // 有token
    if (to.path === "/login") {
      // 去系统主页
      next("/");
    } else {
      // 放行  【登录了,有权限去访问系统内界面】
      if (!store.getters.userId) {
        // ps:store.getters.userId 刷新丢失
        // 发请求获取用户资料
        // console.log("发请求获取用户资料");
        const { roles } = await store.dispatch("user/getUserProfileAction");
        // 得到了页面权限标识
        // console.log(roles.menus);
        const userAsyncRoutes = await store.dispatch(
          "permission/filterRoutes",
          roles.menus
        );
        // console.log({ userAsyncRoutes });
        // 把动态路由注入到路由实例router中
        router.addRoutes(userAsyncRoutes);
        next(to.path);
      }
      next();
    }
  } else {
    // 没有token
    if (whiteList.includes(to.path)) {
      // 放行
      next();
    } else {
      // 拦截
      next("/login");
    }
  }
  NProgress.done();
});

// 全局后置守卫
router.afterEach(function () {
  NProgress.done(); // 关闭进度条
});
View Code

在 main.js 引入 导航守卫文件 permission.js 

 

 

新建你一个 文件 专门处理权限控制  path:  store/modules/permmission.js ;
文件代码:
import { constantRoutes, asyncRoutes } from "@/router";

// 新建你一个 文件 专门处理权限控制
export default {
  namespaced: true,
  state() {
    return {
      routes: constantRoutes,
    };
  },
  mutations: {
    setRoutes(state, data) {
      state.routes = [...constantRoutes, ...data];
    },
  },
  actions: {
    // 用来整理出属于当前用户的动态路由映射数组
    filterRoutes(context, data) {
      // data 是当前的路由标识
      // asyncRoutes 完整的动态路由规则
      const userAsyncRoutes = asyncRoutes.filter((item) => {
        return data.includes(item.name);
      });
      // console.log(userAsyncRoutes);
      context.commit("setRoutes", userAsyncRoutes);
      // 返回的是某个用户的权限路由页面
      return userAsyncRoutes;
    },
  },
};

 

 

 

posted on 2022-11-07 19:19  流浪のwolf  阅读(344)  评论(0编辑  收藏  举报