Vue权限路由思考-LMLPHP

  • 登录成功后同时要做很多事情,具体业务具体对待。后台管理系统 登录成功后会请求当前用户的菜单权限接口,来获取用户的可访问的路由(动态路由),获取成功后,Vue Router 是不能直接使用的,必须得解析成符合Vue Router 可识别的格式 .

    登录

        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",
                      duration1000
                    });
                    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权限路由思考-LMLPHP

    前端接收到的真实菜单树

    Vue权限路由思考-LMLPHP


  • 按钮权限控制





    Vue权限路由思考-LMLPHP


    Vue权限路由思考-LMLPHP



    2020前端技术面试必备Vue:(一)基础快速学习篇

    2020前端技术面试必备Vue:(二)Router篇

    2020前端技术面试必备Vue:(二)组件篇

    2020前端技术面试必备Vue:(四)Vuex状态管理

    以上是Vue全家桶系列

    全栈进阶:Nginx基本功能及其原理

    TypeScript 快速入门(基础篇)
    MYSQL常用操作指令

    更多精彩文章在公众号


    Vue权限路由思考-LMLPHP








    本文分享自微信公众号 - 前端自学社区(gh_ce69e7dba7b5)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    03-29 04:58