关键词不能为空

当前您在: 主页 > 英语 >

【前端】Vue 路由权限控制

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-28 05:40
tags:

-

2021年2月28日发(作者:install是什么意思)


Vue


路由权限控制



Vue


路由权限控制




当我们在做后台管理系统的时候,都会涉及到系统左侧的菜单 树如何动态












都< /p>



RBAC









Role-Based


Access


Control


,权限与角色相关联,用户通过成为适当角色的 成员而


得到这些角色的权限。这就极大地简化了权限的管理。



vue


有很多优秀的后台管理系统模板,这些开源项目都提供了


RBAC


权限


控制的思路,但是在实际 项目中,写死角色的方式可能并不适合。





看了网上蛮多的解决方案,个人感觉都有弊端,好多都是前端 先把完整的


路由表注册到项目中,然后通过后台返回树过滤显示的方案,这样的做法


其实只是隐藏了左侧菜单,但是路由还是已经注册进去了,用户猜到访问

路径还是可以轻易进入页面,没有真正的做到动态路由加载





以下是我设计的解决方案,


-



-



< /p>


先看一下已经完成的系统结构,便于理解,用户绑定角色


(


一对多


)


,角色


绑定 菜单


(


一对多


)




用户菜单





选择角色






角色菜单






选择菜单,由于本项目是多系统,所以会有



ADMIN




HMI


两个子系


统,后面再来解释







资源管理


(


我这里没有叫做菜单管理,因为 会涉及到各个子系统我称作模


块,模块下面有菜单,菜单下面有按钮

)







好了,看完几张图大家估计也明白了这就是典型的

< p>
RBAC


。内部具体怎么


运作的呢




要实现动态添加路由,即只有有权限的路由才会注 册到


Vue


实例中,核


心是

< p>
vue-router



addRoutes


和导航钩子


beforeEach


两个方法





大体思 路为,在


beforeEach


方法中


(


即每次路由跳转之前做判断


)


,如果


已经加载了路由表,则把路由表注册到实例中,如果没有,则从后端拉取


路由表注册到实例中。那为什么不在登录的时候加载一次就可以了呢?这


是因为 如果只是登录的时候加载一次,网页刷新的时候注册的路由表会丢


失,所以我们统一在< /p>


beforeEach


这个钩子中去实现




// ,


此文件在

< br>


中直接导入即可,这边的思路是仿照的


element- admin



import router from


'./router'


import store from


'./store'


import NProgress from


'nprogress'


// progress bar


import


'nprogress/'


// progress bar style


import Cookies from


'js-cookie'


import screenfull from


'screenfull'



Each(async (to, from, next) => {


const token = (


'token'


)


()



if


(token) {


//


如果已经处于登录状态,跳到登录页重定向到首页




if


( ===


'/login'


) {


next({ path:


'/'


})


()


}


else


{



if


(!ized) {


try {


tes(await ch(


'setAccessRoutes'


))


ch(


'setAllDict'


)


next({ ...to, replace:


true


})


} catch (e) {


(


'token'


)


(


'userInfo'


)


next({ path:


'/login'


})


()


}


}


else


{


next()


//


全屏参数判断该页面是否全屏




if


(!led)


return



if


( && reen) {


t().catch(() => null)


}


else


{



if


(screen) {


()


}


}


}


}


}


else


{


next( !==


'/login'


? { path:


'/login'


} :


true


)


}


})



ach(() => {


()


})



由于路由是动态注册的,所以项目的初始路由就会很简洁,只要提供基础


的路由 ,其他路由都是从服务器返回之后动态注册进来的




//



import Vue from


'vue'


import Router from


'vue-router'


import Login from


'modules/Login'


import NoPermission from


'modules/NoPermission'


(Router)



// Fixed NavigationDuplicated Problem


const originalPush =


=


function


push(location, onComplete, onAbort) {



if


(onComplete || onAbort)


return


(this, location, onCompl


ete, onAbort)



return


(this, location).catch(err => err)


}



const createRouter = () =>


new Router({


mode:


'history'


,


scrollBehavior: () => ({ y: 0 }),


routes: [


{


path:


'/'


,


redirect:


'/platform'


},


{


path:


'/noPermission'


,


component: NoPermission


},


{


path:


'/login'


,


component: Login


}


]


})



const router = createRouter()



export



function



resetRouter


() {


const newRouter = createRouter()


r = r // reset router


}



export


default router



webpack


之前不支持动态编译 ,所以很多项目都在路由表维护了一份映射表如下:




const routerMap = {


user: () => import(


'/views/user'


),


role: () => import(


'/views/role'


),


...


}




我觉得这样很不


nice

< p>
,最新版的


vue-cli


集成的


webpack


已经可以支持


动态导入啦,因此可以把 所有的路由信息全部放到数据库里面配置,前端


不在需要维护一份


router


的映射关系表啦,如果你是老版的


CLI


,可以


使用


dynamic- import



我们再来看看下面这个神奇的文件,也可以大致 浏览一下然后看下面的解





//



// id:


随便是什么规则,只要唯一就行,这里前端写死


ID


而不是每次导入数据库时候再生成是因


为如果每次入库的时候重新生成会丢失之前的关联 关系



// title:


菜单的标题



// name:


唯一标识



//


type


:


'MD'


代 表模块


(


子系统


),

< br>'MN'


代表菜单,


'BT'


代 表按钮,如果需要控制到按钮权限则需要


配置到


BT

< p>
级别



// icon:


菜单的图标



// uri:


菜单的路由地址



// co mponentPath:


该菜单在对应前端项目的路径,在后续的


会看到用法,就是上述说


的不需要在写一份


routerMap


// hidden:


作为菜单 的时候是否在左侧显示,有些菜单比如某个列表的详情页,需要注册到实例


中,但是并不 需要在左侧菜单栏显示



// noCache:


由于项目页面增加了缓存控制,因此该字段用于判断当前页面是否需要缓存



// fullScreen:


有些菜单,进入的时候就是全屏 展示的,例如某些大屏展示页面,通过该字段配




// children:


和上述字段一样




[


{




:



,




:



,




:



,




:



,




: [


{


{




:



,




:



系统管理



,




:



,




:



,




:



,




:



,




:



,




: [


{




:



,




:



用户管理



,




:



,




:



,




:



,




:



,




: [


{



:



,



:



新增



,



:



,



:



},


{



:



,



:



编辑



,



:



,



:



},


{



:



,



:



删除



,



:



,



:



},


{



:



,



:



修改密码



,



:



,



:



},


{



:



,



:



选择角色



,



:



,



:



}


]


},


{




:



,




:



角色管理



,




:



,




:



,




:



,




:



,




: [


{



:



,



:



新增



,



:



,



:



},


{



:



,



:



编辑



,



:



,



:



},


{



:



,



:



删除



,



:



,



:



},


{



:



,



:



设置菜单



,



:



,



:



}


]


},


{




:



,




:



资源管理



,




:



,




:



,




:



,




:



,




: [


{



:



,



:



新增



,



:



,



:



},


{



:



,



:



编辑



,



:



,



:



},


{



:



,



:



删除



,



:



,



:



}


]


}


]


},


}

-


-


-


-


-


-


-


-



本文更新与2021-02-28 05:40,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/679004.html

【前端】Vue 路由权限控制的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文