«

权限控制

yang 发布于 阅读:369 Vue2阶段


1.1 什么是权限管理?

根据用户的角色权限,显示能操作的模块,就是权限管理,也叫权限控制

后端实现权限控制:将所有导航菜单全部入库,根据用户的权限,读取对应的导航菜单,作为接口数据返回给前端,前端再根据数据渲染出导航栏。大部分的项目都是后端进行权限控制。

前端实现权限控制:将路由线路拆分开,分成不同的权限可以访问到不同的路由,再根据路由模块渲染出导航栏,一般用于小项目。

扩展阅读:https://zhuanlan.zhihu.com/p/34608415

1.2 实现权限控制

思想:根据不同的角色,制作出不同的路由,实现显示不同的模块功能

第一步:将登陆后获取的角色信息存储到本地

//在login登陆模块中,登陆成功以后,将角色信息存储到本地
local.set('role', res.data.role);

第二步:根据不同的角色,生成不同的路由

//在router/index.js中,重新配置路由,根据不同的角色生成不同的路由
//拆分路由,将路由分成不同的角色
function showRouter(){
  let role=local.get('role');
  if(role==='super'){
    return [...normalRoutes, ...superRoutes];
  }else{
    return normalRoutes;
  }
}

const router = new VueRouter({
  routes: showRouter(), //根据角色生成不同的路由
})

第三步:根据路由生成导航栏

//1. 获取路由线路
import {showRouter} from '@/router/index.js'
export default {
    data(){
        return {
            routers: showRouter(), //路由线路数组
        }
    },
}

//2. 排除不需要生成导航的路由,使用数组的过滤函数进行排除,在路由上添加 isMenu 标志
data(){
  return {
    routers: showRouter().filter(v=>v.isMenu), //筛选留下具备 isMenu的路由
  }
},//1. 获取路由线路
import {showRouter} from '@/router/index.js'
export default {
    data(){
        return {
            routers: showRouter(), //路由线路数组
        }
    },
}

//2. 排除不需要生成导航的路由,使用数组的过滤函数进行排除,在路由上添加 isMenu 标志
data(){
  return {
    routers: showRouter().filter(v=>v.isMenu), //筛选留下具备 isMenu的路由
  }
},
<!-- 3. 根据路由数组渲染出导航栏-->
<template v-for="(v,i) in routers">
  <!-- 一级菜单 -->
  <el-menu-item :index="v.path" v-if="v.children.length<=1" :key="i">
    <i :class="v.icon"></i>
    <span slot="title">{{v.meta.title}}</span>
  </el-menu-item>

  <!-- 二级菜单 -->
  <el-submenu :index="v.path" v-else :key="i">
    <template slot="title">
      <i :class="v.icon"></i>
      <span>{{v.meta.title}}</span>
    </template>
    <el-menu-item v-for="(v2, i2) in v.children.filter(v3=>v3.isMenu)" :index="v2.path" :key="i2">{{v2.meta.title}}</el-menu-item>
  </el-submenu>
</template>

问题1:完善路由的图标

//在一级路由上添加图标
{
    path: '/count',
    component: () => import('../views/index/Layout.vue'),
    redirect:'/count/goods',
    meta:{title:'销售统计'},
    isMenu:true,
    icon:'el-icon-pie-chart', //小图标的类名
    children:[...]
},

//在生成导航时生成图标
<el-menu-item :index="v.path" v-if="v.children.length<=1" :key="i">
    <i :class="v.icon"></i>
    <span slot="title">{{v.meta.title}}</span>
</el-menu-item>

问题2:刷新路由

//在登陆成功后 login.vue,刷新一次路由
//跳转到首页,一定要等待
await this.$router.push('/index');

//刷新一次,重新加载路由
window.location.reload();

权限控制

版权所有:微4e
文章标题:权限控制
除非注明,文章均为 微4e 原创,请勿用于任何商业用途,禁止转载

推荐阅读:


扫描二维码,在手机上阅读
请先 登录 再评论