首页 > 其他 > 详细

7-7 企业开发之权限管理思路讲解

时间:2020-04-14 18:39:18      阅读:71      评论:0      收藏:0      [点我收藏+]

目录:

  • 什么是权限管理
  • 实现的思路

一、什么是权限管理

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>
Login.vue

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: ‘用户不存在‘
        }
      }
    }
  }
}
permission.js

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>

 

7-7 企业开发之权限管理思路讲解

原文:https://www.cnblogs.com/zhangqigao/p/12699399.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!