diff --git "a/\351\203\255\345\205\201\346\226\214/20240701-RBAC\347\256\200\344\273\213.md" "b/\351\203\255\345\205\201\346\226\214/20240701-RBAC\347\256\200\344\273\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..672e53c05483f0b524f9d07d922aa49c3b8cbdc9 --- /dev/null +++ "b/\351\203\255\345\205\201\346\226\214/20240701-RBAC\347\256\200\344\273\213.md" @@ -0,0 +1,27 @@ +## RBAC(Role-Based Access Control) +基于角色的权限控制模型,是一种广泛应用于计算机系统和网络安全领域的访问控制机制。该模型通过将权限分配给角色,再将角色分配给用户,来实现对系统资源的访问控制。 + +### 一、RBAC模型概述 +RBAC模型的核心思想是通过角色来管理用户的权限,从而简化权限管理过程。在RBAC模型中,用户、角色和权限之间形成了多对多的关系,即一个用户可以拥有多个角色,一个角色可以包含多个用户;同时,一个角色可以拥有多个权限,一个权限也可以被多个角色所拥有。 + +### 二、RBAC模型组成 +1. RBAC0(Core RBAC):最基础也是最核心的模型。包含用户(User)、角色(Role)、许可(Permission)、会话(Session)和操作(Operations)五个基本元素。通过将权限分配给角色,再将角色分配给用户,实现访问控制。 +2. RBAC1(Hierarchical RBAC):在RBAC0的基础上增加了角色分层的概念。定义了不同角色之间的层级关系,高级角色可以自动继承下级角色的权限。通过角色分层,可以实现更细粒度的权限管理。 +3. RBAC2(Constraint RBAC):在RBAC0或RBAC1的基础上增加了约束条件。包括静态职责分离(SSD)和动态职责分离(DSD)等约束。SSD用于防止具有利益冲突的角色被分配给同一用户;DSD则根据会话或任务动态地限制用户的权限。 +4. RBAC3:结合了RBAC1和RBAC2的特点,既有角色分层又有约束条件。是一种综合授权模型,提供了更高的灵活性和安全性。 + +### 三、RBAC模型的优势 +1. 简化权限管理:通过将权限分配给角色,再将角色分配给用户,使得权限管理更加灵活和易于管理。 +2. 提高安全性:通过严格控制权限的分配和角色的定义,可以减少系统中的安全漏洞和潜在的攻击风险。 +3. 易于扩展和维护:RBAC模型使用了基于角色的抽象概念,当系统需要进行扩展或调整时,只需修改角色的权限分配,而无需改变具体的用户权限。 + +### 四、RBAC模型的适用场景 +1. 企业组织架构:用于根据员工的职位、角色和职责来管理访问权限。 +2. 应用程序和系统访问控制:管理应用程序和系统中的用户访问权限,确保用户只能访问其所需的功能和数据。 +3. 多租户系统:用于隔离和管理不同租户之间的访问权限。 +4. 医疗保健:管理医生、护士和管理员等不同角色的访问权限。 +5. 金融和银行:管理不同用户角色的访问权限,确保客户只能访问其自己的账户信息,而经理和审计人员可以拥有更广泛的访问权限。 +6. 云计算和网络服务提供商:管理云计算平台和网络服务提供商中的用户访问权限。 + +### 五、总结 +RBAC模型通过角色关联用户和权限,提供了一种灵活且易于管理的访问控制机制。该模型不仅简化了权限管理过程,提高了系统的安全性,还易于扩展和维护。因此,RBAC模型在各种领域和系统中得到了广泛应用。 \ No newline at end of file diff --git "a/\351\203\255\345\205\201\346\226\214/20240702-DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241.md" "b/\351\203\255\345\205\201\346\226\214/20240702-DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..dd6b3e9a02926d42d2f144dff5656a6381402032 --- /dev/null +++ "b/\351\203\255\345\205\201\346\226\214/20240702-DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241.md" @@ -0,0 +1,39 @@ +## DDD(领域驱动设计,Domain-Driven Design) +一种软件开发方法论,它强调软件设计应紧密围绕业务领域模型进行。以下是DDD领域驱动设计的详细分析,包括其核心思想、关键概念、设计流程以及优缺点等方面: + +### 一、核心思想 +DDD的核心思想是将实现与业务逻辑分离,通过深入理解和分析业务领域,建立起一个丰富且符合业务逻辑的领域模型,然后基于这个模型来设计和实现软件系统。 +1. 以领域为核心:DDD将业务领域作为软件设计的核心驱动力,围绕业务概念构建软件系统。 +2. 建立领域模型:通过领域专家的参与,建立起反映业务复杂性和业务规则的领域模型。 +3. 划分限界上下文:在领域模型中,识别并划分出不同的限界上下文(Bounded Context),以明确领域模型的适用范围和边界。 + +### 二、关键概念 +1. 实体(Entities):具有唯一标识符的对象,它们通常具有状态和行为,以及多个属性和关系。 +2. 值对象(Value Objects):表示没有唯一标识符的对象,通常用来表示一些不可变的属性。 +3. 聚合(Aggregates):一组相关对象的集合,被视为一个数据修改的单元。每个聚合有一个根实体,称为聚合根。 +4. 仓储(Repositories):用于封装数据的访问逻辑,将数据的持久化存储与领域模型隔离开来。 +5. 领域服务(Domain Services):处理领域模型中无法单独由实体或值对象处理的业务逻辑。 +6. 领域事件(Domain Events):表示领域中发生的重要事件,用于实现事件驱动的架构。 + +### 三、设计流程 +#### 战略设计: +1. 领域建模:建立领域模型,识别领域中的实体、值对象、聚合等关键概念。 +2. 划分限界上下文:将业务领域划分为不同的限界上下文,以明确领域模型的适用范围和边界。 +3. 建立通用语言:与领域专家、开发人员和用户共同建立一种通用语言,用于描述业务领域中的概念、规则和流程。 +#### 战术设计: +1. 设计领域对象:根据领域模型,设计实体、值对象、聚合等领域对象的代码实现。 +2. 实现仓储:实现数据的持久化存储,封装数据访问逻辑。 +3. 编写领域服务:处理领域模型中无法单独由实体或值对象处理的业务逻辑。 +4. 编写领域事件:实现事件驱动的架构,以响应领域中的重要事件。 + +### 四、优缺点 +#### 优点: +1. 更好地识别和理解业务需求:DDD通过深入理解和分析业务领域,帮助开发人员更快速地开发出高质量的软件。 +2. 提高代码的可读性和可维护性:DDD强调开发人员在编写代码时对业务问题的深入理解,从而得到更可读、更明确的代码。 +3. 支持代码测试:DDD通过强调业务需求的深入理解来更好地支持代码测试,有助于提高软件质量。 +4. 减少沟通成本和误解:DDD让开发人员更加聚焦于业务领域本身的价值,减少了开发过程中的沟通成本和误解。 +#### 缺点: +1. 缺乏规范的过程指导:DDD缺乏一个规范的过程指导,使得其缺乏可操作性。 +2. 缺乏匹配的需求管理体系:DDD没有匹配的需求管理体系,需求管理体系会直接影响DDD的质量。 +3. 缺乏面向领域的架构体系:DDD虽然以模型驱动设计为主线,但没有给出明确的领域建模方法和面向领域的架构体系。 +4. 综上所述,DDD领域驱动设计是一种强大的软件开发方法论,它通过深入理解和分析业务领域,帮助团队更好地识别和理解业务需求,提高代码的可读性、可维护性和测试能力。然而,DDD也存在一些缺点,需要在实践中不断加以完善和优化。 \ No newline at end of file diff --git "a/\351\203\255\345\205\201\346\226\214/20240703-ABP vNext.md" "b/\351\203\255\345\205\201\346\226\214/20240703-ABP vNext.md" new file mode 100644 index 0000000000000000000000000000000000000000..863dc77377682cf5d047b5fd364014983d2c4880 --- /dev/null +++ "b/\351\203\255\345\205\201\346\226\214/20240703-ABP vNext.md" @@ -0,0 +1,25 @@ +## ABP vNext +ABP vNext 框架是一个集成多个第三方组件类库的一个应用程序集,遵循 模块化(Module) 思想实践的最佳方式。基于 ASP.NET Core 的开源 Web 应用程序框架,它继承了 ABP 框架的精髓并进行了大量的改进和扩展。 + +### 一、ABP vNext 的特点 +1. 模块化与插件化:ABP vNext 强调模块化设计,允许开发者将系统拆分成多个独立命名且可独立访问的模块。每个模块可以独立开发、测试,最后组装成完整的软件,提高了系统的可维护性和可扩展性。 +2. 多租户支持:框架内置了多租户支持,使得开发者可以轻松地构建支持多租户的应用程序。 +3. 领域驱动设计(DDD):ABP vNext 遵循 DDD 原则,将系统划分为领域层、应用层、基础设施层等,有助于构建复杂且易于维护的系统。 +4. 快速开发:提供了丰富的代码生成工具、模板和库,加速了开发过程,降低了开发成本。 +5. 稳定性与可靠性:经过多年的开源沉淀和社区支持,ABP vNext 具有良好的稳定性和可靠性。 + +### 二、ABP vNext 的架构 +1. 领域层(Domain Layer):包含实体、值对象、领域服务、仓储接口等,是系统的核心部分。 +2. 应用层(Application Layer):承接 UI 和领域层的中间层,负责处理业务逻辑,接收用户请求并返回响应。 +3. 基础设施层(Infrastructure Layer):包含数据访问、消息队列、缓存等基础设施组件的实现。 +4. 表示层(Presentation Layer):包括 MVC、Razor Pages、Blazor 等前端技术,用于展示数据和接收用户输入。 + +### 三、模块化设计 +1. 模块独立性:每个模块都有自己独立的命名空间、依赖关系和生命周期。 +2. 模块依赖:模块之间可以相互依赖,但依赖关系应该是明确的和可控的。 +3. 模块插件化:允许开发者通过插件的方式动态地添加或移除模块,提高了系统的灵活性和可扩展性。 + +### 四、使用场景 +1. 企业级应用:适用于构建复杂的企业级应用,如 ERP、CRM 等。 +2. SaaS 应用:支持多租户,适合构建 SaaS 应用。 +3. 微服务架构:提供了微服务架构的支持,可以轻松地构建分布式系统。 \ No newline at end of file diff --git "a/\351\203\255\345\205\201\346\226\214/20240704-Fluent Api.md" "b/\351\203\255\345\205\201\346\226\214/20240704-Fluent Api.md" new file mode 100644 index 0000000000000000000000000000000000000000..f266f954d578129276146c2ff6c1341ee87d2bfb --- /dev/null +++ "b/\351\203\255\345\205\201\346\226\214/20240704-Fluent Api.md" @@ -0,0 +1,54 @@ +## Fluent API +被称为流畅API或流式API,是一种面向对象的API设计方式,主要基于方法链的概念。这种设计方式由Eric Evans和Martin Fowler在2005年创建,旨在通过创建特定领域语言(DSL)来提高代码的可读性和易用性。 + +### 一、定义与特点 +1. 定义:Fluent API是一种允许通过链式调用多个方法来完成复杂操作的API设计方式。 +2. 特点: + - 方法链:允许方法调用返回一个对象,使得后续的方法调用可以连续进行,形成链式调用。 + - 可读性:通过链式调用,代码更加直观易懂,易于阅读和维护。 + - 表达力:能够更自然、更简洁地表达复杂的操作逻辑。 +### 二、组成与实现 +1. 组成: + - 最终对象或结果:Fluent API的链式调用最终会返回一个对象或结果。 + - 方法链:由一系列返回对象自身的方法组成,支持连续调用。 +2. 实现: + - 返回类型:在Fluent API中,大部分方法都会返回当前对象(this),以便支持链式调用。 + - 终止方法:某些方法(如toString()、build()等)会返回其他类型的值,用于结束链式调用并获取最终结果。 +#### 三、优势与应用 +1. 优势: + - 提高代码可读性:通过链式调用,减少了代码中的临时变量和显式方法调用,使代码更加简洁。 + - 减少出错率:链式调用能够确保操作的顺序和完整性,减少了因遗漏步骤而导致的错误。 + - 易于扩展:Fluent API的设计方式使得添加新的方法或功能变得更加容易。 +2. 应用: + - Java:在Java中,StringBuilder类就是一个典型的Fluent API实现。此外,许多Java框架和库(如JPA、Spring Data等)也提供了Fluent API风格的接口。 + - 其他语言:Fluent API不仅限于Java,它可以在任何面向对象的编程语言中实现,如C#、Go、Scala等。 +### 四、示例 +```c# +public class User { + private String name; + private int age; + + public User setName(String name) { + this.name = name; + return this; + } + + public User setAge(int age) { + this.age = age; + return this; + } + + public static User create() { + return new User(); + } + + // 其他方法... +} + +// 使用Fluent API创建User对象 +User user = User.create() + .setName("张三") + .setAge(20); +``` +### 五、总结 +Fluent API是一种强大的API设计方式,它通过方法链的形式提高了代码的可读性和易用性。在面向对象的编程语言中,Fluent API得到了广泛的应用,并成为了许多框架和库的标准设计模式之一。 \ No newline at end of file diff --git "a/\351\203\255\345\205\201\346\226\214/20240705-PostgreSQL\345\234\250\346\234\215\345\212\241\345\231\250\344\270\212\347\232\204\345\256\211\350\243\205\345\222\214\351\205\215\347\275\256.md" "b/\351\203\255\345\205\201\346\226\214/20240705-PostgreSQL\345\234\250\346\234\215\345\212\241\345\231\250\344\270\212\347\232\204\345\256\211\350\243\205\345\222\214\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..0c7e0fe1eb9af7df0a818b41e4e39daad7e0d146 --- /dev/null +++ "b/\351\203\255\345\205\201\346\226\214/20240705-PostgreSQL\345\234\250\346\234\215\345\212\241\345\231\250\344\270\212\347\232\204\345\256\211\350\243\205\345\222\214\351\205\215\347\275\256.md" @@ -0,0 +1,79 @@ +**以阿里云的云服务器ECS、Ubuntu操作系统为例。** +## 1. 域名解析 +- 阿里云中点控制台,选择域名 +- 在域名列表中选择需要解析的域名,点击解析 +- 添加记录,然后填入服务器公网IP,公网IP在云服务器ECS->实例 + +## 2. 开启SSH服务(可选) +1. 安装SSH + ``` + sudo apt-get install ssh + ``` +2. 配置允许root用户远程登录 + - 修改/etc/ssh/sshd_config文件 + ``` + vim /etc/ssh/sshd_config + + + #PermitRootLogin prohibit-password + PermitRootLogin yes + ``` + +3. 重启服务 + ``` + sudo service ssh restart + ``` + +## 3. 远程连接服务器 + +**可通过阿里云直接远程连接,也可以在任意终端工具连接(例如Tabby、Windows PowerShell等)** +**通过终端工具连接需要输入命令`ssh root@域名`,然后输入密码进入** + +## 4. 安装和启动PostgreSQL + +- 使用 apt update 命令获取包的最新版本 + ``` + $ sudo apt update + ``` +- 安装PostgreSQL + ``` + $ sudo apt install postgresql -y + ``` +- 启动PostgreSQL + ``` + + $ sudo systemctl start postgresql + + + $ sudo systemctl status postgresql + ``` + +## 5. 配置 PostgreSQL 允许远程连接 +- 编辑postgresql.conf文件 + ``` + vim /etc/postgresql/(版本号)/main/postgresql.conf + ``` + **找到listen_adresses行,去掉前面#注释,将localhost改为*,表示 PostgreSQL 将监听所有可用的网络接口。具体来说,这意味着 PostgreSQL 将会监听服务器上所有网络接口的连接请求,需要注意的是,开放所有网络接口可能会增加安全风险,因此在配置时需要注意网络安全性,确保采取适当的安全措施(例如防火墙、访问控制等)以保护数据库的安全。** + +- 编辑 pg hba.conf 文件的 IPv4 本地连接部分 + ``` + vim /etc/postgresql/(版本号)/main/pg_hba.conf + ``` + + **在IPv4中添加一行`host all all 0.0.0.0/0 md5`** + **表示允许来自任意 IP 地址(0.0.0.0/0)的所有用户(all)连接到所有的数据库(all),并通过md5验证方式进行身份验证** + +- 重启PostgreSQL服务 + ``` + sudo systemctl restart postgresql + ``` + +- 防火墙中添加允许5432端口 + ``` + sudo ufw allow 5432/tcp + ``` + +## 6. 阿里云中安全组添加入口访问规则 +- 阿里云中点控制台,选择云服务器ECS +- 网络与安全中选择安全组,创建安全组 +- 可快速添加也可以手动添加,端口范围选择PostgreSQL(5432) \ No newline at end of file