Vue + Element UI 前端篇(十三):页面权限控制

这篇具有很好参考价值的文章主要介绍了Vue + Element UI 前端篇(十三):页面权限控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue + Element UI 实现权限管理系统 前端篇(十三):页面权限控制 

权限控制方案

既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦。

前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作权限。

我们的设计把页面导航菜单和页面操作按钮统一存储在菜单数据库表中,菜单表中包含以下权限关注点。

菜单类型

菜单类型代码页面资源的类型。类型包括,0:目录   1:菜单   2:按钮'。

权限标识

权限标识即是代表此页面资源,用来进行权限控制的唯一标识,主要是进行增删改查的权限控制。

权限标识包括,sys:user:add:新增 sys:user:edit:编辑 sys:user:delete:删除 sys:user:view:查看。

注:目前查看都可以通过菜单可见性进行控制,所以查看权限标识目前没有用上,如果需要显示无权限页面可以使用。

菜单表结构

具体的菜单表结构如下。

vue + element ui 实现权限管理系统,vue

-- ------------------------------------------------
--  菜单
-- ------------------------------------------------
--  Table structure for `sys_menu`
-- ------------------------------------------------
CREATE TABLE `sys_menu` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(50) COMMENT '菜单名称',
  `parent_id` bigint COMMENT '父菜单ID,一级菜单为0',
  `url` varchar(200) COMMENT '菜单URL',
  `perms` varchar(500) COMMENT '授权(多个用逗号分隔,如:sys:user:add,sys:user:edit)',
  `type` int COMMENT '类型   0:目录   1:菜单   2:按钮',
  `icon` varchar(50) COMMENT '菜单图标',
  `order_num` int COMMENT '排序',
  `create_by` varchar(50) COMMENT '创建人',
  `create_time` datetime COMMENT '创建时间',
  `last_update_by` varchar(50) COMMENT '更新人',
  `last_update_time` datetime COMMENT '更新时间',
  `del_flag` tinyint DEFAULT 0 COMMENT '是否删除  -1:已删除  0:正常',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单管理';

vue + element ui 实现权限管理系统,vue

导航菜单实现思路

1.用户登录系统

用户登录系统之后,跳转到首页。

2.根据用户加载导航菜单

在路由导航守卫路由时加载用户导航菜单并存储到store。

加载过程如下,返回结果排除按钮类型。

user -> user_role -> role -> role_menu -> menu。

3.导航栏读取菜单树

导航栏到sotre读取导航树并进行展示。 

页面按钮实现思路

1.用户登录系统

用户登录系统之后,跳转到首页。

2.根据用户加载权限标识集合

在路由导航守卫路由时加载用户权限标识集合。

加载过程如下,返回结果是用户权限标识的集合。

user -> user_role -> role -> role_menu -> menu。

3.页面按钮控制

页面操作按钮提供权限标识,查询是否在用户权限标识集合中。

在:有权限,可见或可用,不在:无权限,不可见或禁用。

目前本系统采用的是状态禁用。

权限控制实现

导航菜单权限

加载导航菜单

如下图所示,在导航守卫路由时加载导航菜单并保存状态。

router/index.js

vue + element ui 实现权限管理系统,vue

页面组件引用

导航栏页面从共享状态中读取导航菜单树并展示。

views/NavBar/NavBar.vue

vue + element ui 实现权限管理系统,vue

views/NavBar/NavBar.vue

vue + element ui 实现权限管理系统,vue

页面按钮权限

添加权限获取接口

http/modules/user.js

vue + element ui 实现权限管理系统,vue

// 查找用户的菜单权限标识集合
export const findPermissions = (params) => {
    return axios({
        url: '/user/findPermissions',
        method: 'get',
        params
    })
}

vue + element ui 实现权限管理系统,vue

添加权限获取接口

store/modules/user.js

vue + element ui 实现权限管理系统,vue

export default {
    state: {
        perms: [],  // 用户权限标识集合
    },
    getters: {
   
    },
    mutations: {
        setPerms(state, perms){  // 用户权限标识集合
            state.perms = perms;
        }
    },
    actions: {
    }
}

vue + element ui 实现权限管理系统,vue

加载权限标识

如下图所示,在导航守卫路由时加载权限标识并保存状态。

router/index.js

权限按钮判断

封装了权限操作按钮组件,在组件中根据外部传入的权限标识进行权限判断。

views/Core/KtButton.vue

vue + element ui 实现权限管理系统,vue

<template>
  <el-button :size="size" :type="type" 
    :loading="loading" :disabled="!hasPerms(perms)" @click="handleClick">
    {{label}}
  </el-button>
</template>

<script>
import { hasPermission } from '@/permission/index.js'
export default {
  name: 'KtButton',
  props: {
    label: {  // 按钮显示文本
      type: String,
      default: 'Button'
    },
    size: {  // 按钮尺寸
      type: String,
      default: 'mini'
    },
    type: {  // 按钮类型
      type: String,
      default: null
    },
    loading: {  // 按钮加载标识
      type: Boolean,
      default: false
    },
    disabled: {  // 按钮是否禁用
      type: Boolean,
      default: false
    },
    perms: {  // 按钮权限标识,外部使用者传入
      type: String,
      default: null
    }
  },
  data() {
    return {
    }
  },
  methods: {
    handleClick: function () {
      // 按钮操作处理函数
      this.$emit('click', {})
    }, 
    hasPerms: function (perms) {
      // 根据权限标识和外部指示状态进行权限判断
      return hasPermission(perms) & !this.disabled
    }
  },
  mounted() {
  }
}
</script>

<style scoped>

</style>

vue + element ui 实现权限管理系统,vue

权限判断逻辑

src/permission/index.js

vue + element ui 实现权限管理系统,vue

import store from '@/store'
/**
 * 判断用户是否拥有操作权限
 * 根据传入的权限标识,查看是否存在用户权限标识集合
 * @param perms
 */
export function hasPermission (perms) {
    let hasPermission = false
    let permissions = store.state.user.perms
    for(let i=0, len=permissions.length; i<len; i++) {
        if(permissions[i] === perms) {
            hasPermission = true;
            break
        }
    }
    return hasPermission
}

vue + element ui 实现权限管理系统,vue

权限按钮引用

views/Sys/User.vue

vue + element ui 实现权限管理系统,vue

测试效果

1.可用状态,操作按钮可用。

vue + element ui 实现权限管理系统,vue

2.修改页面的权限标识,导致认证失败。

如下图所示,修改新增和删除按钮的权限标识(加个2),导致权限认证失败。

3.无权限,操作按钮禁用。

新增和删除按钮因为修改了权限标识,匹配失败,变成了禁用状态。

vue + element ui 实现权限管理系统,vue

源码下载

后端:kitty: 基于Spring Boot、Spring Cloud、Vue.js 、Element UI实现,采用前后端分离架构的权限管理系统,JAVA快速开发平台。文章来源地址https://www.toymoban.com/news/detail-823453.html

到了这里,关于Vue + Element UI 前端篇(十三):页面权限控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 78.(前端)分配权限页面显示——树形结构使用(Element-ui的Tree树形控件)

    在前端的操作中,应该增加修改、删除、分配权限的操作 这次主要是实现分配权限的显示!!!!!! 更换icon图标,并设计大小 绑定函数,点击弹出提示框(DIalog对话框) 在对话框内,应该显示一个树形结构提供选择(Tree树形控件) 初始化树形结构,并填充数据

    2024年02月05日
    浏览(36)
  • 基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏

    1.vue-cli创建前端工程,安装element-ui,axios和配置; 2.前端跨域的配置,请求添加Jwt的设置; 3.进行初始化布局,引入新增页面的方式; 4.home页面导航栏的设置,一级目录,二级目录; 安装成功 布局初步 1.vue-cli创建前端工程,安装element-ui,axios和配置; 2.前端跨域的配置,请

    2024年02月09日
    浏览(38)
  • Vue+Element UI 权限管理(角色 )

    用户前台登录后,后台返回一个token,将该token存储到store中,并设置到header中,每次发起请求时都会携带该token,用于后台进行权限校验 在store 的user.js中定义了该方法 此时登录成功后,后台将返回一个token 在请求拦截器中将token添加到请求头上,在响应拦截器中设置未登录状

    2024年02月12日
    浏览(30)
  • ​Vue + Element UI前端篇(二):Vue + Element 案例 ​

    打开 Visual Studio Code,File -- add Folder to Workspace,导入我们的项目。 安装依赖 Element 是国内饿了么公司提供的一套开源前端框架,简洁优雅,提供了 vue、react、angular 等多个版本,我们这里使用 vue 版本来搭建我们的界面。 访问:http://element-cn.eleme.io/#/zh-CN/component/installation ,官

    2024年02月09日
    浏览(27)
  • 【Vue2+Element ui通用后台】菜单权限

    对于菜单权限我们需要解决以下问题: 1、不同的账号登录,有不同的菜单 2、通过输入url地址来显示页面,所以应该根据权限动态注册路由 3、对于菜单数据,在不同页面之间的数据通信 现在项目中的菜单,我们是在 CommenAside 中写死的,现在我们需要根据登录后返回的权限

    2024年02月07日
    浏览(22)
  • vue-element-adminn实现权限管理(后端只控制权限roles)

    用户应该分为三类: ​ 1、普通用户(user):只允许登录前台小程序端并进行基本的操作、不能进行后台管理系统的任何操作。 ​ 2、店铺管理员(admin):允许管理店铺的栏目CRUD操作、商品CRUD操作、评论的查看与删除、查看店铺的销售情况等。 ​ 3、超级管理员(super):允许进行

    2024年01月18日
    浏览(32)
  • Element UI +Vue页面生成二维码的方法

    //在终端输入npm命令,安装二维码插件 全部代码 名称 类型 默认值 说明 errorCorrectionLevel String M 错误处理级别。可选值:low, medium, quartile, high or L, M, Q, H maskPattern Number 可选值:0, 1, 2, 3, 4, 5, 6, 7 margin Number 4 scale Number 4 width Number color.dark String #000000ff color.light String #ffffffff logoS

    2024年03月15日
    浏览(25)
  • Vue + Element UI 前端篇(十二):用户管理模块

    添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 模拟数据 在 mock/moduls/user.js 中添加用户管理相关mock接口。 提取根路径 为了可以统一控制mock的开启与关闭,把mock的根路径提取出来。  而具体的Mock接口,把根路径移除,因为在生成Mock的时候会自动把根路径加上去。

    2024年02月09日
    浏览(27)
  • Vue + Element UI 前端篇(七):功能组件封装

    为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度。 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航、头部和主内容三个组件。 Home.vue HeadBar.vue MenuBar.vue Main.vue 国际化语言切换也被封装成为了组

    2024年02月09日
    浏览(28)
  • Vue + Element UI 前端篇(六):更换皮肤主题

    命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。 2.安装chalk主题 安装白垩主题,可以从 npm 安装或者从 GitHub 拉取最新代码,这里从 npm 安装。 3.初始化变量

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包