vue实现后台管理系统的权限管理的思路和主要实现步骤

首先 要明白权限管理的究竟是要做什么,

说白了其实就是不同的管理员登录之后看到的页面是不一样

超级管理员往往权限很大很多功能都能看见和操作,包括用户的删除和增加

而普通的管理员往往只是具有查看功能 

俩者登录之后要看到不一样的效果 这就是权限管理的最终样子

这个往往最直接的就是 管理系统左侧的菜单 

超级管理员看到的菜单内容最丰富了,普通的用户就相对单调了些  我们权限管理就是根据这个菜单进行处理的

这样的话 我们先来说下思路 

1.首先是路由我们不能再写死,像下面的的情况就是

import Home from "@/views/Home/Home.vue"

{

     path:'/home',

     name:'home',

     component:Home     //  或者使用懒加载    ()=> import("@/views/Home/Home.vue")

我们要实现路由的动态加载    而这个实现,往往要和后台配合好的

/Home/Home.vue   用户能看到那些组件的内容 后台应该根据前台 登陆的用户反馈给我们,而不是我们写死的

 这个用户能看到什么界面  然后把这个界面的地址给我们,然后我们把界面地址拼接到前台路由上面 这样动态路由就实现了

有权限管理的系统往往后台是 应该单独会有一个权限管理的数据表

我这里先用假数据模拟一下 后台发来的数据

1.1.超级用户可以看到 首页和用户管理页和带有子菜单的菜单分类 

{

          code: 200,

          msg:'ok'

          data: {

            menu: [

              {

                path: '/',     //  首页的路由地址

                name: 'home',  

                url: 'Home/Home.vue'  //  这里是首页的 文件存储地址 这个就是我们要动态拼接到前台  用来路由加载使用

              },

              {

                path: '/user',

                name: 'user',

                url: 'User/User.vue'

              },

              {

                label: '其他',

                icon: 'location',

                children: [

                  {

                    path: '/page1',

                    name: 'page1',

                    url: 'Other/Page1.vue'

                  },

                  {

                    path: '/page2',

                    name: 'page2',

                    url: 'Other/Page2.vue'

                  }

                ]

            ]

          }

        }

      }

//  普通用户只能看到首页

 {

          code: 200,

         msg:'ok'

          data: {

            menu: [

              {

                path: '/',

                name: 'home',

                url: 'Home/Home.vue'

              }

            ]

          }

        }

2.前台来处理  首先得用户登录 (省去了表单登录和数据的处理)

login() {

      this.$http.post('api/User/permission/', this.form).then(res => {

        if (res.code === 200) {

          // 这里我使用了 vuex中的mutations 定义的方法这样可以让所有的组件都可以调用

          this.$store.commit('addMenu', this.$router)  // 将路由对象穿进去,之后将上面存入数据动态加载到路由中间

          this.$router.push({ name: 'home' })   //  不管哪个用户登录 都会跳转到首页

        } 

      })

    }

2.将后台的返回的菜单数据 存入到vuex中          下面代码写在 /store/index.js

state:{

    menu:[]

}

   // 我把数据存储到了 cookie里面 防止 用户刷新之后 导致的vuex数据初始化

addMenu(state, router) {

      if (!Cookie.get('menu')) {

        return

      }

      let menu = JSON.parse(Cookie.get('menu'))

      if (!menu) return

      let currentMenu = [     // 路由的前面固定格式     提前先写好

        {

          path: '/',

          component: () => import('@/views/Main'),  //  Main是后台的主入口文件,返回的路由数据要放到他的chidlren里面 

          children: []                               //  是单页应用开发的  变得往往只是 右侧的那部分 数据

        }

      ]

      state.menu = menu     // 将数据 存入到 state.menu  最后就是将这个 返回到前台 用来进行菜单展示

      menu.forEach(item => {

        if (item.children) {   // 判断数据下面有没有子菜单 子菜单的单独处理

          item.children = item.children.map(item => {

            item.component = () => import(`@/views/${item.url}`)  //  添加 

            return item

          })

          currentMenu[0].children.push(...item.children)  // 有孩子的这里我用扩展运算符展开运算,最后还是以数组的单个元素形式存了进去

        } else {

          item.component = () => import(`@/views/${item.url}`)   // 添加 路由   指向的是 当前项目下指定页面的地址

          currentMenu[0].children.push(item)   //  没有子菜单 直接push进去

        }

      })

      router.addRoutes(currentMenu)  //  使用 router.addRoutes() 方法 将处理好的路由对象 生成动态路由

    }

最后还没完 就是 在用户每次刷新页面之后还是得执行一次这个方法

在main.js中

new Vue({

  router,

  store,

  render: h => h(App),

  created() {

    store.commit('addMenu', router)   //  每次刷新 触发一次  让用户菜单再重新生成一次

  }

}).$mount('#app')

好了 暂时就是这些 这个是能实现的 后期我应该还是会更新的  

发布了168 篇原创文章 · 获赞 65 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yunchong_zhao/article/details/104347767