目录:
1.1、什么是权限管理
1.2、实现思路
2.1、目录结构
...
-src
    -api
        ...
    -assets
        ....
    -common
        ....
    -mock
        -home.js
        -index.js
        -permission.js  //权限文件
        -user.js
    -store
        -index.js
        -tab.js   //动态菜单添加
        -user.js
    -views
        ....
        -Loigin
            -Login.vue   //登录组件
    -APP.vue
    -main.js
    -routes.js
....
2.2、 路由routes.js配置
//懒加载
const Main = () => import(‘@/views/Main‘);
//公共组件加载
....
//登录组件
const Login = () => import(‘@/views/Login/Login.vue‘)
let routes = [
  {
    path: ‘/‘,
    component: Main,
    children: [....]
  },
  {
    path: ‘/login‘,   
    name: ‘login‘,
    component: Login   //登录组件
  }
];
export default routes;
2.2、Login.vue组件
<template> <div style="padding: 20px"> <el-form :model="form" label-width="120"> <el-form-item label="用户名"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码"> <el-input v-model="form.password" type="password"></el-input> </el-form-item> <el-form-item align="center"> <el-button type="primary" @click="login">登录</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: { username: ‘‘, password: ‘‘ } } }, methods: { login() { //定义login事件,去调用permisson.js this.$http.post(‘api/permission/getMenu‘, this.form).then(res => { res = res.data; console.log(res); //调式login组件 }) } } } </script> <style scoped> .el-form { width: 50%; margin: auto; padding: 45px; height: 450px; background-color: #fff; } </style>
2.3、 新增权限文件permission.js
import Mock from ‘mockjs‘ export default { getMenu: config => { const { username, password } = JSON.parse(config.body); console.log(JSON.parse(config.body)); // 先判断用户是否存在 if (username === ‘admin‘ || username === ‘wp‘) { // 判断账号和密码是否对应 if (username === ‘admin‘ && password === ‘123456‘) { return { code: 20000, data: { menu: [ { path: ‘/‘, name: ‘home‘, label: ‘首页‘, icon: ‘s-home‘, url: ‘Home/Home‘ }, { path: ‘/video‘, name: ‘video‘, label: ‘视频管理页‘, icon: ‘video-play‘, url: ‘VideoManage/VideoManage‘ }, { path: ‘/user‘, name: ‘user‘, label: ‘用户管理页‘, icon: ‘user‘, url: ‘UserManage/UserManage‘ }, { 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‘ } ] } ], token: Mock.Random.guid(), message: ‘获取成功‘ } } } else if (username === ‘wp‘ && password === ‘123456‘) { return { code: 20000, data: { menu: [ { path: ‘/‘, name: ‘home‘, label: ‘首页‘, icon: ‘s-home‘, url: ‘Home/Home‘ }, { path: ‘/video‘, name: ‘video‘, label: ‘视频管理页‘, icon: ‘video-play‘, url: ‘VideoManage/VideoManage‘ } ], token: Mock.Random.guid(), message: ‘获取成功‘ } } } else { return { code: -999, data: { message: ‘密码错误‘ } } } } else { return { code: -999, data: { message: ‘用户不存在‘ } } } } }
2.4、在index.js的文件中mock请求url
import Mock from ‘mockjs‘ .... import permissionApi from ‘./permission‘ .... // 权限相关 Mock.mock(/\/permission\/getMenu/, ‘post‘, permissionApi.getMenu);
2.5、我们在并且我们在store下的tab.js中需要定义动态的state:menu
const state = {
  ....,
  menu: [], //存储动态菜单
  tabsList: [...]
};
....
export default {
  state,
  mutations,
  actions
}
2.6、编辑Aside.vue组件获取动态的menu菜单
<template>
  <!--background-color自定义颜色-->
  <el-menu default-active="2" class="el-menu-vertical-demo" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b" :collapse="isCollage">
    <h3 v-show="!isCollage">高高后台管理系统</h3>
    <h3 v-show="isCollage">高高</h3>
    <el-menu-item :index="item.path" v-for="item in noChildren" :key="item.path" @click="clickMenu(item)">
      <i :class="‘el-icon-‘ + item.icon"></i>
      <span slot="title">{{ item.label }}</span>
    </el-menu-item>
    <el-submenu index="item.path" v-for="(item,index) in hasChildren" :key="index">
      <template slot="title">
        <i :class="‘el-icon-‘ + item.icon"></i>
        <span slot="title">{{ item.label }}</span>
      </template>
      <el-menu-item-group>
        <el-menu-item :index="subItem.path" v-for="(subItem,subIndex) in item.children" :key="subIndex" @click="clickMenu(subItem)">
           <i :class="‘el-icon-‘ + subItem.icon"></i>
          <span slot="title">{{ subItem.label }}</span>
        </el-menu-item>
      </el-menu-item-group>
    </el-submenu>
  </el-menu>
</template>
<script>
    export default {
        computed: {
          noChildren(){  //改成this.asideMenu 变成 this.menu
            return this.menu.filter(item => !item.children)
          },
          hasChildren(){
            return this.menu.filter(item => item.children)
          },
          isCollage(){
            return this.$store.state.tab.isCollapse;
          },
          menu(){  //获取动态的菜单
            return this.$store.state.tab.menu;
          }
        },
        ....
    }
</script>
<style scoped>
....
</style>
原文:https://www.cnblogs.com/zhangqigao/p/12699399.html