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

news2025/7/29 23:09:34

在开发企业级应用时,权限控制无疑是至关重要且不可或缺的一部分。合理的权限控制不仅能够有效保障系统的安全性,还能确保不同用户角色在系统中拥有合适的操作权限,从而提高系统的使用效率和稳定性。本文将详细介绍如何在 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">
    <div
      v-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-menu
        v-if="item.sonMenuButtonCustom && item.sonMenuButtonCustom.length"
        :data="item.sonMenuButtonCustom"
        :checked-data="checkedData"
      />
      <div
        v-else
        class="flex flex-wrap flex1 border-left pl-10 pt-5 pr-10 pb-5 min-height"
      >
        <el-checkbox
          v-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>
    <CustomSearch
      class="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 = id
  functionsDialogVisible.value = true
}


</script>

<style lang="scss" scoped>
</style>

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

4. 总结

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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. 事务隔离的种类…

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

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

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的…

【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…

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系统的基础设施和技术…

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;同时将数据…

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…

私有云基础架构与运维(一)

私有云基础架构与运维&#xff08;OpenStackopenEuler版&#xff09; 项目一.OpenStack 云计算基础架构平台概述 任务1.1 安装部署虚拟化环境 通过安装 openEuler-22.09 操作系统来熟悉虚拟机的安装&#xff0c;在操作过程中熟悉计算机虚 拟化资源的分配管理。 1.1.1 VMware…