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

在 .NET 9.0 Web API 中实现 Scalar 接口文档及JWT集成

示例代码:https://download.csdn.net/download/hefeng_aspnet/90408075 

介绍

        随着 .NET 9 的发布,微软宣布他们将不再为任何 .NET API 项目提供默认的 Swagger gen UI。以前,当我们创建 .NET API 项目时,微软会自动添加 Swagger Swashbuckle 包,该包提供了app.UseSwagger()和app.UseSwaggerUI() 等方法。这些方法显示了带有预定义 UI 的 API 文档,可直接在浏览器中进行测试,而无需使用 Postman 等任何第三方应用程序。但是,Swagger 不再与 .NET 9 Web API 项目集成。做出此决定是因为该包最近没有得到妥善维护,并且许多用户报告的问题仍未解决。 

        微软团队创建了一个名为 Microsoft.AspNetCore.OpenApi 的新包,它提供了类似于 Swagger 的内置 OpenAPI 文档生成功能。但是,这只提供了所有端点和架构定义的 JSON 文档,而浏览器中不会显示任何 UI。这一变化的主要目的是让用户实现他们喜欢的 UI 库,无论是 Swagger 还是任何其他替代方案。微软删除默认的 Swagger 包并不意味着您不能在项目中再次安装 Swagger——您可以添加它并执行与以前相同的所有操作。

        目前有许多 Swagger 的替代方案,但在本文中,我们将讨论并在我们的 API 项目中实现 Scalar。继 Swagger 之后,Scalar 在开发人员中越来越受欢迎。

创建新项目

        当您使用 .NET 9 创建新项目时,它会询问您是否要配置 OpenAPI 支持。如果您选中此复选框,它会将 Microsoft.AspNetCore.OpenApi 包添加到您的项目中,并在 program.cs 文件中注册 OpenAPI 服务,如下所示:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenApi();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();

现在,当您运行 API 并导航到/OpenApi/v1.json时,它将显示默认生成的文档,其中包含有关您的端点和您使用的所有模式的信息,如下图所示:

配置 Scalar.NET

首先,打开你的包管理器并安装Scalar.AspNetCore。

然后,只需在program.cs文件中添加app.MapScalarApiReference();即可映射 Scalar UI 的所有 API 引用和路由。

现在,如果您转到/Scalar/V1,您将看到端点的漂亮 UI。在这里,我只有一个端点,所以它看起来像这样。

配置标量的选项

您可以配置多个选项并更改 UI 的设置。一些配置包括。

1、Title:设置显示在浏览器选项卡顶部的文档标题
2、DarkMode: true/false 启用或禁用暗模式
3、Favicon:设置文档的图标
4、DefaultHttpClient:在浏览器中加载 UI 时显示默认 HTTP 客户端。它显示相应编程语言的代码实现。
5、HideModels: true/false 设置是否显示模型定义
6、Layout:设置 Scalar UI 的布局/主题
7、ShowSidebar: true/false 设定是否显示侧边栏。这仅在您选择了现代布局时才有效。
还有更多。

默认打开 Scalar UI

        您可能已经注意到,我们每次都必须在 URL 中输入 scalar/v1 才能看到 Scalar UI。我们可以更改启动 URL,这样就不必重复执行此操作。打开launchsettings.json文件并将启动 URL 添加到您的配置文件中。我已为 HTTP 和 HTTPS 添加了它。您可以根据您的要求进行配置。

使用授权和 JWT 令牌

        在大多数 API 中,我们都会实现 JWT 令牌或其他类型的令牌身份验证。因此,我添加了几行代码来使用 JWT 令牌实现授权。我还为此安装了 Microsoft.AspNetCore.Authentication.JwtBearer 包。

builder.Services
    .AddAuthorization()
    .AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(x =>
    {
        x.RequireHttpsMetadata = false;
        x.SaveToken = true;
        x.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = false,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("your_jwt_key")),
            ValidateIssuer = false,
            ValidateAudience = false
        };
    });

app.UseAuthentication();
app.UseAuthorization();
app.MapGet("/test1", () => "This is test 1 endpoint")
    .WithName("Test1")
    .RequireAuthorization();

        当我调用此 test1 端点时,它给出了401 错误(未经授权)。那么,我们如何解决这个问题呢?我们可以简单地传递一个身份验证令牌,但如果你看看 Scalar,你会发现没有选项可以在他们的 UI 上添加身份验证/承载令牌。即使我在MapScalarApiReference中添加了PreferredSecurityScheme作为承载者,也没有针对身份验证类型的选项。

options.Authentication = new ScalarAuthenticationOptions
{
    PreferredSecurityScheme = "Bearer"
};

        如果您在标头中将身份验证令牌与授权密钥一起传递,则它可以工作,但这不是我们想要的,对吗?我们想要一个类似于 Swagger 的界面,它显示在主页或各个端点上添加令牌的选项。这是 Scalar 的一个问题,已在其 GitHub 存储库中报告:https://github.com/scalar/scalar/issues/4055。

        但是,有一种方法可以实现我们想要的并解决这个问题。我们可以使用 OpenAPI 中的文档转换器功能,微软在这里提供了详细的文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/openapi/customize-openapi ?view=aspnetcore-9.0 。

        使用这个转换器,我们可以通知 Scalar 我们想要在 UI 上显示身份验证选项,以便 Scalar 可以将其添加到主页以及各个端点上。

这是压缩类:

internal sealed class BearerSecuritySchemeTransformer : IOpenApiDocumentTransformer
{
    private readonly IAuthenticationSchemeProvider _authenticationSchemeProvider;

    public BearerSecuritySchemeTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider)
    {
        _authenticationSchemeProvider = authenticationSchemeProvider;
    }

    public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
    {
        var authenticationSchemes = await _authenticationSchemeProvider.GetAllSchemesAsync();

        if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer"))
        {
            var requirements = new Dictionary<string, OpenApiSecurityScheme>
            {
                ["Bearer"] = new OpenApiSecurityScheme
                {
                    Type = SecuritySchemeType.Http,
                    Scheme = "bearer",
                    In = ParameterLocation.Header,
                    BearerFormat = "JWT"
                }
            };

            document.Components ??= new OpenApiComponents();
            document.Components.SecuritySchemes = requirements;

            foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
            {
                operation.Value.Security.Add(new OpenApiSecurityRequirement
                {
                    [new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Id = "Bearer",
                            Type = ReferenceType.SecurityScheme
                        }
                    }] = Array.Empty<string>()
                });
            }
        }
    }
}

此代码将在主页和所有请求端点添加一个身份验证选项,您可以在其中传递令牌来发送请求。

此代码修改了 OpenAPI/Scalar 文档以显示 API 支持 Bearer 令牌认证。

1、它首先检查 API 是否启用了“Bearer”身份验证
2、如果存在 Bearer 身份验证,它会在 OpenAPI/Scalar 中添加安全方案
3、此安全方案告诉 OpenAPI/Scalar,请求应在授权标头中包含 JWT(JSON Web Token)
4、默认情况下,这仅添加了对身份验证的支持,但在 OpenAPI/Scalar UI 中不需要它
5、为了使 UI 中看起来需要身份验证,代码循环遍历所有 API 端点并将它们标记为需要 Bearer 令牌

下面的循环就是这么做的:

foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
{
    operation.Value.Security.Add(new OpenApiSecurityRequirement
    {
        [new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Id = "Bearer",
                Type = ReferenceType.SecurityScheme
            }
        }] = Array.Empty<string>()
    });
}

这可确保每次生成 OpenAPI/Scalar 文档时都会添加安全方案和要求。

如果您想要真正强制身份验证,则需要向控制器添加[Authorize]或在 Minimal API 中添加 RequireAuthorization() 。

现在您可以在此输入中传递您的令牌,它将被传递到服务器而不会出现任何问题,并且您将不再收到 401 错误。

您可以下载该示例项目:https://download.csdn.net/download/hefeng_aspnet/90408075

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

相关文章:

在 .NET 9.0 Web API 中实现 Scalar 接口文档及JWT集成

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90408075 介绍 随着 .NET 9 的发布&#xff0c;微软宣布他们将不再为任何 .NET API 项目提供默认的 Swagger gen UI。以前&#xff0c;当我们创建 .NET API 项目时&#xff0c;微软会自动添加 Swagger…...

XSS跨站脚本攻击漏洞(Cross Site Scripting)

前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习&#xff0c;以下是对XSS跨站脚本攻击漏洞的一些个人解析&#xff0c;请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击&#xff08;XSS&#xff09;漏洞是一种常见且危害较…...

Android:蓝牙设置配套设备配对

一、概述 在搭载 Android 8.0&#xff08;API 级别 26&#xff09;及更高版本的设备上&#xff0c;配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描&#xff0c;而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…...

MFC中CString类型是如何怎么转std::string的

文章目录 一、转换方法总结二、详细步骤1. Unicode 项目&#xff08;CStringW → std::string&#xff09;2. 多字节项目&#xff08;CStringA → std::string&#xff09; 三、注意事项四、总结更多信息(知识点存在重复&#xff0c;可跳过)方法 1&#xff1a;项目使用 Unicode…...

使用vscode搭建pywebview集成vue项目示例

文章目录 前言环境准备项目源码下载一、项目说明1 目录结构2 前端项目3 后端项目获取python安装包(选择对应版本及系统) 三、调试与生成可执行文件1 本地调试2 打包应用 四、核心代码说明1、package.json2、vite.config.ts设置3、main.py后端入口文件说明 参考文档 前言 本节我…...

JAVASCRIPT 基础 DOM元素,MAP方法,获取输入值

从输入框获取数据的一般写法是&#xff1a; javascript const w parseFloat(document.getElementById("weight").value); const h parseFloat(document.getElementById("height").value); 而从弹窗获取数据一般写法是&#xff1a; javascript const w …...

VLAN间通信

目录 第一步&#xff1a;配vlan 第二步&#xff1a;配置核心vlanif,MAC地址信息。 第三步&#xff1a;ospf协议 三层交换机&#xff08;汇聚层&#xff09;: 对于交换机、路由器、防火墙等网络设备而言&#xff0c;接口类型一般存在两种&#xff1a;二层接口&#xff0c;三…...

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇

文章目录 前言一、窗口函数&#xff08;Window Functions&#xff09;1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式&#xff08;Common Table Expressions, CTEs&#xff09;2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…...

5.安全相关(双手启动、安全触边传感器)

一、关于双手启动按钮的使用规范 本文介绍双手启动按钮的使用。概括来讲&#xff1a; 双手按下之间的时间差间隔应该在0.5-2秒之间。一旦释放任何一个按钮&#xff0c;启动信号输出结束。只有两个按钮都被释放之后&#xff0c;才能再次触发双手启动信号。如果某按钮被按下超过…...

国产达梦(DM)数据库的安装(Linux系统)

目录 一、安装前的准备工作 1.1 导包 1.2 创建用户和组 1.3 修改文件打开最大数 1.4 目录规划 1.5 修改目录权限 二、安装DM8 2.1 挂载镜像 2.2 命令行安装 2.3 配置环境变量 2.4 启动图形化界面 三、配置实例 四、注册服务 五、启动 停止 查看状态 六、数据库客…...

mapper.xml中 “http://mybatis.org/dtd/mybatis-3-mapper.dtd“> 报错的解决方法

我用mybatisx自动生成代码&#xff0c;但是mapepr.xml中的 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">报错&#xff0c;如下图&#xff0c;圈起来的部分是之前的报错&#xff0c;现在已经解决&#xff0c;所以没有爆红&#xff1a; 解决方法&#xff1a;…...

01_JavaScript

目录 一、js介绍、能做什么 --了解 二、JavaScript的组成-重点 三、JavaScript代码的书写位置 行内JS 内嵌 JS 外链 JS 四、JS 中的注释 单行 多行 五、变量&#xff08;重点&#xff09; 定义变量及赋值 变量的命名规则和命名规范 六、数据类型&#xff08;重…...

数组作为哈希表的妙用:寻找缺失的第一个正数

数组作为哈希表的妙用&#xff1a;寻找缺失的第一个正数 大家好&#xff0c;我是Echo_Wish&#xff0c;今天我们来探讨一个经典的算法问题——“缺失的第一个正数”。听起来可能有点简单&#xff0c;但它实际上是一个非常有意思且富有挑战性的题目&#xff0c;在面试中常常会碰…...

JAVA学习*Object类

Object类 Object类是所有类的父类 类中有一些方法&#xff08;都需要掌握&#xff09; toString()方法 在学习类的对象的时候有介绍过了&#xff0c;当我们重新给此方法就会打印类与对象的信息 equals()方法 在Java中的比较&#xff0c; 如果左右两侧是基本类型变量&#…...

《论语别裁》第02章 为政(03)星辰知多少

第二个问题说到“北辰”。我们中国文化发达得最早的是天文。过去我们把天体分成二十八宿和三垣——紫微、少微、太微&#xff0c;类似于我们现在讲天文的经纬度。经纬度是西方的划分法。曾经有位天文学家主张&#xff0c;我们自己重新划过&#xff0c;不照西方的度数划&#xf…...

git_version_control_proper_practice

git_version_control_proper_practice version control&#xff0c;版本控制的方法之一就是打tag 因为多人协作的项目团队&#xff0c;commit很多&#xff0c;所以需要给重要的commit打tag&#xff0c;方便checkout&#xff0c;检出这个tag 参考行业的实践方式。如图git、linux…...

playwright-go实战:自动化登录测试

1.新建项目 打开Goland新建项目playwright-go-demo 项目初始化完成后打开终端输入命令&#xff1a; #安装项目依赖 go get -u github.com/playwright-community/playwright-go #安装浏览器 go run github.com/playwright-community/playwright-go/cmd/playwrightlatest insta…...

手机扫描仪 含PDF转word功能+OCR识别110种语言

TapScanner Premium 是一款功能强大的手机扫描仪应用&#xff0c;支持 PDF 合并、分割以及转换为 Word 文档格式&#xff0c;还具备 OCR 识别功能&#xff0c;可识别 110 种语言。汉化中文且已激活全部功能&#xff0c;可免费使用。 该应用操作简洁&#xff0c;扫描文档、收据…...

数据可视化在商业智能中的应用:从数据到洞察的桥梁

数据可视化在商业智能中的应用:从数据到洞察的桥梁 大家好,我是Echo_Wish。今天,我们来探讨一个数据领域的热门话题——数据可视化在商业智能中的应用。在数据驱动的时代,如何从海量的数字和信息中提炼出有价值的洞察,成为了企业决策的关键。而数据可视化,正是将枯燥的数…...

【HarmonyOS Next的奇幻大冒险】DevEco Studio的AI助手CodeGenie挺好用

遇到些问题在官网搜不出答案&#xff0c;CodeGenie都给解决了&#xff01; 不过我的问题可能比较初级&#xff0c;往后再看看它的能力怎么样 下面的截图是关于其中一个问题的对话。可见CodeGenie干脆利索&#xff0c;并且给出了相关知识点在官网上的参考信息链接&#xff0c;大…...

替代-UX设计师

初创公司如何在没有设计师的情况下 打造实用的用户体验 一个常见的捷径是使用预构建的组件库&#xff0c;如谷歌的 Material UI它们为你提供了构建块&#xff0c;但它们并没有为你考虑整个用户流程你仍然需要弄清楚所有这些是如何组合在一起的但是&#xff0c;很多时候&#x…...

ISIS-1 ISIS概述

前面几章我们介绍了OSPF的基础工作原理以及怎样交互LSA形成LSDB链路状态数据库的 这一章我们来介绍另一个链路状态路由协议,ISIS路由协议 一、概述 ISIS(Intermediate System to Intermediate System,中间系统到中间系统)是由ISO(International Organization for Standardiza…...

电脑上不了网普通用户排除方法

1&#xff1a;首先通过电脑的运行/CMD/ipconfig /all 命令查看电脑的ip地址是否正常如图&#xff1a; 2&#xff1a;在命令行中运行&#xff1a;ping 127.0.0.1 如图则正常&#xff0c;否则要重新安装网卡驱动 程序。 3&#xff1a;用ping命令&#xff0c;ping一下同网段的电…...

Qt 控件概述 QLCDNumber 和 Progressbar

目录 QLCDNumber 进度条 定时器进度条的实现 通过stylesheet来改变进度条颜色​ QLCDNumber LCD数字显示器 实现一个定时器 QLCDNumber 进度条 定时器进度条的实现 为什在Widget.h种头文件并没有包含QTimer这个头文件&#xff0c;却还可以申明一个TImer指针呢&#xff1f;…...

2025.03.21首板涨停股票分析

目录 1 涨停原因分析2 交易建议 1 涨停原因分析 2 交易建议...

数据库的DDL操作

目录 一、创建数据库 &#xff08;1&#xff09;字符集和校验集 二、操作数据库 &#xff08;1&#xff09;查看数据库 &#xff08;2&#xff09;显示创建语句 &#xff08;3&#xff09;修改数据库 &#xff08;4&#xff09;删除数据库 三、数据库的备份与恢复 四、…...

Docker 部署 Graylog 日志管理系统

Docker 部署 Graylog 日志管理系统 前言一、准备工作二、Docker Compose 配置三、启动 Graylog 服务四、访问 Graylog Web 界面总结 前言 Graylog 是一个开源的日志管理平台&#xff0c;专为实时日志收集、分析和可视化设计。它支持强大的搜索功能&#xff0c;并且与 Elastics…...

特征工程自动化(FeatureTools实战)

目录 特征工程自动化(FeatureTools实战)1. 引言2. 项目背景与意义2.1 特征工程的重要性2.2 自动化特征工程的优势2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化特征工程理论基础4.1 特征工程的基本概念4.2 FeatureTools库简介4.3 关键公…...

Linux:xxx is not in the sudoers file. This incident will be reported.

报错 xxx is not in the sudoers file. This incident will be reported.解决方式 切换到root用户下操作 # 1、修改/etc/sudoers文件为可修改&#xff0c;默认是只读的 ls -lh /etc/sudoers -r--r----- 1 root root 4.3K Dec 1 01:45 /etc/sudoerschmod uw /etc/sudoersls…...

fastapi+playwright爬取google搜索1-3页的关键词返回json

1,playwright无头 2,代理池随机获取代理ip 3,随机浏览行为,随机页面滚动 4,启用stealth模式 5,随机延时搜索 from fastapi import FastAPI, HTTPException from fastapi.responses import JSONResponse import asyncio from concurrent.futures import ThreadPool…...

论文阅读笔记:Denoising Diffusion Probabilistic Models (3)

论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (2) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (3) 4、损失函数逐项分析 可以看出 L L L总共分为了3项…...

FlauBERT:面向法语的无监督语言模型预训练

摘要 语言模型已成为在许多不同自然语言处理&#xff08;NLP&#xff09;任务中取得最先进成果的关键步骤。利用当今可用的大量未标注文本&#xff0c;它们提供了一种有效的方式来预训练连续词表示&#xff0c;这些表示可以在下游任务中进行微调&#xff0c;并在句子级别上进行…...

JavaScript严格模式

文章主要介绍JavaScript严格模式&#xff0c;包括启用原因、方式以及需避开的常见陷阱&#xff0c;助力开发者写出更健壮代码。 1. 启用原因&#xff1a;将普通JavaScript中的“静默错误”变为抛出错误&#xff0c;有助于编写健壮代码&#xff1b;修复阻碍JavaScript引擎优化的…...

文件上传的小点总结(1)

2.文件类型绕过 问题插入&#xff1a;BP无法拦截本地流量 ①插件限制 不代理的地址列表通常写有localhost和127.0.0.1&#xff0c;把本地的全都删掉&#xff0c;然后应用保存。 ②浏览器限制 Firefox浏览器设置&#xff1a;检查浏览器代理配置和proxy listeners都没问题后&…...

2024年数维杯数学建模B题生物质和煤共热解问题的研究解题全过程论文及程序

2024年数维杯数学建模 B题 生物质和煤共热解问题的研究 原题再现&#xff1a; 随着全球能源需求的不断增长和对可再生能源的追求&#xff0c;生物质和煤共热解作为一种潜在的能源转化技术备受关注。生物质是指可再生能源&#xff0c;源自植物和动物的有机物质&#xff0c;而煤…...

@maptalks/gl-layers中的VectorTileLayer的Symbol样式文档

maptalks/gl-layers中的VectorTileLayer的Symbol样式文档 矢量的Symbol样式分为以下几个大类&#xff1a; marker样式属性&#xff0c;定义了图标相关样式属性 text样式属性&#xff0c;定义了文字相关样式属性 line样式属性&#xff0c;定义了线相关的样式属性 polygon样式属…...

OpenCV旋转估计(3)帮助构建一个最大生成树(Maximum Spanning Tree)函数findMaxSpanningTree()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::findMaxSpanningTree 是 OpenCV 中用于图像拼接工作流的一个函数&#xff0c;它帮助构建一个最大生成树&#xff08;Maximum Spanni…...

OpenCV HighGUI 模块使用指南(Python 版)

用户让我编写一个 HighGUI 模块的使用指南&#xff0c;包括函数的使用和应用场景的实现。首先&#xff0c;我需要回顾 HighGUI 模块的主要功能&#xff1a;图像显示、视频捕获、鼠标和键盘事件。然后&#xff0c;按照用户提供的结构&#xff0c;整理每个部分的函数详解、代码示…...

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载&#xff0c;对比传统SPI机制&#xff1a; 传统SPI扫描路径&#xff1a;META-INF/services/** Spring Boot新方案&#xff1a;META-INF/spring/org.springfram…...

算法基础篇(1)(蓝桥杯常考点)

算法基础篇 前言 算法内容还有搜索&#xff0c;数据结构&#xff08;进阶&#xff09;&#xff0c;动态规划和图论 数学那个的话大家也知道比较难&#xff0c;放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么&#xff0c;就不再分入目录中了 注意事…...

【蓝桥杯速成】| 10.回溯切割

前面两篇内容我们都是在做有关回溯问题的组合应用 今天的题目主题是&#xff1a;回溯法在切割问题的应用 题目一&#xff1a;分割回文串 问题描述 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;请你将 s 分割成一些 子串&#xff…...

【Spring】深入理解 Spring 事务管理

文章目录 一、事务的基本概念​原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 二、Spring 事务管理的优势​简化事务管理代码提供多种事务管理方式整合…...

java学习笔记6

按住shift键&#xff0c;选择开始的一位和最后结束的一位来全选 面向对象特征之二&#xff1a;继承性(inheritance) 面向对象特征之二:继承性1.继承性的理解 > 生活上:财产的继承、颜值的继承 > 代码层面:> 自上而下:定义了一个类A&#xff0c;在定义另一个类B时&…...

人工智能在现代科技中的应用和未来发展趋势

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一种模拟人类智能思维和行为的技术&#xff0c;已经在现代科技中得到广泛应用。以下是人工智能在现代科技中的应用和未来发展趋势&#xff1a; 应用&#xff1a; 机器学习&#xff1a;机器学习是人工…...

第二十一章:模板与继承_《C++ Templates》notes

模板与继承 重点和难点编译与测试说明第一部分&#xff1a;多选题 (10题)第二部分&#xff1a;设计题 (5题)答案与详解多选题答案&#xff1a;设计题参考答案 测试说明 重点和难点 21.1 空基类优化&#xff08;EBCO&#xff09; 知识点 空基类优化&#xff08;Empty Base Cla…...

STC89C52单片机学习——第35节: [16-1] AD/DA

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.23 51单片机学习——第35节: [16-1] AD/DA 前言开发板说明引用解答和科普一、AD问题…...

算法-最大公约数

1、约数&#xff1a; 1.1 试除法求约数 原理&#xff1a;只需要遍历最小的约数即可&#xff0c;较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…...

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据&#xff0c;这些数据不仅是数字的记录&#xff0c;更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此&#xff0c;大部分的 SaaS 产品在发展到一定阶段后&#xff0c;都会开始构建自己的报表模块或分析模块&#xff0c;…...

代码随想录刷题day51|(二叉树篇)654.最大二叉树

一、二叉树基础知识 详见&#xff1a;代码随想录刷题day34|&#xff08;二叉树篇&#xff09;二叉树的递归遍历-CSDN博客 二、递归思路 递归三部曲 构造树一般采用前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树&#xff1b; 1.递归函数参数…...

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录 std::unique_ptr&#xff08;独占式智能指针&#xff09;std::shared_ptr&#xff08;共享式智能指针&#xff09;std::weak_ptr&#xff08;弱引用智能指针&#xff09;示例展示&#xff1a;智能指针的原理内存泄漏**什么是内存泄漏&#xff0c;内存泄漏的危害****如…...