写一些关于vue的权限控制

胡说八道一番

权限控制大概分为三种方式
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339