最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue权限路由[菜单权限/按钮权限控制]

    正文概述 掘金(HaiJun)   2021-02-25   579

    Vue权限路由[菜单权限/按钮权限控制]

    前言

    权限授权登录

    登录

        handleLogin() {
          this.$refs.loginForm.validate(valid => {
            if (valid) {
              this.loading = true;
              login(this.loginForm)
                .then(res => {
                  if (res.code === 200) {
                    // 存放token
                    sessionStorage.setItem("tokens", res.data.token);
                    // 触发Vuex 来 加载 获取当前用户的菜单,并解析路由
                    store.dispatch("setMenuList");
                    this.$message({
                      message: "登录成功",
                      type: "success",
                      duration: 1000
                    });
                    this.$router.replace({ path: "/dashboard" });
                  }
                })
                .catch(() => {
                  this.loading = false;
                });
            } else {
              console.log("error submit!!");
              return false;
            }
          });
        }
    

    获取当前用户菜单,解析路由

    /*
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-02-02 16:10:59
     * @LastEditTime: 2021-02-23 23:03:30
     * @LastEditors: ZhangXin
     */
    // getMenu 解析后台路由
    import { getMenu } from '../../utils/getMenu'
    // 引入路由 和 静态路由
    import router, { constantRoutes } from '../../router/index'
    const state = {
      routerType: '',
      // 菜单路由
      meunList: []
    }
    
    const mutations = {
      SET_ROUTER_TYPE(state, type) {
        state.routerType = type
      },
      SET_ROUTER_MENULIST(state, list) {
        // 静态路由 +  动态路由  合并  完整路由
        const array = constantRoutes.concat(list)
        state.meunList = array
        router.options.routes = array
        router.addRoutes([...array])
      }
    }
    
    const actions = {
      setMenuList({ commit, state }) {
        // 接收返回来的 路由数组
        return new Promise((resolve, reject) => {
          getMenu().then(res => {
            commit('SET_ROUTER_TYPE', '')
            commit('SET_ROUTER_MENULIST', res)
            resolve(res)
          })
        })
      }
    }
    export default {
      state,
      mutations,
      actions
    }
    

    解析后端返回来路由(重点)

    /*
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-02-02 16:03:48
     * @LastEditTime: 2021-02-23 23:09:02
     * @LastEditors: ZhangXin
     */
    import Layout from '@/layout'
    import {getUserAuthMenu} from '@/api/user'
    
    
    
    /**
     * @description: 解析后端返回来的菜单树
     * @param {*} data 后端返回来的路由树
     * @param {*} arr 菜单
     * @return {*}
     */
    function tree(data, arr) {
      data.forEach((datas, index) => {
        arr.push({
          path: datas.path,
          name: datas.name,
          types: datas.types,
          hidden: datas.hidden == 'true' ? true : false,
          // 当时这块踩坑了
          component: datas.component === 'Layout' ? Layout : resolve => require([`@/views/${datas.component}.vue`], resolve),
          meta: {
            title: datas.meta.title,
            icon: datas.meta.icon,
            // 用来存放按钮权限
            button: datas.meta.button
          },
          //  redirect: datas.redirect,
          id: datas.id,
          // 子路由
          children: []
        })
    
        if (datas.children) {
          const childArr = tree(datas.children, [])
          arr[index].children = childArr
        }
      })
      return arr
    }
    
    
    /**
     * @description: 获取当前登录用户的菜单
     * @param {*}
     * @return {*}
     */
    export function getMenu() {
      return new Promise(function (resolve, reject) {
        getUserAuthMenu().then(res => {
          if(res.code === 200){
          const datas = res.data
          // 调用 tree 来解析后端返回来的树
          resolve(tree(datas, []))
          }
    
        })
      })
    }
    
    

    后端接收路由格式

    Vue权限路由[菜单权限/按钮权限控制]

    前端接收到的真实菜单树

    Vue权限路由[菜单权限/按钮权限控制]

    页面刷新,路由丢失

    如何处理呢?

    我这块直接在 App.vue 的 生命周期 created 中 , 再次执行了 Vuex 来进行加载和解析,没有做其它操作。 当然了,具体业务具体对待。

    <template>
      <div id="app">
        <router-view v-if="isRouterAlive" />
      </div>
    </template>
    
    <script>
    import store from "@/store";
    export default {
      name: "App",
      provide() {
        return {
          reload: this.reload
        };
      },
      data() {
        return {
          isRouterAlive: true
        };
      },
      methods: {
        reload() {
          this.isRouterAlive = false;
          this.$nextTick(() => (this.isRouterAlive = true));
        }
      },
      created() {
          //只要刷新页面,就会重新加载路由树,保证了路由不会丢失数据
    	  store.dispatch("setMenuList");
      }
    };
    </script>
    
    

    总结

    Vue权限路由[菜单权限/按钮权限控制]


    起源地下载网 » Vue权限路由[菜单权限/按钮权限控制]

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元