简单易懂处理vue根据权限(角色)渲染动态菜单栏问题

权限对于新手真的是一言难尽。。。。接到权限的项目。。硬着头皮终于啃下来了!可喜可贺!

介绍:权限渲染动态菜单一般分为两类:1⃣️后端返回权限对应菜单列表. || 2⃣️后端不返回菜单列表,只返回用户身份(角色:普通用户或者管理员),此情况就需要前端来根据角色动态渲染菜单。

一般都为第1⃣️种情况--------此文介绍第2⃣️种:

1、登陆以后后端接口返回数据:

2、在store ---> user.js 文件下设置:

引入:

 state:

 mutation:

router    ----->  index.js:

 需要新设置:utils ---->下(根据user.js文件中引用的文件可看):

 注意:由于vuex在刷新会数据丢失,所以在存储的时候选择sessionStorage中存储!

user.js 完整代码:you

import {
  login
} from '@/api/user'
import {
  getToken,
  setToken,
  removeToken
} from '@/utils/auth'
import {
  NAME,
  USER_TYPE,
  USER_ID,
  USER_ASYNCROUTES
} from '@/utils/mappingData'
import {
  constantRoutes,
  asyncRoutes
} from '@/router'
import router from "@/router"
// import {resetRouter} from '@/router'
export default {
  namespaced: true,
  state: {
    // 获取token
    token: getToken(),
    // 存储用户名
    name: sessionStorage.getItem(NAME),
    // 角色信息
    roles: JSON.parse(sessionStorage.getItem(USER_TYPE)) || [], // normal ?????? factory??????
    // userId: sessionStorage.getItem(USER_ID),
    // 服务器返回的菜单信息【根据不同的角色,返回的标记信息,数组里面的元素是字符串】
    routers: [],
    // 对比之后【项目中已有的异步路由,与服务器返回的标记信息进行对比最终需要展示的理由
    resultAsyncRoutes: JSON.parse(sessionStorage.getItem(USER_ASYNCROUTES)) || [],
    // userId:''
  },
  // 唯一修改state的地方
  mutations: {
    // 重置state
    // RESET_STATE:(state)=>{
    //   Object.assign(state,state)
    // },
    //存储token
    SET_TOKEN: (state, token) => {
      state.token = token
      setToken(token)
    },
    SET_NAME: (state, name) => {
      sessionStorage.setItem(NAME, name)
      state.name = name
    },
    // SET_USER_ID: (state, userId) => {
    //   sessionStorage.setItem(USER_ID, userId)
    //   state.userId = userId
    // },
    SET_ROLES: (state, level) => {
      let role
      if (level === 0) {
        role = '管理员'
      } else {
        role = '普通用户'
      }
      // sessionStorage.setRole(ROLE, role)
      // state.role = role
      state.roles.splice(0, 1)
      state.roles.push(role)
      sessionStorage.setItem(USER_TYPE, JSON.stringify([role]))
    },
    SET_RESULTSYNCROUTES: (state, asyncrouters) => {
      state.resultAsyncRoutes = asyncrouters
      sessionStorage.setItem(USER_ASYNCROUTES, JSON.stringify(asyncrouters))
      router.addRoutes(state.resultAsyncRoutes)
      console.log('router',router)
    },
  },
  actions: {
    async login({
      dispatch,
      commit
    }, userinfo) {
      try {
        const {
          username,
          password
        } = userinfo
        const res = await login({
          userName: username.trim(),
          password: password
        })

        if (res.code === 0) {
          // commit('SET_USER_ID', res.userId)
          if (res.level == 0) {
            // 将两个路由合并
            commit('SET_RESULTSYNCROUTES', constantRoutes.concat(asyncRoutes))
          } else {
            commit('SET_RESULTSYNCROUTES', constantRoutes)
          }
          commit('SET_NAME', res.name)
          commit('SET_TOKEN', res.token)
          commit('SET_ROLES', res.level)

        }
        return res
      } catch (error) {
        console.log(error)
      }
    },
    // remove token
    resetToken({
      commit
    }) {
      return new Promise(resolve => {
        removeToken()
        sessionStorage.clear()
        resolve()
      })
    }
  }
}

由于vuex数据的不持久化,在页面刷新以后,动态添加的路由会出现白屏的bug,下篇文章介绍。 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 安装vue-router ```bash npm install vue-router --save ``` 2. 创建router.js文件并配置路由 ```javascript import Vue from 'vue' import Router from 'vue-router' import Home from '@/components/Home' import About from '@/components/About' import Contact from '@/components/Contact' Vue.use(Router) export default new Router({ mode: 'history', routes: [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About }, { path: '/contact', name: 'Contact', component: Contact } ] }) ``` 3. 在App.vue中引入router并设置router-view组件 ```vue <template> <div id="app"> <nav> <ul> <li><router-link to="/">Home</router-link></li> <li><router-link to="/about">About</router-link></li> <li><router-link to="/contact">Contact</router-link></li> </ul> </nav> <router-view/> </div> </template> <script> import router from './router' export default { name: 'App', router } </script> ``` 4. 在router.js中添加meta属性 ```javascript export default new Router({ mode: 'history', routes: [ { path: '/', name: 'Home', component: Home, meta: { title: 'Home' } }, { path: '/about', name: 'About', component: About, meta: { title: 'About' } }, { path: '/contact', name: 'Contact', component: Contact, meta: { title: 'Contact' } } ] }) ``` 5. 在App.vue动态生成菜单导航栏 ```vue <template> <div id="app"> <nav> <ul> <li v-for="route in $router.options.routes"> <router-link :to="route.path">{{route.meta.title}}</router-link> </li> </ul> </nav> <router-view/> </div> </template> ``` 这样就可以根据vue-router生成菜单导航栏了。当需要增加新的页面时,只需要在router.js中添加路由和meta属性,菜单导航栏会自动更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值