diff --git "a/\350\202\226\346\226\207\346\205\247/20240705 \344\273\245\344\273\243\347\240\201\345\257\271\346\225\260\346\215\256\345\272\223\347\232\204\346\233\264\346\224\271.md" "b/\350\202\226\346\226\207\346\205\247/20240705 \344\273\245\344\273\243\347\240\201\345\257\271\346\225\260\346\215\256\345\272\223\347\232\204\346\233\264\346\224\271.md" index e6cf036726bd1c4c97b146b6ec57dde8623e34a8..da44aef07ab125a5d4f227c19ee7153d0cc4a3f5 100644 --- "a/\350\202\226\346\226\207\346\205\247/20240705 \344\273\245\344\273\243\347\240\201\345\257\271\346\225\260\346\215\256\345\272\223\347\232\204\346\233\264\346\224\271.md" +++ "b/\350\202\226\346\226\207\346\205\247/20240705 \344\273\245\344\273\243\347\240\201\345\257\271\346\225\260\346\215\256\345\272\223\347\232\204\346\233\264\346\224\271.md" @@ -1,9 +1,11 @@ ## fluent api -常见的配置实体方法 +### 常见的配置实体方法 数据注释(映射特性) Fluent API -二、使用fluent API配置模型 + +### 二、使用fluent API配置模型 +```c# 1.在数据库上下文中使用OnModelCreate方法 public class MyContext : DbContext { @@ -17,12 +19,14 @@ Fluent API } #endregion } + 注意: Fluent API 配置具有最高优先级,并将替代约定和数据注释 配置按调用方法的顺序应用,如果存在任何冲突,最新调用将替代以前指定的配置 + 2.分组配置 -为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中 + 为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中 public class BlogEntityTypeConfiguration : IEntityTypeConfiguration { @@ -77,7 +81,7 @@ public class BooksContext : DbContext 注意:程序集中不会自动发现 EntityTypeConfigurationAttribute 类型。 实体类型必须添加到模型中,然后才能在该实体类型上发现特性 三、数据注释 -数据注释会替代约定,但会被 Fluent API 配置替代 约定是什么? 在EFCore中,约定是框架根据一组预设规则自动推断和应用于模型的某些配置方法。这些约定可以自动处理诸如住建、外键、表名、列名等数据库映射的细节,可以在迁移文件中查看约定 +数据注释会替代约定,但会被 Fluent API 配置替代 约定是什么? 在EFCore中,约定是框架根据一组预设规则自动推断和应用于模型的某些配置方法。这些约定可以自动处理诸如主键、外键、表名、列名等数据库映射的细节,可以在迁移文件中查看约定 [Table("Blogs")] public class Blog @@ -95,4 +99,6 @@ public class Blog 时间戳是 机器ID(10位):用来标识生成ID的机器,每台机器需要分配一个唯一的ID 序列号(12位):在同一毫秒内生成多个ID时,用来区分不同ID的顺序号 -==学习资料== https://cloud.tencent.com/developer/article/2364487 \ No newline at end of file +==学习资料== https://cloud.tencent.com/developer/article/2364487 + +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240708 jwt.md" "b/\350\202\226\346\226\207\346\205\247/20240708 jwt.md" new file mode 100644 index 0000000000000000000000000000000000000000..5a09513fe291ac83cdfec59285cd754b80e7ae45 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240708 jwt.md" @@ -0,0 +1,49 @@ +https://developer.aliyun.com/article/995894 +jwt + + +### 前言 +```c# +============= +签名技术 + +是一种用于验证数字信息来源和完整性的加密技术。 + +主要依赖公钥加密和非对称秘钥体系。其中包括两个关键组件:私钥和公钥。私钥由信息的发送者持有,用于生成签名,而公钥是公开的,用于验证签名的有效性。 + +签名技术确保消息的发送者无法否认曾经发送过该消息,同时也防止他人伪造或篡改消息。 + +技术原理: +发送方使用哈希函数对原始消息生成一个固定长度的哈希值(或消息摘要) +|| +\/ +发送方使用私钥对哈希值进行加密,生成数字签名。将原始消息和数字签名一起发送给接收方 +|| +\/ +接受方收到消息后使用公钥对数字签名进行解密,得到由原始消息生成的哈希值。再对收到的原始信息进行哈希值的转化,与解密得到的哈希值进行比较,如果二者一致,则验证通过。 +``` + +### JWT +```c# +JWT是一个开放标准,定义了一种紧凑和自包含的方式,用于作为JSON对象在各方之安全的传输信息。 + +主要用于用户验证。 + +jwt由三个部分组成 + +1.Header +报头由两部分组成:Token类型(jwt)和使用的签名算法 + +2.Payload +第二部分是有效负载,其中包含声明。声明是关于实体和其他数据的语句(有三种声明+registered claims, public claims, and private claims) + +3.Signature +要创建Signature,必须先获取编码的标头、编码的有效载荷,secret,标头中的指定算法,并对其进行签名。 + +secret是保存在服务器中的。(私钥)secret是在生成jwt时结合前两部分来生成签名的。 +``` +![图](./img/jwt.png) + +``` +secret不可以轻易泄露,必须保存在后端服务器中。由上图可知,其他地方非必要secret。 +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240708 \351\207\215\347\275\256\345\257\206\347\240\201.md" "b/\350\202\226\346\226\207\346\205\247/20240708 \351\207\215\347\275\256\345\257\206\347\240\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..c184debb2e27f768e1ced2f81cdf8ecde0ec5027 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240708 \351\207\215\347\275\256\345\257\206\347\240\201.md" @@ -0,0 +1,47 @@ +## 重置密码 + +创建用户成功后的返回值中不包含密码。可以创建一个DTO来作为传递的返回值 + + 简易示例 + +```c# + +public class UserDto +{ + public string Id { get; set; } + public string Username { get; set; } + public string Email { get; set; } + // 可以添加其他需要的用户信息属性 +} + +[HttpPost] +public async Task CreateUser([FromBody] CreateUserDto createUserDto) +{ + // 使用 DTO 中的数据创建新的 User 对象 + var user = new ApplicationUser + { + UserName = createUserDto.Username, + Email = createUserDto.Email + // 其他必要的用户属性 + }; + + // 使用 UserManager 来创建用户 + var result = await _userManager.CreateAsync(user, createUserDto.Password); + + if (!result.Succeeded) + return BadRequest(result.Errors); // 如果创建失败,返回错误信息 + + // 创建 UserDto 对象,不包含密码 + var userDto = new UserDto + { + Id = user.Id, + Username = user.UserName, + Email = user.Email + // 其他需要的用户信息属性 + }; + + // 返回不包含密码的 UserDto 对象 + return Ok(userDto); +} + +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240710 \351\200\232\347\224\250\350\277\224\345\233\236\345\200\274.md" "b/\350\202\226\346\226\207\346\205\247/20240710 \351\200\232\347\224\250\350\277\224\345\233\236\345\200\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..ee00e3af489e8d696257e461d6c7440e19ab64bb --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240710 \351\200\232\347\224\250\350\277\224\345\233\236\345\200\274.md" @@ -0,0 +1,78 @@ +## 创建一个通用的返回类 + +1. 属性定义: + +- Success: 一个布尔值,表示请求是否成功。 +- Data: 一个泛型类型 T,用于存储返回的数据。 +- Message: 一个字符串,用于存储错误信息,当请求失败时可以提供详细的错误描述。 +- Errors: 一个字符串列表,用于存储多个错误信息,这在验证或其他情况下可能会出现多个错误。 + +2. 构造函数: + +- 默认构造函数初始化 Errors 列表。 + +3. 静态方法: + +- Successful(T data): 一个静态方法,用于创建一个表示请求成功的响应实例,并包含返回的数据。 +- Failure(string message): 一个静态方法,用于创建一个表示请求失败的响应实例,并包含错误信息。 +- Failure(List errors): 一个静态方法,用于创建一个表示请求失败的响应实例,并包含多个错误信息。 + +下面是通用返回类的 C# 代码实现: + +```c# +public class ApiResponse +{ + public bool Success { get; set; } + public T Data { get; set; } + public string Message { get; set; } + public List Errors { get; set; } + + + public ApiResponse() + { + Errors = new List(); + } + + public static ApiResponse Successful(T data) + { + return new ApiResponse { Success = true, Data = data }; + } + + public static ApiResponse Failure(string message) + { + return new ApiResponse { Success = false, Message = message }; + } + + public static ApiResponse Failure(List errors) + { + return new ApiResponse { Success = false, Errors = errors }; + } +} +在你的 Web API 控制器中,你可以这样使用这个通用返回类: + +[HttpPost] +public async Task CreateUser([FromBody] CreateUserDto createUserDto) +{ + // 业务逻辑... + + if (!result.Succeeded) + { + // 如果创建用户失败,返回包含错误信息的失败响应 + return BadRequest(ApiResponse.Failure(result.Errors.Select(e => e.Description).ToList())); + } + + // 创建 UserDto 对象,不包含密码 + var userDto = new UserDto + { + // ... + }; + + // 返回包含用户数据的成功响应 + return Ok(ApiResponse.Successful(userDto)); +} + +``` + +在这个例子中,当用户创建成功时,我们返回一个包含 UserDto 数据的 ApiResponse 实例,并使用 Ok 状态码。如果用户创建失败,我们返回一个包含错误信息的 ApiResponse 实例,并使用 BadRequest 状态码。这样,客户端就可以根据 Success 字段来判断请求是否成功,并处理相应的数据或错误信息。 + + diff --git "a/\350\202\226\346\226\207\346\205\247/20240711 \345\220\216\347\253\257\344\273\243\347\240\201\351\203\250\347\275\262\345\210\260\346\234\215\345\212\241\345\231\250\344\270\212.md" "b/\350\202\226\346\226\207\346\205\247/20240711 \345\220\216\347\253\257\344\273\243\347\240\201\351\203\250\347\275\262\345\210\260\346\234\215\345\212\241\345\231\250\344\270\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..b3f7fbae7c659d315b48d3574bbb0e93fbafe51b --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240711 \345\220\216\347\253\257\344\273\243\347\240\201\351\203\250\347\275\262\345\210\260\346\234\215\345\212\241\345\231\250\344\270\212.md" @@ -0,0 +1,21 @@ +## 部署代码 + +### 概念了解 + +```c# +=====反向代理服务器===== + +一种位于客户端和目标服务器之间的中间服务器。 + +主要功能: + +1. 负载均衡 + +通过将客户端的请求分发到多个后端服务器,防止单一服务器过载。 + +2. 安全性增加 + +- 隐藏真实IP地址:反向代理服务器可以隐藏后端服务器的真实IP地址,使得攻击者难以直接定位和攻击后端服务器。 +- SSL加密:反向代理服务器可以作为SSL终端,负责与客户端进行SSL握手和加解密操作,保护信息在传输过程中的安全性。 + +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240712 \347\273\204\344\273\266\345\272\223.md" "b/\350\202\226\346\226\207\346\205\247/20240712 \347\273\204\344\273\266\345\272\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..f868e322599ec58f3d0a15e2f4665734752e4e12 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240712 \347\273\204\344\273\266\345\272\223.md" @@ -0,0 +1,56 @@ +## 引入 ant-design-vue +```js +1.新建项目 +2.使用组件 +1. 安装 +npm i --save ant-design-vue@4.x +2. 注册 +全局完整注册 + import { createApp } from 'vue'; + import App from './App'; + // 以下完整引入antdv + import Antd from 'ant-design-vue'; + import 'ant-design-vue/dist/reset.css'; + + let app = createApp(App); + + app.use(Antd).mount('#app'); + // 样式文件需要单独引入 +全局部分注册 + import { createApp } from 'vue'; + import { Button, message } from 'ant-design-vue'; + import App from './App'; + + let app = createApp(App); + + /* 会自动注册 Button 下的子组件, 例如 Button.Group */ + app.use(Button).mount('#app'); + + app.config.globalProperties.$message = message; +局部组件 需要分别注册组件子组件,如 Button、ButtonGroup,并且注册后仅在当前组件中有效 + // 选项式写法 + + + // 组合式写法 + + + +二、按需加载 +ant-design-vue 默认支持基于 ES modules 的 tree shaking,直接引入 import { Button } from 'ant-design-vue'; 就会有按需加载的效果 \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/img/jwt.png" "b/\350\202\226\346\226\207\346\205\247/img/jwt.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e6eecc02c4ac2d0d44e0bf8de9541caa95c45e2 Binary files /dev/null and "b/\350\202\226\346\226\207\346\205\247/img/jwt.png" differ