我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue2模拟vue-element-admin手写角色权限怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue2模拟vue-element-admin手写角色权限怎么实现

这篇文章主要介绍“vue2模拟vue-element-admin手写角色权限怎么实现”,在日常操作中,相信很多人在vue2模拟vue-element-admin手写角色权限怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2模拟vue-element-admin手写角色权限怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

权限

路由权限

  • 静态路由:固定的路由,没有权限。如login页面

  • 动态路由:根据不同的角色,后端返回不同的路由接口。通过meta中的roles去做筛选

store存储路由
//地址:store/modules/permissionimport { routes as constantRoutes } from '@/router'// 根据meta.roles去判断该角色是否有路由权限function hasPermission(roles, route) {  if (route.meta && route.meta.roles) {    return route.meta.roles.some(val => val === roles)  }  return true}export function filterAsyncRoutes(routes, roles) {  const res = []  routes.forEach(route => {    const tmp = { ...route }    if (hasPermission(roles, tmp)) {      if (tmp.children) {        //后台传来的路由字符串,转换为组件对象        //       let a = `../views/${route.component}`;        //       route.component = () => import(a); // 导入组件        tmp.children = filterAsyncRoutes(tmp.children, roles)      }      res.push(tmp)    }  })  return res}//模拟后端传过来的路由export const asyncRoutes = [  {    path: '/',    name: 'home',    redirect: '/PickupTask',    meta: {      title: '首页',      //纯前端去做动态路由      roles: ['admin']    },    component: () => import('@/views/HomeView.vue'),    children: [      {        path: 'PickupTask',        name: 'PickupTask',        meta: {          title: 'PickupTask',        },        component: () => import('@/views/Sd/PickupTask.vue'),      },      {        path: 'access',        hidden: true,        component: () => import('@/views/demo/Access.vue'),        meta: {          title: 'access',          roles: ['admin'],          //按钮权限标识          button: {            'btn:access:createUser': 'hidden',            'btn:access:editUser': 'disable'          },        },      },    ],  }]const permisssion = {  // namespaced: true, -> store.dispatch('permisssion/generateRoutes', 'admin');  state: {    //静态路由+动态路由    routes: [],    //动态路由    addRoutes: []  },  mutations: {    SET_ROUTES: (state, routes) => {      state.addRoutes = routes      state.routes = constantRoutes.concat(routes)    }  },  actions: {    generateRoutes({ commit }, roles) {      return new Promise(resolve => {        let accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)        commit('SET_ROUTES', accessedRoutes)        resolve(accessedRoutes)      })    }  }}export default permisssion
router添加路由

将store中的动态路由使用addRoute添加(最新版本去掉了addRoutes只能使用addRoute添加路由)。

//地址:router/indeximport Vue from 'vue';import VueRouter, { RouteConfig } from 'vue-router';import store from '@/store';Vue.use(VueRouter);const isProd = process.env.NODE_ENV === 'production';const routerContext = require.context('./', true, /index.js$/);//静态路由export let routes: any = [];routerContext.keys().forEach((route) => {  // route就是路径  // 如果是根目录的index不做处理  if (route.startsWith('./index')) {    return;  }  const routerModule = routerContext(route);  routes = [...routes, ...(routerModule.default || routerModule)];});// 创建 router 实例,然后传 `routes` 配置const router = new VueRouter({  mode: 'history',  base: isProd ? '/vue-demo/' : process.env.BASE_URL,  routes,  scrollBehavior(to, from, savedPosition) {    if (to.hash) {      return {        selector: to.hash,      };    }  },});let registerRouteFresh = true;router.beforeEach(async (to: any, from, next) => {  //设置当前页的title  document.title = to.meta.title;  if (to.path === '/login' && localStorage.getItem('token')) {    next('/');  }  console.log(registerRouteFresh);  //如果首次或者刷新界面,next(...to, replace: true)会循环遍历路由,  //如果to找不到对应的路由那么他会再执行一次beforeEach((to, from, next))直到找到对应的路由,  //我们的问题在于页面刷新以后异步获取数据,直接执行next()感觉路由添加了但是在next()之后执行的,  //所以我们没法导航到相应的界面。这里使用变量registerRouteFresh变量做记录,直到找到相应的路由以后,把值设置为false然后走else执行next(),整个流程就走完了,路由也就添加完了。  if (registerRouteFresh) {    //设置路由    const accessRoutes = await store.dispatch('generateRoutes', 'admin');    let errorPage = {      path: '*',      name: '404',      component: () => import('../views/404.vue'),    };    // 将404添加进去    // 现在才添加的原因是:作为一级路由,当刷新,动态路由还未加载,路由就已经做了匹配,找不到就跳到了404    router.addRoute({ ...errorPage });    accessRoutes.forEach((item: RouteConfig) => {      router.addRoute(item);    });    //获取路由配置    console.log(router.getRoutes());    //通过next({...to, replace})解决刷新后路由失效的问题    next({ ...to, replace: true });    registerRouteFresh = false;  } else {    next();  }  next();});export default router;

菜单权限

路由遍历,通过store路由权限中的permission.state.routes去做处理

按钮权限

准备:存储按钮标识
//地址:store/modules/userimport {  userInfo,} from '@/api'const user = {  state: {    role: 'admin',    mockButton: {      'btn:access:createUser': 'show',      'btn:access:editUser': 'show'    }  },  //更改 Vuex 的 store 中的状态的唯一方法是提交 mutation  mutations: {    change_role: (state, data) => {      state.role = data.role    },    change_btn: (state, data) => {      state.mockButton = data.mockButton    }  },}export default user
指令

通过模拟传入按钮标识的属性,去判断按钮是否隐藏或者禁用

//地址:directive/permission/indeximport permission from './permissionBtn'const install = function(Vue) {  Vue.directive('permission', permission)}if (window.Vue) {  window['permission'] = permission  Vue.use(install); // eslint-disable-line}permission.install = installexport default permission
//地址:directive/permission/permissionBtnimport store from '@/store'function checkPermission(el, binding) {  const { value } = binding  const roles = store.getters && store.getters.role  // 获取模拟权限按钮标识  const mockButton = store.getters && store.getters.mockButton  // 设置按钮属性  if (mockButton[value] === 'disabled') {    el.disabled = true    el.setAttribute('disabled', true)  }  if (mockButton[value] === 'hidden') {    el.style.display = 'none'  }  if (mockButton[value] === 'show') {    el.style.display = 'block'    el.disabled = false  }  // throw new Error(`need roles! Like v-permission="['admin','editor']"`)}export default {  inserted(el, binding) {    checkPermission(el, binding)  },  update(el, binding) {    checkPermission(el, binding)  }}

//应用

<template>  <div>    <a-button @click="changeRole">切换角色</a-button>    <span>当前角色:{{ role }}</span>    <!-- 注意一定要加disabled属性,才能设置它的disabled值 -->    <a-button :disabled="false" v-permission="'btn:access:createUser'">      新建用户    </a-button>    <a-button :disabled="false" v-permission="'btn:access:editUser'">      编辑用户    </a-button>  </div></template><script lang='ts'>import { Vue, Component, Watch } from "vue-property-decorator";import permission from "@/directive/permission/index.js"; // 权限判断指令// import checkPermission from '@/utils/permission' // 权限判断函数@Component({  directives: {    permission,  },  computed: {    role() {      return this.$store.getters.role;    },  },})export default class Access extends Vue {  get role() {    return this.$store.getters.role;  }  changeRole() {    //设置按钮权限    this.$store.commit("change_btn", {      mockButton:        this.role === "admin"          ? {              "btn:access:createUser": "hidden",              "btn:access:editUser": "disabled",            }          : {              "btn:access:createUser": "show",              "btn:access:editUser": "show",            },    });    //设置角色    this.$store.commit("change_role", {      role: this.role === "admin" ? "edit" : "admin",    });  }}</script>
函数
export default function checkPermission(value) {  if (value && value instanceof Array && value.length > 0) {    const roles = store.getters && store.getters.roles    const permissionRoles = value    const hasPermission = roles.some(role => {      return permissionRoles.includes(role)    })    return hasPermission  }    console.error(`need roles! Like v-permission="['admin','editor']"`)    return false}
<template>  <div>    <a-button      v-if="hasPerms('btn:access:createUser')"      :disable="hasPerms('btn:access:createUser')"    >      新建用户    </a-button>    <a-button      v-if="hasPerms('btn:access:editUser')"      :disable="hasPerms('btn:access:editUser')"    >      编辑用户    </a-button>  </div></template><script lang='ts'>import { Vue, Component, Watch } from "vue-property-decorator";import checkPermission from "@/utils/permission"; // 权限判断函数@Componentexport default class Access extends Vue {  hasPerms(params) {    return checkPermission(params);  }}</script>

到此,关于“vue2模拟vue-element-admin手写角色权限怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue2模拟vue-element-admin手写角色权限怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue2模拟vue-element-admin手写角色权限怎么实现

这篇文章主要介绍“vue2模拟vue-element-admin手写角色权限怎么实现”,在日常操作中,相信很多人在vue2模拟vue-element-admin手写角色权限怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录