diff --git "a/\346\235\250\345\256\201/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" "b/\346\235\250\345\256\201/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..89737cedb532a9d0b85597ec05f1e9231b961989 --- /dev/null +++ "b/\346\235\250\345\256\201/20240701_NetCore\345\220\216\347\253\257\346\236\266\346\236\204.md" @@ -0,0 +1,92 @@ +## 项目架构说明 +### 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工具层之一 +用于数据库访问和数据持久化,它提供了从数据库中查询、添加、更新和删除数据的功能,同时封装了数据库操作的复杂性 + +## 思考:通用系统都需要哪些表 +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: 发送时间 +10. 地理位置表Location:存储与地理位置相关的数据,如地理坐标、地址信息等 + - LocationName:地理名称 + +12. 审计表Audits:记录数据的变更历史,用于数据审计 + + - AuditID: 主键,唯一标识一条审计记录 + + - UserID: 外键,关联用户表,操作用户 + + - TableName: 被操作的数据表名 + + - RecordID: 被操作的数据记录ID + + - ChangeType: 变更类型(如新增、修改、删除) + + - OldValues: 变更前的值 + + - NewValues: 变更后的值 + + - CreatedAt: 变更时间 \ No newline at end of file diff --git "a/\346\235\250\345\256\201/20240702_\344\272\206\350\247\243RBAC.md" "b/\346\235\250\345\256\201/20240702_\344\272\206\350\247\243RBAC.md" new file mode 100644 index 0000000000000000000000000000000000000000..41b0d84ed4f88a26feac1cda16d931edc3f36694 --- /dev/null +++ "b/\346\235\250\345\256\201/20240702_\344\272\206\350\247\243RBAC.md" @@ -0,0 +1,38 @@ +## 一、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. 云计算和网络服务提供商:管理云计算平台和网络服务提供商中的用户访问权限,限制其对云资源、虚拟机或网络设备的操作 + +## 四、用户、角色、权限关系 +![用户角色权限关系-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) + diff --git "a/\346\235\250\345\256\201/20240703_PostgreSQL\347\232\204\345\256\211\350\243\205\345\222\214\351\203\250\347\275\262.md" "b/\346\235\250\345\256\201/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 0000000000000000000000000000000000000000..71aeea795159c3bc86ad5a731ba38532e6db5fa5 --- /dev/null +++ "b/\346\235\250\345\256\201/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) diff --git "a/\346\235\250\345\256\201/20240704-\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260.md" "b/\346\235\250\345\256\201/20240704-\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..ff3c9047cf498d0aea38644f4716d82b085dda6c --- /dev/null +++ "b/\346\235\250\345\256\201/20240704-\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260.md" @@ -0,0 +1,52 @@ +``` +namespace Admin2024.Application.Contracts.AppUser; + +public interface IAppUserAppService +{ + Task Registry(CreateAppUserDto createAppUserDto); + + void Login(string username, string password); + + void Logout(string token); + + void DisableUser(); + + void Delete(); + + void Update(UpdateAppUserDto updateAppUserDto); + + void ModifyPassword(string password); + + void AllocateRoleToUser(); + + +} +``` +``` +namespace Admin2024.Application.Contracts.AppUser; + +public class AppUserDto +{ + public Guid Id{get;set;} + public string Username{get;set;}=null!; + public string Password{get;set;}=null!; +} +``` +``` +namespace Admin2024.Application.Contracts.AppUser; + +public class CreateAppUserDto +{ + public string Username { get; set; } = null!; + public string Password { get; set; } = null!; + public string ConfirmPassword { get; set; } = null!; +} +``` +``` +namespace Admin2024.Application.Contracts.AppUser; + +public class UpdateAppUserDto +{ + +} +``` \ No newline at end of file diff --git "a/\346\235\250\345\256\201/20240705-\346\250\241\345\236\213\351\205\215\347\275\256.md" "b/\346\235\250\345\256\201/20240705-\346\250\241\345\236\213\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..bb1f886e3e22e2eb9f807169132dfdbbe048929f --- /dev/null +++ "b/\346\235\250\345\256\201/20240705-\346\250\241\345\236\213\351\205\215\347\275\256.md" @@ -0,0 +1,28 @@ +### 创建并配置模型 +- EF Core 使用元数据模型来描述如何将应用程序的实体类型映射到基础数据库。 +- 此模型是使用一组约定构建的,这些约定是寻找常见模式的启发式方法。 然后,可以使用映射特性(也称为数据注释)自定义模型 +- 在 OnModelCreating 中调用 ModelBuilder 方法(也称为 Fluent API),这两者都将替代约定执行的配置。 + +- 大多数配置可以应用于面向任何数据存储的模型。 +- 提供程序还可以启用特定于特定数据存储的配置,也可以忽略不支持或不适用的配置。 +- 有关提供程序特定配置的文档,请参阅数据库提供程序部分。 + +### fluent API 配置模型 +- 可在派生上下文中替代 OnModelCreating 方法,并使用 Fluent API 来配置模型 + +### 分组配置 +- 为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中。 + + +### 生成id的几种方式 +- UUID (无序,基本可以认为不会重复,有根据mac地址生成(这种会暴露隐私)、时间、或者名称生成) +- 数据库自增主键(分表的情况下会有问题,无法保证唯一性) +- redis的INCR和INCEBY(实际项目中没见过这样做的) +- 雪花算法生成id(有序,不需要依赖中间件,但是因为有序可能会暴露隐私,导致安全问题;依赖时间戳,若时间快了重新校准,有时钟回拨问题) +2. 雪花算法 +### 雪花算法介绍 +- 雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。 +- 1:最高 1 位是符号位,固定值 0,表示id 是正整数 +- 41:接下来 41 位存储毫秒级时间戳,2^41/(1000606024365)=69,大概可以使用 69 年。 +- 10:再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。 +- 12:最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。 \ No newline at end of file