vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

这篇具有很好参考价值的文章主要介绍了vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现的效果如下:

用admin账号登录展示

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

 用xiaoxiao账号登录:

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

 并且在xiaoxiao登录的系统中,手动在地址栏输入'/user',请求admin用户才会显示的用户管理页,页面不会展示。

实现思路如下:

1.用户登录,后端返回的data中有菜单数据,把菜单数据存储在vuex中,在侧边栏组件中去获取到存储在vuex中的菜单数据,根据数据动态生成侧边栏。

本项目我是用Mock模拟的数据,后端返回的接口数据如下图:

import Mock from 'mockjs'
export default {
  getMenu: config => {
    const { username, password } = JSON.parse(config.body)
    // 先判断用户是否存在
    // 判断账号和密码是否对应
    if (username === 'admin' && password === 'admin') {
      return {
        code: 20000,
        data: {
          menu: [
            {
              path: '/home',
              name: 'home',
              label: '首页',
              icon: 's-home',
              url: 'Home.vue'
            },
            {
              path: '/mall',
              name: 'mall',
              label: '商品管理',
              icon: 'video-play',
              url: 'Mall.vue'
            },
            {
              path: '/user',
              name: 'user',
              label: '用户管理',
              icon: 'user',
              url: 'User.vue'
            },
            {
              label: '其他',
              icon: 'location',
              children: [
                {
                  path: '/page1',
                  name: 'page1',
                  label: '页面1',
                  icon: 'setting',
                  url: 'PageOne.vue'
                },
                {
                  path: '/page2',
                  name: 'page2',
                  label: '页面2',
                  icon: 'setting',
                  url: 'PageTwo.vue'
                }
              ]
            }
          ],
          token: Mock.Random.guid(),
          message: '获取成功'
        }
      }
    } else if (username === 'xiaoxiao' && password === 'xiaoxiao') {
      return {
        code: 20000,
        data: {
          menu: [
            {
              path: '/home',
              name: 'home',
              label: '首页',
              icon: 's-home',
              url: 'Home.vue'
            },
            {
              path: '/video',
              name: 'video',
              label: '商品管理',
              icon: 'video-play',
              url: 'Mall.vue'
            }
          ],
          token: Mock.Random.guid(),
          message: '获取成功'
        }
      }
    } else {
      return {
        code: -999,
        data: {
          message: '密码错误'
        }
      }
    }

  }
}

在store/tab.js的state中定义一个menu数据用来存储后端返回的菜单栏数据,在mutations中定义一个setMenu方法,在登录成功的时候调用该方法,把后端返回的数据存入menu中

export default {
    state:{
        //菜单栏数据
        menu:[]
    },
    mutations:{
        // 设置menu的数据
        setMenu(state,val){
            state.menu = val
        },
    }
}

在Login.vue组件中,点击登录调用后端接口,拿到后端返回的数据

//登录
        submit(){
            this.$refs.form.validate((valid) => {
                if(valid){
                    getMenu(this.form).then(({ data }) => {
                        console.log(data)
                        if(data.code === 20000){

                            //获取菜单的数据存入store中
                            this.$store.commit('setMenu',data.data.menu)
                            
                        }else{
                            this.$message.error(data.data.message)
                        }
                    })
                }
            })
        }

在 CommonAside.vue中动态计算menuData,然后根据menuData生成菜单栏结构

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

这样就实现了不同账号登录展示不同的侧边栏。但是,当我们在地址栏中手动输入一些路径,仍能够访问到。比如,在xiaoxiao登录的系统中,输入'/user'仍然显示。原因是项目中的路由表是写死了,就像router/index.js中的注释掉的这部分内容这样:

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

 

 因此,接下来我们要做得就是利用router.addRoute方法,把这部分内容变成动态的。

代码如下:

还是在store/tab.js中

定义动态添加路由的方法,遍历存储在state中的menu数据,把它从这样

          menu: [
            {
              path: '/home',
              name: 'home',
              label: '首页',
              icon: 's-home',
              url: 'Home.vue'
            },
            {
              path: '/mall',
              name: 'mall',
              label: '商品管理',
              icon: 'video-play',
              url: 'Mall.vue'
            },
            {
              path: '/user',
              name: 'user',
              label: '用户管理',
              icon: 'user',
              url: 'User.vue'
            },
            {
              label: '其他',
              icon: 'location',
              children: [
                {
                  path: '/page1',
                  name: 'page1',
                  label: '页面1',
                  icon: 'setting',
                  url: 'PageOne.vue'
                },
                {
                  path: '/page2',
                  name: 'page2',
                  label: '页面2',
                  icon: 'setting',
                  url: 'PageTwo.vue'
                }
              ]
            }
          ]

变成和注释掉的那部分一样,然后调用router.addRoute()把内容添加到路由表中。

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏

 实现代码如下:

export default {
    state:{
        //菜单栏数据
        menu:[]
    },
    mutations:{
        // 设置menu的数据
        setMenu(state,val){
            state.menu = val
        },

        //动态注册路由
        addMenu(state,router){
            if(state.menu.length == 0 ) return

            //组装动态路由的数据
            const menuArray = []
            state.menu.forEach(item => {
                if(item.children){
                    item.children = item.children.map(childItem => {
                        childItem.component = () => import(`../views/${childItem.url}`)
                        console.log(childItem.component)
                        return childItem
                    })
                    console.log(item.children)
                    menuArray.push(...item.children)
                }else{
                    item.component = () => import(`../views/${item.url}`)
                    menuArray.push(item)
                }

                console.log(menuArray,'menuArray')

                //路由的动态添加
                menuArray.forEach(item => {
                    router.addRoute('main',item)
                })
            })

        }


    }
}

因为要用到router的api,所以,在定义addMenu方法的时候要把路由实例作为参数传进来。

在Login.vue组件中,登录成功调用addMenu方法:

//登录
        submit(){
            this.$refs.form.validate((valid) => {
                if(valid){
                    getMenu(this.form).then(({ data }) => {
                        console.log(data)
                        if(data.code === 20000){
                            //token信息存入cookie用于不同页面间的通信
                            Cookie.set('token', data.data.token)

                            //获取菜单的数据存入store中
                            this.$store.commit('setMenu',data.data.menu)
                            
                            //动态添加路由表中的数据
                            this.$store.commit('addMenu',this.$router)

                            //跳转到首页
                            this.$router.push('/home')
                        }else{
                            this.$message.error(data.data.message)
                        }
                    })
                }
            })
        }

经过上边操作路由表中的数据已经成功动态生成了,接下来设置路由拦截:

在router/index.js中:

//添加前置导航守卫
router.beforeEach((to, from, next) => {
    // 判断token存不存在
    const token = Cookie.get('token')
    // token不存在,说明当前用户是未登录,应该跳转至登录页
    if(!token && to.name !== 'login'){
        next({name:'login'})
    }else if (token && to.name === 'login'){  //token存在,说明用户已经登录了
       next({name:'home'})
    }else{
        next()
    }
})

这样就实现了动态路由,但是存在两个问题:

1.刷新页面,vuex中的menu会初始化为[]

 解决方法:作vuex的持久化,可参考我另外一篇博客:

vuex持久化存储插件vuex-persistedstate_奋进的大美的博客-CSDN博客

2.刷新页面,路由表数据也会重置

解决方法:

在main.js中调用addMenu方法:

vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏文章来源地址https://www.toymoban.com/news/detail-415270.html

到了这里,关于vue项目中实现用户登录角色鉴权,不同的用户登录展示不同的菜单栏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • vue3项目中实现登录成功页面回跳

    在很多的时候都登录成功都需要回跳,比如  在未登录的情况下将商品加入购物车,会提示先登录.那么登录成功这时就不单止是登录到首页,应该是将页面重新回跳到购物车页面. 登录我这边是放到pinia去管理的 以下是回跳的解决方案:    

    2024年02月11日
    浏览(39)
  • Uniapp根据权限(角色)不同动态展示底部tabbar

    比如绑定openId展示的tabbar为:首页、巡检、工单 未绑定openId展示的tabbar为:在线报修、我的报修 首页配置pages.json中的tabbar: 这里只用配置pagePath就可以了~ 具体代码如下: 创建一个自定义的tabbar文件: 具体代码如下: 注意:pagePath的最前面要   加  / 创建index.js文件配置

    2024年04月26日
    浏览(49)
  • Git 用户名邮箱的全局配置和单仓库配置(不同项目使用不同账号登录)

    因工作和个人的仓库地址、用户名和邮箱都不一样,很多时候一个git账号无法满足工作和个人学习并行的需求。 全局用户名和邮箱是本地 git 客户端的变量,可配置,不随 git 库而改变。gitee 和 github 是按邮箱来统计贡献者(Contributors)的。 我们的目的是在特定项目里设置特定

    2024年02月14日
    浏览(43)
  • 优雅实现微信小程序动态tabBar,根据不同用户角色显示不同底部导航

    背景 在开发小程序过程中,有个需求是,小程序底部的tabBar需要根据不同用户角色显示不同底部导航。此时就需要用到自定义底部导航 custom-tab-bar。 上次发文是组合显示4个底部tabBar导航,很多小伙伴评论说组合超过5个怎么办。他们的需求总数超过5个了。 现在我在这里更新

    2024年02月14日
    浏览(38)
  • uniapp 实现不同用户展示不同的tabbar(底部导航栏)

    目录 一、背景 源码地址:包含vue2和vue3版本:cheinlu/tabBar_demo_vue 二、效果展示 三、前置工作 四、创建tabbar组件 五、登录页面根据不同身份进行tabbar切换逻辑 六、问题拓展 最近在做一个uniapp开发的小程序遇到一个需求,希望不同用户登录后展示不同的tabbar页面,但是uniapp项

    2024年02月08日
    浏览(47)
  • vue项目登录页面实现记住用户名和密码

    记录一下实现的逻辑,应该分两步来理解这个逻辑 首次登录,页面没有用户的登录信息,实现逻辑如下: 用户输入用户名和密码登录,用户信息为名为form的响应式对象,v-model分别对应两个输入框 用户点击登录实现登录功能 判断是否勾选了记住密码,v-model一个CheckBox,勾选

    2024年02月15日
    浏览(46)
  • Chrome/Edge 浏览器多账号登录,测试同一业务系统的不同账号角色

    虽然说用不同浏览器测试也比较方便、还能顺带测试多浏览器兼容问题…… 但我是开发呀,我只想用我最习惯的谷歌浏览器完成快速开发,把功能铺上,专注于业务逻辑的开发 这些浏览器差异等只会给我造成麻烦,影响我的开发沉浸感,打乱我的开发节奏,等功能开发完再

    2024年02月11日
    浏览(62)
  • uni-app动态tabBar,根据不同用户展示不同的tabBar

    因为我们用的是uni-app框架开发,所以在创建项目的时候直接创建uni-ui的项目即可,这个项目模板中自带了uni的一些好用的组件和api。 起初我想着这个效果不难实现,因为官方也有api可以直接使用,所以我最开始尝试就是使用uni的api完成,也就是这个 :uni.setTabBarItem(options) 我

    2024年02月09日
    浏览(51)
  • 微信小程序自定义tabbar,分为医生端和患者端模拟不同角色登录

    介绍微信小程序如何自定义tabbarr界面,使用开发环境为微信开发原生工具,本文案例: 小程序有两个角色用户——医生端、患者端,每个角色进入小程序之后都有其所对应的tabbar界面, 隔离角色的权限,医生端无法进入患者端,患者端无法进入医生端。 1 成果展示 小程序

    2024年04月13日
    浏览(34)
  • MongoDB 6.0 单实例基于用户角色实现授权登录

    现代数据库系统能够存储和处理大量数据。因此,由任何一个用户单独负责处理与管理数据库相关的所有活动的情况相对较少。通常,不同的数据库用户需要对数据库的某些部分具有不同级别的访问权限:某些用户可能只需要读取特定数据库中的数据,而其他用户则必须能够

    2024年02月05日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包