页面/按钮 - 权限控制(前端)

这篇具有很好参考价值的文章主要介绍了页面/按钮 - 权限控制(前端)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是权限控制
在项目中,尤其是在后台管理系统中,不同人员登陆,看到的页面菜单是不一样的,比如,一个公司的办公系统,老板登陆可以看到所有的页面,而普通员工登录可能无法看到公司业绩,营收情况的页面,比如公司的员工个人资料页面只有人力资源部门有权利看,其他部门的员工是不允许查看公司员工信息数据的。

当然了除了页面的权限,还会有一些按钮级别的权限,比如一个下载按钮,有的帐号可以用,有的人不能用,比如学校的系统,一个页面中有一个确认成绩按钮,这个按钮只有老师有权利点击,其他学生登陆是无法点击的。

	1.页面级的权限(用户是否有权限能看到这个页面)
	2.按钮级的权限(用户是否能看到或者能用页面中的某个按钮)

页面级权限控制(一)
1.后端返回路由信息,前端存储完整路由表:

前端拿到路由信息采取递归的方式动态生成页面菜单。
自己本身的router.js文件定义好页面所有的路由。这种方式弊端很明显,并不能实现真正的权限控制,
因为如果用户记住了某个路由,用户不点击菜单,直接在地址栏里输入地址,那么页面还是可以显示出来

2.后端返回路由权限名,前端存储完整路由权限表,并动态生成路由(真正的权限控制)

首先前端router.js文件存储的路由配置信息会分为两部分,分别是需要权限的和不需要权限的。
页面一开始不能一个路由没有,所以会有一些不需要权限的页面,比如登录页,404页面等。所以一开始直接渲染
这个不需要权限的路由表,等后台返回之后再把需要权限的路由加到当前路由里面形成一个全新的路由表就可以了

router.js 不需要权限的路由表

 const route = [
  {
    path: '/',
    redirect: '/login',
  },
  {
    path: '/login',
    name: '登录页面',
    component: ()=>import("@/views/login.vue")
  },
  {
    path: '/404',
    name: '404页面',
    component: ()=>import("@/views/404.vue")
  },
]


router.js 需要权限的路由表
对于需要权限的页面,我们在路由中的meta属性里添加了一个字段roles,表示当前路由所需要的权限.
注意这个roles并不是关键字,叫别的名字也行。至于meta为什么值是一个数组,是我们考虑到将来有些页面可能不同的权限都能看,比如普通用户,管理员,超级管理员

export const asyncRouterMap = [
  {
    path: '/permission',
    name: 'permissionhome',
    meta: {
      icon: 'el-icon-setting',
      roles: ['admin','superadmin']
    },
    component: ()=>import("@/views/permission.vue")
 },
 {
    path: '/detail',
    name: 'detail',
    meta: {
      icon: 'el-icon-setting',
      roles: ['superadmin']
    },
    component: ()=>import("@/views/detail.vue")
 },

当用户登录之后,登陆接口会返回一个权限名字的字符串类似于如下结构

{
  code:200,
  success:true,
  result:{
    name:"张三",
    opid:11024,
    role:"admin"//此字段是拥有的权限名字
  }
}


拿到这个权限名字之后,去遍历我们写好的那个需要权限的路由表进行挨个比较,

登录之后拿到的信息我们一般会存储在vuex中,因为这个数据全局都需要使用。(具体怎么放到vuex中和怎么取出不做详细描述,有需要的可以先去学习vuex,后面我也会整理出来以供大家阅读)

新建一个js文件
具体操作就是引入我们的异步路由表,然后做一个循环

import  {asyncRouterMap} from "../router.js".

利用filter方法过滤出路由列表中role权限中跟我们返回的role权限名一致的项

asyncRouterMap.filter()

将筛选之后的路由表,通过一个方法加入到当前项目的路由中。通过调用根路由实例的这个方法,就可以实现把任意一个路由配置加入到当前页面路由中,由此就可以生成一个新的路由。达到了真正控制权限的目的

router.addRoutes(筛选之后的路由表)

页面级权限控制(二)
第二种方式其实就是第一种方式的简化版,只不过后端返回的不是返回权限名字了,我们前端也不在本地存储异步路由表了,登陆成功之后直接由后端返回异步路由表,然后前端直接通过addRoutes方法添加。

这种方式好处是减少了前端工作量,但是实际工作比较麻烦,前端每次要加权限都需要让后端帮助添加, 因为路由表是在后端维护的。

按钮级权限控制(一)
比如某个按钮只有超级管理员能看到,其他权限看不到,那么按照上面第一种说法,我们从返回信息拿到role字段
那么页面中的按钮可以这么写

html

<button v-if="role=='superAdmin'">权限按钮</button>

js

export default{
    computed:{
        //当然实际工作中这里一般都使用mapState
        role:this.$store.state.role
    }
}

这样其实就能实现按钮级别的权限控制。特殊情况如果role是数组,那么可以用indexOf方法去查找一下权限数组中包不包含我这个按钮需要的权限,原理几乎不变

按钮级权限控制(二)
第二种方式是通过自定义指令,原理大致相同

1.首先还是取出后端返回的权限的名字
2.全局定义一个自定义指令


Vue.directive('per', {
    bind: (el, binding, vnode) => {
    //roles是我们的权限数组,binding.value是我们传入自定义指令的值
    //如果找不到,那证明没有权限,把当前元素节点移除掉
        if (roles.indexOf(binding.value)==-1) {
            el.parentNode.removeChild(el);
        }
    }

使用文章来源地址https://www.toymoban.com/news/detail-641974.html

//这个传入的admin是对应上面binding.value
<div v-per="[admin]">
    admin 可见
</div>

到了这里,关于页面/按钮 - 权限控制(前端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue前端自定按钮控制手动上传文件

    首先element-ui中的上传组件是这样的 数据结构: { action:“”//上传的连接 filelist:\\\'‘’//选种的文件集合 } 点击按钮后就自动根据action的地址上传,实际上是element-ui自动发送了post请求给action连接,但是我想要通过自己手动上传文件(图片/excel) 直接发送这个文件体 游览器发现无负载

    2024年04月25日
    浏览(28)
  • 【VUE学习】权限管理系统前端vue实现3-登陆页面

             path: \\\'/login\\\' :指定了路由的路径为 \\\"/login\\\",表示该路由匹配到的 URL 是 \\\"/login\\\"。 name: \\\'login\\\' :指定了路由的名称为 \\\"login\\\",可以在代码中通过名称来进行路由导航。 component: () = import(\\\'../views/Login.vue\\\') :指定了该路由对应的组件为一个异步加载的组件。 使用箭头函

    2024年02月13日
    浏览(44)
  • 【vue】前端页面点击按钮弹窗播放m3u8格式视频

    最终效果: 1.表格操作列 2.initVideo方法 3.弹出层代码 4.showAll_dialog样式 5.第2步跳转的video.html页面代码,用dplayer播放的,放在项目根目录的public文件夹即可

    2024年02月04日
    浏览(53)
  • (vue权限管理)前端路由表角色权限管理,通过登录不同角色侧边栏显示对应页面

    1. 首先在src/router/index.js中添加路由表,其中constantRoutes 设置的为所有角色可见的路由,asyncRouterMap为对应权限人员可见路由,demo路由表代码如下: 2.在src/api/user.js中创建用户登录,获取用户信息,以及登出的接口 3.在store/modules/user.js文件,添加获取角色权限role的信息 4.在src

    2024年02月11日
    浏览(43)
  • 〖大前端 - 基础入门三大核心之JS篇⑰〗- JavaScript的流程控制语句「while循环语句」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月04日
    浏览(94)
  • 前端Vue自定义商品评价页面单选多选标签tags组件单选多选按钮选择器picker组件

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(67)
  • 〖大前端 - 基础入门三大核心之JS篇⑱〗- JavaScript的流程控制语句「break 和 continue语句」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月05日
    浏览(57)
  • 〖大前端 - 基础入门三大核心之JS篇⑯〗- JavaScript的流程控制语句「for循环语句及算法题」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月07日
    浏览(51)
  • Vue前端 更具router.js 中的meta的roles实现路由卫士,实现权限判断。

    参考了之篇文章 1、我在登陆时获取到登录用户的角色名roles,并存入sessionStorage中,具体是在login页面实现,还是在menu页面实现都可以。在menu页面实现,可以显得登陆快一些。 2、编写router.js,注意,一个用户可能有多个角色。 这里有个bug 我们的roles存在sessionStorage中,关闭

    2024年02月13日
    浏览(46)
  • 记录--按钮级别权限怎么控制

    最近的面试中有一个面试官问我按钮级别的权限怎么控制,我说直接 v-if 啊,他说不够好,我说我们项目中按钮级别的权限控制情况不多,所以 v-if 就够了,他说不够通用,最后他对我的评价是做过很多东西,但是都不够深入,好吧,那今天我们就来深入深入。 因为我自己没

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包