当前位置: 首页 > news >正文

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备

1. Visual Studio 2022
2. .NET6 平台支持
3. Internet Information Services 服务器( IIS
4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 )
5. Linux 服务器下的 Docker 容器( Docker 部署使用)

2、上手NET6WebAPI

1. 创建 .NET6 WebAPI 项目
2. 项目结构解读
3. 多种 API 定义
4. 多种启动方式 3 RESTful 风格

3.1 什么是 RESTful

REST 全称是 Representational State Transfer ,中文意思是表述性状态转移。
REST 本身并没有创造新的技术、组件或服务
REST 指的是一组架构约束条件和原则。
如果一个架构符合 REST 的约束条件和原则,我们就称它为 RESTful 架构。
理论上 REST 架构风格并不是绑定在 HTTP 上,只不过目前 HTTP 是唯一与 REST 相关的实例。 所以我们这
里描述的 REST 也是通过 HTTP 实现的 REST

3.2 RESTfull 主要规则是什么?

3.2.1 资源与 URI ,所有的资源都有一个资源标志符
Core WebApi - -- 访问一块资源

3.2.2 统一资源接口

3.2.3 资源的表述

服务端可以通过 Content-Type 告诉客户端资源的表述形式。
资源的表述形式有:文本资源可以采用 html xml json 等格式,图片可以使用 PNG JPG 展现出来

3.2.4 资源的链接

dotnet run -- 参数 在项目根目录下执行 ----- 先编译 --- 再启动
dotnet xxx.dll -- 参数 直接启动 dll 文件
https://localhost:7289/Company ---- 代表 Company 的一块资源
https://localhost:7289/User ---- 代表 User 的一块资源
幂等性:对同一 REST 接口的多次访问,得到的资源状态是相同的。
安全性:对该 REST 接口访问,不会使服务器端资源的状态发生改变。
传统 URL 请求格式:
http://127.0.0.1/user/query/1 GET 根据用户 id 查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息
RESTful 请求格式:
http://127.0.0.1/user/1 GET 根据用户 id 查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息 很多人在设计 RESTful 架构时,使用很多时间来寻找漂亮的 URI ,而忽略了超媒体。所以,应该多花一
些时间来给资源的表述提供链接,而不是专注于 " 资源的 CRUD"
比如下一页的链接地址、资源的链接地址都应该符合 RESTful 的设计思路。
不同的动作都可以有一个唯一的 URl 地址;

3.2.5 状态的转移

原则上要求无状态通信原则。

4、多方式调用CoreAPI

1. 浏览器访问 -- 只能是 Get 请求
2. swagger 访问
3. 后台模拟 Http 请求访问 ----- HttpClient / HttpWebRequest
4. Core WebAPI 返回结果中文乱码问题解决
5. Ajax 请求访问 -- 异步请求【后面讲解 -- 跨域请求】

5Swagger配置

1. 基本配置
项目创建之初:
2. 版本控制
3. 注释展示
4. 扩展 Token 值传入
5. 扩展文件上传按钮

6、路由解读

源码项目: Zhaoxi.NET6Demo.WebApi
源码案例: AttributeRouteController 控制器

6.1 什么是路由?

路由器 ---- 转发网络信号
客户端在访问 API 时, API 服务器接收到请求之后,请求的 URL 地址,来通过一定的规则来进行匹配,
然后转发到确定的某一个 API 中,由某一个 API 来做业务处理,这个转发的行为就是路由来完成,这个
匹配的规则就是路由规则。

6.2 特性路由Route

Core WebAPI 中,每一个 API 必须指定特性路由,即在 API 或者控制器上标记
Route(“api/[Controller]/Api”) ;访问 API ,就按照这个格式访问;

6.3 RESTFul 约束,如果有多个GetPost...操作怎么办?

在一个控制器中可以定义多个 API 方法
通过路由规则来区分

6.3 路由约束

6.4 全局路由扩展

如果在开发中,需要把 API 的请求地址来一个修改,按照目前的做法只能一个一个的修改;

7Swagger补充

源码项目: Zhaoxi.NET6Demo.WebApi
源码案例: VersionControlController 控制器 +SwaggerExtension
1. 框架支持 API 版本控制
2. Swagger 支持 API 版本控制
3. 遵循 RESTful 的多版本控制

7.1 框架支持 API 版本

8、内置IOC容器使用

源码项目: Zhaoxi.NET6Demo.WebApi
源码案例: IOCContainerController 控制器
1. 分层架构,上层调用下层
2. 具备抽象【接口和抽象类】和实现【普通类】
3. 注册抽象和具体之间的关系
4. 通过构造函数注入【内置容器仅支持构造函数注入】

9API参数修饰特性

源码项目: Zhaoxi.NET6Demo.WebApi
源码案例: ParameterFromController 控制器

9.1 FromServices

表示来自于 IOC 容器创建
必然需要 IOC 容器先注册
如果没有标记 [FromServices] ,默认会认定这个参数是要通过调用方传递
客户端向服务器发起请求,组装一个固定格式的,符合 http 协议标准的数据格式;发给服务器;
以下几种特性,作用,就是明确指定,参数的数据是来源于 Http 请求的参数中,某一个渠道,可能是头 信息,body ,表单;

9.2 FromBody

api 搜集来自于客户端请求的参数中,从 HTTP Body 中去搜集这个参数的数据,通常用于取 JSON,
XML , 收集到以后,绑定到当前的参数 / 对象中;
FromBody 修饰 -Get 请求 --- 不能访问
FromBody 修饰 -Post 请求 --- 可以访问
FromBody 修饰 -Put 请求 --- 可以访问
FromBody 修饰 -Delete 请求 --- 可以访问
请求 API ,客户端携带的参数为 JSON 格式。 content - type: application/json

9.3 FromForm

api 搜集来自于客户端请求的参数中,到 Form 表单中去搜集这个参数的数据,收集到以后,绑定到当 前的参数/ 对象中;
FromForm 修饰 -Get 请求 --- 不能访问
FromForm 修饰 -Post 请求 --- 可以访问
FromForm 修饰 -Put 请求 --- 可以访问
FromForm 修饰 -Delete 请求 --- 可以访问

9.4 FromHeader

api 搜集来自于客户端请求的参数中,到 Header 头信息中去搜集这个参数的数据,收集到以后,绑定 到当前的参数/ 对象中;
FromHeader 修饰 -Get 请求 --- 可以访问
FromHeader 修饰 -Post 请求 --- 可以访问
FromHeader 修饰 -Put 请求 --- 可以访问
FromHeader 修饰 -Delete 请求 --- 可以访问

9.5 FromQuery

如果客户端通过查询字符串方式传递参数, FromQuery 就是在 Url 地址中去获取值 api 搜集来自于客户端请求的参数中,通过 URL Query 中去搜集这个参数的数据,收集到以后,绑定到 当前的参数/ 对象中;
FromQuery 修饰 -Get 请求
FromQuery 修饰 -Post 请求
FromQuery 修饰 -Put 请求
FromQuery 修饰 -Delete 请求

9.6 FromRouteapi

搜集来自于客户端请求的参数中,在路由中去搜集这个参数的数据,收集到以后,绑定到当前的参
/ 对象中;
FromRoute 修饰 --Get 请求
FromRoute 修饰 --Post 请求
FromRoute 修饰 --Put 请求
FromRoute 修饰 --Delete 请求

10、返回结果

Zhaoxi.NET6Demo.WebApi
ReturnResultController

10.1 返回指定类型 (Specific type)

返回指定类型,如果是对象、 int ,默认会返回 Json 格式 --- 经过序列化处理的;
如果是字符串:直接返回字符串;
最简单的 API 会返回原生的或者复杂的数据类型(比如, string 或者自定义对象类型)。考虑如下的
Action 方法,其返回了一个自定义的 User 对象的集合
[HttpGet]
[Route("GetStudentById/{id:int}")]
public Student GetStudentById(int id) => new Student()
{
Id = 1,
Age = 36,
Name = "张三"
};
[HttpGet]
[Route("GetStudentList")]
public IEnumerable<Student> GetStudentList() => new List<Student>()
{
new Student()
{
Id = 1,
Age = 36,
Name = "张三"
}, new Student()
{
Id = 1,
Age = 36,
Name = "李四"
}
};
[HttpGet]
[Route("GetAsyncUserList")]
public async IAsyncEnumerable<Student> GetAsyncUserList([FromServices]
IStudentService studentService)
{
var studentlist = studentService.GetUserListAsync();
// 使用GetAuthorsAsync异步方法,不用authors查询完毕,就会进入下一步迭代返回
authors
await foreach (var student in studentlist)
{
yield return student;
}
}

10.2 返回 IActionResult 实例

只要是实现了 IActionResult 的接口的,都可以作为返回值;
[Route("GetStudentJson")]
[HttpGet]
public IActionResult GetStudentJson()
{
//返回Json对象
return new JsonResult(new Student()
{
Id = 1,
Age = 36,
Name = "张三"
});
响应Nofound
//return NotFound("No records");
响应Ok
return Ok(); // 必须有Ok等方法包装
}

10.3 返回 ActionResult<T> 实例

[HttpGet]
[Route("GetStudentNew")]
public ActionResult<Student> GetStudentNew()
{
//返回Json对象
return new Student()
{
Id = 1,
Age = 36,
Name = "张三"
};
}

10.4 建议返回类型

WebApi 作为服务存在,需要和第三方对接;

最好能够约束一个标准;固定的返回数据的格式;

固定格式
public class ApiResult<T> where T : class
{
/// <summary>
/// Api执行是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 错误消息
/// </summary>
public string? Message { get; set; }
/// <summary>
/// 结果集
/// </summary>
public T? Data { get; set; }
}

11、日志记录

Zhaoxi.NET6Demo.WebApi
LoggingController
注意:不能允许没有任何监控的系统上线;
如何监控 --- 日志记录
需要日志信息的持久化 -- 保存到文件中,保存到数据库中;

11.1 log4net 日志记录

支持文本日志,数据库日志
1 Nuget 引入程序包 log4net + Microsoft.Extensions.Logging.Log4Net.AspNetCore
2 、准备配置文件【设置为始终复制】
3 、植入 log4net
4 、注入 log 对象,写日志,写入 txt 文件

11.2 数据库日志

要支持数据库记录日志,日志信息写入到数据库中保存;
1 、修改配置文件,支持数据库
2 nuget 引入:写入数据库需要的程序集
3 、执行初始化数据库库脚本

11.2 Nlog 日志记录

1 nuget 引入: NLog.Web.AspNetCore
2 、准备配置文件
3 、读取配置文件,植入 Nlog

12Core WebAPI-Filter

12.1 什么是 AOP ?

AOP(Aspect Orient Programming) ,面向切面编程 , 作为面向对象编程的一种补充 , 可以在不破坏 之前的封装为基础动态增加一些功能;从而让系统更具备扩展性;
增加一个缓存功能
增加日志的功能
既希望不要违背开闭原则,也希望能够增加新的工能;
在之前的业务逻辑之前增加了逻辑;
在之前的业务逻辑之后增加了逻辑;

12.2 Core WebAPI 中的 AOP 支持有哪些?

Zhaoxi.NET6Demo.WebApi
FiltersController
授权 --- Authorize
资源 -- Resource
异常 -- Exception
方法前后 --- Action
AlwayRunResult
结果前后 --- Result

12.3 ResourceFilter 扩展定制

a 定义类、实现 IResourceFilter / IAsyncIResourceFilter 接口,继承 Attribute 父类
b 实现方法
c 标记在 API 方法上
注意:只要是框架提供的是接口,抽象类;我们是不能直接使用的,需要通过扩展;
接口:实现接口,实现方法,把实现类植入;
抽象类:自定类来继承抽象类,覆写方法,把实现类注入;
CustomResourceFilterAttribute 特点:
使用 OnResourceExecuting 方法 + OnResourceExecuted 方法 把要控制器构造函数的执行 + API 调用 给包裹起来了;

12.4 ResourceFilter 扩展缓存

ResouceFilter 的特点,适合什么场景应用呢? ---- ResouceFilter 天生就是为了缓存而生的
缓存:就是一个临时存储区域,以一个 Key-value 格式保存数据;
key--- 保存数据的标识,也需要这个标识 key 才能获取缓存。
请求来了 --- 在还没有做业务逻辑计算之前 --- 判断缓存是否存在,如果存在,就直接返回缓存的值。
如果不存在,就应该去做计算,计算完毕,把结果保存到缓存中去;
缓存:如果缓存区域中的值没有变化,且 key 不变的,获取的值就应该是之前的值;
url 作为 key---- url 不变,缓存就应该不变;

12.5 ActionFilter 扩展定制

a 定义类、实现或者实现 IActionFilter / IAsyncAction / ActionFilterAttribute 抽象类
b 实现方法 / 覆写方法
c 标记在 API 方法上
特点:
ResourceFilter 比较:
ResouceFilter 使用两个方法包裹了控制器的构造实例 + API 执行;
ActionFilter 使用两个办法只包裹了 API 逻辑部分;

12.6 ActionFilter 场景应用

ActionFilter 适合什么场景应用呢? 缓存? --- 也可以扩展缓存; 为什么说 ResourceFilter 更适合做缓存? --- ResouceFilter 做缓存性能更高; 请求处理的环节会更
少,所以 ResouceFilter 更适合做缓存;
ActionFilter 究竟适合做什么呢? ActionFilter -- 靠近 API 方法; 传入到 API 的参数, API 执行
结束后,执行结果;都是 ActionFilter 最先获取到;记录日志的时候;需要记录下来;

12.7 ExceptionFilter 扩展

专门用来统一进行异常的处理;
异常处理在开发中,是一个必须要做的事儿 ~
a 定义类、实现或者实现 IExceptionFilter / IAsyncExceptionFilter 接口
b 实现方法
c 标记在 API 方法上
发生异常就会触发扩展类中的实现方法;

12.8 Filter的生效范围和依赖注入

前面的 Filter 都是标记在方法上的,如果要大批量的生效怎么办呢?
1. 方法注册 ---- 当前方法生效
2. 控制器注册 --- 控制器下所有方法生效
3. 全局注册 --- 全局生效
TypeFilter ServiceFilter 的解读

12.9 ResultFilter/AlwaysRunResultFilter 特点总结

a 定义类、实现或者实现接口
b 实现方法
c 标记在 API 方法上

13、鉴权授权

13.1 授权核心价值

1 、保证数据安全,让不同的人做各自的事儿,让管理更便捷
2 、保证系统的安全
Http 协议: 多进程相互通信的一种协议标准,统一这个一个标准后,可以相互通信了;
1 、无状态
Sesssion/Cookes 授权
1. 把多个请求和响应建立了联系;

13.2 JWT授权/token令牌授权

通过一个令牌,验证这个令牌来确定权限;
https://jwt.io/

13.3 加密解密技术

加密: 可以把一段明文 ( 人类能够识别的信息 )===== 加密技术加密 ====== 得到密文(人类无法识别的 信息);
解密: 可以把一段密文(人类无法识别的信息 ==== 解密技术解密 ====== 得到明文 ( 人类能够识别的信 息)

13.4 可逆加密:

可以加密也可以解密
对称可逆加密
有一个公开的加密解密算法 ( 你知我知大家都知道 )
有一个加密 key 和一个解密 key,
且两个 key 完全相 同;
加密算+ 加密 key 可以加密。
解密算法 + 解密 key 可以解密;
非对称可逆加密
有一个公开的加密解密算法 ( 你知我知大家都知道 ) ,有一个加密 key 和一个解密 key, 且两个 key 不相同,
且两个 key 是成对的,知道加密 key 无法推导出解密 key, 知道解密 key 也不能推导出加密 key;
加密 key+ 加密算法 --- 加密 必须又解密算法 + 和加密 key 成套的解密 key 才能解密;
公钥私钥:
加密 key 做私钥,解密 key 做公钥;

13.5 鉴权授权角色授权策略授权

角色授权,客户端带上 token 来请求 Api Api 要鉴权,要求角色授权,在带上的 token 中,必须包含 Api授权指定的觉得;
启用角色授权
如果标记多个 Authorize ,指定的角色,是并且的关系;
角色授权的场景:
场景一:如果要验证多个同时具备,同时具备多个 role, 就标记多个 Authorize ,分别把角色写上 , 多个 角色是并且的关系
[Authorize(AuthenticationSchemes= JwtBearerDefaults.AuthenticationScheme,Roles =
"teacher")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
"admin")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
"student")]
场景二:多个角色,只要有一个角色匹配即可,多个角色为或者的关系 , 只需要标记一个 Authorize 特 性,roles=" 角色名称以逗号分割 " ,逗号分割的角色名称是或者的关系;
策略:方式,定义多个策略;
启用策略
配置策略生效

13.6 鉴权授权扩展Requirement

token 是认证服务器颁发, token 也没有被篡改;
如果我希望去调用第三方的服务来做一些数据验证呢?
Requirement :还是基于策略的授权, Requirement 可以把验证逻辑给封装出来;
1 、定义 Requirement
2 、实现 IAuthorizationHandler --- 直接使用 AuthorizationHandler<> 泛型类
3 、实现 IAuthorizationHandler 接口,
4 、使用 Requirement ,执行的时候,通过 Requirement 找到 IAuthorizationHandler 的实现类,
AuthorizationHandler 实现类可以支持构造函数注入;
5 、标记生效
作用:把验证逻辑另外封装了,可以定义更多的验证逻辑;

14、发布部署

1. Internet Information Services
2. Linux 系统部署
3. Docker 部署

14.1 Internet Information Services 部署

1. 环境安装
安装IIS
安装ASP.NET Core运行时环境:https://dotnet.microsoft.com/zh
cn/download/dotnet/6.0
2. 发布项目
3. 部署

14.2 Linux系统发布 Core WebAPI

Linux系统-CentOS7 ---基于虚拟机来安装
IP:192.168.1.97

安装教程
链接:https://pan.baidu.com/s/1gI93YwptrWdPKHBh5fLNqQ?pwd=6666
提取码:6666

我们的 Core WebAPI 应用程序是需要跑在 .NET Core 环境上面的。所以我们就需要先安装 .NET Core 环境。
根据微软官方的文档说明:如果要开发 .NET 应用,请安装 SDK (包括运行时)。 或者,如果只需运行 应用程序,请安装运行时。 如果要安装该运行时,建议安装 ASP.NET Core 运行时,因为它同时包括 .NET Core 和 ASP.NET Core 运行时。
命令执行:
1 、签名 密钥 添加到受信任密钥列表,并添加 Microsoft 包存储库
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft
prod.rpm

2 、查看可以安装的 dotnet - SDK
yum search dotnet-sdk
3 、安装适合的版本
sudo yum install dotnet-sdk-6.0.3.2
4 、查看安装的环境
dotnet --list-sdks
dotnet --list-runtimes
5 、发布 Core WebAPI 项目 , 上传到 Linux 服务器
6 、命令启动

        

相关文章:

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …...

opencv通过3种算子进行边缘提取

Scharr算子是效果比较好的,但从肉眼看sobel算子比较顺眼 # 导入OpenCV库&#xff0c;用于图像处理 import cv2 import numpy as np # 从matplotlib库中导入pyplot模块&#xff0c;用于绘制图像 from matplotlib import pyplot as plt # 创建一个名为window的窗口&#xff0c;窗…...

【KodExplorer】可道云KodExplorer-个人网盘安装使用

说明&#xff1a;安装kodExplorer &#xff08;不是Kodbox&#xff09;&#xff1b;Kodbox需求服务器至少2核4G内存&#xff0c;要求环境具备php/redis/mysql/。安装kodExplorer 就是比较方便简单部署&#xff0c;个人版免费。 一、安装环境需求 服务器: Windows&#xff0c;…...

并查集基础

abstract 并查集&#xff08;Union-Find Set&#xff09;是一种数据结构&#xff0c;主要用于处理动态连通性问题&#xff08;Dynamic Connectivity Problem&#xff09;&#xff0c;例如在图论中判断两点是否属于同一个连通分量&#xff0c;以及动态地合并集合。 它广泛应用…...

FPGA 16 ,Verilog中的位宽:深入理解与应用

目录 前言 一. 位宽的基本概念 二. 位宽的定义方法 1. 使用向量变量定义位宽 ① 向量类型及位宽指定 ② 位宽范围及位索引含义 ③ 存储数据与字节数据 2. 使用常量参数定义位宽 3. 使用宏定义位宽 4. 使用[:][-:]操作符定义位宽 1. 详细解释 : 操作符 -: 操作符 …...

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…...

原创 传奇996_55——后端如何点击npc隐藏主界面

点击图片退出&#xff0c;举例&#xff1a; |linkexit Img|ax0.5|ay0.5|percentx50|percenty50|imgpublic/touming2.png|hideMain1|linkexit <Img|x0|y0|esc1|show4|bg1|move0|imgcustom/new/longhun/bg.png|loadDelay0|reset1|hideMain1>...

java+springboot+mysql法律咨询网

项目介绍&#xff1a; 使用javaspringbootmysql开发的法律咨询网&#xff08;文书&#xff09;&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;登录系统&#xff1b;用户管理&#xff1b;文章管理&#xff08;法律知识&#xff09…...

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时&#xff0c;那种既兴奋又困惑的心情吗&#xff1f;我是从一个对AI一知半解的普通用户&#xff0c;逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就&#xff0c;而是通过不断的探索和实践&#xff0c;掌握了一系列高效使用的技巧。今天&#…...

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...

国科大智能设备安全-APK逆向分析实验

APK逆向分析实验 使用APK常用逆向分析工具&#xff0c;对提供的移动应用程序APK文件进行逆向分析&#xff0c;提交逆向后代码和分析报告。具体任务如下&#xff1a; 任务一&#xff1a;安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法&#xff0c;对提供的Facebook Updat…...

Batch Normalization和 Layer Normalization

Batch Normalization和 Layer Normalization Batch Normalization (BN) 和 Layer Normalization (LN) 是深度学习中常用的归一化技术&#xff0c;它们的主要目的是加速训练、提高模型的收敛速度和稳定性。以下是对这两种归一化技术的详细讲解&#xff1a; 1. Batch Normalizat…...

数据结构——顺序表

顺序表的简单介绍 顺序表的概念&#xff1a;顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 特点&#xff1a;顺序表的特点是可以通过元素的索引快速访问数据&#xff0c;其访问时间复杂度…...

C语言中互斥锁、信号量和条件变量的所有相关函数、参数、返回值和说明

1. 互斥锁&#xff08;Mutex&#xff09;的使用 互斥锁用于保护共享数据&#xff0c;防止多个线程同时修改它。 #include <pthread.h> #include <stdio.h> #include <stdlib.h> // 定义一个全局共享变量 int shared_counter 0; // 定义一个互斥锁 pthrea…...

(前序 简单)leetcode 226翻转二叉树

代码随想录说用前序遍历和后序遍历方便&#xff0c;而中序遍历比较绕。 活用自定义函数使程序结构更为清晰 这里用的是前序遍历&#xff0c;根结点root指向left和root&#xff0c;交换root的左右指向 执行过程&#xff1a; 也就是交换下例的 2 &#xff0c;7 使得交换后&…...

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据&#xff0c;对数据进行处理&#xff0c;…...

解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义

转载&#xff1a;self参数 - __ init__ ()方法 super(Net, self).__init__()是什么_super(net, self).init()-CSDN博客 相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码&#xff1a; import torch import torch.nn as nn import torch.nn.functional …...

23种设计模式之责任链模式

目录 1. 简介2. 代码2.1 AbstractLogger&#xff08;抽象处理者&#xff09;2.2 InfoLogger &#xff08;具体处理者&#xff09;2.3 DebugLogger &#xff08;具体处理者&#xff09;2.4 ErrorLogger &#xff08;具体处理者&#xff09;2.5 Test &#xff08;测试&#xff09…...

电感2222

1 电感 1电感是什么 2 电感的电流不能突变&#xff1a;电容是两端电压不能突变 3 电感只是限制电流变化速度...

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…...

【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测

文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …...

从资产流动分析WIF市场潜力X.game深究其他未知因素

近日&#xff0c;两则关于WIF最新消息引起了投资者们的注意。据报道&#xff0c;11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF&#xff0c;此举不仅彰显了其强大的资金实力&#xff0c;更在某种程度上推动了WIF币价的反弹&#xff1b;另一方面…...

【工具变量】上市公司企业经营困境指数数据(Zscore、Oscore、RLPM、Merton DD)2000-2021年

一、资料范围&#xff1a;包括Zscore、Oscore、RLPM、Merton DD&#xff0c;经营困境说明如下&#xff1a;&#xff08;1&#xff09;Zscore&#xff1a;以2.67和1.81作为临界值计算样本得分所处的范围。Zscore>2.67 为财务状况良好&#xff0c;发生破产的可能性较小。Zscor…...

freeswitch(监听、旁听)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch使用场景: 比如A和B在通话,C想监听他们通话内容,其他设备是不知道有人在监听的使用方法: 进入dialplan/default.xml 在配置表添加 <…...

php基础:命名空间

1.PHP 命名空间可以解决以下两类问题&#xff1a; 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名&#xff08;或简短&#xff09;的名称&#xff0c;以提高源代码的可读…...

SAP FICO物料分类账实操

物料分类账所涉及到的差异从采购入库的时候就可能已经产生&#xff0c;接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示&#xff0c;可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的&#xff0…...

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(移动警务通系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文1、制定项目章程2、制定项目管理计划3、指导与管理项目工作4、管理项目知识5、监控项目工作6、实施整体变更控制7、结束项目或阶段正文 2022年2月,我有幸作为项目经理参加了“某市公安移动警务通系统”项…...

学习笔记069——Java集合框架

文章目录 集合1、List 接口2、Set 接口3、Map3.1、Map 常用实现类 集合 需要创建多个对象&#xff0c;但是数量和类型不确定。 集合是 Java 提供的一种类型&#xff0c;功能和数组类似&#xff0c;但是长度和数据类型都是动态。 集合框架&#xff08;包括很多类和接口&#…...

JIS-CTF: VulnUpload靶场渗透

JIS-CTF: VulnUpload来自 <https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/> 1,将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 靶机IP地址192.168.23.162&#xff0c;攻击机IP地址192.168.23.140…...

2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP

本篇文章&#xff0c;小编将与大家一同探讨2024年食堂采购系统的技术趋势&#xff0c;并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年&#xff0c;AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...

Flink CDC实时同步mysql数据

官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化&#xff08;如插入、更新和删除操作&#xff09;的技术。Flink CDC…...

解决MAC装win系统投屏失败问题(AMD显卡)

一、问题描述 电脑接上HDMI线后&#xff0c;电脑上能显示有外部显示器接入&#xff0c;但是外接显示器无投屏画面 二、已测试的方法 1 更改电脑分辨&#xff0c;结果无效 2 删除BootCamp&#xff0c;结果无效 3更新电脑系统&#xff0c;结果无效 4 在设备管理器中&#…...

【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现二叉排序树的基本算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;二叉树的创建、查找和删除算法。具体如下&#xff1a; (1)由…...

【NumPy进阶】:内存视图、性能优化与高级线性代数

目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图&#xff08;View&#xff09;1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝&#xff08;Copy&#xff09;1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…...

[C++]多态

1. 什么是多态性&#xff1f; 1.定义 多态性是指同一个函数或操作在不同对象上表现出不同的行为。 2.分类 C 中的多态性主要分为两种&#xff1a; 1.编译时多态性&#xff08;静态多态性&#xff09;&#xff1a; 编译时决定调用哪个函数。通过 函数重载 和 运算符重载 实…...

文本编辑器与正则表达式

1. VIM 编辑器 1.1 VIM 基本概念 VIM 是一个高度可定制的文本编辑器&#xff0c;广泛用于程序员的日常开发中。与传统的文本编辑器不同&#xff0c;VIM 基于模式操作&#xff0c;具有以下几个主要特点&#xff1a; 普通模式&#xff1a;用于浏览和修改文本。插入模式&#x…...

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...

scala基础_数据类型概览

Scala 数据类型 下表列出了 Scala 支持的数据类型&#xff1a; 类型类别数据类型描述Scala标准库中的实际类基本类型Byte8位有符号整数&#xff0c;数值范围为 -128 到 127scala.Byte基本类型Short16位有符号整数&#xff0c;数值范围为 -32768 到 32767scala.Short基本类型I…...

【重生之我要苦学C语言】文件操作

文件操作 为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保…...

Python中PyTorch详解

文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量&#xff08;Tensor&#xff09;1.1、创建张量1.2、张量操作 2、自动求导&#xff08;Autograd&#xff09;2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器&#xff08;Optimizer&#xff09; 四、…...

Codigger SIDE之Helix编辑器

在Codigger的多维世界中&#xff0c;Helix编辑器以其卓越的性能和灵活性&#xff0c;成为开发者手中的利剑。基于Rust构建&#xff0c;Helix不仅继承了Vim编辑器的经典特性&#xff0c;更以其现代化的功能&#xff0c;重新定义了代码编辑的边界。 模式切换的艺术 Helix的模式切…...

vue3+echarts+websocket分时图与K线图实时推送

一、父组件代码&#xff1a; <template> <div class"chart-box" v-loading"loading"> <!-- tab导航栏 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…...

Maven常用插件清单

Maven 是一个强大的项目管理和构建工具&#xff0c;它使用插件来执行各种构建生命周期任务。以下是常用的一些 Maven 构建插件及其主要用途&#xff1a; 1. Maven Compiler Plugin 用途&#xff1a;编译Java源代码。配置示例&#xff1a;<build><plugins><plu…...

敏捷项目管理

虽然一直在践行敏捷开发&#xff0c;包括站会、尝试使用Confluence做知识wiki、每周分享等等&#xff0c;当然项目日常使用的coding、禅道、jira 项目管理和 jenkins 、git之类的CICD工具更不必说&#xff0c;但确实没有系统地去学习过敏捷开发管理。昨天被人问到敏捷开发到底是…...

牛客小白月赛107(A~E)

文章目录 A Cidoai的吃饭思路code B Cidoai的听歌思路code C Cidoai的植物思路code D Cidoai的猫猫思路code E Cidoai的可乐思路code 牛客小白月赛107 A Cidoai的吃饭 思路 签到题&#xff0c;按题意模拟即可 code void solve(){int n,a,b,c;cin >> n >> a &g…...

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

基于Python深度学习的【猫狗宠物识别】系统设计实现

一、简介 宠物识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;基于TensorFlow搭建卷积神经网络算法&#xff0c;并收集了37种常见的猫狗宠物种类数据集【‘阿比西尼亚猫&#xff08;Abyssinian&#xff09;’, ‘孟加拉猫&#xff08;Bengal&#xff09;’…...

网站多语言前端翻译translate.js 在vue项目中的使用方法

网站多语言前端翻译translate.js 在vue项目中的使用方法 需求 客户网站&#xff0c;想要多语言版本的&#xff0c;通常的解决办法有两种&#xff1a; 1、最直接的办法&#xff1a;编写两种&#xff0c;或者多种语言版本的网站&#xff0c;也就是一个网站有几种语言&#xff0…...

HTML技术贴:深入理解与实践

1. 引言 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页和网上应用的标准标记语言。它定义了网页内容的结构和意义&#xff0c;由一系列元素组成&#xff0c;这些元素告诉浏览器如何展示内容。本技术贴旨在深入探讨HTML的核心技…...

在SQL Server中使用hash join来提高表连接的性能

在SQL Server中使用hash join来提高表连接性能时&#xff0c;需要考虑数据集的大小、索引情况以及查询的具体需求。 在SQL Server中使用hash join来提高表连接性能的情况主要包括以下几种&#xff1a; • 两个表都没有合适的索引&#xff1a;Hash join通常适合当两个表都没有索…...