引言
做后台系统的时候,难免会有用户权限的判断。admin可以查看全部菜单,user只能查看部分菜单。
一开始接触这个需求的时候,完全是纯前端做的。在配置路由的时候,加一个roles的属性,通过判断用户的roles是否与路由的roles属性相匹配来作为显示隐藏的依据
{ path: '/router', name: 'router', meta: { title: '标题', roles: ['admin','user'] }, component: index, children: [ { path: 'children', name: 'children', meta: { title: '子标题', roles: ['admin','user'] }, component: child } ] }
// 过滤路由 menuList-菜单 roles-用户角色 const checkMenuList = (menuList, roles) => { for (let i = 0; i < menuList.length; i++) { if (!compareEqual(roles, menuList[i].meta.roles) || menuList[i].meta.noRenderTree) { menuList.splice(i, 1) i -= 1 } else { if (menuList[i].children) { checkMenuList(menuList[i].children, roles) } } } return menuList }
这样做确实可以实现给不同用户展示不同的菜单。但是如果用户权限发生改变,前端就需要发版。本着万物皆可灵活配置的原则。
需求
首先我们要了解,我们要做什么。
我们希望我们可以通过用户权限配置功能,达到灵活配置路由权限,由服务器端返回需要展示的路由权限,前端做展示。
思路
- 前端配置好项目全部页面的路由
- 服务器端返回该用户的权限列表,前端去匹配,最后返回一个路由列表,作为菜单
- 为了更好的用户体验,当用户输入异常的路由时,我们要重定向到一个404页面,提示用户该页面不存在。
- 基于第3点,我们在每次跳转的时候,还需要判断这个页面是否存在,该用户是否有权限进行跳转
实现
ok 思路整理完了。现在就开始来实现吧!
首先,routers是需要在前端注册,我们要先配置整个页面的routers。
除了系统的菜单之外,我们还需要配置403错误页面,还有login、首页这些基本路由。由于系统菜单还需要与服务器端返回的路由列表进行匹配,暂时不进行注册
// router.js // 基本路由 export const defaultRouter = [ { path: '/', component: index }, // 首页 { path: '/login', name: 'login', component: login } // 登录页 ] // 项目全部页面 export const appRouter = [ { path: '/router1', name: 'router1', redirect: '/router1/test1', component: router1, meta: { title: '路由1'}, children: [ { path: 'test1', name: 'test1', component: test1, meta: { title: '测试1' } }, { path: 'test2', name: 'test2', component: test1, meta: { title: '测试2' } } ] }, ] // 这个是我们页面初始化时候,注册的routes const routers = [ ...defaultRouter ] const RouterConfig = { routes: routers } const router = new VueRouter(RouterConfig)
全部路由都注册完了,接下来就要匹配用户可访问的路由了,这一步需要和服务器端一起约定规则。
// 服务器端返回的键值对: 路由名:是否有权限 authRouter:{ 'test1': false, 'test2': true }
拿到服务器端返回的用户权限之后,就开始过滤路由
// 过滤路由 appRouterCopy-项目全部页面 authRouter-权限列表 const checkMenuList = (appRouterCopy, authRouter) => { for (let i = 0; i < appRouterCopy.length; i++) { let {name, children} = appRouterCopy[i] if (authRouter[name] === false) { appRouterCopy.splice(i, 1) i-- } else if (children && children.length) { checkMenuList(children, authRouter) } } }
得到过滤后的路由之后,使用addRoutes
进行注册。注意404路由配置要在最后加上。
let error404Page = { path: '/*', name: 'error-404', meta: { title: '404-页面不存在'}, component: error404Page } router.addRoutes([...appRouterCopy, error404Page])
到此我们就得到了用户有权限的页面了,可以把得到的列表作为系统菜单渲染上去。接下来就要处理一下跳转异常的状况了。需要用到beforeEach
对每次跳转进行拦截判断
router.beforeEach(((to, from, next) => { if (isNotLog && to.name !== 'login') { // 未登录 跳转到登录页 next({ name: 'login' }) } else if (to.name && (to.name === 'login' || to.name.indexOf('error') !== -1)){ // 跳转异常 next() } else { // 校验用户权限 checkUser(next, to ,router) } }) const checkUser = async (next, to ,router) => { if (isNotUser) { // 首次登陆系统,没有用户信息的时候 需要获取用户信息做过滤路由的操作 const authRouter = getAuthRouter() // 获取用户权限 checkMenuList(appRouterCopy, authRouter) const error404Page = { path: '/*', name: 'error-404', meta: { title: '404-页面不存在'}, component: error404Page} router.addRoutes([...appRouterCopy, error404Page]) if (!appRouterCopy.length) { // 用户没有有权限的路由 可以跳转到404或者登录页 next({ ...error404Page, replace: true }) } else { next({ ...to, replace: true }) } } else { next() } }
总结
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]