性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
📚 目录
- 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
- 一、为什么选择 MiniProfiler? 🧐
- 二、集成 MiniProfiler 到 ABP 项目 🛠️
- 1️⃣ 安装 NuGet 包
- 2️⃣ 在 `MyProjectWebModule.cs` 中注册
- 集成流程示意图
- 3️⃣ 在中间件中启用(仅限开发环境)
- 中间件流程图
- 三、前端页面嵌入 Profiler UI 🎨
- 1️⃣ Razor Pages / MVC
- 2️⃣ Blazor Server
- 前端嵌入流程图
- 四、实战演示:控制器或应用服务中标记关键耗时段 ⏱️
- 五、进阶实践 🚀
- 1️⃣ AOP 拦截全站性能
- 自定义拦截器:`MiniProfilerInterceptor`
- 注册拦截器并应用(示例:拦截所有应用服务)
- AOP 拦截流程图
- 2️⃣ HttpClient 自动打点
- HttpClient 打点流程图
- 3️⃣ 健康检查接口打点
- 健康检查打点流程图
- 六、安全与生产建议 🔒
- 七、示例项目与复现方式 🏗️
- 快速启动步骤
一、为什么选择 MiniProfiler? 🧐
在 ABP 应用开发中,很容易遇到以下性能难题:
- 调用链复杂:控制器 → 应用服务 → 领域服务 → 仓储,每层调用都可能出现瓶颈。
- EF Core 查询慢:未加索引、N+1 查询或大表扫描,经常导致数据库成为性能瓶颈。
- 第三方 API 响应慢:调用外部服务时耗时不可见,无法快速定位是哪一步出现问题。
我们需要一个能快速诊断性能瓶颈、零侵入、前端可视化的工具。
MiniProfiler 正符合这些需求:
- ✅ 轻量嵌入式性能分析器;对代码几乎零改动即可集成
- ✅ 支持 SQL、服务方法、HttpClient 等多种调用的耗时可视化
- ✅ 前端浮窗展示;无需跳转后台即可查看 Profiling 结果
二、集成 MiniProfiler 到 ABP 项目 🛠️
下面演示如何在 ABP vNext 项目中集成 MiniProfiler。请确保您的项目满足“适用环境”所列版本要求。
1️⃣ 安装 NuGet 包
dotnet add package MiniProfiler.AspNetCore.Mvc --version 5.0.2
dotnet add package MiniProfiler.EntityFrameworkCore --version 5.0.2
📌 建议使用
5.x
或更高版本,兼容 .NET 6/7/8、EF Core 6/7/8。如果未来 MiniProfiler 发布 6.x 以上大版本,也请以最新稳定版为准。
📌 若您的项目使用 EF Core 5 或 ABP v6,请访问 MiniProfiler GitHub 查询对应版本。
2️⃣ 在 MyProjectWebModule.cs
中注册
using Microsoft.Extensions.Configuration;
using StackExchange.Profiling;
using StackExchange.Profiling.Storage;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity;
using Volo.Abp.AspNetCore.Mvc;[DependsOn(typeof(AbpAspNetCoreMvcModule),typeof(AbpDynamicProxyModule) // 确保启用了动态代理
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){var services = context.Services;var configuration = context.Services.GetConfiguration();services.AddMiniProfiler(options =>{// 路由前缀,访问地址为 /profileroptions.RouteBasePath = "/profiler";options.ColorScheme = StackExchange.Profiling.ColorScheme.Auto;options.EnableServerTimingHeader = true;options.TrackConnectionOpenClose = true;// 🔐 安全控制:仅允许拥有 "Admin" 角色的用户访问options.Authorize = request =>request.HttpContext.User?.IsInRole("Admin") == true;// 👥 多用户区分:从 HttpContext.User 提取用户名options.UserProvider = request =>{var user = request.HttpContext.User;return user?.Identity?.IsAuthenticated == true? user.Identity.Name: "Anonymous";};// 💾 持久化存储(可选):将 Profiling 数据保存到 SQL Server// 请先在 appsettings.json 中添加连接字符串 "ProfilerDb"// options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);// 🔴 或者使用 Redis 存储(适合高并发、多实例环境)// options.Storage = new RedisStorage(configuration.GetConnectionString("RedisConnection"));})// EF Core 6/7/8 推荐 .AddEntityFramework(); 如果报错则改为 .AddEntityFrameworkCore().AddEntityFramework();}
}
集成流程示意图
3️⃣ 在中间件中启用(仅限开发环境)
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;public class MyProjectWebModule : AbpModule
{public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();if (env.IsDevelopment()){// ⚠️ 请务必将 UseMiniProfiler 放在 UseRouting 之前,才能捕获整个请求管道的耗时app.UseMiniProfiler();}app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseConfiguredEndpoints();}
}
💡 提示:
- 如果使用的是 ABP v6 或更早版本,请将
app.UseConfiguredEndpoints()
替换为:app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
- 确保先调用
app.UseAuthentication()
与app.UseAuthorization()
,否则HttpContext.User
中信息可能为空,影响Authorize
和UserProvider
的逻辑。
中间件流程图
三、前端页面嵌入 Profiler UI 🎨
后端功能集成完成后,需要在前端布局页插入 MiniProfiler 的渲染代码,才能看到浮窗效果。以下示例展示了 Razor Pages/MVC 与 Blazor Server 的差异。
1️⃣ Razor Pages / MVC
在 _Layout.cshtml
的末尾(即 </body>
之前)插入:
@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><title>MyProject</title><!-- … 其他头部内容 … -->
</head>
<body>@RenderBody()@* 如果当前请求中有 MiniProfiler,则渲染浮动窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}
</body>
</html>
📌 注意:
- 确保在
_ViewImports.cshtml
中添加@using StackExchange.Profiling
,否则会提示找不到MiniProfiler
。- 如果布局页与
_ViewImports.cshtml
不在同一路径,需在布局页最顶部手动引入@using StackExchange.Profiling
。
2️⃣ Blazor Server
在 _Host.cshtml
的末尾(即 </body>
之前)插入:
@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><base href="~/" /><title>MyBlazorApp</title><!-- … 其他头部内容 … -->
</head>
<body><app><component type="typeof(App)" render-mode="ServerPrerendered" /></app>@* 如果当前请求中有 MiniProfiler,则渲染浮动窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}<script src="_framework/blazor.server.js"></script>
</body>
</html>
🔔 提示:
- Blazor Server 环境下同样需要引入
@using StackExchange.Profiling
;如果未能渲染浮窗,可检查 CORS 配置是否允许跨域访问/profiler/includes.js
。
前端嵌入流程图
四、实战演示:控制器或应用服务中标记关键耗时段 ⏱️
集成并渲染 UI 后,我们可以在业务代码里手动打点,直观查看各步骤耗时。下面示例展示在应用服务(ApplicationService
)中如何妥善使用 Step
与异常处理。
using System;
using System.Threading.Tasks;
using StackExchange.Profiling;
using Volo.Abp.Application.Services;public class OrderAppService : ApplicationService
{private readonly IOrderRepository _orderRepository;public OrderAppService(IOrderRepository orderRepository){_orderRepository = orderRepository;}public async Task<OrderDto> GetAsync(Guid id){// 获取当前请求的 Profiler 实例,若在生产环境关闭则 profiler == nullvar profiler = MiniProfiler.Current;IDisposable step = null;try{// 第一层打点:🔍 查询订单数据step = profiler?.Step("🔍 查询订单数据");var order = await _orderRepository.GetAsync(id);// 第二层打点:📦 映射 Order → DTOusing (profiler?.Step("📦 映射 Order → DTO")){return ObjectMapper.Map<Order, OrderDto>(order);}}catch (Exception ex){// 在异常发生时新增一个标记,记录错误信息profiler?.Step($"❌ 查询订单数据失败: {ex.Message}");throw;}finally{// 无论成功或异常,都要关闭第一层 Stepstep?.Dispose();}}
}
🧠 建议:
- 只对关键步骤进行打点,避免在每一行都嵌套
Step
,否则 UI 层次过多、可读性下降。- 在异常处理时,要确保前面的
step?.Dispose()
能在finally
中执行,不要在捕捉异常后忘记关闭先前 Step。
五、进阶实践 🚀
1️⃣ AOP 拦截全站性能
如果不想在每个方法都手动写 Step
,可利用 ABP vNext 的动态代理拦截器,为所有应用服务或 Controller 自动打点。
自定义拦截器:MiniProfilerInterceptor
using System.Threading.Tasks;
using Castle.DynamicProxy;
using StackExchange.Profiling;public class MiniProfilerInterceptor : IAsyncInterceptor
{public async Task InterceptAsync(IInvocation invocation){var profiler = MiniProfiler.Current;using (profiler?.Step($"[Profiling] {invocation.TargetType.Name}.{invocation.Method.Name}")){await invocation.ProceedAsync();}}// 如果还需要拦截同步方法,可实现 IInterceptor:// public void Intercept(IInvocation invocation) { … }
}
注册拦截器并应用(示例:拦截所有应用服务)
using Volo.Abp;
using Volo.Abp.Modularity;
using Volo.Abp.DynamicProxy;[DependsOn(typeof(AbpDynamicProxyModule) // 确保动态代理功能可用
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// … 前面已有 MiniProfiler 注册代码 …// 1. 注册拦截器到依赖注入容器context.Services.AddTransient<MiniProfilerInterceptor>();// 2. 配置动态代理:拦截所有继承自 ApplicationService 的类方法Configure<AbpDynamicProxyOptions>(options =>{options.Interceptors.Add<MiniProfilerInterceptor>(Predicates.ForService(type =>type.IsAssignableTo<AbpApplicationService>()));});// 如果要拦截 MVC Controller,也可使用:// Configure<AbpAspNetCoreMvcOptions>(options =>// {// options.ConventionalControllers.Interceptors.AddService<MiniProfilerInterceptor>();// });}
}
✅ 这样,所有继承
ApplicationService
的服务方法都会被 Profiler 自动包裹,无需手动在每个方法中写Step
。💡 如果只想拦截某个特定命名空间的应用服务,可在
Predicates.ForService(...)
中提供更精准的匹配条件,例如:Predicates.ForService(type => type.Namespace.Contains("MyProject.Application.Orders"))
AOP 拦截流程图
2️⃣ HttpClient 自动打点
在分布式或微服务场景下,调用第三方 API 也可能成为瓶颈。MiniProfiler 支持在 HttpClient
上自动打点。以下示例展示如何配置带打点功能的 HttpClient
。
using Microsoft.Extensions.DependencyInjection;
using StackExchange.Profiling;
using StackExchange.Profiling.Http;// 在 ConfigureServices 中:
services.AddHttpClient("ThirdParty")// 使用 ProfilingHandler 自动捕获 HttpClient 请求耗时.AddHttpMessageHandler(() => new ProfilingHandler(new HttpClientHandler()));// 在应用服务或 Controller 中注入 IHttpClientFactory:
public class ExternalService : IExternalService
{private readonly IHttpClientFactory _httpClientFactory;public ExternalService(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}public async Task<string> GetExternalDataAsync(){var client = _httpClientFactory.CreateClient("ThirdParty");// 此次请求将被 Profiler 记录var response = await client.GetAsync("https://api.example.com/data");return await response.Content.ReadAsStringAsync();}
}
HttpClient 打点流程图
3️⃣ 健康检查接口打点
如果项目有健康检查(Health Checks)端点,也可以为其打点,帮助监控该接口的执行耗时。
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using StackExchange.Profiling;
using System.Threading.Tasks;[ApiController]
[Route("api/health")]
public class HealthController : ControllerBase
{private readonly HealthCheckService _healthCheckService;public HealthController(HealthCheckService healthCheckService){_healthCheckService = healthCheckService;}[HttpGet]public async Task<HealthReport> CheckAsync(){// 为健康检查整体逻辑打点using (MiniProfiler.Current?.Step("Health Check")){return await _healthCheckService.CheckHealthAsync();}}
}
健康检查打点流程图
六、安全与生产建议 🔒
场景 | 建议与示例 |
---|---|
生产环境 | - 禁止启用 app.UseMiniProfiler() ,避免将 SQL、堆栈信息暴露给最终用户。- 持久化存储:使用 options.Storage 将 Profiling 数据保存到数据库/Redis,然后离线分析。例如:csharp<br/>options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);<br/> |
多用户区分 | - 配置 options.UserProvider ,让不同用户的 Profiling 数据能单独查看。例如:csharp<br/>options.UserProvider = request =><br/>{<br/> var user = request.HttpContext.User;<br/> return user?.Identity?.IsAuthenticated == true<br/> ? user.Identity.Name<br/> : "Anonymous";<br/>};<br/> |
认证保护 | - 设置 options.Authorize = request => request.HttpContext.User.IsInRole("PerfAdmin"); 限制只有“PerfAdmin”角色可访问 /profiler 路由。- 注意:务必先在管道中调用 app.UseAuthentication() 与 app.UseAuthorization() ,否则 HttpContext.User 可能为空。 |
路由隐藏 | - 修改默认路由前缀:options.RouteBasePath = "/internal/profiler"; 。- 在 Nginx/IIS 层做 IP 白名单,仅允许公司内网访问。例如: nginx<br/>location /internal/profiler {<br/> allow 192.168.1.0/24;<br/> deny all;<br/> proxy_pass http://localhost:5000/internal/profiler;<br/>}<br/> |
跨域场景 | - 若前后端分离(UI 与 API 跨域),需在 API 项目中配置 CORS 以允许加载 Profiler 脚本。例如:csharp<br/>services.AddCors(options =><br/>{<br/> options.AddPolicy("AllowProfiler", builder =><br/> {<br/> builder.WithOrigins("http://localhost:5001")<br/> .AllowAnyHeader()<br/> .AllowAnyMethod()<br/> .AllowCredentials();<br/> });<br/>});<br/>app.UseCors("AllowProfiler");<br/> |
健康检查 | - 如果健康检查接口需监控耗时,可在 Controller 中添加 using (MiniProfiler.Current?.Step("Health Check")) { … } ,便于快速定位健康检查性能瓶颈。 |
🔒 提示:
- 在生产环境仅保留“持久化存储”功能,关闭浮动窗口和即时展示,避免敏感信息泄露。
- 确保在
Program.cs
或Startup.cs
中先调用app.UseAuthentication()
、app.UseAuthorization()
,再调用app.UseMiniProfiler()
(开发环境)或app.UseCors()
。
七、示例项目与复现方式 🏗️
以下示例仓库演示了如何在 ABP 项目中完整集成 MiniProfiler,涵盖开发环境打点、AOP 拦截、HttpClient 打点、持久化存储、健康检查打点等功能。
abp-miniprofiler-demo/
├── src/
│ ├── MyProject.Web/ # Web 层(含 MiniProfiler 注册、中间件、UI、CORS)
│ ├── MyProject.Application/ # 应用服务层(示例 OrderAppService、ExternalService、HealthController)
│ ├── MyProject.EntityFrameworkCore/ # EF Core 层(DbContext、Migration、配置 ProfilerDb)
│ └── MyProject.Domain/ # 领域层(聚合、实体)
├── profiler-ui.png # Profiler UI 截图示例
├── README.md # 快速启动说明
└── appsettings.json # 包含 ProfilerDb、RedisConnection、CORS Origins 等配置
快速启动步骤
- 配置数据库
- 打开
appsettings.json
,在"ConnectionStrings"
节点中填入:
- 打开
"ConnectionStrings": {"Default": "Server=.;Database=MyProjectDb;Trusted_Connection=True;","ProfilerDb": "Server=.;Database=ProfilerDb;Trusted_Connection=True;","RedisConnection": "localhost:6379"}
- 如果您使用 SQLite、MySQL 或 PostgreSQL,可在
MyProject.EntityFrameworkCore
的DbContext
配置中修改UseSqlServer
为对应方法,例如UseSqlite
、UseMySql
、UseNpgsql
。
- 运行数据库迁移
dotnet tool install --global dotnet-ef # 如果尚未安装dotnet ef migrations add InitialCreate --project src/MyProject.EntityFrameworkCoredotnet ef database update --project src/MyProject.EntityFrameworkCore
如果使用 Redis 存储 Profiler 数据,请确保本地或容器中已启动 Redis,例如:
docker run -d --name redis -p 6379:6379 redis
- 恢复依赖并运行项目
dotnet restoredotnet run --project src/MyProject.Web
- 访问应用并查看 Profiler
- 浏览器打开:
http://localhost:5000
- 在页面右下角会出现 MiniProfiler 浮窗,点击即可展开 Profiling 详情,包括:
- 请求链路总耗时
- EF Core SQL 查询耗时与详细信息
- HttpClient 调用耗时
- 健康检查接口耗时
- 如果配置了持久化存储,可登录后台管理页面或直接查询
ProfilerDb
数据库中的MiniProfilers
表,离线分析历史数据。
- 浏览器打开:
🔍 线上对比:
- MiniProfiler 适用于“开发/测试环境”快速定位性能瓶颈。
- 生产环境若想做全面链路追踪,可结合 Elastic APM、Application Insights 等 APM 平台。
- 生产环境仅保留“持久化存储”功能,关闭浮动窗口和即时展示,避免敏感信息泄露。
✅ 强烈建议:在所有 ABP 项目中默认集成 MiniProfiler,并按需启用 AOP 打点与 HttpClient 自动打点,让性能瓶颈无处藏身!
🔗 更多资源:
- MiniProfiler 官方文档:https://miniprofiler.com/dotnet/
- ABP vNext 官方指南:https://docs.abp.io/
相关文章:
性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 📚 目录 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler? 🧐二、集成 MiniProf…...

React 基础入门笔记
一、JSX语法规则 1. 定义虚拟DOM时,不要写引号 2.标签中混入JS表达式时要用 {} (1).JS表达式与JS语句(代码)的区别 (2).使用案例 3.样式的类名指定不要用class,要用className 4.内…...
C++.OpenGL (12/64)光照贴图(Lightmaps)
光照贴图(Lightmaps) 静态光照烘焙技术 #mermaid-svg-1vJKLLr1zSCp1ASH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-icon{fill:#552222;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-text…...

压测软件-Jmeter
1 下载和安装 1.1 检查运行环境 Jmeter需要运行在java环境(JRE 或 JDK)中 在window的"命令提示窗"查看安装的java版本: java -version 1.2 下载Jmeter 从Apache官网下载Jmeter安装包 1.3 解压和运行 解压后,进入bin文件夹,双击jmeter.bat即可…...
Linux 常用命令语法总结
Linux 常用命令语法总结 1. 文件和目录操作 1.1 基本文件操作 # 列出文件和目录 ls # 列出当前目录内容 ls -l # 详细列表格式 ls -la # 显示隐藏文件 ls -lh # 人性化显示文件大小 ls...
青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统
青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统 一、UNIX的历史沿革二、UNIX系统架构三、UNIX主要特性四、UNIX分支与变种五、UNIX设计哲学六、UNIX的影响与遗产 **摘要:**UNIX操作系统是现代计算领域最具影响力的操作系统之一,其设计哲学和技术…...

NLP学习路线图(三十):微调策略
在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…...

leetcode刷题日记——1.组合总和
解答: class Solution { public:void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {if(idxcandidates.size()){//遍历完的边界return;}if(target0){//找完了能组成和…...

关于单片机的基础知识(一)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片机基础知识的相关内容…...
Python训练营打卡Day45
知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorbo…...

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用
一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构,用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示,ICAP原语可实现flash中n1各版本的动态切换,在工作过程中,可以通过IPROG命令切…...

Redis专题-基础篇
题记 本文涵盖了Redis的各种数据结构和命令,Redis的各种常见Java客户端的应用和最佳实践 jedis案例github地址:https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址:https://github.com/whltaoin/springbootData…...

springMVC-11 中文乱码处理
前言 本文介绍了springMVC中文乱码的解决方案,同时也贴出了本人遇到过的其他乱码情况,可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法,通过javaW…...

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程
前言 越狱iPhone之后,一定记得安装一下用于屏蔽更新的描述文件(可使用爱思助手) 因为即便关闭了自动更新,iPhone仍会在某些时候自动更新系统,导致越狱失效;更为严重的是,更新后的iOS版本可能是…...
MongoDB检查慢查询db.system.profile.find 分析各参数的作用
db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...

智能标志桩图像监测装置如何守护地下电缆安全
在现代城市基础设施建设中,大量电缆、管道被埋设于地下,这虽然美化了城市景观,却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响,都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅
在做 SEO 优化时,除了前一篇提过的Title之外,meta 信息(通常指 <meta> 标签)也是最基础、最重要的内容之一,主要包括: <meta name="description"> <meta name="keywords"> 搜索引擎重点参考这些信息,决定你网页的展示效果与排名。…...

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头,1是第二个摄像头,传递视频文件路径也可以 …...
elasticsearch基本操作笔记
1.通过kibana查看elasticsearch版本信息 a.左上角三道横->Management->Dev Tools b.GET / 执行 c.执行结果 { “name” : “xxxx”, “cluster_name” : “xxxxxxx”, “cluster_uuid” : “vl1UudAoQp-aHWAzyPoMyw”, “version” : { “number” : “7.15.1”, “build…...
LVGL手势识别事件无上报问题处理记录
最近在使用LVGL8.3开源库开源UI界面时,碰到使用FB驱动显示UI时,触摸屏手势识别事件接收不到的情况,通过如下调整可以处理该问题: 1、创建Top Object时,不能使用如下语句: lv_obj_t *page_obj = lv_obj_create(lv_scr_act()); 而要使用如下语句: lv_obj_t *page_obj =…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门
第一篇:MIPI CSI-2基础入门 1. 为什么需要CSI-2? 痛点场景对比 (用生活案例降低理解门槛) 传统并行接口CSI-2接口30根线传输720P图像仅需5根线(1对CLK4对DATA)线距>5cm时出现重影线缆可长达1…...

变幻莫测:CoreData 中 Transformable 类型面面俱到(一)
概述 各位似秃似不秃小码农们都知道,在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过,大家是否知道在 CoreData 中还存在一个 Transfo…...

开源技术驱动下的上市公司财务主数据管理实践
开源技术驱动下的上市公司财务主数据管理实践 —— 以人造板制造业为例 引言:财务主数据的战略价值与行业挑战 在资本市场监管日益严格与企业数字化转型的双重驱动下,财务主数据已成为上市公司财务治理的核心基础设施。对于人造板制造业而言࿰…...
婚恋小程序直播系统框架搭建
逻辑分析 直播流管理:需要处理主播端的直播流推送,确保直播流能够稳定、高效地传输到各个观看用户的设备上。这涉及到选择合适的流媒体协议,如 RTMP(Real-Time Messaging Protocol)、HLS(HTTP Live Streami…...
day46 python预训练模型补充
目录 一、预训练模型的背景知识 二、实验过程 (一)实验环境与数据准备 (二)预训练模型的选择与适配 (三)训练策略 三、实验结果与分析 四、学习总结与展望 一、预训练模型的背景知识 在传统的神经网…...
CCPC chongqing 2025 H
题目链接:https://codeforces.com/gym/105887 题目背景: 方框上有上下两排小球,下面的紧贴框底,上面的部分贴框顶,每牌小球上都有一个一个数字(1~n),将相同的小球连接到一起,是否在不交叉的情况…...

Java建造者模式(Builder Pattern)详解与实践
一、引言 在软件开发中,我们经常会遇到需要创建复杂对象的场景。例如,构建一个包含多个可选参数的对象时,传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时,建造者模式(Builder Pattern)便成为…...
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
目录 一、问题 二、解决方法 三、总结 一、问题 1.代码里有一个基于ant封装的公共组件数字输入框,测试突然说 无效了,输入其他字符也会显示;改了只有又发现某些 输入法 需要连续输入两次 才能显示出来。 二、解决方法 1.就离谱࿰…...
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型,修改依赖为: from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单,主要是两个接口。 db.create_all(True) #创建所有模型的表…...
【win | 自动更新关闭】win11
利用本地组策略编辑器 对于Windows 11专业版或更高版本的用户,可以利用本地组策略编辑器来完全关闭自动更新。按下“WinR”键,输入“gpedit.msc”并回车。在本地组策略编辑器中,依次展开“计算机配置”>“管理模板”>“Windows组件”&…...