Vue核心知识:Vue动态权限到按钮完整方案

为了进一步实现上面提到的动态路由功能,并且加入对每个路由的权限控制(即增、删、改、查按钮的权限控制),我们需要对数据库、后端接口、前端的设计做一些改进和扩展。下面我将详细描述如何在现有方案的基础上加入对路由的增、删、改、查权限控制。

目录

      • 一、数据库设计扩展
        • 1.1 修改路由表(routes)
        • 1.2 修改角色与路由权限表(role_routes)
      • 二、后端接口设计
        • 2.1 修改获取路由接口
        • 2.2 添加路由权限的接口
      • 三、前端实现
        • 3.1 动态生成路由
        • 3.2 根据权限动态显示按钮
        • 3.3 在Vuex中存储用户权限
      • 四、总结

一、数据库设计扩展

为了实现更细粒度的权限控制,我们需要对数据库结构做一些修改和扩展,增加对路由权限的支持。每个路由会关联四个权限:增、删、改、查。

1.1 修改路由表(routes)

首先,我们要扩展路由表,使其支持每个路由的增、删、改、查权限。

CREATE TABLE routes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    path VARCHAR(255) NOT NULL,
    component VARCHAR(255) NOT NULL,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT 0,
    meta JSON DEFAULT NULL, 
    is_enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    -- 增、删、改、查权限
    permission_create BOOLEAN DEFAULT FALSE,
    permission_delete BOOLEAN DEFAULT FALSE,
    permission_update BOOLEAN DEFAULT FALSE,
    permission_view BOOLEAN DEFAULT TRUE
);
  • permission_create:该路由是否具有增权限。
  • permission_delete:该路由是否具有删权限。
  • permission_update:该路由是否具有改权限。
  • permission_view:该路由是否具有查权限。
1.2 修改角色与路由权限表(role_routes)

role_routes表中,新增字段来存储角色对路由的权限,分别对应增、删、改、查。

CREATE TABLE role_routes (
    role_id INT,
    route_id INT,
    permission_create BOOLEAN DEFAULT FALSE,
    permission_delete BOOLEAN DEFAULT FALSE,
    permission_update BOOLEAN DEFAULT FALSE,
    permission_view BOOLEAN DEFAULT TRUE,
    PRIMARY KEY (role_id, route_id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    FOREIGN KEY (route_id) REFERENCES routes(id)
);
  • 每条记录表示角色对某个路由的权限。

二、后端接口设计

在后端,我们需要确保路由的增、删、改、查权限在获取路由数据时被正确地返回,并且在路由的操作(如添加、删除、修改、查看)时进行权限控制。

2.1 修改获取路由接口

修改/api/get_routes接口,增加对路由权限的支持,返回每个路由的增、删、改、查权限信息。

@app.route('/api/get_routes', methods=['GET'])
def get_routes():
    role_name = request.args.get('role')
    role = Role.query.filter_by(name=role_name).first()
    
    if not role:
        return jsonify({'message': 'Role not found'}), 404
    
    routes = db.session.query(Route).join(RoleRoute).filter(RoleRoute.role_id == role.id).all()
    routes_data = []
    
    for route in routes:
        role_route = RoleRoute.query.filter_by(role_id=role.id, route_id=route.id).first()
        routes_data.append({
            'path': route.path,
            'component': route.component,
            'name': route.name,
            'meta': route.meta,
            'permissions': {
                'create': role_route.permission_create,
                'delete': role_route.permission_delete,
                'update': role_route.permission_update,
                'view': role_route.permission_view
            }
        })
    
    return jsonify(routes_data)

在这个接口中,我们通过RoleRoute表来获取每个角色对应的路由权限,并将这些权限一起返回。

2.2 添加路由权限的接口

我们还需要提供一个接口来修改路由权限(即为角色设置增、删、改、查权限)。

@app.route('/api/set_route_permissions', methods=['POST'])
def set_route_permissions():
    data = request.json
    role_id = data['role_id']
    route_id = data['route_id']
    permission_create = data['permission_create']
    permission_delete = data['permission_delete']
    permission_update = data['permission_update']
    permission_view = data['permission_view']

    role_route = RoleRoute.query.filter_by(role_id=role_id, route_id=route_id).first()

    if not role_route:
        role_route = RoleRoute(role_id=role_id, route_id=route_id)
        db.session.add(role_route)

    role_route.permission_create = permission_create
    role_route.permission_delete = permission_delete
    role_route.permission_update = permission_update
    role_route.permission_view = permission_view
    
    db.session.commit()

    return jsonify({'message': 'Permissions updated successfully'})

该接口接收角色ID、路由ID以及增、删、改、查权限的设置,并更新数据库中的权限数据。

三、前端实现

前端需要根据从后端接口获取的路由信息和权限数据,动态生成路由,并根据权限来控制不同路由下按钮的显示与操作权限。

3.1 动态生成路由

前端的路由配置需要动态加载,并在路由生成时判断当前用户对该路由的权限。

router/index.js中,我们可以根据权限信息来配置动态路由。

import Vue from 'vue';
import Router from 'vue-router';
import store from '../store';

Vue.use(Router);

const router = new Router({
  routes: []
});

function generateRoutes(routes) {
  const routeArray = [];
  routes.forEach(route => {
    const routeConfig = {
      path: route.path,
      name: route.name,
      component: () => import(`@/views/${route.component}.vue`), // 动态加载组件
      meta: route.meta,
      permissions: route.permissions // 保存权限数据
    };

    if (route.children && route.children.length > 0) {
      routeConfig.children = generateRoutes(route.children);
    }

    routeArray.push(routeConfig);
  });
  return routeArray;
}

router.beforeEach(async (to, from, next) => {
  if (!store.state.routes.length) {
    const res = await store.dispatch('getRoutes');
    const routes = generateRoutes(res);
    routes.forEach(route => {
      router.addRoute(route);
    });
    next({ ...to, replace: true });
  } else {
    next();
  }
});

export default router;
3.2 根据权限动态显示按钮

前端页面上的操作按钮(如增、删、改、查)需要根据用户对路由的权限来进行显示和隐藏。假设每个页面都有这些按钮,我们可以使用v-if指令来根据权限控制显示与否。

<template>
  <div>
    <button v-if="hasCreatePermission">新增</button>
    <button v-if="hasUpdatePermission">编辑</button>
    <button v-if="hasDeletePermission">删除</button>
    <button v-if="hasViewPermission">查看</button>
  </div>
</template>

<script>
export default {
  computed: {
    hasCreatePermission() {
      return this.$store.state.userPermissions.create;
    },
    hasUpdatePermission() {
      return this.$store.state.userPermissions.update;
    },
    hasDeletePermission() {
      return this.$store.state.userPermissions.delete;
    },
    hasViewPermission() {
      return this.$store.state.userPermissions.view;
    }
  },
  created() {
    this.setPermissions(this.$route.meta.permissions);
  },
  methods: {
    setPermissions(permissions) {
      this.$store.commit('setUserPermissions', permissions);
    }
  }
}
</script>

在这个组件中,我们使用v-if指令根据权限来显示对应的按钮。hasCreatePermissionhasUpdatePermission等计算属性返回当前用户对该页面的权限,setPermissions方法会在页面加载时设置当前用户的权限。

3.3 在Vuex中存储用户权限

在Vuex中,我们可以存储用户的权限数据,并在不同的组件中访问。

// store.js
export default new Vuex.Store({
  state: {
    userPermissions: {
      create: false,
      delete: false,
      update: false,
      view: true
    }
  },
  mutations: {
    setUserPermissions(state, permissions) {
      state.userPermissions = permissions;
    }
  },
  actions: {
    async getRoutes({ commit }) {
      const res = await axios.get('/api/get_routes', { params: { role: 'admin' } });
      commit('setRoutes', res.data);
      return res.data;
    }
  }
});

四、总结

通过以上的设计和实现,我们能够在前端根据路由和权限动态生成路由,并且为每个路由设置增、删、改、查等操作的权限。后端负责根据用户的角色返回对应的权限信息,前端通过vue-routervuex管理动态路由和用户权限。通过这种方式,系统可以灵活地根据角色和权限来展示不同的功能,并且有效地控制用户对数据的操作权限。

这种设计方式非常适合复杂权限管理的系统,能够提供细粒度的权限控制,并且可以随着业务需求的变化灵活调整。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979733.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全技术概述

1 TCP/IP 模型基础 OSI参考模型 OSI(Open System Interconnect Reference Model)&#xff0c;开放式系统互联参考模型&#xff0c;它是由 国际标准化组织 ISO 提出的一个网络系统互连模型。 OSI 模型的设计目的是成为一个所有销售商都能实现的开放网络模型&#xff0c;来克服…

Android实现漂亮的波纹动画

Android实现漂亮的波纹动画 本文章讲述如何使用二维画布canvas和camera、矩阵实现二、三维波纹动画效果&#xff08;波纹大小变化、画笔透明度变化、画笔粗细变化&#xff09; 一、UI界面 界面主要分为三部分 第一部分&#xff1a;输入框&#xff0c;根据输入x轴、Y轴、Z轴倾…

LabVIEW中三种PSD分析VI的区别与应用

在LabVIEW的声音与振动分析工具包中&#xff0c;SVFA Power Spectral Density VI、SVFA Power Spectral Density Subset VI 和 SVFA Zoom Power Spectral Density VI 均用于信号频域分析&#xff0c;但它们在功能、适用场景和操作逻辑上存在显著差异。以下从区别、应用场合、注…

房屋租赁|房屋租赁系统|基于Springboot的房屋租赁系统设计与实现(源码+数据库+文档)

房屋租赁系统目录 目录 基于Springboot的房屋租赁系统设计与实现 一、前言 二、系统功能设计 三、系统实现 管理员功能模块 房主功能模块 用户功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

@[TOC](Java实现 图书管理系统) # 一、菜单 该图书管理系统的菜单界面主要有以下两种: **管理员菜单:** **用户菜单:**

Java实现 图书管理系统 一、菜单二、基本框架1.book包1.1 book类1.2 bookList类 2.use包2.1 User类2.2 AdminUser类2.3 NormalUser类2.4 用户菜单 3.operation包3.1 IOperation接口3.2 AddIOperation类3.3 剩余类如下 4.Main类4.1 login方法4.2 main函数 三、具体运行3.1 ExitI…

【动手实验】TCP半连接队列、全连接队列实战分析

本文是对 从一次线上问题说起&#xff0c;详解 TCP 半连接队列、全连接队列 这篇文章的实验复现和总结&#xff0c;借此加深对 TCP 半连接队列、全连接队列的理解。 实验环境 两台腾讯云服务器 node2&#xff08;172.19.0.12&#xff09; 和 node3&#xff08;172.19.0.15&am…

【弹性计算】弹性裸金属服务器和神龙虚拟化(二):适用场景

弹性裸金属服务器和神龙虚拟化&#xff08;二&#xff09;&#xff1a;适用场景 1.混合云和第三方虚拟化软件部署2.高隔离容器部署3.高质量计算服务4.高速低时延 RDMA 网络支持场景5.RISC CPU 支持6.GPU 性能无损输出 公共云服务提供商推出 弹性裸金属服务器&#xff0c;很显然…

正大杯攻略|量表类问卷数据分析基本步骤

在量表类问卷研究领域&#xff0c;分析变量之间的影响关系是基础且常用的手段。一般先提出关于自变量 X 对因变量 Y 影响关系的假设&#xff0c;随后运用合适的统计方法进行验证&#xff0c;挖掘二者间规律&#xff0c;进而得出结论&#xff0c;为研究发展提供建议。具体分析步…

stm32(hal库)学习笔记-时钟系统

在stm32中&#xff0c;时钟系统是非常重要的一环&#xff0c;他控制着整个系统的频率。因此&#xff0c;我们有理由好好学一下时钟系统。 什么是时钟&#xff1f; 时钟是具有周期性的脉冲信号&#xff0c;一般我们常用占空比为50%的方波。可以形象的说&#xff0c;时钟就是单…

浅入浅出Selenium DevTools

前言 在自动化测试领域&#xff0c;Selenium一直是主流工具之一。随着前端技术的不断发展&#xff0c;浏览器的功能也在不断丰富。 Selenium 3版本前&#xff0c;一套通用的采集流程如上图所示&#xff1a; 打开Charles&#xff0c;设置Session自动导出频次及导出路径Seleniu…

网络安全-使用DeepSeek来获取sqlmap的攻击payload

文章目录 概述DeepSeek使用创建示例数据库创建API测试sqlmap部分日志参考 概述 今天来使用DeepSeek做安全测试&#xff0c;看看在有思路的情况下实现的快不快。 DeepSeek使用 我有一个思路&#xff0c;想要测试sqlmap工具如何dump数据库的&#xff1a; 连接mysql数据库&#…

猿大师播放器:HTML内嵌VLC播放RTSP视频流,无需转码,300ms级延迟,碾压服务器转码方案

在智慧城市、工业安全、应急指挥等关键领域&#xff0c;实时视频监控已成为守护生命与财产的核心防线‌。然而&#xff0c;行业普遍面临三大矛盾&#xff1a; ‌实时性要求与高延迟矛盾‌&#xff1a;火灾蔓延速度达1米/秒&#xff0c;化工泄漏扩散仅需数秒&#xff0c;传统方…

[Jsprit]Jsprit学习笔记-vrp问题新解的接收策略

阈值接收器 作者实现了一个阈值接收器&#xff0c;SchrimpfAcceptance 下面是对这个接收器的解释 阈值接受函数&#xff1a; 这个概念可以描述如下&#xff1a;大多数问题不仅仅有一个唯一的最小值&#xff08;或最大值&#xff09;&#xff0c;而是有多个局部最小值&#xff…

传奇3光通版手游行会战攻略:团队协作与战术布局详解

戳一戳&#xff1b;了解更多 在《传奇3光通版》手游中&#xff0c;行会战是玩家们展现团队协作与战术布局的重要舞台。下面&#xff0c;我们就来详细解析一下行会战中的团队协作与战术布局攻略。 一、团队协作 ​职业搭配 在行会战中&#xff0c;合理的职业搭配至关重要。一般…

初出茅庐的小李博客之按键驱动库使用

驱动库介绍 源码地址&#xff1a;https://github.com/jiejieTop/ButtonDrive 使用只需3步&#xff0c;创建按键&#xff0c;按键事件与回调处理函数链接映射&#xff0c;周期检查按键&#xff0c;支持单双击、连按、长按&#xff1b;采用回调处理按键事件&#xff08;自定义消…

基于springboot+vue实现的食物营养分析与推荐网站 (源码+L文+ppt)43-18

摘 要 食物营养分析与推荐网站是一个综合性的在线平台&#xff0c;它汇集了各类食材的详细营养数据&#xff0c;为用户提供深入的食物营养分析。通过输入个人需求和健康状况&#xff0c;网站能够智能生成个性化的饮食建议&#xff0c;帮助用户更好地规划日常饮食&#xff0c;…

#渗透测试#批量漏洞挖掘#某图创图书馆集群管理系统updOpuserPw SQL注入(CVE-2021-44321)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

java基础+面向对象

Java基础语法 CMD命令 cls 清屏 cd 目录进入文件 cd… 退回 dir 查看当前目录所有文件 E&#xff1a;进入E盘 exit 退出 环境变量就是不用去专门的盘符去找&#xff0c;直接去环境变量里找到文件 语言优势 编译型语言c&#xff1a; 整体翻译 解释型语言python&#x…

水滴tabbar canvas实现思路

废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…

SpringBoot+Redis+Mybatis-plus黑马点评

短信登录 基于Session实现登录 流程&#xff1a; 发送短信验证码-->短信验证码注册登录-->校验登录状态&#xff08;保存用户到ThreadLocal&#xff0c;方便后续使用&#xff09; 不能每次请求服务都要进行登录状态校验&#xff0c;解决办法&#xff1a;拦截器 在Sp…