Vue通用后台管理——菜单权限功能

菜单权限功能

存在的三个问题
1 不同的账号登录有不同的权限,也就是说,有不同的页面

1.1 首先,在 login.vue页面的登录成功的里面,进行获取到返回数据中携带的页面信息
data.data.menu
1.2 由于信息是许多页面都需要进行使用的,所以进行写在store文件夹下,进行处理
对此,里面包含一个数组menu,和修改的方法 setMenu

export default{
    state:{
        menu:[]
    },
    mutations:{
        // 用来定义改变state的方法 同步状态
        // 此时的state就是接收的上面的   
        // 设置menu数据
        setMenu(state,val){
            state.menu = val
        }

    }
}

1.3 之后便是在登录页面进行调用setMenu,传递参数

  // 1 form 表单的校验通过
      this.$refs.form.validate((valid) => {
        if (valid) {
          // 2  如果存在 调用接口 并将form中的数据传入
          getMenu(this.form).then(({ data }) => {
            // console.log(data);
            // 接下来 根据返回的数据code 进行判断是否返回成功
            if (data.code === 20000) {
              // 表示请求成功,拿到后端返回给我们的token 并保存到 cookie里面
              // console.log(data.data.token);
              Cookie.set("token", data.data.token);

              // 对于左侧列表的显示
              // 1 获取数据 存入到 store里面
              this.$store.commit("setMenu", data.data.menu);

              // 跳转到首页
              this.$router.push("/home");
            } else {
              // 使用的是element-ui 中的 message组件
              this.$message.error(data.data.message);
            }
          });
        }
      });
    },

1.4 将原来写在 components文件夹下的 CommonAside 中的MenuData 数据进行删除,(原来里面的数据时写死的),然后通过在computed计算属性中进行拿到store里面的menu,然后在其他功能进行实现
原来的数据

 MenuData: [
        {
          path: "/",
          name: "home",
          label: "首页",
          icon: "s-home",
          url: "Home/Home",
        },
        {
          label: "其他",
          icon: "location",
          children: [
            {
              path: "/page1",
              name: "page1",
              label: "页面1",
              icon: "setting",
              url: "Other/PageOne",
            },
            {
              path: "/page2",
              name: "page2",
              label: "页面2",
              icon: "setting",
              url: "Other/PageTwo",
            },
          ],
        },
      ],

现在的代码:

 computed: {
    noChildren() {
      return this.MenuData.filter((item) => !item.children);
      //   console.log(arr);
    },
    hasChildren() {
      return this.MenuData.filter((item) => item.children);
    },
    // 在计算属性里面进行拿到数据
    isCollapse() {
      return this.$store.state.tab.isCollapse;
    },
    // 主要的步骤 
    MenuData() {
      // 获取store中的state
      return this.$store.state.tab.menu;
    },
  },
2 由于权限的不同,所以有些页面不能显示,也不能够通过url输入地址的方式进行显示。

例如现在登录的权限存在两种,一种是管理员登录,一种是普通用户进行登录,当管理员进行登录的时候,能够显示所有的页面,而在用户进行登录的时候,只能显示首页和商品管理两项。对于用户来说,不能够通过url跳转到user也就是用户管理页面。
具体的功能:
类似于数据间的通信,也需要在state里面定义一个方法,用来接收登录传来的url数据。
在login.vue页面中,在其中的methods方法中进行写:
获取当前的路由,传到设置的方法中

 this.$store.commit("addMenu", this.$router);

在store文件夹下的tab.js文件中:

  // 动态进行路由的修改 动态注册路由
        // 在登录的时候进行调用
        addMenu(state,router){
            // 判断 当前缓存中是否有数据 
            if(!Cookie.get('menu')) return
            const menu = JSON.parse(Cookie.get('menu'))
            state.menu = menu
            // 组装动态路由数据的处理
            const menuArray = []
            menu.forEach(item =>{
                // 判断是否存在子菜单
                if(item.children){
                   item.children =  item.children.map(item=>{
                        item.component = () => import(`../views/${item.url}`)
                        return item
                    })
                    menuArray.push(...item.children)
                }else{
                    // 没有子菜单
                    // component:()=>import('../views/home')
                    item.component = () => import(`../views/${item.url}`)
                    menuArray.push(item)

                }
            })
            console.log( menuArray,' menuArray');

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

        }
3 对于菜单的数据在不同页面之间的数据通信
注意: 此时第一点存在一个问题,就是当页面进行刷新的时候,左侧的菜单栏会没有,其实是因为 数据存在于 store.state 里面,而state存在于 浏览器的内存中,所以浏览器一刷新,导致state里面的数据就不存在了,所以要进行一下缓存,叫做数据的持久化,通过cookie进行缓存。

解决代码
store中的

 // 设置menu数据
        setMenu(state,val){
            state.menu = val
            // stringify将一个对象 序列化成字符串
            Cookie.set('menu',JSON.stringify(val))
        }

CommonAside

 MenuData() {
      // 获取store中的state
      // JSON.parse将原来的数据还原
      // 判断当前数据,缓存中没有,从当前store中获取,
      // 缓存中有 从cookie进行获取
      return JSON.parse(Cookie.get("menu")) || this.$store.state.tab.menu;
    },
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 后台管理系统的菜单管理是指在后台管理系统中对菜单进行配置和管理的功能。通过菜单管理,可以动态地添加、修改和删除菜单,以实现对系统功能的灵活控制。 在Vue3 后台管理系统中,菜单管理通常包括以下几个方面的功能: 1. 菜单列表:通过菜单列表展示所有已配置的菜单,包括菜单名称、图标、路径等信息。管理员可以轻松地查看和管理所有菜单。 2. 菜单添加:管理员可以通过菜单添加功能添加新的菜单项。在添加菜单时,可以设置菜单的名称、图标、路径和权限等属性,以便后续的菜单控制和权限管理。 3. 菜单编辑:管理员可以对已有菜单进行编辑,包括修改菜单的名称、图标、路径和权限。通过菜单编辑功能,可以实现对已有菜单的灵活调整和优化。 4. 菜单删除:如果某个菜单不再需要或者有需要重新配置时,管理员可以通过菜单删除功能将其删除。删除菜单时,会同时删除该菜单下的所有子菜单,以保证系统的结构清晰和统一。 5. 菜单排序:管理员可以对菜单进行排序,以自定义菜单在系统中的显示顺序。通过菜单排序功能,可以将常用或者重要的菜单放在前面,方便用户的使用。 6. 菜单权限控制:菜单管理还需要与权限管理功能结合,实现对用户的菜单访问权限控制。只有具有相应权限的用户才能看到和使用对应的菜单项,增加了系统的安全性和稳定性。 总之,Vue3 后台管理系统的菜单管理功能通过配置和管理菜单,实现了对系统功能的灵活控制,提升了系统的易用性和管理效率。同时,菜单权限控制功能也实现了对系统的访问权限的精细管理,保证了系统的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值