From ffaaa5288363cf9f11a10236fedea3d707bf8353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Mon, 1 Jul 2024 20:31:38 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BA=86=E8=A7=A3RABC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240701_\344\272\206\350\247\243RBAC.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 "\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" diff --git "a/\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" "b/\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" new file mode 100644 index 0000000..5929bb1 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" @@ -0,0 +1,32 @@ +## 一、RBAC是什么 +### 1.基本概念 +- 【Role-Based Access Control】基于角色的访问控制 +- 将权限分配给角色,再将角色分配给用户,来实现对系统资源的访问控制 +- 在这种模型中,用户-角色-权限三者之间,一般都是多对多的关系 +### 2.核心概念 +1. 角色Role:代表用户在特定上下文中的身份或职能,例如管理员、普通用户等等 +2. 权限Permission:对系统资源进行操作的许可,比如读取、写入、修改等等 +3. 用户User:系统的实际使用者,每一个用户可以被分配一个或多个角色,比如一个人可以是经理也可以是CEO +4. 分配Assignment:将角色和用户关联起来,赋予用户相应的权限 +**总之就是,Who对What进行了How的操作(谁对什么进行了怎么样的操作)** + +## 二、为什么要使用RBAC模型 +1. 用户数量大时,给每个用户逐一授权非常麻烦 +2. 除了给用户授权,还可以给用户组授权 +3. 可以构成“用户-角色-权限-资源”的授权模型,将功能操作归为一类,数据资源归为一类,更具有便携性和扩展性 + +## 三、适用场景 +1. 企业组织架构:用于根据员工的职位、角色和职责来管理访问权限 +2. 应用程序和系统访问控制:管理员可以根据用户的角色将其分配到适当的角色,并定义角色的权限集合,确保用户只能访问其所需的功能和数据 +3. 多租户系统: 单个软件实例可以同时为多个租户(客户或用户)提供服务,并且每个租户都相对独立,彼此隔离,且通常不会察觉其他租户的存在。比如公司A和公司B都使用你的在线办公软件。公司A的用户登录后只能看到自己公司的数据和设置,而公司B的用户也只能看到属于公司B的内容。虽然它们共享同一个软件实例和硬件资源(比如服务器),但它们的数据和功能是完全隔离的 +4. 医疗保健:管理医生、护士和管理员等不同角色的访问权限 +5. 金融和银行:管理客户、经理和审计人员等不同角色的访问权限 +6. 云计算和网络服务提供商:管理云计算平台和网络服务提供商中的用户访问权限,限制其对云资源、虚拟机或网络设备的操作 + +## 四、RBAC个模块功能 +![RBAC模块功能-2024-7-120:13:46.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/RBAC%E6%A8%A1%E5%9D%97%E5%8A%9F%E8%83%BD-2024-7-120:13:46.png) + +## 五、访问控制流程 +![d5d66788efd2526838ff3102afb1e7b-2024-7-120:29:26.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/d5d66788efd2526838ff3102afb1e7b-2024-7-120:29:26.png) + + -- Gitee From e42ec940a41e1f0ebec9314ea33c6ad0c1ed0fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Mon, 1 Jul 2024 20:50:02 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\347\253\257\346\236\266\346\236\204.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 "\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" diff --git "a/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" new file mode 100644 index 0000000..c94463e --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" @@ -0,0 +1,43 @@ +## 项目架构说明 +### Api向外提供接口服务层 +处理外部请求,并将其传递到底层的应用程序或服务中 + +### Domain领域层(核心层) +定义了系统的核心业务规则、实体、值对象以及它们之间的关系 +#### 其中包括: +1. BaseEntity抽象表:基础实体类/基类 +~~~c# +// 包含以下字段 +public abstract class BaseEntity +{ + public Guid Id { get; set; } // 主键 + public bool IsActived { get; set; } // 是否启用/激活 + public bool IsDeleted { get; set; } // 是否删除(软删除) + public DateTime CreatedAt { get; set; } // 创建时间 + public Guid CreatedBy { get; set; } // 创建人Id + public DateTime UpdatedAt { get; set; } // 最后更新时间 + public Guid UpdatedBy { get; set; } // 更新人Id + public int DisplayOrder { get; set; } // 显示顺序,数字越大越靠前 + public string? Remarks { get; set; } // 备注 +} +~~~ +2. System:包含系统表如下 + - AppUser用户表 + - AppRole角色表 + - AppUserRole用户和角色的中间表 + - AppPermission权限表 + - AppRolePermission角色权限表 + - AppResource资源表 + - AppOperation操作表 + +### Application服务/应用层 +接收来自API的请求,并调用领域层的服务和实体来完成具体的业务操作 + +### Application.Contracts 定义应用接口及Dto +处理共享的接口定义和DTO + +### Infrastructure基础设施层 +包括数据库访问、文件系统、外部服务调用、日志记录、缓存等基础设施组件,为应用程序的其他层提供支持,使它们能够正常运行和协同工作 + +### EntityFrameworkCore ORM工具层之一 +用于数据库访问和数据持久化,它提供了从数据库中查询、添加、更新和删除数据的功能,同时封装了数据库操作的复杂性 \ No newline at end of file -- Gitee From c472e385d0f26ab0edb27e41662e51c9f6a031c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Mon, 1 Jul 2024 21:37:27 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=E9=80=9A=E7=94=A8=E8=A1=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\347\253\257\346\236\266\346\236\204.md" | 49 +++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git "a/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" index c94463e..72392a9 100644 --- "a/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" +++ "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" @@ -24,20 +24,61 @@ public abstract class BaseEntity 2. System:包含系统表如下 - AppUser用户表 - AppRole角色表 - - AppUserRole用户和角色的中间表 + - AppUserRole用户和角色的关联表 - AppPermission权限表 - - AppRolePermission角色权限表 + - AppRolePermission角色权限关联表 - AppResource资源表 - AppOperation操作表 ### Application服务/应用层 接收来自API的请求,并调用领域层的服务和实体来完成具体的业务操作 -### Application.Contracts 定义应用接口及Dto +### Application.Contracts 应用层接口相关DTO依赖 处理共享的接口定义和DTO ### Infrastructure基础设施层 包括数据库访问、文件系统、外部服务调用、日志记录、缓存等基础设施组件,为应用程序的其他层提供支持,使它们能够正常运行和协同工作 ### EntityFrameworkCore ORM工具层之一 -用于数据库访问和数据持久化,它提供了从数据库中查询、添加、更新和删除数据的功能,同时封装了数据库操作的复杂性 \ No newline at end of file +用于数据库访问和数据持久化,它提供了从数据库中查询、添加、更新和删除数据的功能,同时封装了数据库操作的复杂性 + +## 思考:通用系统都需要哪些表 +1. 用户表User:村粗用户信息 +2. 角色表Role:定义系统中的不同角色 +3. 权限表Permission:定义系统中的操作权限 +4. 角色权限关联表RolePermission:用于关联角色和权限,表示某个角色拥有哪些权限 +5. 用户角色关联表UserRole:用于关联用户和角色,表示某个用户属于哪些角色 +6. 日志表Logs:记录用户的操作日志,包括操作时间、操作内容、操作人等信息 + - LogID: 主键,唯一标识一条日志 + - UserID: 外键,关联用户表,记录操作用户 + - Operation: 操作描述 + - CreatedAt: 操作时间 +7. 菜单表Menus:定义系统菜单,用于构建后台的导航栏 + - MenuID: 主键,唯一标识一个菜单项 + - ParentID: 父菜单ID,用于构建菜单层级 + - Title: 菜单标题 + - URL: 菜单链接地址 + - Order: 菜单排序 +8. 文件表Files:存储系统中上传的文件或文档的信息,如文件名、路径、大小等 + - FileID: 主键,唯一标识一个文件 + - FileName: 文件名 + - FilePath: 文件存储路径 + - CreatedAt: 上传时间 +9. 消息表Messages:用于存储系统消息,如系统通知、邮件等 + - MessageID: 主键,唯一标识一条消息 + - UserID: 外键,关联用户表,消息接收者 + - Title: 消息标题 + - Content: 消息内容 + - SentAt: 发送时间 +11. 地理位置表Location:存储与地理位置相关的数据,如地理坐标、地址信息等 + - LocationName:地理名称 +12. 审计表Audits:记录数据的变更历史,用于数据审计 + - AuditID: 主键,唯一标识一条审计记录 + - UserID: 外键,关联用户表,操作用户 + - TableName: 被操作的数据表名 + - RecordID: 被操作的数据记录ID + - ChangeType: 变更类型(如新增、修改、删除) + - OldValues: 变更前的值 + - NewValues: 变更后的值 + - CreatedAt: 变更时间 + \ No newline at end of file -- Gitee From 461fe6497901dcc8190ad21397964c79d55f4e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Tue, 2 Jul 2024 22:14:03 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BA=86=E8=A7=A3RBAC=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\347\253\257\346\236\266\346\236\204.md" | 30 ++++++++++++------- .../20240702_\344\272\206\350\247\243RBAC.md" | 10 +++++-- 2 files changed, 27 insertions(+), 13 deletions(-) rename "\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" => "\351\273\204\351\233\252\350\212\263/20240702_\344\272\206\350\247\243RBAC.md" (83%) diff --git "a/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" index 72392a9..89737ce 100644 --- "a/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" +++ "b/\351\273\204\351\233\252\350\212\263/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" @@ -70,15 +70,23 @@ public abstract class BaseEntity - Title: 消息标题 - Content: 消息内容 - SentAt: 发送时间 -11. 地理位置表Location:存储与地理位置相关的数据,如地理坐标、地址信息等 - - LocationName:地理名称 +10. 地理位置表Location:存储与地理位置相关的数据,如地理坐标、地址信息等 + - LocationName:地理名称 + 12. 审计表Audits:记录数据的变更历史,用于数据审计 - - AuditID: 主键,唯一标识一条审计记录 - - UserID: 外键,关联用户表,操作用户 - - TableName: 被操作的数据表名 - - RecordID: 被操作的数据记录ID - - ChangeType: 变更类型(如新增、修改、删除) - - OldValues: 变更前的值 - - NewValues: 变更后的值 - - CreatedAt: 变更时间 - \ No newline at end of file + + - AuditID: 主键,唯一标识一条审计记录 + + - UserID: 外键,关联用户表,操作用户 + + - TableName: 被操作的数据表名 + + - RecordID: 被操作的数据记录ID + + - ChangeType: 变更类型(如新增、修改、删除) + + - OldValues: 变更前的值 + + - NewValues: 变更后的值 + + - CreatedAt: 变更时间 \ No newline at end of file diff --git "a/\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" "b/\351\273\204\351\233\252\350\212\263/20240702_\344\272\206\350\247\243RBAC.md" similarity index 83% rename from "\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" rename to "\351\273\204\351\233\252\350\212\263/20240702_\344\272\206\350\247\243RBAC.md" index 5929bb1..41b0d84 100644 --- "a/\351\273\204\351\233\252\350\212\263/20240701_\344\272\206\350\247\243RBAC.md" +++ "b/\351\273\204\351\233\252\350\212\263/20240702_\344\272\206\350\247\243RBAC.md" @@ -23,10 +23,16 @@ 5. 金融和银行:管理客户、经理和审计人员等不同角色的访问权限 6. 云计算和网络服务提供商:管理云计算平台和网络服务提供商中的用户访问权限,限制其对云资源、虚拟机或网络设备的操作 -## 四、RBAC个模块功能 +## 四、用户、角色、权限关系 +![用户角色权限关系-2024-7-217:36:17.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/%E7%94%A8%E6%88%B7%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90%E5%85%B3%E7%B3%BB-2024-7-217:36:17.png) + +## 五、如何设计RBAC +### 1.RBAC模块功能 ![RBAC模块功能-2024-7-120:13:46.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/RBAC%E6%A8%A1%E5%9D%97%E5%8A%9F%E8%83%BD-2024-7-120:13:46.png) -## 五、访问控制流程 +### 2.访问控制流程 ![d5d66788efd2526838ff3102afb1e7b-2024-7-120:29:26.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/d5d66788efd2526838ff3102afb1e7b-2024-7-120:29:26.png) +### 3.数据库设计 +![RBAC数据表设计-2024-7-217:21:23.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/RBAC%E6%95%B0%E6%8D%AE%E8%A1%A8%E8%AE%BE%E8%AE%A1-2024-7-217:21:23.png) -- Gitee From 420179723923e08e7c22e923ca39020b5796c69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Wed, 3 Jul 2024 20:06:55 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E9=85=8D=E7=BD=AEpg=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9C=E7=A8=8B=E8=BF=9E=E6=8E=A5=E3=80=81=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0pgAdmin=E5=B7=A5=E5=85=B7=E7=9A=84=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...05\345\222\214\351\203\250\347\275\262.md" | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 "\351\273\204\351\233\252\350\212\263/20240703_PostgreSQL\347\232\204\345\256\211\350\243\205\345\222\214\351\203\250\347\275\262.md" diff --git "a/\351\273\204\351\233\252\350\212\263/20240703_PostgreSQL\347\232\204\345\256\211\350\243\205\345\222\214\351\203\250\347\275\262.md" "b/\351\273\204\351\233\252\350\212\263/20240703_PostgreSQL\347\232\204\345\256\211\350\243\205\345\222\214\351\203\250\347\275\262.md" new file mode 100644 index 0000000..71aeea7 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240703_PostgreSQL\347\232\204\345\256\211\350\243\205\345\222\214\351\203\250\347\275\262.md" @@ -0,0 +1,142 @@ +# Linux下PostgreSql安装部署 +### 一、安装PostgreSQl +1. 运行以下命令更新软件包列表 +~~~js +sudo apt-get update +~~~ +2. 运行以下命令安装PostgreSQ +~~~js +sudo apt install postgresql +~~~ +3. 安装完成后,PostgreSQL服务将自动启动,使用以下命令检查它是否正在运行 +~~~js +sudo systemctl status postgresql +// 如果PostgreSQL正在运行,将看到“Active: active (running)”的消息 +~~~ +4. 停止PostgreSQL服务 +~~~js +sudo systemctl stop postgresql +~~~ + +### 二、关于用户和数据库 +1. 创建新的PostgreSQL用户,默认情况下,PostgreSQL使用名为“postgres”的超级用户 +~~~js +sudo -u postgres createuser --interactive +// 根据提示输入新用户的名称和是否为超级用户 +~~~ +2. 删除用户 +~~~js +DROP ROLE username; +// 如果要删除用户并强制断开连接 +DROP ROLE username FORCE; +~~~ +3. 创建新的数据库 +~~~js +sudo -u postgres createdb dbname +~~~ +4. 删除数据库 +~~~js +DROP DATABASE dbname; +// 删除数据库并强制断开连接 +DROP DATABASE dbname FORCE; +~~~ + +### 三、登录和访问 +#### 1.使用以下命令以超级用户身份登录到PostgreSQL: +~~~js +sudo -u postgres psql +// 登录成功将看到一个以“postgres=#”开头的命令行提示符 +// 注:也可以先切换到su postgres,再通过命令:psql +~~~ +#### 2.常用pg命令行 +1. 在PostgreSQL中创建一个新用户并授予其对新数据库的访问权限 +~~~js +CREATE USER username WITH PASSWORD 'password'; +// 分号不能少 +~~~ +2. 查看所有库、查看帮助 +~~~js +// 查看库 +\l +// 查看帮助 +\l? +~~~ +3. 退出PostgreSQL +~~~js +\q +~~~ +4. 修改密码 +~~~js +ALTER USER postgres WITH PASSWORD '新密码'; +~~~ +5. 切换数据库 +~~~js +\c dbname +// 一般数据库名需要加上引号 +~~~ +6. 显示所有表 +~~~js +\dt +~~~ +7. 帮助信息:help +8. \h 显示 SQL脚本,\h + 命令,可以查看脚本语法 +~~~js +// 例如 +\h SELECT +// 会显示以下信息 +命令: SELECT +描述: 从数据表或视图中读取数据 +语法: +[ WITH [ RECURSIVE ] with查询语句(with_query) [, ...] ] +SELECT [ ALL | DISTINCT [ ON ( 表达式 [, ...] ) ] ] + [ * | 表达式 [ [ AS ] 输出名称 ] [, ...] ] + [ FROM from列表中项 [, ...] ] + [ WHERE 条件 ] + [ GROUP BY grouping_element [, ...] ] + [ HAVING 条件 ] +......省略...... +~~~ +9. 列出表、视图、序列 +~~~js +// 显示出了表、视图等信息 +\dS +// 显示了更多信息,包括表存储空间 +\dS+ +// 描述表,视图,序列,或索引 +\dS 表名 +~~~ + +### 四、远程连接配置 +#### 1.修改pg_hba.conf文件 +~~~js +// 1.进入到所在目录 +cd /etc/postgresql/16/main +// 2.查看是否配置远程连接 +cat pg_hba.conf +// 3.打开并修改 +vim pg_hba.conf +// 4.并添加以下一行 +host all all 0.0.0.0/0 md5 + /* + 0.0.0.0/0表示允许所有IP访问,md5表示使用密码验证方式 + */ +~~~ +#### 2.修改postgresql.conf文件 +~~~js +// 修改配置项 +listen_addresses = '*' +// 该配置项表示监听所有IP地址。 +~~~ +#### 3.重启PostgreSQL服务 +~~~js +sudo systemctl restart postgresql +~~~ + +### 五、在服务器上安装PostgreSQL的优势 +1. 平台稳定性和可靠性: Linux 操作系统通常被认为比 Windows 更稳定和可靠,尤其是在服务器环境中 +2. 开源:ostgreSQL 是一个开源数据库管理系统,它在Linux社区中得到广泛支持和使用。Linux和开源软件有着紧密的关系 +3. 许多服务器应用程序和工具更倾向于在Linux环境下运行,因此在同一平台上安装 PostgreSQL 可以更容易地实现集成和兼容性 + +### 六、PgAdmin——管理pg数据库通用工具 + +[pgadmin4工具安装及使用-CSDN博客](https://blog.csdn.net/tangzongwu/article/details/122165362) -- Gitee From 5f3e7195398c873f48bde5a8502f58782da16e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Sun, 7 Jul 2024 22:37:44 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9D=83=E9=99=90=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E8=AE=BE=E8=AE=A1=E3=80=81=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\261\202\350\256\276\350\256\241.md" | 59 ++++++++++ ...15\347\275\256\345\256\236\344\275\223.md" | 108 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 "\351\273\204\351\233\252\350\212\263/20240704_\346\235\203\351\231\220\347\263\273\347\273\237\351\234\200\346\261\202\350\256\276\350\256\241.md" create mode 100644 "\351\273\204\351\233\252\350\212\263/20240705_\351\205\215\347\275\256\345\256\236\344\275\223.md" diff --git "a/\351\273\204\351\233\252\350\212\263/20240704_\346\235\203\351\231\220\347\263\273\347\273\237\351\234\200\346\261\202\350\256\276\350\256\241.md" "b/\351\273\204\351\233\252\350\212\263/20240704_\346\235\203\351\231\220\347\263\273\347\273\237\351\234\200\346\261\202\350\256\276\350\256\241.md" new file mode 100644 index 0000000..2af1143 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240704_\346\235\203\351\231\220\347\263\273\347\273\237\351\234\200\346\261\202\350\256\276\350\256\241.md" @@ -0,0 +1,59 @@ +## 一、权限系统需求 + +### 关于用户 + +1. 注册 +2. 登录 +3. 登出 +4. 禁用 +5. 删除 +6. 修改用户基本信息 +7. 修改密码(用户自己修改) +8. 重置密码(1.重置为系统默认密码;2.重置为指定密码) +9. 管理用户角色(包括分配用户角色、移除用户角色) +**如果借用DDD设计的话,实体有自己的行为,如果实体的行为无法单独满足业务需求,则可以将这个业务放在领域服务层(涉及多个实体)** + +### 关于角色 +1. 创建角色 +2. 删除角色 +3. 修改角色基本信息(目前包含角色名称、角色描述) +4. 给角色分配权限 +5. 给角色移除权限 + +### 关于权限 +1. 创建权限 +2. 删除权限 +3. 禁用权限 +4. 修改权限基本信息(权限名称、权限描述) + +## 二、项目各层组成 + +#### 1.Admin.Api(向外提供接口服务层) + +1. 控制器Controller +2. 入口文件Program +3. 启动类Startup + +#### 2.Admin.Application(服务\应用层) + +1. 实体类接口实现类 + +#### 3.Admin.Application.Contracts(应用层接口相关DTO依赖) + +1. 实体类的DTO + +#### 4.Admin.Domain(领域层) + +1. 实体类Emtity(包括基类、系统类) +2. 通用仓储接口IRepository + +#### 5.Admin.EntityFrameworkCore(工具层) + +1. 配置实体EntityConfiguration +2. 迁移文件 +3. 通用仓储接口实现类EfRepository +4. 数据库上下文AdminDbContext + +#### 6.Admin.Infrastructure(基础设施层) + +1. 暂定 \ No newline at end of file diff --git "a/\351\273\204\351\233\252\350\212\263/20240705_\351\205\215\347\275\256\345\256\236\344\275\223.md" "b/\351\273\204\351\233\252\350\212\263/20240705_\351\205\215\347\275\256\345\256\236\344\275\223.md" new file mode 100644 index 0000000..ed086a3 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240705_\351\205\215\347\275\256\345\256\236\344\275\223.md" @@ -0,0 +1,108 @@ +### 一、常见的配置实体方法 +1. 数据注释(映射特性) +2. Fluent API + +### 二、使用fluent API配置模型 +#### 1.在数据库上下文中使用OnModelCreate方法 +~~~c# + public class MyContext : DbContext + { + public DbSet Blogs { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(b => b.Title) //指定要配置的字段为Title + .IsRequired(); // 不能为空 + } + #endregion + } +~~~ +**注意:** +1. Fluent API 配置具有最高优先级,并将替代约定和数据注释 +2. 配置按调用方法的顺序应用,如果存在任何冲突,最新调用将替代以前指定的配置 +#### 2.分组配置 +为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中 +~~~c# +public class BlogEntityTypeConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.Property(b => b.Url) + .IsRequired(); + } +} +~~~ +然后需要在OnModelCreating调用Config方法 +~~~C# +proteced override void OnModelCreating(ModelBuilder modelBuilder) +{ + base.OnModelCreating(modelBuilder); + // 应用程序集中定义的所有实体配置 + modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppUserConfiguration).Assembly); +} +~~~ +==拓展:什么叫程序集?== +1. 程序集是.NET Framework和.NET Core中的基本部署单元之一。它通常是一个可执行文件(例如.exe或.dll),包含了应用程序的代码(IL代码)、元数据(用于描述程序集内容的信息)、以及其他资源(如图像、文本文件等 +2. 程序集可以理解为一个逻辑单元,它可以包含一个或多个相关的文件,这些文件一起构成一个功能完整的单元 +3. 常见的两种程序集:可执行文件(.exe文件)和类库文件(.dll文件) +4. 在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集 +5. 程序集的结构: + - 程序集元数据:也叫清单,是程序集进行自我说明的核心文档,主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可) + - 类型元数据:列举了程序集中包含的类型信息,说明了程序集中定义了哪些类,每个类包含哪些属性和方法,每个方法有哪些参数和返回值类型等等 + - MSIL代码:程序集的核心部分,实现程序集的功能,前面两个都只是为了描述MSIL代码而存在的 + - 资源:图像、图标、声音等资源 + + ![程序集的结构-2024-7-721:43:43.png](img/程序集的结构-2024-7-7214343.png) + +#### 3.对实体类型使用 EntityTypeConfigurationAttribute +在实体类中使用该特性 +~~~c# +[EntityTypeConfiguration(typeof(BookConfiguration))] +public class Book +{ + public int Id { get; set; } + public string Title { get; set; } + public string Isbn { get; set; } +} +~~~ +然后需要在数据库上下文中为实体类创建表,并将其注册到OnModelCreating +~~~c# +public class BooksContext : DbContext +{ + public DbSet Books { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(); + } +} +~~~ +**注意:程序集中不会自动发现 EntityTypeConfigurationAttribute 类型。 实体类型必须添加到模型中,然后才能在该实体类型上发现特性** + +### 三、数据注释 + 数据注释会替代约定,但会被 Fluent API 配置替代 +*约定是什么?* +*在EFCore中,约定是框架根据一组预设规则自动推断和应用于模型的某些配置方法。这些约定可以自动处理诸如住建、外键、表名、列名等数据库映射的细节,可以在迁移文件中查看约定* +~~~c# +[Table("Blogs")] +public class Blog +{ + public int BlogId { get; set; } + + [Required] + public string Url { get; set; } +} +~~~ + +### 四、雪花算法 +#### 1.概念 +- 雪花算法(Snowflake Algorithm)是一种用于生成分布式系统中ID的算法 +- 组成部分: + 1. 时间戳(41位):用于表示生成ID的时间戳,精确到毫秒级 + - 时间戳是 + 2. 机器ID(10位):用来标识生成ID的机器,每台机器需要分配一个唯一的ID + 3. 序列号(12位):在同一毫秒内生成多个ID时,用来区分不同ID的顺序号 + +==学习资料== +https://cloud.tencent.com/developer/article/2364487 \ No newline at end of file -- Gitee