vue iview动态路由与权限验证步骤详解

这次给大家带来vue iview动态路由与权限验证步骤详解,使用vue iview动态路由与权限验证的注意事项有哪些,下面就是实战案例,一起来看一下。

github上关于vue动态添加路由的例子很多,本项目参考了部分项目后,在iview框架基础上完成了动态路由的动态添加和菜单刷新。为了帮助其他需要的朋友,现分享出实现逻辑,欢迎一起交流学习。

Github地址

iview-dynamicRouter

实现目标

客户端从服务端拿到路由和权限数据后,刷新项目的路由和菜单列表,并进行权限控制。

项目基础

基础框架: iview组件库官方模板项目 iview-admin 的template分支项目,此项目为 iview-admin 的基础框架代码。项目地址:iview-admin 

实现逻辑

动态路由控制加载

一般来说,动态路由控制分为两种:一种是将所有路由数据存储在本地文件中,然后从服务端获取用户的权限信息,在路由跳转时,添加权限判断钩子,如果用户前往的页面不在权限列表内,则禁止跳转。另一种则是本地只存储基本路由,如错误处理页面、无权限控制页面等,而权限路由则从服务器获取,服务器根据用户的权限下发相应的路由数据,客户端利用这些数据进行路由的动态生成和添加,本文采用的是第二种方法。

iview-admin项目将路由分为三种:

不作为Main组件的子页面展示的页面路由,例如login、404、403等错误页面路由;

作为Main组件的子页面展示但是不在左侧菜单显示的路由 otherRouter ,比如首页路由;

作为Main组件的子页面展示并且在左侧菜单显示的路由 appRouter ;

拿到路由数据后,我们主要进行两部分操作,第一部分是遍历数据,利用组件异步加载的方法,加载每个路由节点对应的组件,之后利用 router.addRoutes(routes) 完成路由列表的动态添加;第二部分是因为 iview-admin 框架下的页面标签和面包屑导航,需要遍历appRouter获取路由信息,所以我们也需要将路由数据存入 vuex ,以便全局访问。

需要特别注意的是,如果404页面为静态路由,那么第一次进入页面时,这时动态路由还未加载,找不到路由地址会默认跳转到404错误页,体验很差,所以404路由先不写入路由规则中,和动态路由一起加载。

主要代码实现如下:

数据请求及路由节点生成

//util.js//生成路由util.initRouter = function (vm) { const constRoutes = []; const otherRoutes = []; // 404路由需要和动态路由一起注入 const otherRouter = [{  path: '/*',  name: 'error-404',  meta: {   title: '404-页面不存在'  },  component: 'error-page/404' }]; // 模拟异步请求 util.ajax('menu.json').then(res => {  var menuData = res.data;  util.initRouterNode(constRoutes, menuData);  util.initRouterNode(otherRoutes, otherRouter);  // 添加主界面路由  vm.$store.commit('updateAppRouter', constRoutes.filter(item => item.children.length > 0));  // 添加全局路由  vm.$store.commit('updateDefaultRouter', otherRoutes);  // 刷新界面菜单  vm.$store.commit('updateMenulist', constRoutes.filter(item => item.children.length > 0)); });};//生成路由节点util.initRouterNode = function (routers, data) { for (var item of data) {  let menu = Object.assign({}, item);  menu.component = lazyLoading(menu.component);  if (item.children && item.children.length > 0) {   menu.children = [];   util.initRouterNode(menu.children, item.children);  }  //添加权限判断  meta.permission = menu.permission ? menu.permission : null;  //添加标题  meta.title = menu.title ? menu.title : null;  menu.meta = meta; }};

登录后复制

动态加载组件

//lazyLoading.jsexport default (url) =>()=>import(`@/views/${url}.vue`)Store缓存实现//app.js // 动态添加主界面路由,需要缓存updateAppRouter (state, routes) { state.routers.push(...routes); router.addRoutes(routes);},// 动态添加全局路由,不需要缓存updateDefaultRouter (state, routes) { router.addRoutes(routes);},// 接受前台数组,刷新菜单updateMenulist (state, routes) { state.menuList = routes;}

登录后复制

最后在main.js中进行调用

//main.js mounted () { // 调用方法,动态生成路由 util.initRouter(this); }

登录后复制

权限控制

同动态路由实现方法类似,操作权限控制也一般也分为两种,第一种是页面显示时不控制权限,所有的操作,比如按钮全部展现,然后在操作发起时,进行权限判断,如果用户拥有该操作的权限,则通过,否则提醒用户无权限,第二种则是在页面加载的时候,就进行权限判断,无权限的操作不进行显示。本人更喜欢第二种方法,这样不会对用户进行误导,个人认为用户看到的应该就行可操作的,不然点下按钮再提示无权限的感觉一定很不爽。

本项目的思路来源见参考博文,原博主的具体思路是:在路由结构的meta字段中,添加用户操作权限列表,然后注册全局指令,当节点初次渲染时,判断该页面是否存在权限,如果存在,并且传入的参数不在权限列表中,则直接删除该节点。

主要代码实现如下:

在路由数据中添加 permission 字段,存放权限列表

//menu.json,模拟异步请求数据[ { "path": "/groupOne", "icon": "ios-folder", "name": "system_index", "title": "groupOne", "component": "Main", "children": [  {  "path": "pageOne",  "icon": "ios-paper-outline",  "name": "pageOne",  "title": "pageOne",  "component": "group/page1/page1",  "permission":["del"]  },  ... ] }]

登录后复制

在遍历生成路由节点时,将 permission 字段数据存入路由节点 meta 属性中

//util.js//生成路由节点util.initRouterNode = function (routers, data) { for (var item of data) {  ....  //添加权限判断  meta.permission = menu.permission ? menu.permission : null;  ... }};

登录后复制

定义全局命令组件,读取路由 permission 属性值获得权限列表,如果该不权限在权限列表中,则删除节点

//hasPermission.js const hasPermission = { install (Vue, options) {  Vue.directive('hasPermission', {   bind (el, binding, vnode) {    let permissionList = vnode.context.$route.meta.permission;    if (permissionList && permissionList.length && !permissionList.includes(binding.value)) {     el.parentNode.removeChild(el);    }   }  }); }};export default hasPermission;

登录后复制

权限组件使用示例:

 

page1

登录后复制

全局注册组件

// main.jsimport hasPermission from '@/libs/hasPermission.js';Vue.use(hasPermission);

登录后复制

这种权限控制方法的优点就是,不管是管理配置还是页面处理逻辑都相对简单,没有很多重复的代码判断和节点处理,在参考对比了网上几种实现方式后,个人比较推荐这一种方法。

页面标签和面包屑导航

在我看来,页面标签和面包屑都属于系统中锦上添花的页面相关控件,提高页面管理的便捷性,在iview官方admin项目中已经实现了这两个组件。所以这个项目中,只是将其进行移植,实现了组件功能,没有深入了解,感兴趣的可以仔细研究。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

分享页面后跳转回首页

Vue自定义动态组件使用详解

以上就是vue iview动态路由与权限验证步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2766526.html

(0)
上一篇 2025年3月8日 11:15:24
下一篇 2025年3月8日 11:15:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue实现验证码倒计时功能

    这次给大家带来vue实现验证码倒计时功能,vue实现验证码倒计时功能的注意事项有哪些,下面就是实战案例,一起来看一下。     上网上搜了一下,也把他们的代码试了一下,自己出了很多问题。所以,需要写一篇基础入门的文章,避免后面人采坑。   …

    2025年3月8日
    200
  • node+token实现验证

    这次给大家带来node+token实现验证,node+token实现验证的注意事项有哪些,下面就是实战案例,一起来看一下。 最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+…

    编程技术 2025年3月8日
    200
  • Vue如何调用第三方验证码

    这次给大家带来Vue如何调用第三方验证码,Vue调用第三方验证码的注意事项有哪些,下面就是实战案例,一起来看一下。 什么是腾讯验证码?它长这个样子……:point_down:   最近公司项目要求引入腾讯云验证,要求是这样的: 为了防止别人…

    2025年3月8日 编程技术
    200
  • element-ui控件操作iview的方法

    这次给大家带来element-ui控件操作iview的方法,element-ui控件操作iview的注意事项有哪些,下面就是实战案例,一起来看一下。 实现原理 修改了element-ui源码,把源码里面的tree模块提取出来 然后修改ele…

    2025年3月8日
    200
  • JS里怎样验证E-mail 地址格式

    这次给大家带来JS里怎样验证E-mail 地址格式,JS里验证E-mail地址格式的注意事项有哪些,下面就是实战案例,一起来看一下。 最近做了一个前端的项目,要求:输入的数据必须包含 @ 符号和点号(.)。同时,@ 不可以是邮件地址的首字符…

    2025年3月8日
    200
  • js获取ModelAndView后如何使用

    这次给大家带来js获取ModelAndView后如何使用,js获取ModelAndView使用的注意事项有哪些,下面就是实战案例,一起来看一下。 1 方法一 【有效】 可以的,跟el表达式访问方式一样。 示例代码,一个数据展示请求的Acti…

    编程技术 2025年3月8日
    200
  • js实现滑动拼图验证效果(附代码)

    这次给大家带来js实现滑动拼图验证效果(附代码),js实现滑动拼图验证效果的注意事项有哪些,下面就是实战案例,一起来看一下。   上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的。我的想法是,随机生成图片,随机生…

    2025年3月8日 编程技术
    200
  • iview自定义验证关键词输入框实现方法

    这次给大家带来iview自定义验证关键词输入框实现方法,iview自定义验证关键词输入框实现的注意事项有哪些,下面就是实战案例,一起来看一下。 一、验证需求      对应配置的关键词输入框,验证要求如下:     1、总字数不能超过700…

    2025年3月8日
    200
  • jQuery+Cookie实现切换皮肤效果实现(附代码)

    这次给大家带来jQuery+Cookie实现切换皮肤效果实现(附代码),jQuery+Cookie实现切换皮的注意事项有哪些,下面就是实战案例,一起来看一下。 1)关键代码 jQuery Cookie切换皮肤 $(function () {…

    编程技术 2025年3月8日
    200
  • js-cookie使用步骤详解

    这次给大家带来js-cookie使用步骤详解,js-cookie使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Cookie是网站设计者放置在客户端的小文本文件,一般后台语言使用的比较多,可以实现用户个性化的一些需求。js-cook…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论