【面试题】面试官: Vue如何实现权限管理?_面试官问权限管理的角色分配如何实现的

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

}
})


缺点:


* 全局路由守卫里,每次路由跳转都要做判断
* 菜单信息在前端,要修改个标题,需要重新编译
* 菜单跟路由耦合在一起,路由不一定作为菜单显示,还要多加字段进行标识


#### 菜单权限


菜单权限可以理解成将页面与路由进行解耦


方法一


菜单与路由分离,菜单由后端返回


1. 前端定义路由信息



{
name: “login”,
path: “/login”,
component: () => import(“@/pages/Login.vue”)
}


`name`字段作为和后端返回的菜单的唯一标识


1. 全局路由守卫里做判断



function hasPermission(router, accessMenu) {
if (whiteList.indexOf(router.path) !== -1) {
return true;
}
let menu = Util.getMenuByName(router.name, accessMenu);
if (menu.name) {
return true;
}
return false;
}

Router.beforeEach(async (to, from, next) => {
if (getToken()) {
let userInfo = store.state.user.userInfo;
if (!userInfo.name) {
try {
await store.dispatch(“GetUserInfo”)
await store.dispatch(‘updateAccessMenu’)
if (to.path === ‘/login’) {
next({ name: ‘home_index’ })
} else {
next({ …to, replace: true })
}
}
catch (e) {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next(‘/login’)
}
}
} else {
if (to.path === ‘/login’) {
next({ name: ‘home_index’ })
} else {
if (hasPermission(to, store.getters.accessMenu)) {
Util.toDefaultPage(store.getters.accessMenu,to, routes, next);
} else {
next({ path: ‘/403’,replace:true })
}
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next(‘/login’)
}
}
let menu = Util.getMenuByName(to.name, store.getters.accessMenu);
Util.title(menu.title);
});

Router.afterEach((to) => {
window.scrollTo(0, 0);
});


每次路由跳转的时候都要判断权限,这里的判断也很简单,因为菜单的`name`与路由的`name`是对应的,后端返回的菜单是经过权限过滤的


根据路由`name`找不到对应的菜单,就表示用户有没权限访问


如果路由很多,可以应用初始化时,只挂载不需要权限控制的路由。拿到后端返回的菜单后,根据菜单与路由的对应关系,筛选出可访问的路由,通过`addRoutes`动态挂载


缺点:


* 菜单需要和路由一一对应,前端添加了新功能,需要通过菜单管理功能添加新的菜单,如果菜单配置的不对会导致应用不能正常使用
* 全局路由守卫里,每次路由跳转都要做判断


方法二


菜单和路由都由后端返回


1. 前端统一定义路由组件



const Home = () => import(“…/pages/Home.vue”);
const UserInfo = () => import(“…/pages/UserInfo.vue”);
export default {
home: Home,
userInfo: UserInfo
};


1. 后端返回路由



[
{
name: “home”,
path: “/”,
component: “home”
},
{
name: “home”,
path: “/userinfo”,
component: “userInfo”
}
]


将后端返回的路由通过`addRoutes`动态挂载,需要处理数据,将`component`字段换成对应的组件,注意嵌套路由的数据遍历


缺点:


* 全局路由守卫里,每次路由跳转都要做判断
* 需要前后端完美配合


#### 按钮权限


方法一


用`v-if`判断,当如果页面很多的时候,每个页面都要获取用户权限`role`和路由表里的`meta.btnUse`,然后再做判断,比较繁琐


方法二


通过自定义指令进行按钮权限的判断


1. 首先配置路由



{
path: ‘venueSetting’,
component: _import(‘venue/venueSetting’),
name: ‘场馆设置’,
meta: {
btnUse: [‘admin’, ‘editor’]
}
},
{
path: ‘fieldSetting’,
component: _import(‘venue/fieldSetting’),
name: ‘场地设置’,
meta: {
btnUse: [‘admin’]
}
}


1. 自定义权限鉴定`指令`



const has = Vue.directive(‘has’, {
bind: function (el, binding, vnode) {
let btnPermissionsArr = [];
if(binding.value){
btnPermissionsArr = Array.of(binding.value);
}else{
btnPermissionsArr = vnode.context.KaTeX parse error: Expected 'EOF', got '}' at position 36: …sions; }̲ if (!Vu…_has(btnPermissionsArr)) {
el.parentNode.removeChild(el);
}
}
});
// 权限检查方法
Vue.prototype.$_has = function (value) {
let isExist = false;
// 获取用户按钮权限
let btnUseStr = sessionStorage.getItem(“btnUse”);
if (btnUseStr == undefined || btnUseStr == null) {
return false;
}
if (value.indexOf(btnUseStr) > -1) {
isExist = true;
}
return isExist;
};
export {has}


在使用的按钮中引用`v-has`指令


### 总结

根据路线图上的重点去进行有针对性的学习,在学习过程中,学会写笔记,做总结。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

这里分享一些前端学习笔记:

* **html5 / css3 学习笔记**  

  ![](https://img-blog.csdnimg.cn/img_convert/c7aea89db6b059151c753196f8f4e9b5.png)

  

* **JavaScript 学习笔记**  

  ![](https://img-blog.csdnimg.cn/img_convert/af0c75f32f6618baccf39ce440a0fb5c.png)

* **Vue 学习笔记**  

  ![](https://img-blog.csdnimg.cn/img_convert/94cca01f6717f672208838e9ac549be1.png)



  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值