美文网首页
写一些关于vue的权限控制

写一些关于vue的权限控制

作者: yimi珊 | 来源:发表于2020-12-16 15:12 被阅读0次
胡说八道一番

权限控制大概分为三种方式
1.使用addRoutes动态添加路由,进行权限控制
2.动态导航,控制入口,从而就行权限控制
3.动态按钮,控制入口,从而就行权限控制

一、使用addRoutes动态添加路由

看官网,其实也就是一句话

router.addRoutes(routes: Array<RouteConfig>)

说说我具体怎么实现的方法吧

  • 首先router/index.js文件中,只添加默认又权限的部分,例如login,404 等等。
  • 将后端给的路由权限数据给保存在vuex中。
  • 然后在router文件夹中新建一个permission.js,用来控制路由的添加。
  • 当然,这个permission.js需要在mian.js中引入
router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import login from '../views/login.vue'

Vue.use(VueRouter)

const routes = [{
    //login
    path: '/',
    name: 'Login',
    component: login
    },
    {// login
        path: '/login',
        name: 'Login',
        component: login
    },
    {
        path: '/404',
        name:'404',
        component: () => import('@/views/exception/404'),
        hidden: true
      },

]
const createRouter = () => new VueRouter({
    scrollBehavior: () => ({//解决拖动时多个页面互相影响的问题,当切换到新路由时,想要页面滚到顶部
        y: 0
    }),
    routes: constantRoutes
})
const router = createRouter()
//重新设置路由
export function resetRouter() {
    const newRouter = createRouter();
    router.matcher = newRouter.matcher // reset router
}


//路由导航冗余报错(路由重复)
//push 
const VueRouterPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(to) {
    return VueRouterPush.call(this, to).catch(err => err)
}

//replace
const VueRouterReplace = VueRouter.prototype.replace
VueRouter.prototype.replace = function replace(to) {
    return VueRouterReplace.call(this, to).catch(err => err)
}
export default router
将后端给的数据保存起来,这里是在登录接口中获取的权限数据,以及token

login.vue 此处只写关键代码

//点击登录
    loginFn() {
      let params = {
        username: this.username,
        password: this.password,
      };
      postLogin(params).then((r) => {
        if (r.data.status == 2000) {
          //自动登录数据保存
          let aioData = {
            role: r.data.data.role,
            token: r.data.data.token,
            username: r.data.data.username,
          };
          //设置记住密码七天
          if (this.checkedDay && !this.$cookies.get("AIOuserMsg")) {
            this.$cookies.set("AIOuserMsg", JSON.stringify(params), "7d");
          }
          //保存姓名,token,角色
          localStorage.setItem("AIOuserMsg", JSON.stringify(aioData));

          (async ()=>{
            await this.saveStore(r.data.data);//保存权限
            this.goUrl(r.data.data)//页面跳转
          })();
        }
      });
    },
    //路由,按钮数据存储
    saveStore(data) {
      return new Promise((resolve, reject) => {
        this.$store.dispatch("setMenus", data.menus);//导航权限控制
        this.$store.dispatch("setAllPages", data.routes);//路由权限控制
        this.$store.dispatch("setAllBtns", data.features);//按钮权限控制
        resolve();
      });
    },
router/permission.js

不过是否添加的路由判断该怎么写,得看后台返回什么数据哦

// permission.js
import router,{resetRouter} from '@/router'
import store from '@/store/'

var pageSel = [];
let flag = 0;
const pageRouter = [
  {
    path: '/dataMg',
    name: 'DataMg',
    component: resolve => require(['@/views/dataManagement.vue'], resolve)
  },
  {//新建资源
    path: '/dataMg/backupsNew',
    name: 'BackupsNew',
    component: resolve => require(['@/views/dataManagement/backupsNew.vue'], resolve)
  },
 //...这里省略其他路由
];

router.beforeEach((to, from, next) => {
  let AIOuserMsg = localStorage.getItem("AIOuserMsg");//获取本地存储
  // console.log(AIOuserMsg)
  if (AIOuserMsg) { // 判断是否有token
    if (to.name === 'Login') {
      next()
    } else {
      let allPages = { ...store.getters.getAllPages, login: 1, '404': 1 };
      if (flag === 0 || !to.name) {
        pageSel=[];
        resetRouter();//更新默认的路由
        for (let page of pageRouter) {
          if (allPages[page.name] == 1) {
            pageSel.push(page);
          }
        }
        router.addRoutes(pageSel);//动态添加路由
        flag++;
        next({ ...to, replace: true });
      } else {
        if (allPages[to.name] == 1) {
          next();
        } else {
          next({ name: '404' })
        }
      }
    }
  } else {
    flag=0;
    next()
  }
})

我方后台给的数据是这样的(虽然是我要求的...)
对象的key----是路由的name,
对象的值----0表示没有权限,1表示有权限,需要添加路由

routes: {DataMg: 1, BackupsNew: 0,…后边不写了}//这个routes也就是登录时候vuex保存的那个data.routes
mian.js

添加permission.js(另外一个是动态按钮的)

//permission 路由权限控制
import './router/permission.js'
//按钮权限控制
import './assets/js/btnDirective.js'

二、动态导航

这个就很简单了,使用数据去控制导航的显示就行了,和列表啥的没啥区别,不说了...

三、动态按钮

弄个自定义指令

新建文件: assets/js/btnDirective.js

import Vue from 'vue'
import store from '@/store/'

// 全局注册按钮权限指令
Vue.directive('hasPermission', {
  bind(el, binding, vnode) {
    if(!store.getters.getAllBtns[binding.value].has_feature){//不存在
      if (!el.parentNode) {
        el.style.display = "none";
      } else {
        el.parentNode.removeChild(el);
      }
    }
  },
});
mian.js引入
//按钮权限控制
import './assets/js/btnDirective.js'
使用方式

通过v-hasPermission来判断,后边数组里边的值,就是后台小哥哥给的了

<a-button type="primary" icon="plus" @click="goUrl()"  v-hasPermission="['add_policy']"> 添加 </a-button>

我方后台给的是这样的
feature_key:就是填入v-hasPermission里边的值了
has_feature:1代表显示,0代表不显示


对了,这个自定义指令还有参数啥的,根据后台数据针对性修改,自由发挥吧~

终于瞎说完了,呼~

参考资料:
vue-element-admin总结
关于vue-router当中addRoutes的使用
手摸手,带你用vue撸后台 系列二(登录权限篇)
在此,抱拳感谢~

转载请著名出处~
-----*13

相关文章

  • 写一些关于vue的权限控制

    胡说八道一番 权限控制大概分为三种方式1.使用addRoutes动态添加路由,进行权限控制2.动态导航,控制入口,...

  • 2019-10-25 vue前端按钮权限控制隐藏

    vue前端按钮权限控制隐藏权限控制描述如何实现1、储存权限数据2、权限判断方法3、设置vue自定义指令4、最终代码...

  • php系列(五)权限控制的思考

    权限控制 说到权限控制,有人不明白为什么要单独设计权限模块,难道不能直接在代码里面直接写死一些权限的控制吗? 是的...

  • 前端界面权限控制-React/Vue实现

    前端界面权限控制-React/Vue实现 前言 在所有管理系统中,都会包含权限模块,来进行用户的权限分配和控制,从...

  • vue权限控制

    在SPA(单页面应用)中,前端需要根据用户的权限来控制用户菜单以及路由表,vue-router提供了几个路由生命周...

  • Vue权限控制

    需求 页面级别权限控制1.URL路由权限控制2.导航菜单权限控制3.超链接权限控制 元素界别权限控制1.按钮元素权...

  • Vue权限控制

    在Web系统中, 权限很久以来⼀直都只是后端程序所控制的.为什么呢? 因为Web系统的本质围绕的是数据, ⽽和数据...

  • vue 权限控制

    根据后台控制vue页面和组件的访问 先将路由分为两种,需要权限访问的 routeMap, 不需要权限访问的rout...

  • Vue2.0用户权限控制解决方案

    Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决...

  • vue基于d2-admin的RBAC权限管理解决方案2019-0

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了。 vue权限路由实现方式总结 vue权限路由实...

网友评论

      本文标题:写一些关于vue的权限控制

      本文链接:https://www.haomeiwen.com/subject/jclngktx.html