当前位置: 首页 > 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; …...

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…...

PCIe学习笔记

PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01dc604fbdc847e8998a978c83c7b2eb.png 一般主…...

The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论

讨论 论法学硕士研究与Agent研究的互利性 近年来&#xff0c;随着激光诱导金属化技术的发展&#xff0c;激光诱导金属化与化学剂交叉领域的研究取得了长足的进步&#xff0c;促进了这两个领域的发展。在此&#xff0c;我们期待着LLM研究和Agent研究相互提供的一些益处和发展机…...

C语言:const的用法

有时候我们希望定义这样一种变量&#xff0c;它的值不能被改变&#xff0c;在整个作用域中都保持固定。例如&#xff0c;用一个变量来表示班级的最大人数&#xff0c;或者表示缓冲区的大小。为了满足这一要求&#xff0c;可以使用 const 关键字对变量加以限定&#xff1a; con…...

Redis - 集合 Set 及代码实战

Set 类型 定义&#xff1a;类似 Java 中的 HashSet 类&#xff0c;key 是 set 的名字&#xff0c;value 是集合中的值特点 无序元素唯一查找速度快支持交集、并集、补集功能 常见命令 命令功能SADD key member …添加元素SREM key member …删除元素SCARD key获取元素个数SI…...

LabVIEW面向对象编程有什么特点?

LabVIEW面向对象编程&#xff08;OOP&#xff09;的特点主要体现在它如何结合传统面向对象编程&#xff08;OOP&#xff09;的理念与LabVIEW的图形化编程模式&#xff0c;提供灵活的抽象和模块化的功能。以下是LabVIEW面向对象编程的几个主要特点&#xff1a; ​ 1. 类&#x…...

配置Nginx自签名SSL证书,支持HTTPS

配置Nginx自签名SSL证书的流程 生成一个SSL自签名证书客户端机器信任这个自签名证书修改RHEL服务器的Nginx配置在客户机用curl测试HTTPS 生成一个SSL自签名证书 在RHEL服务器上, 用openssl命令生成一个自签名证书 openssl genrsa -out server.key 2048 #生成一个2048位的RS…...

使用Spring Boot、VUE实现SSE长连接:跟踪文件上传和任务进度

使用Spring Boot实现SSE长连接&#xff1a;跟踪文件上传和任务进度 文章目录 使用Spring Boot实现SSE长连接&#xff1a;跟踪文件上传和任务进度什么是SSE&#xff1f;使用场景前端库选择安装event-source-polyfill1. 创建SSE连接2. 关闭SSE连接3. 结合Vue.js使用 使用Spring B…...

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…...

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…...

会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会

今年秋季学期起&#xff0c;全国多所高校面向本科生开设人工智能通识课。 当前人工智能通识课程的建设进展主要分为三种情况&#xff1a; 全市统筹&#xff0c;由某头部高校牵头建设市级人工智能通识课&#xff0c;以北京市、天津市为代表&#xff1b; 已于秋季学期按照课程…...

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

文章目录 关联文章一、CANoe加载诊断数据库cdd、dll文件二、CAPLdiagGenerateKeyFromSeed关联文章 UDS - 深论Security Access Service 27服务-安全访问状态转换 CDD文件——CANdelaStudio Vector——CAPL语言设计 CANoe诊断测试 相信读者基于Diagnostic/ISO TP Confighratio…...

订单编号如何实现

背景 常见的订单编号是带有一些信息的&#xff0c;比如说创建日期例如&#xff1a;本案例中的订单日期 自增编号日期可以使用格式化字符串&#xff0c;自增则可以使用redis来实现 代码实现 redis就有自增的方法 每天的key都是不一样的&#xff0c;且过期时间设置为1天 // 生成…...

Vue3 大事件管理系统

Vue3 项目实战&#xff1a; &#x1f197;好久没有更新blog&#xff0c;最近在找工作&#xff0c;还有准备考试&#xff0c;哎&#xff0c;&#x1f636;‍&#x1f32b;️爆炸的大环境&#x1f972; 内卷开始&#x1f32f;&#x1f32f; 本篇文章涉及的技术栈速通链接&#x…...

IOS通过WDA自动化中遇到的问题

IOS自动化遇到的问题 搭建WDA环境中遇到的问题1、XCode unsupport iphone xxx.2、创建Bundle Identifier出现问题&#xff1a;Communication with Apple failed3、创建Bundle Identifier出现问题&#xff1a;Automatic signing failed \Signing certificate is invalid4、创建B…...

单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能

感谢您提供的详细日志信息。根据您的反馈&#xff0c;问题可能出在 pyautogui 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题&#xff1a; 1. **确保 pyautogui 正确执行点击操作**&#xff1a; - 我们将添加更多的调…...

路由引入问题(双点双向路由回馈问题)

简介 总所周知&#xff0c;路由引入import又称路由重分发redistribute&#xff0c;为了解决不同路由协议进程间路由信息不互通而使用的技术&#xff0c;由于不同路由协议的算法、机制、开销等因素的差异&#xff0c;它们之间无法直接交换路由信息。因此&#xff0c;路由引入技…...

设计模式之 适配器模式 C# 范例

在 C# 中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在将一个类的接口转换成客户端所期待的另一个接口。适配器模式允许你将现有的类包装起来&#xff0c;使其能够与其他接口兼容。 适配器模式的使用场景&#xff1a; …...

LabVIEW实现GPS通信

目录 1、GPS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…...

The Quantization Model of Neural Scaling

文章目录 摘要1引言2 理论3 概念验证&#xff1a;一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因&#xff08;monogenic&#xff09;与多基因&#xff08;polygenic&#xff09;的规模曲…...

数据源指的是哪里的数据,磁盘中还是内存中

在 MyDB 项目中&#xff0c;特别是这段缓存框架代码&#xff1a; T obj getForCache(key);以及它的上下文&#xff1a; AbstractCache 是一个抽象类&#xff0c;内部有两个抽象方法&#xff0c;留给实现类去实现具体的操作&#xff1a; protected abstract T getForCache(lon…...

android 之 MediaExtractor

MediaExtractor 是Android多媒体处理的基础组件&#xff0c;解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具&#xff0c;主要作用是从媒体文件&#xff08;如MP4、MKV、MP3&#xff09;中分离音视频轨道数据&#xff0c;为后续解…...

一文掌握 Tombola 抽象基类的自动化子类测试策略

深入解析 Python 抽象基类的自动化测试框架设计 在 Python 开发中&#xff0c;抽象基类&#xff08;ABC&#xff09;是定义接口规范的强大工具。本文将以 Tombola 抽象基类为例&#xff0c;详细解析其子类的自动化测试框架设计&#xff0c;展示如何通过 Python 的内省机制实现…...

ESP-Brookesia:融合 AI 大模型,全新一代 GUI 开发与管理平台

乐鑫信息科技 (688018.SH) 推出 ESP-Brookesia ——一款专为物联网设备打造、集成 AI 交互能力的 UI 开发与管理框架。 ESP-Brookesia 深度融合 AI 大模型技术&#xff0c;为智能屏显应用赋予语音识别、自然语言对话、拟人化反馈等能力&#xff0c;帮助开发者构建更智能、更具…...

PyCharm和VS Code哪个更适合初学者

对于 Python 初学者来说&#xff0c;选择 VS Code 还是 PyCharm 取决于你的具体需求和使用场景。以下是两者的详细对比和推荐建议&#xff1a; VS Code 优点&#xff1a; 轻量级&#xff1a;启动速度快&#xff0c;占用资源少&#xff0c;适合在低端设备上运行。高度可定制&am…...

javaSE复习(7)

1.KMP算法 使用KMP算法在主串 "abaabaabcabaabc" 中搜索模式串 "abaabc"&#xff0c;到匹配成功时为止&#xff0c;请问在匹配过程中进行的单个字符间的比较次数是&#xff08;&#xff09;。 10次 用于互斥时 初值为1 在一个并发编程环境中&#xff0c…...

BeanFactory 和 FactoryBean 有何区别与联系?

导语&#xff1a; Spring 是后端面试中的“常青树”&#xff0c;而 BeanFactory 与 FactoryBean 的关系更是高频卡人点。很多候选人混淆两者概念&#xff0c;答非所问&#xff0c;轻则失分&#xff0c;重则直接被“pass”。本文将从面试官视角&#xff0c;深入剖析这一经典问题…...

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示&#xff0c;同时&#xff0c;统计目标数量以及违停数量&#xff0c;生成结果评估&#xff0c;一并发送到前端展示。对于本文任何技术上的空缺&#xff0c;可在博主主页前面博客…...