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

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题

我学习Blazor的顺序是基于Blazor University,然后实际内容不完全基于它,因为它的例子还是基于.NET Core 3.1做的,距离现在很遥远了。

截至本文撰写的时间,2025年,最新的.NET是.NET9了都,可能10也快了。我发现有些它上面说的例子其实现在都不一定能运行了,我结合Deep Seek和其他几家人工智能辅助的情况下,进行Blazor的学习,基于原来的教程,并补充了一些我好奇的部分,结合人工智能给我的教学,掌握blazor的核心知识。

我是冗长你不爱看的目录

  • 我是大标题
    • 组件与布局
    • 单向绑定和双向绑定
      • 单向绑定
      • 访问HTML元素的DOM事件
      • 双向绑定
    • 组件之间的参数传递
    • Blazor所支持的指令
    • Blazor的属性与属性展开Attribute Splatting
    • 如何捕获了未在组件中显式定义的属性CaptureUnmatchedValues
    • Blazor的变量生命期
    • Blazor的多线程与InvokeAsync
      • 同步初始化
      • 异步初始化
      • ConfigureAwait(continueOnCapturedContext: bool)方法
      • InvokeAsync
    • Blazor的虚拟DOM功能
    • Blazor的@key关键字
    • Blazor的RenderFragments模板化
    • Blazor的路由功能
    • Blazor的表单功能
    • Blazor的组件库
    • Blazor下的.NET和JS互操作
    • Blazor下的DI依赖注入

组件与布局

首先什么是布局,就是页面的模板
创建自己的模板需要

  • 使用razor语法,@inherits LayoutComponentBase
    然后一般的会基于一个已有的布局来做,如果这样的话就需要再写一句

@layout [其他布局]

例如这样
在这里插入图片描述
基于MainLayout创建一个叫Admin的布局。
然后如何使用自定义的布局到具体的页面呢

  • 大批量的,通过_Imports.razor,在指定文件夹下的所有布局都会按照_Imports.razor来处理,就是这个razor文件放在哪个文件夹下,哪个文件夹下的razor都会按照这个_Imports.razor来渲染
  • 小量的,直接就写@layout [你的布局]

如图所示,这样写Admin下面的razor都会按_Import的布局来渲染了
在这里插入图片描述
组件如果需要交互的话,需要在最前面加@rendermode InteractiveServer
这里我默认都是用服务器模式的Blazor

单向绑定和双向绑定

单向绑定

单向绑定就是C#->前端的意思
只需要把需要绑定的对象写一个[Parameter]属性,然后修改为public属性,在前端区域就可以使用@符号进行访问了
比如这样
在这里插入图片描述

访问HTML元素的DOM事件

对于像是button这类存在DOM的HTML元素,可以通过@onxxxx来访问其DOM事件,之后就可以和C#进行联动了,或者直接通过lambda表达式。某些事件还具备属性,只需要通过@onxxxx:yyyy进行更细致的控制。
联动C#区域代码
在这里插入图片描述
原地直接lambda表达式
在这里插入图片描述
访问某些事件更细化的属性功能【譬如这里的stopPropagation】
在这里插入图片描述
这个的作用就是让事件停止冒泡传递了,就停在button这一级了。

单向绑定的总结[来自AI]

单向绑定,这样写外部初始化这个Razor组件的时候就必须要传入一个参数,然后传入的参数就会投射到前端区域
在Blazor中,组件如何解释我们传递的值取决于我们正在设置的[Parameter]的类型,以及我们是否通过使用@符号明确表达了我们的意图。

关于[Parameter]属性:
在Blazor组件中,当你想要从父组件接收数据时,你会在子组件的代码中定义一个带有[Parameter]特性的属性。这个特性告诉Blazor这是一个可以从外部传递进来的值。

关于值的传递和解释:
当你向组件传递一个简单类型的值(如整数、字符串、布尔值)时,Blazor会根据属性的类型自动进行值的转换和绑定。例如,如果你传递了一个字符串给一个类型为string的[Parameter]属性,Blazor会直接将这个字符串值赋给该属性。
对于复杂类型的值(如对象、委托Func、事件处理程序等),Blazor同样会根据属性的类型进行绑定,但这里可能需要更多的考虑,比如对象的生命周期管理、委托的调用上下文等。

关于@符号的使用:
在Blazor的Razor语法中,@符号通常用于标记代码表达式。当你在HTML标记中嵌入C#代码时,你需要使用@符号来告诉Razor引擎这是一个代码块或表达式。
但是,在传递参数给组件时,@符号的使用并不是直接相关的。更常见的是,你会在父组件的Razor标记中直接使用属性名来传递值,而不需要额外的@符号(除非你是在传递一个代码表达式的结果作为值)。例如:。
有一点需要注意:如果你在传递参数时使用了绑定表达式(例如,绑定到一个组件的状态或父组件的状态),那么你可能需要使用@bind指令或@bind-Value(取决于属性的命名)来实现双向绑定。但即使在这种情况下,@符号也是用于标记绑定表达式本身,而不是用于标记参数属性。总结来说,Blazor如何解释传递给组件的值主要取决于[Parameter]属性的类型以及你传递值的方式(直接值、绑定表达式等)。@符号在Razor语法中用于标记代码表达式,但在传递参数时通常不是直接相关的,除非你在值中使用了代码表达式。

Blazor 在传递参数时,会根据目标参数的类型推断传递的值。
对于布尔、数字等非字符串类型,Blazor 会将字符串字面量推断为相应的表达式。
对于字符串类型,Blazor 会直接传递字符串值,而不会进行推断。
这种推断机制使得代码更简洁,同时确保类型安全。

双向绑定

双向绑定就是实现数据在前端区域和C#区域双向传递
通过@bind和@bind-value来实现

特性@bind@bind-value
语法简洁性更简洁,适合大多数场景更显式,适合复杂场景
默认绑定属性自动绑定到 value 属性显式绑定到 value 属性
默认事件默认绑定到 onchange 事件需要显式指定事件(如 oninput)
适用场景普通 HTML 元素或简单组件自定义组件或需要显式控制的场景
灵活性较低,适合简单绑定较高,适合需要精细控制的场景

这里我们看下面这个例子,涵盖了双向绑定的各种情况
简单说就是懒的话,直接@bind,想精细点就@bind-value,毕竟牛逼
在这里插入图片描述

组件之间的参数传递

组件之间传递参数,可以通过将需要传递的组件通过[Parameter]暴露出去给父级组件来访问或者通过CascadingParameter来级联传递。
这里重点说CascadingParameter
它有两种模式

  • 通过“名字”来让子组件索引自己要的信息
  • 通过类型自动检索自己要的信息

先说“名字”索引
父组件想传递两个信息到子组件
在这里插入图片描述
传递的时候就这样套娃写,CascadingValue,然后指定传递的变量,然后给要传递的变量取一个“名字”,然后最后子组件就写在最内层就完了【我这里子组件叫CascadingChild】
子组件是这样的
在这里插入图片描述
在子组件里头需要用一个变量来接传递进来的参数
写一个属性CascadingParameter,然后指定好取的名字就可以接收到上层传递进来的参数了

基于类型的参数传递
父组件
我这里整了个复杂的类对象来传递,让子组件自动推断,类似于上面用“名字”来索引
在这里插入图片描述
子组件
在这里插入图片描述
最后再说下按“名字”传递的特殊情况-覆写

框架在按照名字进行索引的时候,会出现级联传递的名字一样的情况,这种情况下就会发生在传递过程中的覆写问题,框架并不禁止这种行为,可以在过程中组件将上一级传递的值修改,然后再往下传递。

父组件
在这里插入图片描述
子组件
这里就出现了子组件往更下一级的孙组件传递同样名字的参数,这个时候框架不禁止这种行为,可以自行修改变量的值,再往下传递。
在这里插入图片描述
孙组件
在这里插入图片描述

Blazor所支持的指令

类别关键字/用法
控制流@if、@else、@switch、@for、@foreach、@while
代码块@{ … }
表达式@变量、@(表达式)
HTML 辅助方法@Html.Raw、@Html.ActionLink、@Html.Partial
注释@* … *@
模型和视图数据@model、@using、@inherits
布局和部分视图@section、@RenderBody、@RenderSection
函数和属性@functions
Razor Pages@page
异步编程@await
依赖注入@inject
标签助手@addTagHelper、
URL 和路径@Url.Action、@Url.Content
表单和验证@Html.BeginForm、@Html.ValidationSummary、@Html.ValidationMessageFor
组件渲染@(await Html.RenderComponentAsync)
动态属性<div class=“@(isActive ? “active” : “inactive”)”>
全局指令@namespace、@attribute
转义字符@@
自定义指令通过自定义 Razor 引擎或标签助手实现

控制流语句
@if、@else、@else if:条件判断。

@switch、@case、@default:多条件分支。

@for、@foreach、@while:循环语句。

代码块
@{ … }:定义多行C#代码块。

表达式
@变量:直接输出变量。

@(表达式):输出表达式的结果。

HTML辅助方法
@Html.Raw:输出未编码的HTML。

@Html.ActionLink:生成超链接。

@Html.Partial、@Html.RenderPartial:渲染部分视图。

注释
@* … *@:Razor注释。

模型和视图数据
@model:定义视图的强类型模型。

@using:引入命名空间。

@inherits:指定视图继承的基类。

布局和部分视图
@section:定义布局中的占位符内容。

@RenderBody():在布局页面中渲染主体内容。

@RenderSection:在布局页面中渲染特定部分。

函数和属性
@functions:定义视图中的函数或属性。

Razor Pages
@page:定义Razor页面的路由。

三元运算符
@(条件 ? “True” : “False”):条件化输出。

Lambda表达式
@{ Func<int, string> 函数名 = (参数) => “返回值”; }:定义和使用Lambda表达式。

其他
@await:用于异步操作。

Blazor的属性与属性展开Attribute Splatting

属性这个和前端部分联系比较紧密。
对于HTML组件来说,他们一般会有一些“键-值对”构成了属性描述
譬如举一个例子,可能某一个按钮有这些属性

属性名
classbtn btn-primary
stylecolor:red;
disabletrue
data-custom123

按照既有的理解,开发人员就直接在前端部分写HTML标签写这些玩意进去了。但是在Blazor框架下,这个可以通过C#的字典来定义,然后传递给前端HTML部分,这个就叫做属性了。就很方便可以动态在C#代码区修改属性
譬如我定义一个键值对属性字典
在这里插入图片描述
我把它给一个按钮附上
在这里插入图片描述
这样渲染的时候,框架就会把我希望的属性渲染给这个按钮
就是通过这个@attributes 来实现
这里就会引申出另一个问题,如果我HTML对象就本身存在了一些既有的键值对属性了,怎么处理呢,就要引出CaptureUnmatchedValues了。

来自AI的解读
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何捕获了未在组件中显式定义的属性CaptureUnmatchedValues

譬如我这里有一个组件CaptureUnmatchedValues
在这里插入图片描述
通过CaptureUnmatchedValues属性,配合一个键值对字典变量来接收外部传递进来的“属性”,接收没有显式定义的属性
外部我是这样写的
在这里插入图片描述
我在外部既有已经写了一个字体大小的属性,和内部显式定义的属性是重复的,这种时候就会按内部显式定义的属性来渲染,虽然这个组件也接收了来自外部的属性。
在这里插入图片描述
如果我把显式定义删掉
在这里插入图片描述
这样写,运行的效果这个按钮的字体大小就是10px了
在这里插入图片描述

来自AI的总结
在这里插入图片描述
在这里插入图片描述

Blazor的变量生命期

这里我让AI总结了下微软文档中关于【ASP.NET Core Razor组件生命周期】这篇文档的内容
就是每个组件自带的这些方法的执行顺序要小心,有很多坑
在这里插入图片描述
这部分就是理论性比较强,就没有去具体做些例子来试了,只能说是日后遇到用到的情况具体问题具体分析了。

Blazor的多线程与InvokeAsync

我先问了问AI,Blazor里的多线程和普通C#的多线程的区别
Blazor的多线程

  1. UI线程的限制:
    在Blazor中,特别是Blazor WebAssembly应用程序中,所有的UI更新和事件处理都是在浏览器的UI线程上执行的。这意味着,如果开发者在Blazor中启动了一个异步操作(如使用Task.Run或await Task.Delay等),并且这个操作需要在UI线程上继续执行(如更新UI元素),那么就需要确保这个操作在完成后能够正确地返回到UI线程上。
    为了实现这一点,Blazor通常会使用ConfigureAwait(true)来确保异步操作在完成后能够返回到捕获的同步上下文(即UI线程)上
    然而,这也可能导致性能问题,因为频繁的上下文切换会增加额外的开销。
  2. 线程安全性的考虑:
    在Blazor中,由于UI线程的限制,开发者需要更加谨慎地处理线程安全问题。例如,当多个线程尝试同时访问或修改共享资源时,就需要使用适当的同步机制(如锁、信号量等)来避免竞态条件和死锁等问题。此外,由于Blazor运行在浏览器中,因此还需要考虑跨线程通信的问题。例如,如果需要在非UI线程上执行某些操作,并且这些操作的结果需要更新到UI上,那么就需要使用适当的方法(如通过消息传递或事件机制)来将结果传递回UI线程。
  3. Blazor Server的特殊性:
    值得注意的是,Blazor Server的运行环境与Blazor WebAssembly有所不同。
    在Blazor Server中,应用程序实际上是在服务器上运行的,而UI更新则是通过SignalR连接实时回传给客户端的。这意味着在Blazor Server中,多线程的使用可能更加复杂。
    因为开发者需要处理服务器和客户端之间的通信、状态同步等问题。同时,由于服务器上的代码可以访问完整的.NET Core运行时支持,因此也可以使用更高级的多线程和并行编程技术来提高性能。

普通C#程序

C#提供了多种实现多线程的方式,如使用Thread类、ThreadPool类、Task类以及Parallel类等。这些类和方法允许开发者创建和控制线程,以实现并行执行多个任务。在普通C#程序中,多线程的访问和操作通常不会受到特定的框架或运行环境的限制。开发者可以自由地在线程之间共享数据、进行同步和通信等操作。然而,这也需要开发者自行处理线程安全问题,如避免竞态条件、死锁等问题。

这里先通过两种不同的初始化-同步初始化vs异步初始化,来体验下初探下多线程,然后再说一说InvokeAsync。

同步初始化

在这里插入图片描述
这里重写了OnInitialized方法,里面获取当前线程的管理线程ID。
然后外层父组件是通过一个for循环调用了5次这个组件
在这里插入图片描述
运行的效果就是这5个组件均会输出同一个管理线程的ID
在这里插入图片描述
然后我再问了AI关于这个的理解。
输出结果取决于以下因素:
情况 1:纯同步调用

如果父组件自身是完全同步的(例如没有 async 方法或 await):
所有子组件的 OnInitialized 会由同一个线程连续执行
输出的 IdThread 相同
这是因为同步代码会阻塞当前线程,直到所有子组件初始化完成。

情况 2:异步父组件

如果父组件包含异步逻辑(如 OnInitializedAsync):
可能在初始化过程中发生线程切换
子组件的 IdThread 可能不同(但未必一定会不同)

异步初始化

做一个异步初始化的代码,试一下,外层也是类似的for循环调用5次
在这里插入图片描述
在这里插入图片描述
出现了一些不同的线程ID了
输出的线程 ID 大概率会不同,因为异步操作可能导致线程切换。

ConfigureAwait(continueOnCapturedContext: bool)方法

这里再引申出另一个有关系的知识点-ConfigureAwait
实际上在异步初始化这里,我们的初始化是可以设置一个参数来控制线程控制权后面的归属的。
就是这个ConfigureAwait(continueOnCapturedContext: bool)方法。

用于指定在等待异步操作完成后,是否应该尝试将控制权返回给捕获的同步上下文(如果存在的话)。在这个上下文中,“捕获的同步上下文”通常指的是最初启动异步操作的上下文,比如ASP.NET Core的请求上下文或Blazor的UI线程

设置为true设置为false
框架默认的行为是true,await 操作完成后,控制权将尝试返回给捕获的同步上下文。在Blazor中,这意味着如果异步操作是在UI线程上启动的,那么后续的操作也会尝试在UI线程上执行,以确保对UI元素的访问是线程安全的await 操作完成后,控制权不会返回给捕获的同步上下文,而是继续在当前可用的线程池线程上执行。这可以提高性能,因为它避免了不必要的上下文切换,但你必须小心确保不在错误的线程上访问UI元素
推荐的做法,保证UI访问的线程安全不涉及UI的后台操作,使用false可以提高性能和响应
1. 需要操作 UI 组件(如更新 @currentCount)2. 访问 HttpContext(在 ASP.NET Core 中)3.使用 Blazor 的 JS 互操作(IJSRuntime.InvokeAsync)1. 通用类库代码(不依赖具体上下文)2. 纯后台任务(如日志记录、数据处理)3. 长时间运行的 CPU 密集型操作(避免阻塞 UI 线程)

这里我们做一个测试

打印异步之前的线程ID,和不同设置下异步之后的线程ID
在这里插入图片描述
在这里插入图片描述
当使用await关键字时,默认情况下,它会捕获当前的同步上下文(在Blazor Server中,这通常是ASP.NET Core的同步上下文),并在异步操作完成后尝试回到这个上下文。这是为了确保像UI更新这样的操作能在正确的上下文中执行。在异步操作完成后,应该尝试回到原来的同步上下文。在Blazor Server中,这意味着回到处理该SignalR消息的线程或与之相关的线程。由于线程池的工作方式,这个“原来的线程”可能并不是实际开始执行异步操作的那个线程。因此,你看到的线程ID不同,是因为在await之后,代码可能是在线程池中的另一个线程上执行的,但这个线程被调度回来执行后续的代码,以确保它运行在正确的同步上下文中。所以线程ID会不一样。

如果是false的情况下
在这里插入图片描述
await之后它去到另一个线程ID了,没有回到之前的线程ID
在这里插入图片描述

InvokeAsync

Blazor的虚拟DOM功能

Blazor的@key关键字

Blazor的RenderFragments模板化

Blazor的路由功能

Blazor的表单功能

Blazor的组件库

Blazor下的.NET和JS互操作

Blazor下的DI依赖注入

相关文章:

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University&#xff0c;然后实际内容不完全基于它&#xff0c;因为它的例子还是基于.NET Core 3.1做的&#xff0c;距离现在很遥远了。 截至本文撰写的时间&#xff0c;2025年&#xff0c;最新的.NET是.NET9了都&#xff0c;可能1…...

C++11中的bind

官方文档对于bind接口的概述解释&#xff1a;Bind function arguments 在C11中&#xff0c;std::bind 是一个非常有用的工具&#xff0c;用于将函数、成员函数或函数对象与特定的参数绑定在一起&#xff0c;生成一个新的可调用对象。std::bind 可以用于部分应用函数参数、改变…...

llama.cpp的C语言API使用

我们知道&#xff0c;一般运行大语言模型都是在Python上运行的&#xff0c;可是Python的性能太差了&#xff0c;不适合用于生产环境&#xff0c;因此可以采用llama.cpp提供的API在C语言上运行大模型。 llama.cpp的下载 Windows下的下载 我们需要下载llama.cpp的两个部分&…...

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…...

基于 docker 的mysql 5.7 主备集群搭建

创建挂载目录和配置文件 主节点 mkdir -p /mysql_master/mysql/log mkdir -p /mysql_master/mysql/data mkdir -p /mysql_master/mysql/conf vim /mysql_master/mysql/conf/my.cnf[mysqld] datadir/var/lib/mysql #MySQL 数据库文件存放路径 server_id 1 #指定数据库服务器的…...

金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行

金山打字游戏2010绿色版&#xff0c;Win7-11可用DxWnd完美运行 链接&#xff1a;https://pan.xunlei.com/s/VOIAYCzmkbDfdASGJa_uLjquA1?pwd67vw# 进入游戏后&#xff0c;如果输入不了英文字母&#xff08;很可能是中文输入状态&#xff09;&#xff0c;就按一下“Shift”键…...

爬虫学习笔记之Robots协议相关整理

定义 Robots协议也称作爬虫协议、机器人协议&#xff0c;全名为网络爬虫排除标准&#xff0c;用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件&#xff0c;一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…...

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…...

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…...

25.02.04 《CLR via C#》 笔记14

第二十一章 托管堆和垃圾回收 内存分配过程 CLR维护一个“下一次分配指针”&#xff08;NextObjPtr&#xff09;&#xff0c;指向当前托管堆中第一个可用的内存地址 计算类型所需的字节数&#xff0c;加上对象开销&#xff08;类型对象指针、同步块索引&#xff09;所需字节数…...

day8-面向对象

目录 面向对象1、面向对象介绍2、类和对象类和对象类的几个补充注意事项 3、封装 面向对象 1、面向对象介绍 ⭐️面向对象介绍&#xff1a; 面向&#xff1a;拿、找对象&#xff1a;能干活的东西面向对象编程&#xff1a;拿东西过来做对应的事情 面向对象编程的例子&#x…...

Pyside6 的QObject 类

PySide6 中的 QObject 是 Qt 框架的核心基类&#xff0c;所有需要信号与槽、事件处理、内存管理的对象均需要继承自它。以下是关于 QObject 的详细说明&#xff0c;从功能、关键特性到实际代码示例进行阐述&#xff1a; 1. 核心功能 QObject 提供了以下基本能力&#xff1a; …...

【Java】位图 布隆过滤器

位图 初识位图 位图, 实际上就是将二进制位作为哈希表的一个个哈希桶的数据结构, 由于二进制位只能表示 0 和 1, 因此通常用于表示数据是否存在. 如下图所示, 这个位图就用于标识 0 ~ 14 中有什么数字存在 可以看到, 我们这里相当于是把下标作为了 key-value 的一员. 但是这…...

基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要

前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…...

【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用

文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页&#xff1a;道友老…...

红黑树的封装

一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器&#xff0c;map set 暴露出的接口都不是自己写的&#xff0c;而是红黑树写的&#xff0c;外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口&#xff0c;再在上层的…...

巧用 Cursor+Coze,轻松简化小程序开发

一、为啥要用 Cursor+Coze 简化小程序开发 家人们,如今小程序简直火出圈啦!不管你是电商从业者,还是服务行业的工作者,又或是自媒体运营者,拥有一个小程序,就相当于给业务插上了腾飞的翅膀,能带来更多的流量和机会。但是,小程序开发的过程,那可真是充满了挑战。从最开…...

如何获取sql数据中时间的月份、年份(类型为date)

可用自带的函数month来实现 如&#xff1a; 创建表及插入数据&#xff1a; create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份&#xff1a; select MONTH(begindate)…...

NSSCTF Pwn [NISACTF 2022]ezpie 题解

下载 exeinfo checksec 32位 NX PIE开启 查看main函数&#xff1a; 后门函数&#xff1a; 发现已经给出了main函数地址 因为开启了PIE 所以IDA中 后门函数减去main函数的后三位就是偏移 给出的函数加上这个数就是后门函数地址 exp&#xff1a; from pwn import *p remote(…...

数据结构与算法——二分查找

二分查找算法常用于在具有单调性的数组中&#xff0c;以logn的时间复杂度快速查找某个目标值是否存在于该数组中&#xff0c;如果存在还能够返回目标值在数组中的索引下标&#xff0c;常见的二分查找算法有开区间写法、半开区间写法以及闭区间写法&#xff0c;这三种写法的区别…...

【01】共识机制

BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒&#xff0c;却要保证进攻一致&#xff0c;由此引申到计算领域&#xff0c;发展成了一种容错理论。随着…...

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…...

【R语言】环境空间

一、环境空间的特点 环境空间是一种特殊类型的变量&#xff0c;它可以像其它变量一样被分配和操作&#xff0c;还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点&#xff1a; 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…...

惰性函数【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》

【Ⅱ】《事件绑定的自我修养&#xff1a;从青铜到王者的进化之路》 1. 代码功能大白话&#xff08;给室友讲明白版&#xff09; // 青铜写法&#xff1a;每次都要问浏览器"你行不行&#xff1f;" function addEvent青铜版(element, type, handler) {if (window.add…...

Vue3的el-table-column下拉输入实时查询API数据选择的实现方法

由于本人对el-table-column有下拉输入选择的要求&#xff0c;根据网上搜索的资料及本人优化&#xff0c;推出我比较满意的方法&#xff0c;供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…...

[mmdetection]fast-rcnn模型训练自己的数据集的详细教程

本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练&#xff0c;数据集是自制图像数据。废话不多说&#xff0c;下面进入训练步骤教程。 注&#xff1a;本人使用linux服务器进行展示&#xff0c;Windows环境大差不差。另外&#xff0…...

#systemverilog# Verilog与SystemVerilog发展历程及关系

1. Verilog的发展历史 1984年:Gateway Design Automation公司开发了Verilog,最初作为专有语言,用于逻辑仿真和数字电路设计。 1990年:Cadence收购Gateway,Verilog逐步开放,成为行业标准。 1995年(IEEE 1364-1995):首个IEEE标准,即Verilog-1995,定义基础语法和仿真语…...

RFID涉密载体管控系统|支持国产化、自主研发

涉密载体管理系统DW-S402是一套成熟系统&#xff0c;是用于对各种涉密载体进行有效管理&#xff0c;实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 用户为对文件资料、存储介质等管理严格的单位&#x…...

BUU14 [极客大挑战 2019]PHP1

用dirsearch扫描文件&#xff0c;扫了一万年什么也没扫出来 从网上看的wp&#xff0c;他们扫出来www.zip 这里直接用上了&#xff0c;以后有空再扫一遍 下载www.zip 在index.php中 说明要输入select 打开class.php <?php include flag.php;error_reporting(0);class…...

数据分析师使用Kutools for Excel 插件

数据分析师使用Kutools for Excel 插件 Kutools for Excel 是一款功能强大的 Excel 插件&#xff0c;旨在提高 Excel 用户的工作效率&#xff0c;简化复杂的操作。它提供了超过 300 个增强功能&#xff0c;帮助用户快速完成数据管理、格式化、排序、分析等任务&#xff0c;特别…...