SpringBoot3 JDK21 Vue3开源后台RBAC管理系统 | 2024年好用的开源RBAC管理系统 | 数据权限的探索

news2024/11/20 1:50:41

序言

项目现已全面开源,商业用途完全免费

当前版本:v0.7.2

如果喜欢这个项目或支持作者,欢迎Star、Fork、Watch
一键三连 🚀
!!

在构建此代码框架的过程中,我已投入了大量精力,力求使其功能完善、结构清晰。然而,鉴于个人技术水平和经验的限制,框架中可能存在一些问题或可以改进的地方。对于任何可能的缺陷或不足,我在此表示诚挚的歉意,并恳请各位给予谅解。 我非常期待收到您的反馈和建议,您的每一条意见都是帮助我改进框架、提升技术水平的宝贵资源。让我们共同协作,不断优化和完善这个框架。 感谢您的使用与支持,期待与您的交流和合作!

简介

接触了很多优秀的开源和闭源项目,在使用过程中也发现一些问题,不甘满足的我遂产生了想法:于是利用休息时间编写了一套后台管理系统,它灵活、简洁、高效,拥抱最新的技术,因此Sz-Admin便诞生了,也意为升职Admin,升职加薪节节高。

Sz Admin ,一个基于 Spring Boot 3、Vue 3 和 Element-Plus 的开源中后台管理框架,致力于为您提供一个流畅、直观且功能强大的开发框架。它不仅融合了最新的技术趋势,而且通过精心设计,确保了系统的简洁性和高效,让使用者可以专注业务。

在这里插入图片描述

在线体验

  • 官网地址:https://szadmin.cn

数据权限

在数据权限构建的这场复杂而深刻的旅程中,作者经过了深思熟虑和不懈的探索。我们在这里展示的解决方案,虽然可能不是完美无瑕,但它代表了我们对问题的一种理解和尝试。我们希望这不仅仅是一个方案的展示,更是一个思考的起点。

同时,作者在实现数据权限的过程中,不禁提出了一个关键问题:“我们是否真的需要构建如此复杂的数据权限体系?这样的复杂性是否真正为我们带来了价值?” 。 我们鼓励每一位用户,带着这样的问题,来体验此功能。

目录

    • 序言
    • 简介
    • 在线体验
  • 数据权限
  • 一级目录
    • 二级目录
      • 三级目录
    • 读前须知
      • 注意事项
      • 内置规则
    • 实现原理
      • 数据结构
      • UML时序
      • 核心逻辑
        • 用户登录与权限规则预处理
          • 非自定义权限配置处理
          • 自定义权限配置处理
          • 合并规则细则
          • RuleMap 权限规则映射
          • 预处理Session数据结构与示例
      • 数据权限控制实现
    • 使用指南
      • 准备工作
        • 步骤一:新建菜单与设置权限
        • 步骤二:SQL层添加权限标识
        • 步骤三:设置数据权限角色
        • 步骤四:关联用户与数据权限角色
        • 步骤五:测试验证
    • 效果展示
      • 账户与权限配置
      • 权限效果验证
      • 操作步骤
      • 预览图

一级目录

二级目录

三级目录

读前须知

注意事项

  1. 同步场景优先:当前方案主要针对同步场景设计,以确保数据一致性和实时性。我们认识到并非所有场景都适用,因此将持续探索以适应更多数据交互模式。
  2. 乐观权限控制:我们采取了一种乐观的权限管理策略,即不是所有数据都需要进行严格的权限控制。我们专注于对那些确实需要保护的敏感数据实施权限管理。
  3. 半自动化实现:为确保业务逻辑的清晰性和减少操作歧义,我们采用了半自动化的实现方式。这种方法结合了配置的灵活性和编码的精确性,以实现特定数据的权限控制。
  4. 最小权限单位:我们以菜单(menu)而非数据库表(table)作为数据权限控制的最小单位。这样做避免了用户需要进行大量表配置操作的繁琐,提高了效率和实用性。
  5. 注解依赖性:核心功能依赖于@SaCheckPermission注解来实现。为了确保数据权限的正常运行,请确保所有需要实现权限控制的Controller层都正确配置了该注解。这将帮助系统自动识别并应用相应的权限规则。
  6. 数据归属规则:我们的数据归属规则基于数据创建时的用户状态。这意味着,当用户创建数据时,系统将根据用户当时的部门归属来标记数据。例如,如果张三同时属于财务部和市场部,并且他创建了一条数据,系统将记录这条数据的创建者为create_id="张三ID",并标注其部门范围为dept_scope="[财务部ID, 市场部ID]"。这样的设计确保了数据归属的明确性,并有助于实现跨部门的数据管理和权限控制。
  7. 最小范围规则:系统默认对(已开启但未配置具体权限的)菜单项限制用户访问,仅允许访问本人数据,以保障数据安全。

内置规则

我们的系统内置了五种灵活的数据权限规则,以满足不同场景下的需求:

  • 全部:用户被授予查看所有数据的权限,适用于需要全面数据访问的角色。
  • 本部门及以下:用户可以查看自己所在部门及其所有子部门的数据。为实现这一规则,我们采用了闭包表结构(sys_dept_closure表),确保了查询的效率和速度。
  • 仅本部门:用户只能访问自己所在部门的数据,适用于需要限制数据访问范围的情况。
  • 仅本人:用户仅能查看自己创建或负责的数据,这有助于保护数据的私密性和责任归属。
  • 自定义:提供高度灵活性,允许根据“用户维度”或“部门维度”来定制数据访问规则,满足特定或复杂的业务需求。

实现原理

数据结构

在我们的数据权限管理系统中,用户表、权限表、菜单表以及部门表之间建立了多对多的复杂关系。这种设计不仅增强了系统的灵活性,而且为不同的业务场景提供了广泛的支持。

  1. 用户与角色:用户可以拥有多个角色,而每个角色也可以被多个用户共享,从而实现了角色的灵活分配和权限的多样化管理。
  2. 角色与权限:每个角色可以关联多种权限,而同一种权限也可以被分配给不同的角色,确保了权限设置的细致和精确。
  3. 角色与菜单:角色与菜单之间的关系也是多对多的,允许角色访问多个菜单项,同时一个菜单项也可以被多个角色访问,提供了菜单访问的灵活性。
  4. 角色与部门:角色与部门之间的关系同样采用多对多模型,使得一个角色可以跨越不同部门,或者一个部门内可以有多个角色,增强了组织结构的适应性。

这种多对多的关系设计,不仅提高了系统的扩展性和可维护性,而且为实现复杂和动态的权限管理提供了坚实的基础。

在这里插入图片描述

UML时序

下述时序图详细展示了数据权限管理中的关键节点和操作流程。

在这里插入图片描述

核心逻辑

用户登录与权限规则预处理

[!NOTE]

dataScopeCd类型如下:

字典值含义是否自定义
1006001全部
1006002本部门及以下
1006003仅本部门
1006004仅本人
1006005自定义

代码参考:

在这里插入图片描述

为了显著提升系统性能并缩短响应时间,我们在用户登录时引入了一项关键的预处理机制。这一机制专注于对数据权限规则(Rule)进行有效管理和优化,分为两大类:非自定义权限配置和自定义权限配置。

非自定义权限配置处理
  • 系统将根据用户ID、用户角色所关联的菜单(menu)、所属部门等条件进行查询。
  • 查询结果将经过二次聚合,生成一个RuleMap,为非自定义权限提供结构化的规则集。
自定义权限配置处理
  • 类似地,系统根据用户ID、角色所关联的菜单(menu)、数据权限类型(dataScopeCd)等条件进行查询。
  • 自定义权限是独立的存在,他与非自定义权限是OR的关系。
合并规则细则
  • 最小权限最大规则:在相同菜单下,如果有多个部门的权限范围(scope),系统将选择最小值的scope作为最终权限(规则编号1006001至1006004)。
  • 单一权限无需合并:对于只有一个scope的菜单,不需要进行额外的合并步骤。
  • 自定义权限规则:对于具有自定义权限的用户,系统将分别获取其部门维度和用户维度的权限,做OR拼接。
RuleMap 权限规则映射

RuleMap 是一个关键的数据结构,用于存储和映射菜单(menu)与数据权限范围(dataScopeCd)之间的关系。这种映射以键值对(key-value)的形式存在,其中:

  • Key (k)menuId,代表菜单的唯一标识符。
  • Value (v)dataScopeCd,代表与该菜单关联的数据权限范围代码。

示例 JSON 格式的 RuleMap:

{
    "ruleMap": {
        "85b54322630f43a39296488a5e76ba16": "1006002"
    }
}

在这个示例中,"85b54322630f43a39296488a5e76ba16" 是一个特定的 menuId,而 "1006002" 是对应的数据权限范围代码。这表明对于具有该 menuId 的菜单项,用户的访问权限被限定为 dataScopeCd 所定义的范围。

RuleMap 的重要性:

  • RuleMap 提供了一个快速查询的机制,允许系统迅速确定用户对于特定菜单项的访问权限。
  • 它支持权限管理的灵活性和扩展性,便于在系统运行时动态调整权限设置。
  • 通过预处理和缓存 RuleMap,系统能够减少权限验证的计算成本,从而提高响应速度。

通过这种方式,RuleMap 成为了我们权限管理系统中的一个高效组件,确保了权限控制的精确性和性能的优化。

预处理Session数据结构与示例

在我们的系统中,预处理Session用于存储用户登录后所需的关键数据,以便快速访问和权限验证。以下是Session中包含的主要数据结构及其描述:

  1. 所属部门及其子孙节点部门 (deptAndChildren)
    • 这是一个列表,包含用户所属部门的ID以及其所有子孙部门的ID。
  2. 权限标识与菜单关系数组 (permissionAndMenuIds)
    • 这是一个映射,将权限标识符映射到菜单ID,明确了不同权限对应的菜单项。
  3. 菜单的查询规则 (ruleMap)
    • 这是一个映射,将菜单ID映射到数据权限范围代码,定义了每个菜单项的访问规则。
  4. 自定义userRule(userRuleMap)
    • 这是一个映射,将菜单ID映射到userId集合,定义了可以访问指定菜单的指定用户集合。
  5. 自定义deptRule (deptRuleMap)
    • 这是一个映射,将菜单ID映射到dept集合,定义了可以访问指定菜单的指定部门集合。

示例JSON格式的预处理Session数据:

{
    "depts": [
        "java.util.ArrayList",
        [
            16
        ]
    ],
    "deptAndChildren": [
        "java.util.ArrayList",
        [
            16
        ]
    ],
    "permissionAndMenuIds": {
        "@class": "java.util.HashMap",
        "teacher.statistics.update": "85b54322630f43a39296488a5e76ba16",
        "teacher.statistics.remove": "85b54322630f43a39296488a5e76ba16",
        "teacher.statistics.export": "85b54322630f43a39296488a5e76ba16",
        "teacher.statistics.query_table": "85b54322630f43a39296488a5e76ba16",
        "teacher.statistics.create": "85b54322630f43a39296488a5e76ba16",
        "teacher.statistics.import": "85b54322630f43a39296488a5e76ba16"
    },
    "ruleMap": {
        "@class": "java.util.HashMap",
        "85b54322630f43a39296488a5e76ba16": "1006002"
    },
    "userRuleMap": {
        "@class": "java.util.LinkedHashMap",
        "85b54322630f43a39296488a5e76ba16": [
            "java.util.HashSet",
            [
                3,
                5
            ]
        ]
    },
    "deptRuleMap": {
        "@class": "java.util.HashMap"
    }
}

在这个示例中,我们展示了如何将部门信息、权限与菜单的映射关系、查询规则以及自定义的用户和部门ID存储在Session中。这种结构化的数据存储方式,使得在用户进行操作时,系统能够快速地进行权限验证和数据访问控制。

数据权限控制实现

[!NOTE]

代码参考:

在这里插入图片描述

我们的数据权限控制流程基于Controller层的权限标识和RuleMap的结合来实现精确的数据访问控制:

  • 权限标识与Menu关联:通过分析Controller上的权限permission标识,我们能够确定Controller与相应菜单项(menu)的关联关系,这是权限控制的第一步。
  • RuleMap应用:结合RuleMap,我们可以进一步明确用户对特定菜单项的访问权限,为数据权限控制提供规则支持。

在实现数据权限控制时,我们采用了特定的SQL拼接技术来确保查询的权限正确性:

  • 部门权限查询:通过嵌套的EXISTS查询,我们检查用户所属部门是否包含在指定的部门ID列表中,确保只有当用户与部门关联时,数据才可见。示例SQL如下所示:

    String sql = "EXISTS (SELECT 1 FROM `sys_user_dept` WHERE `sys_user_dept`.`dept_id` IN (部门ID列表) AND `" + alias + "`.`" + field + "` = `sys_user_dept`.`user_id`)";
    
  • 超级管理员权限查询:对于具有超级管理员权限的用户,我们通过特定的字段检查来允许访问,示例SQL如下:

    String sqlSuper = "EXISTS (SELECT 1 FROM `sys_user` WHERE `sys_user`.`id` = `" + alias + "`.`" + field + "` AND `sys_user`.`user_tag_cd` = '1001002' AND `del_flag` = 'F')";
    
  • 个人权限查询:在处理个人权限时,我们使用了条件查询构造器来生成=语句,允许用户访问他们创建的数据。示例代码如下:

    // sql = ' and create_id = 1 ' 
    QueryCondition queryCondition = QueryCondition.create(
    	new QueryColumn(table.getSchema(), table.getName(), field, table.getAlias()),
        SqlConsts.EQUALS,
        loginUser.getUserInfo().getId()
    );
    
  • 自定义权限查询:我们将部门权限和个人权限结合起来,以实现更为复杂的自定义数据访问权限控制。


使用指南

下面我来详细描述下,如何配置和使用数据权限,在使用数据权限前,先进行以下的准备工作。

准备工作

在开始配置数据权限之前,请完成以下准备工作:

  • 确保application.yml配置文件中启用了数据权限功能,设置配置参数:

    data-scope:
      enable: true
      # 数据逻辑实现最小验证(查询)单位:dept 部门(dept_scope字段)、user 用户 (create_id 字段),默认user。
      logic-min-unit: user
    
  • 确认需要进行数据权限控制的表具备create_id(创建者ID,整型)和dept_scope(部门范围,JSON格式)属性。(后续会修改属性结合自定义注解使用)

步骤一:新建菜单与设置权限
  1. 新建菜单项:在系统后台管理界面中,创建新的菜单项以代表不同的业务功能。

  2. 分配权限标识:为每个新建的菜单项分配一个唯一的permission标识符,该标识符将用于后续的权限控制逻辑。

  3. 开启数据权限支持:在菜单配置中找到并启用数据权限支持开关,确保该菜单项能够参与数据权限的控制流程。
    在这里插入图片描述

  4. 使用注解标识权限:在与菜单项关联的Controller层方法上,应用@SaCheckPermission注解,并填入之前分配的permission标识符,以明确该方法的权限要求。

  5. 确保注解正确性:检查注解的语法和permission标识符的准确性,确保它们与菜单项的权限设置相匹配。

    在这里插入图片描述


步骤二:SQL层添加权限标识

[!WARNING] !注意

SimpleDataScopeHelper 通过ThreadLocal存储每个线程的权限控制状态,以确保权限控制逻辑的隔离性和线程安全。为了防止ThreadLocal状态未被正确清理导致的潜在问题,我们强烈建议使用try-finally代码块来严格管理权限控制逻辑:

  • 初始化权限控制上下文: 在try块开始时,调用SimpleDataScopeHelper.start(YourEntity.class)初始化当前线程的权限控制上下文。这为接下来的数据访问操作设定了权限控制的边界。

    try {
        SimpleDataScopeHelper.start(TeacherStatistics.class);
    
  • 执行数据访问操作: 在try块中执行所有需要权限控制的数据访问业务逻辑。SimpleDataScopeHelper将基于当前线程的上下文自动应用相应的权限控制。

  • 清理权限控制状态finally块确保无论业务逻辑执行结果如何,都会调用SimpleDataScopeHelper.clearDataScope()来清理ThreadLocal状态。这一步是关键,它避免了ThreadLocal中的残留状态影响到其他业务操作。

    } finally {
        SimpleDataScopeHelper.clearDataScope();
    }
    

遵循这一最佳实践不仅有助于保持业务逻辑的清晰性和准确性,而且确保了应用程序的线程安全性和稳定性。

在实现数据权限控制的核心环节中,SQL层的适当配置至关重要。请按照以下步骤在SQL查询中添加权限控制标识:

  1. 确定权限控制点:识别出需要根据用户权限过滤数据的SQL查询点。
  2. 使用权限控制辅助类:在相关的数据访问代码块中,使用SimpleDataScopeHelper类来管理权限控制的逻辑。
  3. 示例代码
try {
    SimpleDataScopeHelper.start(TeacherStatistics.class); // 指定要追加权限条件的数据表PO实体类,对此po类的关联表进行条件追加。
    // 在此处编写或修改你的SQL查询,SimpleDataScopeHelper将自动根据权限规则追加条件
    // 示例:SELECT * FROM teacher_statistics WHERE 1=1 你的查询条件
} finally {
    SimpleDataScopeHelper.clearDataScope(); // 清除权限控制状态,避免影响其他操作
}
  1. 自定义SQL条件:如果需要,你可以在SimpleDataScopeHelper.start()clearDataScope()之间添加自定义的SQL条件,以满足特定的业务需求。
  2. 清理权限状态:在finally块中使用SimpleDataScopeHelper.clearDataScope()确保在操作完成后清理权限控制状态,以防止对系统中的其他操作产生影响。

通过这些步骤,您可以确保数据权限的配置既符合业务逻辑,又满足安全合规要求,同时为用户提供了清晰的权限边界。
例1:
在这里插入图片描述

例1:
在这里插入图片描述


步骤三:设置数据权限角色
  • 定义不同的数据权限角色,并为每个角色配置相应的权限规则。自定义权限外,不需单独配置部门,其依赖用户本身部门属性。

  • 自定义权限可以任意配置部门和用户的规则。

    非自定义Scope:

在这里插入图片描述

自定义Scope:

在这里插入图片描述


步骤四:关联用户与数据权限角色
  • 将用户与相应的数据权限角色进行关联,确保用户能够根据其角色获得正确的数据访问权限。

在这里插入图片描述


步骤五:测试验证
  • 在配置完成后,进行彻底的测试以验证数据权限的配置是否正确,确保权限控制按预期工作。

效果展示

为了直观展示数据权限控制的效果,我们以“教师统计”功能中的列表查询和Excel导出为例。以下是我们的演示设置:

账户与权限配置

我们准备了四个不同权限配置的账户,以展示不同数据权限对查询结果的影响:

账户部门数据权限设置
test1研发团队教师统计-本部门及以下部门
test2移动组教师统计-仅本部门
test3移动组教师统计-仅本人
test4无部门教师统计-自定义权限

权限效果验证

  • test1账户:具有查看“教师统计”数据的权限,包括其所属的“研发团队”及其所有子部门的数据。
  • test2账户:权限限制为仅查看其直接所属的“移动组”的数据。
  • test3账户:仅能查看其个人创建的“教师统计”数据。
  • test4账户:具有自定义权限,具体权限设置将根据实际业务需求进行配置。

操作步骤

  1. 登录账户:使用上述账户登录系统,密码默认为sz123456
  2. 访问教师统计列表:在系统中访问“教师统计”列表页面。
  3. 检查数据:观察并验证每个账户所看到的列表数据是否符合其数据权限设置的预期。

通过这一演示,您可以清晰地看到不同数据权限设置如何影响用户在系统中的数据访问结果。

预览图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计

STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理:2.3 使用方法: 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…

寻找事业伴侣:男人如何找到匹配自己事业的女人

寻找事业伴侣:男人如何找到匹配自己事业的女人 前言 在攀登事业的征途上,每位男士都渴望有一位能够并肩作战的伴侣。她不仅要理解你的抱负,还要支持你的每一个决定。但现实中,找到这样的女人并非易事。 以下是一些深入的建议&a…

Linux信号上

信号 概念 信号是由于进程产生,但是由内核调度传递给另一个进程: 产生信号 按键产生信号: Ctrc --> 2)SIGINT(终止/中断) Ctrz --> 20)SIGTSTOP(终端暂停) Ctr\ --> 3)SIGQUIT(退出) 系统调用产生: kill(2), raise, abort软件条件产生: 如定…

Adobe Acrobat Pro DC for Mac:PDF处理软件

Adobe Acrobat Pro DC for Mac是一款专为Mac用户设计的PDF处理软件,它凭借出色的功能和卓越的性能,成为了处理PDF文件的理想选择。 首先,Acrobat Pro DC for Mac支持全方位的PDF编辑。用户可以对PDF文档进行文本编辑、图像处理、表格制作等操…

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 ! 这是以太坊测试网络!用于学习的测试网络!!! 有关web3 和区块链的内容为什么要给我审核不通过? 别人凭什么可以发! 目标成果: 实现功能分析: 显示账户信…

CORS-跨域资源共享

CORS-跨域资源共享 什么是CORS ? 在前后端分离的项目中,我们往往会遇到跨域问题。 跨域问题只会出现在浏览器发起AJAX(XMLHttpRequest、Fetch)请求的时候,因为浏览器限制了AJAX只能从同一个源请求资源,除…

DeadSec CTF 2024 Misc Writeup

文章目录 MiscWelcomeMic checkflag_injectionGoLPartyMAN in the middleForgotten Password CryptoFlag killer 好久没做这么爽了噜 DK盾云服务器: https://www.dkdun.cn/ 最近活动是香港的1-1-3 9.9/月 Misc Welcome 进discord群签到即可 Mic check 就是他说…

echarts所遇到的问题,个人记录

TreeMap 矩形树图,label设置富文本之后,无法垂直居中 font-size 支持rem,其余不支持 font-size 支持 rem,但是其余的属性如height,width等不支持 echarts-for-react 绑定事件,会覆盖实例上绑定的 当给cha…

通过服务端注入的广告被拦截 YouTube现在可能会出现黑屏静音视频段

为避免用户使用广告拦截程序直接拦截 YouTube 平台的所有广告,这段时间谷歌正在采取各种措施与社区进行技术对抗,即谷歌不停地开发新的广告检测方式阻止用户使用广告拦截程序,广告拦截程序则不停地开发应对方法用来继续屏蔽广告和各种提示。 …

uni-app全局文件与常用API

文章目录 rpx响应式单位import导入css样式及scss变量用法与static目录import导入css样式uni.scss变量用法 pages.json页面路由globalStyle的属性pages设置页面路径及窗口表现tabBar设置底部菜单选项及iconfont图标 vite.config中安装插件unplugin-auto-import自动导入vue和unia…

AJAX(2)——URL

URL 什么是URL? 定义:统一资源定位符,缩写:URL,或称统一资源定位器、定位地址,URL地址,俗称网页地址,简称网址,是因特网上标准的资源的地址。 概念:URL就是统一资源定…

Linux下C++动态链接库的生成以及使用

目录 一.前言二.生成动态链接库三.使用动态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C动态链接库&#xff08;.so文件&#xff09;。 二.生成动态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&…

【C++】C++应用案例-检验幻方

“幻方”是数学上一个有趣的问题&#xff0c;它让一组不同的数字构成一个方阵&#xff0c;并且每行、每列、每个对角线的所有数之和相等。比如最简单的三阶幻方&#xff0c;就是把1~9的数字填到九宫格里&#xff0c;要求横看、竖看、斜着看和都是15。 口诀&#xff1a;二四为肩…

Pip换源实战指南:加速你的Python开发

1. Pip换源的重要性 在使用Python进行软件开发或数据分析时&#xff0c;pip 是Python的包管理工具&#xff0c;用于安装和管理第三方库。然而&#xff0c;由于网络环境的差异&#xff0c;特别是在某些国家&#xff0c;访问默认的PyPI&#xff08;Python Package Index&#xff…

debain12中安装mysql8

本文安装使用的官方deb&#xff0c;最新的官方安装包地址&#xff1a;https://repo.mysql.com/mysql-apt-config_0.8.29-1_all.deb 前期准备&#xff1a; 1.安装了debain12.6的虚拟机&#xff0c;我是用的virtualBox安装的12.6 Edu的镜像&#xff1b; 开始安装&#xff1a; …

微服务的入门

带着问题进行学习&#xff1a; 1. 对服务进行拆分后&#xff0c;物理上是隔离的&#xff0c;数据上也是隔离的&#xff0c;如何进行不同服务之间进行访问呢&#xff1f; 2.前端是怎么样向后端发送请求的&#xff1f; 通过http请求&#xff0c;通过url&#xff0c;请求的…

最新版Golang pprof使用(引入、抓取、分析,图文结合)

最新版Golang pprof使用 &#x1f525;具体实践: Go调试神器pprof使用教程Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; Github地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-pprof 引入pprof:import _ “net/http/pprof” …

python 查询机器python、gpu、安装包等环境版本信息

checkenv.py """Check environment configurations and dependency versions."""import importlib import os import resource import subprocess import sys from collections import OrderedDict, defaultdictimport torch# 查询自己想要的包…

【开源】一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。

基于 LLM 大语言模型的知识库问答系统 基于大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的知识库问答系统是一种利用先进的自然语言处理技术来理解用户查询并从知识库中检索出准确答案的系统。这里的LLM指的是能够处理和理解大量文本数据的人工智能…

【Go - 如何查看类型,运行前/运行时】

方式1 - 运行时查看 在Go中&#xff0c;你可以使用reflect.TypeOf()函数来获取变量的类型。这需要导入reflect包。以下是个示例&#xff0c;在运行时打印变量的类型&#xff1a; package mainimport ("context""fmt""reflect""go.mongodb…