在线夸白 之权限页面

在线夸白 之权限页面啥是权限页面 大概就是不同的用户进入系统 能看到不同的页面 菜单的标题不同 一般用在后台管理系统 1 首先 咱得登录成功 然后咱需要在路由前置守卫中获取到用户的信息 里头有用户可以访问到的页面 因为用户信息是存在 vuex 中的 所以需要用 store dispatch 调用 if

大家好,我是讯享网,很高兴认识大家。

啥是权限页面?

大概就是不同的用户进入系统,能看到不同的页面,菜单的标题不同!!!

一般用在后台管理系统


讯享网

1.首先 咱得登录成功   然后咱需要在路由前置守卫中获取到用户的信息 ( 里头有用户可以访问到的页面 )  因为用户信息是存在vuex中的  所以需要用store.dispatch调用

if (!store.getters.userId) { const res = await store.dispatch('user/getProfile') // console.log('当前用户可以访问的', res)// roles.menus }

讯享网

 2.用本地的页面和发请求得到的页面做数组筛选   筛选出来的就是用户可访问的页面

asyncRoutes 是代表本地8个页面      filterRoutes是筛选出来的可访问的页面

讯享网 const filterRoutes = asyncRoutes.filter(item => { return res.roles.menus.includes(item.children[0].name) })

3.配置动态路由  ​在vuex中新建一个模块menu.js   咱先导入静态页面    再将后面筛选出来的可访问的页面存入menu   利于后期渲染左侧导航栏

// 导入静态路由 import { constantRoutes } from '@/router' const state = { menuList: [...constantRoutes] } const mutations = { setMenuList(state, payload) { // 将基本数组和筛选出来的数组合并 state.menuList = [...constantRoutes, ...payload] } } export default { namespaced: true, state, mutations } 

 在前置路由守卫中把筛选出来的数组存入vuex中

讯享网// 将筛选出来的页面保存到vuex中 store.commit('menu/setMenuList', filterRoutes)

4.动态路由添加

router.addRoutes(filterRoutes)

 然后还有3个bug ~ ~ ~

1.通过addRoutes( )​动态设置了路由之后刷新白屏 

解决方法: next(to)

2.退出之后再次进入,会出现路由重复

解决方法:调用resetRouter()

讯享网export function resetRouter() {   const newRouter = createRouter()   router.matcher = newRouter.matcher // reset router }

3.跳转404页面

解决方法: 在router/index.js 里面的404路由配置删掉 

 放在筛选页面列表的最后面

 filterRoutes.push({ path: '*', redirect: '/404', hidden: true })

最后权限这一块完整的前置路由守卫代码如下:

讯享网// 获取个人信息 // 发获取用户请求 调用vuex里 // if (!store.state.user.userInfo.userId) if (!store.getters.userId) { const res = await store.dispatch('user/getProfile') // console.log('当前用户可以访问的', res)// roles.menus // 动态生成当前的用户能访问的页面 // asyncRoutes一共有8个页面,根据用户权限 从中来筛选用户能访问的页面 // console.log(asyncRoutes) const filterRoutes = asyncRoutes.filter(item => { return res.roles.menus.includes(item.children[0].name) }) // 将404加到最后一项 解决刷新跳转到404的bug filterRoutes.push({ path: '*', redirect: '/404', hidden: true }) // console.log('筛选出来的', filterRoutes) router.addRoutes(filterRoutes) // 将筛选出来的页面保存到vuex中 store.commit('menu/setMenuList', filterRoutes) // 解决出现的白屏 next(to) } else { next() }

小讯
上一篇 2025-02-14 23:29
下一篇 2025-02-24 21:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/23656.html