当前位置: 首页 > article >正文

vue3-pc-template后台管理之角色管理与功能权限配置实践

在开发企业级应用时,权限控制无疑是至关重要且不可或缺的一部分。合理的权限控制不仅能够有效保障系统的安全性,还能确保不同用户角色在系统中拥有合适的操作权限,从而提高系统的使用效率和稳定性。本文将详细介绍如何在 Vue3 项目中实现功能权限配置,为开发者提供一个可参考的实践方案。

实现步骤

1、后端返回的数据结构

在进行功能权限配置之前,我们首先需要了解后端返回的数据结构。这些数据将为前端的权限展示和处理提供基础。

 1.1该角色可分配的所有权限

后端返回的 funtionsData1 数据结构中,包含了系统中各个菜单及其对应的功能权限信息。具体如下:

export const funtionsData1 = [{"menuId": 10000,"menuName": "系统管理","listPermission": null,"sonMenuButtonCustom": [{"menuId": 10100,"menuName": "组织架构","listPermission": null,"sonMenuButtonCustom": [{"menuId": 10101,"menuName": "公司管理","listPermission": [{"id": 8,"name": "增加公司","uri": "POST/organizes","menuId": 10101},{"id": 9,"name": "删除公司","uri": "DELETE/organizes/batch","menuId": 10101},{"id": 10,"name": "修改公司","uri": "PUT/organizes/{id}","menuId": 10101}],"sonMenuButtonCustom": null},{"menuId": 10102,"menuName": "部门管理","listPermission": [{"id": 11,"name": "增加部门","uri": "POST/departments","menuId": 10102},{"id": 12,"name": "删除部门","uri": "DELETE/departments/batch","menuId": 10102},{"id": 13,"name": "修改部门","uri": "PUT/departments/{id}","menuId": 10102}],"sonMenuButtonCustom": null},{"menuId": 10103,"menuName": "用户管理","listPermission": [{"id": 1,"name": "增加用户","uri": "POST/users","menuId": 10103},{"id": 2,"name": "删除用户","uri": "DELETE/users/batch","menuId": 10103},{"id": 3,"name": "修改用户","uri": "PUT/users/{id}","menuId": 10103},{"id": 31,"name": "用户角色分配","uri": "POST/users/{id}/role","menuId": 10103}],"sonMenuButtonCustom": null},{"menuId": 10104,"menuName": "角色管理","listPermission": [{"id": 14,"name": "增加角色","uri": "POST/roles","menuId": 10104},{"id": 15,"name": "删除角色","uri": "DELETE/roles/batch","menuId": 10104},{"id": 16,"name": "修改角色","uri": "PUT/roles/{id}","menuId": 10104},{"id": 17,"name": "角色菜单分配","uri": "POST/roles/{id}/menu","menuId": 10104},{"id": 18,"name": "角色功能按钮分配","uri": "POST/roles/{id}/permission","menuId": 10104}],"sonMenuButtonCustom": null}]},{"menuId": 10200,"menuName": "入库管理","listPermission": [{"id": 4,"name": "增加入库单","uri": "POST/regulations","menuId": 10200},{"id": 5,"name": "删除入库单","uri": "DELETE/regulations/batch","menuId": 10200},{"id": 6,"name": "上传入库附件","uri": "POST/regulations/uploadFile","menuId": 10200},{"id": 7,"name": "修改入库单","uri": "PUT/regulations/{id}","menuId": 10200}],"sonMenuButtonCustom": []},{"menuId": 10300,"menuName": "出库管理","listPermission": [{"id": 19,"name": "增加出库单","uri": "POST/meters","menuId": 10300},{"id": 20,"name": "删除出库单","uri": "DELETE/meters/batch","menuId": 10300},{"id": 21,"name": "修改出库单","uri": "PUT/meters/{id}","menuId": 10300},{"id": 22,"name": "上传出库单附件","uri": "POST/meters/uploadFile","menuId": 10300},{"id": 23,"name": "记录溯源信息","uri": "POST/meters/source","menuId": 10300},{"id": 24,"name": "删除溯源信息","uri": "DELETE/meters/source/{id}","menuId": 10300}],"sonMenuButtonCustom": []},{"menuId": 10400,"menuName": "固定资产管理","listPermission": [{"id": 25,"name": "增加固定资产","uri": "POST/substances","menuId": 10400},{"id": 26,"name": "删除固定资产","uri": "DELETE/substances/batch","menuId": 10400},{"id": 27,"name": "修改固定资产","uri": "PUT/substances/{id}","menuId": 10400},{"id": 28,"name": "上传固定资产附件","uri": "POST/substances/uploadFile","menuId": 10400},{"id": 29,"name": "记录溯源信息","uri": "POST/substances/source","menuId": 10400},{"id": 30,"name": "删除溯源信息","uri": "DELETE/substances/source/{id}","menuId": 10400}],"sonMenuButtonCustom": []},{"menuId": 10500,"menuName": "日志管理","listPermission": null,"sonMenuButtonCustom": []}]},{"menuId": 20000,"menuName": "财务管理","listPermission": null,"sonMenuButtonCustom": [{"menuId": 20300,"menuName": "对账单","listPermission": [{"id": 32,"name": "增加对账单","uri": "POST/calibrationLists","menuId": 20300},{"id": 33,"name": "删除对账单","uri": "DELETE/calibrationLists/batch","menuId": 20300}],"sonMenuButtonCustom": []}]},{"menuId": 30000,"menuName": "报价管理","listPermission": null,"sonMenuButtonCustom": [{"menuId": 30300,"menuName": "报价单","listPermission": [{"id": 323,"name": "增加报价单","uri": "POST/calibrationLists","menuId": 20300},{"id": 333,"name": "删除报价单","uri": "DELETE/calibrationLists/batch","menuId": 20300}],"sonMenuButtonCustom": []},{"menuId": 30400,"menuName": "委托服务管理","sonMenuButtonCustom": [{"menuId": 304000,"menuName": "委托单","sonMenuButtonCustom": [],"listPermission": [{"id": 3233,"name": "增加委托单","uri": "POST/calibrationLists","menuId": 203000},{"id": 3333,"name": "删除委托单","uri": "DELETE/calibrationLists/batch","menuId": 203000}],},{"menuId": 304001,"menuName": "下厂单","sonMenuButtonCustom": [],"listPermission": [{"id": 32333,"name": "增加下厂单","uri": "POST/calibrationLists","menuId": 2030003},{"id": 33333,"name": "删除下厂单","uri": "DELETE/calibrationLists/batch","menuId": 2030003}],}]}]}
]

该数据结构以树状形式呈现,每个菜单节点包含 menuId(菜单 ID)、menuName(菜单名称)、listPermission(当前菜单的功能权限列表)以及 sonMenuButtonCustom(子菜单及其功能权限)等信息。 

1.2该角色已经分配的权限id

rolePermissionData 数组中记录了当前角色已经分配的权限 ID。通过这些 ID,前端可以判断哪些功能权限是当前角色所拥有的。 

export const rolePermissionData = [32,8,9,10,11,12,13,1,2,3,31,14,15,16,17,18,6,19,20,21,25,26,27,28
]

2、 封装功能权限弹窗组件

为了更好地管理和展示功能权限配置,我们将功能权限弹窗相关逻辑封装成组件。

2.1 CustomFunctionsDialog.vue

CustomFunctionsDialog.vue 组件用于展示功能权限配置的弹窗界面。具体代码如下:

<template><el-dialog title="功能权限" width="1000" center destroy-on-close><div><div>角色名称:jiaberr</div><div><text>功能权限:</text><el-checkbox v-model="checkAll" @change="handleCheckAllChange">全选/全不选</el-checkbox></div><div class="w-p-100 containner"><nested-menu :data="funtionsData" :checkedData="checkedData" /></div></div><template #footer><div class="dialog-footer"><el-button @click="close">取消</el-button><el-button type="primary" @click="handleSubmit"> 确定 </el-button></div></template></el-dialog>
</template><script setup>
import { ref, provide, watchEffect } from "vue";
import {funtionsData1,funtionsData2,rolePermissionData,
} from "./simulatedData.js";
import NestedMenu from "./NestedMenu.vue"; // 确保正确导入NestedMenu组件const props = defineProps({roleId: {Type: Number,required: true,},
});const checkAll = ref(false);
const funtionsData = ref();
watchEffect(() => {// 仅模拟页面效果使用,真实项目funtionsData需根据id获取后台数据if (props.roleId == 1) {funtionsData.value = funtionsData1;} else {funtionsData.value = funtionsData2;}
});const emits = defineEmits(["close"]);
const close = () => {emits("close");
};
const checkedData = ref(rolePermissionData);
const handleCheckAllChange = (val) => {checkedData.value = val ? permissionIds : [];console.log(checkedData.value);
};
// provide('checkedData', checkedData.value);
const handleCheckData = (id) => {let index = checkedData.value.findIndex((val) => val == id);if (index != -1) {checkedData.value.splice(index, 1);} else {checkedData.value.push(id);}
};
provide("handleEvent", handleCheckData);// 提交
const handleSubmit = () => {// 将选中的id数组上传至后台接口console.log(checkedData.value);emits("close");
};// 收集所有功能权限的id
const extractPermissionIds = (data) => {const ids = [];// 递归遍历函数function traverse(node) {if (node.listPermission && Array.isArray(node.listPermission)) {// 将 listPermission 中的 id 添加到 ids 数组node.listPermission.forEach((permission) => {ids.push(permission.id);});}// 如果有子节点,继续递归遍历if (node.sonMenuButtonCustom && Array.isArray(node.sonMenuButtonCustom)) {node.sonMenuButtonCustom.forEach((child) => traverse(child));}}// 遍历根节点data.forEach((item) => traverse(item));return ids;
};
const permissionIds = extractPermissionIds(funtionsData.value);
</script><style lang="scss" scoped>
.containner {border-top: 1px solid #d3d3d3;border-right: 1px solid #d3d3d3;border-bottom: 1px solid #d3d3d3;
}
</style>

该组件通过接收 roleId 来获取对应的权限数据,并提供了全选、单选以及提交功能权限配置的功能。 

2.2 NestedMenu.vue 

由于后台返回的数据层级关系较为复杂,为了更方便地处理权限分配的展示,我们将权限展示部分单独抽离成 NestedMenu.vue 组件。该组件可以实现循环嵌套,以展示不同层级的菜单和权限。

<template><div class="flex1 border-left"><divv-for="(item, index) in data":key="item.menuId + index"class="flex align-center":class="index == data.length - 1 ? '' : 'border-bottom'"><div class="menuName text-center">{{ item.menuName }}</div><nested-menuv-if="item.sonMenuButtonCustom && item.sonMenuButtonCustom.length":data="item.sonMenuButtonCustom":checked-data="checkedData"/><divv-elseclass="flex flex-wrap flex1 border-left pl-10 pt-5 pr-10 pb-5 min-height"><el-checkboxv-for="(ite, idx) in item.listPermission":key="ite.id || idx":model-value="isChecked(ite.id)"@change="handleChange(ite.id)">{{ ite.name }}</el-checkbox></div></div></div>
</template><script setup>
import { inject } from "vue";
const handleEvent = inject("handleEvent");
const props = defineProps({data: Array,checkedData: Array,
});// 判断是否选中
const isChecked = (id) => {return props.checkedData.includes(id);
};// 调用父组件的方法,修改checkedData
const handleChange = (id) => {handleEvent(id);
};
</script><style scoped>
.border-bottom {border-bottom: 1px solid #d3d3d3;
}.border-left {border-left: 1px solid #d3d3d3;
}.menuName {width: 110px;
}
.min-height {min-height: 40px;
}
</style>

该组件通过接收父组件传递的权限数据和已选中的权限数据,动态展示菜单和权限的勾选状态,并在权限勾选状态发生变化时通知父组件。 

3、在角色管理页面中使用

我们在角色管理页面 role.vue 中引入上述封装的组件,以实现功能权限配置的具体应用。

3.1 role.vue
<template><div><CustomSearchclass="mb-20":searchConfig="roleSearchConfig"@updateQueryData="updateQueryData"></CustomSearch><CustomTable:tableConfig="roleTableConfig":tableData="roleData":total="total"@updateQueryData="updateQueryData"><template #handle="row"><el-button text type="success" size="small">编辑</el-button><el-button text type="danger" size="small">删除</el-button><el-button text type="primary" size="small">菜单权限</el-button><el-button text type="primary" size="small" @click="handleFunctionalAuthority(row.row.id)">功能权限</el-button></template></CustomTable></div><CustomFunctionsDialog v-model="functionsDialogVisible" @close = "functionsDialogVisible = false" :roleId="roleId"></CustomFunctionsDialog>
</template><script setup>
import CustomTable from "@/components/CustomTable/index.vue";
import CustomSearch from "@/components/CustomSearch/index.vue";
import CustomFunctionsDialog from "./CustomFunctionsDialog.vue"
import { roleTableConfig } from "./tableConfig.js";
import { roleSearchConfig } from "./searchConfig.js";
import { roleData } from "./simulatedData.js";
import { ref } from "vue";const total = ref(0);const updateQueryData = (params, bool) => {};// 打开功能权限弹窗
const roleId = ref() // 根据不同的角色id获取不同的权限按钮
const functionsDialogVisible = ref(false)
const handleFunctionalAuthority = (id) => {roleId.value = idfunctionsDialogVisible.value = true
}</script><style lang="scss" scoped>
</style>

在 role.vue 页面中,通过点击 “功能权限” 按钮,可以打开功能权限配置弹窗,并根据不同的角色 ID 获取相应的权限数据进行展示和配置。 

4. 总结

通过上述步骤,我们在Vue3项目中实现了基本的功能权限配置。这种权限控制方式不仅提高了系统的安全性,还使得代码更加模块化和易于维护。在实际应用中,可以根据具体需求进一步完善和扩展权限管理系统。

完整代码实现请参考开源项目:vue3-pc-template

欢迎 Star 和 Fork 项目,一起构建更完善的权限管理体系!

相关文章:

vue3-pc-template后台管理之角色管理与功能权限配置实践

在开发企业级应用时&#xff0c;权限控制无疑是至关重要且不可或缺的一部分。合理的权限控制不仅能够有效保障系统的安全性&#xff0c;还能确保不同用户角色在系统中拥有合适的操作权限&#xff0c;从而提高系统的使用效率和稳定性。本文将详细介绍如何在 Vue3 项目中实现功能…...

Android Flow 示例

在Android开发的世界里&#xff0c;处理异步数据流一直是一个挑战。随着Kotlin的流行&#xff0c;Flow作为Kotlin协程库的一部分&#xff0c;为开发者提供了一种全新的方式来处理这些问题。今天&#xff0c;我将深入探讨Flow的设计理念&#xff0c;并通过具体的例子展示如何在实…...

前端文件加载耗时过长解决方案

从你的 Network (网络) 面板 看到&#xff0c;许多 JS 文件的加载时间较长&#xff08;1~2秒&#xff09;&#xff0c;可能的原因如下&#xff1a; ✅ 可能的原因 1. 过多的 JS 请求&#xff08;多个小文件加载&#xff09; 你当前页面加载了很多小 JS 文件&#xff08;addSi…...

Visual Studio 2022新建c语言项目的详细步骤

步骤1&#xff1a;点击创建新项目 步骤2&#xff1a;到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3&#xff1a;到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…...

物联网系统搭建

实验项目名称 构建物联网系统 实验目的 掌握物联网系统的一般构建方法。 实验要求&#xff1a; 1&#xff0e;构建物联网系统&#xff0c;实现前后端的交互。 实验内容&#xff1a; CS模式MQTT&#xff08;不带数据分析处理功能&#xff09; 实现智能设备与应用客户端的交…...

PostgreSQL中的事务隔离

1. 事务隔离的概念 在数据库管理系统中&#xff0c;事务隔离是一项重要的功能&#xff0c;它能确保在并发访问数据库时事务之间能够独立运行&#xff0c;不会相互干扰。数据库系统通常支持不同级别的事务隔离&#xff0c;用来满足不同应用程序之间的需求。 2. 事务隔离的种类…...

嵌入式硬件设计SPI时需要注意什么?

嵌入式硬件设计SPI时需要注意什么? 1. 硬件设计注意事项 关键点注意事项1. 信号完整性- 缩短SCK、MOSI、MISO的走线长度,避免反射干扰。- 使用屏蔽线或差分信号(高速场景)。- 阻抗匹配(特别是高频信号,如50Ω端接)。2. 电源与地线- 电源去耦:每个SPI芯片的VCC附近放置0…...

mysql新手常见问题解决方法总结

1. 安装与配置问题 1.1 无法安装MySQL Server MySQL Server安装失败是新手常见的问题之一&#xff0c;以下是具体原因及解决方案&#xff1a; 系统要求不满足&#xff1a;MySQL对操作系统有最低版本要求&#xff0c;如Windows 7 SP1及以上、macOS 10.13及以上。若系统版本过…...

Unity3D 资源加载与卸载策略详解

前言 在Unity3D开发中&#xff0c;资源加载与卸载&#xff08;Asset Loading & Unloading&#xff09;是优化游戏性能、减少内存占用、提升用户体验的关键环节。本文将详细探讨Unity3D中的资源加载与卸载策略&#xff0c;并提供相关的技术详解和代码实现。 对惹&#xff…...

AcWing 蓝桥杯集训·每日一题2025·5526. 平衡细菌

5526. 平衡细菌 题意 给定一个序列 ( a i ) (a_i) (ai​)&#xff0c;每次操作可以选择一个位置 (p)&#xff0c;令从 ( a p ) (a_p) (ap​) 开始的每个数都加上一个以 (1) 或者 (-1) 为公差的从 ( 1 / − 1 ) (1 / -1) (1/−1) 开始的等差数列。求最小化让序列归零的操作…...

Android15请求动态申请存储权限完整示例

效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...

UniApp如何判断平台的多种方法(2025最新指南)

摘要&#xff1a;在UniApp跨平台开发中&#xff0c;精准判断运行环境是实现多端差异化的关键。本文将介绍6种判断平台的实用方法&#xff0c;涵盖编译时与运行时场景&#xff0c;助你轻松处理多端兼容问题。 一、为什么需要判断平台&#xff1f; 在UniApp跨平台开发中&#xf…...

unity学习62,尝试做第一个小游戏项目:flappy bird

目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…...

设计模式说明

23种设计模式说明 以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例&#xff0c;帮助你在实际开发中灵活运用&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 解决对象创建问题&#xff0c;降低对象耦合。 1. 单例模式&#xff08;Singleton&…...

【STM32F103ZET6——库函数】11.捕获红外信号

目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…...

unity调用本地部署deepseek全流程

unity调用本地部署deepseek全流程 deepseek本地部署 安装Ollama 搜索并打开Ollama官网[Ollama](https://ollama.com/download) 点击Download下载对应版本 下载后点击直接安装 安装deepseek大语言模型 官网选择Models 选择deepseek-r1&#xff0c;选择对应的模型&#xff0…...

Anaconda 部署 DeepSeek

可以通过 Anaconda 环境部署 DeepSeek 模型&#xff0c;但需结合 PyTorch 或 TensorFlow 等深度学习框架&#xff0c;并手动配置依赖项。 一、Anaconda 部署 DeepSeek 1. 创建并激活 Conda 环境 conda create -n deepseek python3.10 # 推荐 Python 3.8-3.10 conda activate…...

Mac OS升级后变慢了,如何恢复老系统?

我的一台Mac Air闲置很久了&#xff0c;原因是某次系统升级后用着会卡&#xff0c;有差不多10年没用了。今天想试着恢复一下出厂系统&#xff0c;目前看这条路可以走通。记录如下&#xff1a; 1、去哪里下载旧版系统&#xff1f; https://support.apple.com/zh-cn/102662 2、…...

AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例

文生图即以文字描述来生成图像&#xff0c;这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片&#xff0c;除了选择好的模型&#xff0c;在文生图中&#xff0c;提示词特别关键。 一、什么是提示词&#xff08;Prompt&#xff09; 提示词又称创意、关键词、咒语、ca…...

SAP监控体系和机制

SAP监控体系 SAP监控体系是一个多层次、多维度的综合系统&#xff0c;旨在确保SAP系统的性能、可用性、安全性和稳定性。以下是SAP监控体系的主要组成部分&#xff1a; 1. 技术监控&#xff08;Technical Monitoring&#xff09; 目标&#xff1a;监控SAP系统的基础设施和技术…...

算法-贪心篇01-分发饼干

分发饼干 力扣题目链接 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼…...

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx&#xff0c;通过源码烧写的系统。 首先打开终端&#xff0c;输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容&#xff0c; ONNX&#xff08;Open Neural Network E…...

【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践

YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档&#xff1a; 单机&#xff08;主备&#xff09;部署 | YashanDB Doc 另外还参考摩天轮文章&#xff1a; YashanDB 23.2.9.101 企业版安装步骤抢先看&#xff01; - 墨天轮 …...

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…...

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介

前言&#xff1a; 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …...

Qt 实现绘图板(支持橡皮擦与 Ctrl+Z 撤销功能)[特殊字符]

作业&#xff1a; 1&#xff1a;实现绘图的时候&#xff0c;颜色的随时调整 2&#xff1a;追加橡皮擦功能 3&#xff1a;配合键盘事件&#xff0c;实现功能 当键盘按 ctrlz的时候&#xff0c;撤销最后一次绘图 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…...

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DHT11传感器实现温湿度检测&#xff0c;MQ-2烟雾传感器实现烟雾检测&#xff0c;光敏电阻实现光照检测&#xff0c;同时将数据…...

系统架构设计师—数据库基础篇—关系代数运算

文章目录 名词选择运算示例1示例2 投影示例1 笛卡尔积示例1 连接等值连接示例1 自然连接示例1 外连接左外连接右外连接完全外连接 名词 关系&#xff1a;二维表的表名。 元组&#xff1a;二维表中的一行&#xff0c;在数据库中称为记录。 属性&#xff1a;二维表中的一列&am…...

el-table一格两行;概率;find

样式&#xff1a; 根据概率表头关键代码&#xff1a;rateRanges&#xff1b; scope.row.targetHitTable.find((target:any) > target.targetHitRate > range.min && target.targetHitRate < range.max)!.targetHitNum &#xff08;1&#xff09;!.是TypeScri…...

前端跨域设置 withCredentials: true

在做登录认证的时候&#xff0c;会出现请求未登录的情况&#xff0c;查看请求头的时候发现并没有把登录时的cookie设置到第二次的请求头里面。查看资料才知道跨域请求要想带上cookie&#xff0c;必须要在ajax请求里加上 withCredentials: true 再次访问发现请求头可以携带cook…...