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

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果

在这里插入图片描述
在这里插入图片描述

二、新建用户控件:VideoViewControl.axaml

需引用:VideoLAN.LibVLC.Windows包
Linux平台需安装:VLC 和 LibVLC (sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev)

.axaml 代码

注:vlc:VideoView 上无法增加鼠标和指针事件,需使用Popup浮动透明层

<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:vlc="clr-namespace:LibVLCSharp.Avalonia;assembly=LibVLCSharp.Avalonia"xmlns:vm="using:TrainArrivalAnalysis.Avalonia.ViewModels"xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"xmlns:controls="clr-namespace:Avalonia.Controls;assembly=Avalonia.Controls"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="TrainArrivalAnalysis.Avalonia.Controls.VideoViewControl"><Design.DataContext><vm:VideoWindowViewModel/></Design.DataContext><Grid><vlc:VideoView x:Name="playerView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  IsHitTestVisible="False" SizeChanged="playerViewSizeChanged" ></vlc:VideoView><Popup x:Name="videoViewPopup" Placement="Center" PlacementTarget="{Binding ElementName=playerView}" IsOpen="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"><Border Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ><Grid Background="Transparent" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"><TextBlock x:Name="playBackTip" VerticalAlignment="Top" HorizontalAlignment="Right" Background="#F0F8FF" Foreground="Red" Margin="0,50,10,0" Padding="15" FontSize="16" FontWeight="Bold" IsVisible="False" /><TextBlock x:Name="connectTip" VerticalAlignment="Center" HorizontalAlignment="Center" Background="Transparent" Foreground="White" FontSize="40" Text="网络中断" IsVisible="False" /></Grid></Border></Popup></Grid></UserControl>
.axaml.cs 代码
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Extensions.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Threading;
using Avalonia.VisualTree;
using LibVLCSharp.Avalonia;
using LibVLCSharp.Shared;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
using TrainArrivalAnalysis.Utility;namespace TrainArrivalAnalysis.Avalonia.Controls;public partial class VideoViewControl : UserControl, INotifyPropertyChanged, IDisposable
{private bool _disposed = false;private LibVLC _libVLC;private MediaPlayer _mediaPlayer;private string _url;public string Url{get => _url;set{if (_url != value){StopPlayback(); // 停止当前播放_url = value;OnPropertyChanged(nameof(Url));if (!string.IsNullOrEmpty(_url)){SetMediaPlayerAsync();}}}}private int _type = 0;public int Type{get => _type;set{_type = value;OnPropertyChanged(nameof(Type));}}private bool _isPlayBackTip = false;public bool IsPlayBackTip{get => _isPlayBackTip;set{_isPlayBackTip = value;OnPropertyChanged(nameof(IsPlayBackTip));Dispatcher.UIThread.InvokeAsync(() =>{playBackTip.IsVisible = _isPlayBackTip;});}}private string _playBackTipContent;public string PlayBackTipContent{get => _playBackTipContent;set{if (_playBackTipContent != value){_playBackTipContent = value;OnPropertyChanged(nameof(PlayBackTipContent));Dispatcher.UIThread.InvokeAsync(() =>{playBackTip.Text = _playBackTipContent;});}}}private bool _isConnectTip = false;public bool IsConnectTip{get => _isConnectTip;set{_isConnectTip = value;OnPropertyChanged(nameof(IsConnectTip));Dispatcher.UIThread.InvokeAsync(() =>{connectTip.IsVisible = _isConnectTip;});}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}private int _maxRetryAttempts = 5;private int _retryDelayMilliseconds = 5000;private int _currentRetryAttempt = 0;public VideoViewControl(){InitializeComponent();var libVlcOptions = new[] { "--no-video-title-show", "--no-osd" };_libVLC = new LibVLC(libVlcOptions);this.Loaded += async (sender, e) =>{var videoView = this.FindControl<VideoView>("playerView");if (videoView != null){videoView.Loaded += async (s, ev) =>{if (!string.IsNullOrEmpty(Url)){await SetMediaPlayerAsync();}};}};this.Unloaded += (sender, e) =>{StopPlayback();Dispose(false);};}public async Task SetMediaPlayerAsync(){try{if (!string.IsNullOrEmpty(Url)){_mediaPlayer = new MediaPlayer(_libVLC);await Dispatcher.UIThread.InvokeAsync(() =>{VideoView _videoView = this.FindControl<VideoView>("playerView");if (_videoView != null){_videoView.MediaPlayer = _mediaPlayer;}});var mediaOptions = new[] { ":network-caching=300", "avcodec-hw=any" };var _media = new Media(_libVLC, Url, FromType.FromLocation, mediaOptions);_mediaPlayer.Media = _media;_mediaPlayer.EncounteredError += OnEncounteredError;await Task.Run(() =>{_mediaPlayer.Play();});}_currentRetryAttempt = 0;_ = CheckPlayStatus().ConfigureAwait(false);}catch (Exception ex){}}private async Task CheckPlayStatus(){try{await Task.Delay(5000).ConfigureAwait(false);while (true){if (_mediaPlayer != null && _mediaPlayer.IsPlaying){IsConnectTip = false;if (Type == 1){IsPlayBackTip = true;}_currentRetryAttempt = 0;}else if (_mediaPlayer.State == VLCState.Stopped || _mediaPlayer.State == VLCState.Error || (_mediaPlayer.State == VLCState.Ended && !NetworkHelper.IsNetworkConnected())){IsPlayBackTip = false;IsConnectTip = true;StopPlayback();}else if (_mediaPlayer.State == VLCState.Ended){IsConnectTip = false;if (Type == 1){IsPlayBackTip = true;}}await Task.Delay(10000).ConfigureAwait(false);}}catch (OperationCanceledException){}catch (Exception ex){}}private async void OnEncounteredError(object sender, EventArgs e){IsPlayBackTip = false;IsConnectTip = true;}private async void playerViewSizeChanged(object sender, SizeChangedEventArgs e){if (videoViewPopup.IsOpen){videoViewPopup.Width = playerView.ActualWidth();videoViewPopup.Height = playerView.ActualHeight();}}// 停止播放private void StopPlayback(){_mediaPlayer?.Stop();}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){if (_mediaPlayer != null){_mediaPlayer.Stop();_mediaPlayer.Dispose();_mediaPlayer = null;}if (_libVLC != null){_libVLC.Dispose();_libVLC = null;}}_disposed = true;}}
}

三、主页面MainWindow.axaml使用

.axaml代码
<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:animation="clr-namespace:Avalonia.Animation;assembly=Avalonia.Animation"xmlns:vm="using:TrainArrivalAnalysis.Avalonia.ViewModels"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:controls="clr-namespace:TrainArrivalAnalysis.Avalonia.Controls"xmlns:converters="clr-namespace:TrainArrivalAnalysis.Avalonia.Converters"xmlns:md="clr-namespace:TrainArrivalAnalysis.Avalonia.Models.Dto"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="TrainArrivalAnalysis.Avalonia.Views.MainWindow"x:DataType="md:ArrivalRecordDto"Icon="/Assets/avalonia-logo.ico"Title="半自动闭塞区段列车整列到达自动智能分析系统"WindowState="FullScreen" SystemDecorations="None"  ZIndex="1"><Window.Resources><converters:GridLengthToDoubleConverter x:Key="GridLengthToDoubleConverter"/></Window.Resources><Window.Styles><Style Selector="Button.blueBtn"><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="#4C7DF7"/><Setter Property="Height" Value="32"/><Setter Property="FontSize" Value="16"/><Setter Property="BorderBrush" Value="DarkGray"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border x:Name="containerBorder" BorderBrush="{TemplateBinding BorderBrush}" Background="#4C7DF7" CornerRadius="13"><ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter></Border></ControlTemplate></Setter.Value></Setter></Style></Window.Styles><Grid  x:Name="RootGrid" RowDefinitions="Auto,*"  SizeChanged="RootGridSizeChanged"><Grid x:Name="TopGird"  Grid.Row="0" Height="2" Background="Black" PointerMoved="TopGridPointerMovedHandler"> </Grid><Grid Grid.Row="1"  Background="Black"><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition Width="*" /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="*" /><RowDefinition Height="*" /></Grid.RowDefinitions><controls:VideoViewControl  Grid.Row="0" Grid.Column="0" x:Name="videoView"  DoubleTapped="VideoDoubleTappedHandler" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/><controls:VideoViewControl  Grid.Row="0" Grid.Column="1" x:Name="videoView1" DoubleTapped="VideoDoubleTappedHandler" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/><Image x:Name="imageArriva" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"   Stretch="Fill" DoubleTapped="ImageDoubleTappedHandler"></Image><Image x:Name="imageLeave" Grid.Row="1" Grid.Column="1"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"   Stretch="Fill" DoubleTapped="ImageDoubleTappedHandler" ></Image><Image x:Name="imageArriva_1" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"   Stretch="Fill" DoubleTapped="ImageDoubleTappedHandler"></Image><Image x:Name="imageLeave_1" Grid.Row="0"  Grid.Column="1"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"   Stretch="Fill" DoubleTapped="ImageDoubleTappedHandler" ></Image></Grid><Popup x:Name="NavMenuPopup" Placement="Top" PlacementTarget="{Binding ElementName=TopGird}" IsOpen="False" IsVisible="False"><Border x:Name="PopupBorder"  Background="#F0F8FF"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"><Grid x:Name="NavMenuGird" Background="Transparent" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ColumnDefinitions="Auto,*,Auto" MinHeight="30" PointerExited="NavMenuPointerExitedHandler"><StackPanel Orientation="Horizontal" Grid.Column="0" HorizontalAlignment="Left"><Button Content="标记为来车信号" Margin="5" Classes="blueBtn" Width="125" x:Name="arrivalSignalButton" Click="ArrivalSignal_Click" DockPanel.Dock="Left" /><TextBox x:Name="searchStartTime" Watermark="取图开始日期" Text="" Height="32" /><TextBox x:Name="searchEndTime" Watermark="取图结束日期" Text="" Height="32" /><Button Content="标记为无车信号" Margin="5" Classes="blueBtn" Width="125" x:Name="leaveSignalButton" Click="LeaveSignal_Click" DockPanel.Dock="Left" /></StackPanel><Rectangle Grid.Column="1" Fill="Transparent"/><StackPanel Orientation="Horizontal" Grid.Column="2" HorizontalAlignment="Right"><Button Content="最近来车记录" Margin="5" Classes="blueBtn" Width="125" x:Name="showLastArrivalRecordButton" Click="ShowLastArrivalRecordClick" /><Button Content="来车记录查询" x:Name="showArrivalRecordButton" Margin="5" Classes="blueBtn" Width="125" Click="ShowArrivalRecordClick" /><Button Content="结束查询" x:Name="closeArrivalRecordButton" Margin="5" Classes="blueBtn" Width="125" Click="CloseArrivalRecordClick"/><Button Content="测试下载" x:Name="downLoadButton" Margin="5" Classes="blueBtn" Width="125" Click="DownLoadClick" IsVisible="False" /><Button Content="关闭系统" Margin="50,5,5,5" Classes="blueBtn" Width="125" Click="CloseAppClick" /></StackPanel></Grid></Border></Popup><Popup x:Name="ArrivalRecordPopup" Placement="Center" PlacementTarget="{Binding ElementName=RootGrid}" IsOpen="False" ><Border x:Name="ArrivalRecordPopupBorder"  Background="White"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"><controls:ArrivalRecordViewControl x:Name="arrivalRecordView"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/></Border></Popup></Grid>
</Window>
.axaml.cs代码
 public partial class MainWindow : Window{public MainWindow()
{InitializeComponent();this.Loaded += async (sender, e) =>{string url = $"rtsp://用户名:密码@IP/LiveMedia/ch1/Media1";SetVideoViewUrl("videoView", url, "");url = $"rtsp://用户名:密码@IP/LiveMedia/ch1/Media1";SetVideoViewUrl("videoView1", url, "");};}public async void SetVideoViewUrl(string videoViewControlName, string url, string playBackTipContent, int type = 0, bool isPlayBackTip = false)
{_ = Task.Run(async () =>{await Dispatcher.UIThread.InvokeAsync(() =>{var _videoView = this.FindControl<VideoViewControl>(videoViewControlName);if (_videoView != null){_videoView.Url = url;_videoView.Type = type;_videoView.PlayBackTipContent = playBackTipContent;_videoView.IsPlayBackTip = isPlayBackTip;}});});
}
}

相关文章:

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…...

网络协议(八):IP 协议

目录 1. IP 协议简介 2. 首部属性 2.1 版本号 2.2 首部长度 2.3 服务类型 2.4 总长度 2.5 > 16位标识 & 3位标志 & 13位片偏移 2.5.1 > 16 位标识 2.5.2 > 3 位标志 2.5.3 > 13 位片偏移 2.6 生存时间(TTL) 2.7 > 8 位协议 2.8 首部校验和…...

深度解析 pytest 参数化与 --count 执行顺序的奥秘

有这样一个业务场景&#xff0c;登录不同地区的账号&#xff0c;重复500遍&#xff0c;以验证登录功能是否正常。 登录的代码如下&#xff0c;其中login_data是一个fixture&#xff0c;用来组织数据&#xff1a; pytest.mark.parametrize("login_data", [cn_test, …...

【traefik】forwadAuth中间件跨namespace请求的问题

前情提要 - fowardAuth鉴权中间件的使用&#xff1a; 【traefik】使用forwardAuth中间件做网关层的全局鉴权 1. 问题 我的 traefik-ingress-controller 所在 namespace: traefik 业务服务所在 namespace: apps 路由与 forwardAuth 中间件配置如下&#xff1a; # 路由 apiV…...

java学习记录16

并发基础 进程与线程 进程 进程&#xff08;Process&#xff09;是计算机中正在运行的程序。程序是一种静态的概念&#xff0c;而进程是程序在执行过程中创建的动态实体。每个进程都有自己的内存空间、代码、数据和资源&#xff0c;它也是操作系统进行任务调度和资源分配的基…...

【Lua学习之旅】之单行/多行注释

Lua的注释 单行注释多行注释 单行注释 lua中的单行注释采用两个短横线"--" --这是lua单行注释多行注释 写法一&#xff1a; --[[ 这个lua的多行注释&#xff0c; 很多资料说多行注释不可以嵌套&#xff0c; 根据我的测试&#xff0c;这种写法的多行注释在lua54版…...

[Effective C++]条款45 运用成员函数模板接受所有兼容类型

本文初发于 “天目中云的小站”&#xff0c;同步转载于此。 条款45 : 运用成员函数模板接受所有兼容类型 本条款中我们将会以智能指针为例, 介绍如何通过成员函数模板使一个模板类可以接受所有兼容类型. 我们先来构建一个简单的继承体系 : class Top { ... }; class Middle: p…...

Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能

Harry技术添加存储&#xff08;minio、aliyun oss&#xff09;、短信sms&#xff08;aliyun、模拟&#xff09;、邮件发送等功能 基于SpringBoot3Vue3前后端分离的Java快速开发框架 项目简介&#xff1a;基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…...

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…...

解决Qt打印中文字符出现乱码

在 Windows 平台上&#xff0c;默认的控制台编码可能不是 UTF-8&#xff0c;这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体&#xff0c;并确保控制台输出为 UTF-8 编码&#xff1a; 1. Qt 应用程序代码 在 Qt 中&#xff0c;我们可以使用 QApplic…...

第三十八章 Spring之假如让你来写MVC——适配器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found. 1. 故障现象2. 解决思路3. 故障分析4. 案件回溯5. 解决问题 1. 故障现象 有一台服务器业务报无法连接. 尝试用Ping命令发现无法ping通. 通过控制台查看发现有以下报错: error: ..…...

昵称 校验

1. 基本格式校验 1. 长度限制 • 设置最小和最大字符长度&#xff1a;2-20 个字符&#xff08;常见范围&#xff09;。 • 避免昵称过短或过长影响显示和识别。 • 示例&#xff1a; • 2 ≤ 长度 ≤ 20&#xff1a;let minLength 2 let maxLength 20 if nickname.count <…...

MATLAB学习笔记目录

MATLAB学习笔记-生成纯音并保存-CSDN博客 MATLAB学习笔记-各种格式之间的转换 - 知乎 MATLAB学习笔记-胞组&#xff08;cell array&#xff09;转换为矩阵&#xff0c;cell2mat_matlab如何把元胞数组改为矩阵-CSDN博客MATLAB学习笔记-判断数组、结构体、数值、字符串是否相同…...

基于单片机的语音控制玩具汽车的设计

语音控制小汽车选用了两个单片机、一个语音识别芯片、两个无线收发模块、一个电机驱动模块、两个电机、一个音频解码模块。语音控制端选用了一个语音识别芯片&#xff0c;实现了将声音信号转换成数字信号&#xff0c;再将数据传输给单片机的功能。小车端选用了单片机来控制电机…...

Qt WORD/PDF(五)使用Json一键填充Word表格

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: 《Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作》 《Qt WORD/PDF&#…...

vue3+ts的几个bug调试

由于编译问题&#xff0c;把几个type检查给关闭了&#xff0c;否则错误太多。 1&#xff09;第一个检查出的问题&#xff0c;拼写错误数组的length&#xff0c;写成了lengh。 2&#xff09;数组的对象引用。 torStatus Array(8).fill({ ...defaultStatus }) as TorStatus[]…...

DVWA靶场CSRF漏洞通关教程及源码审计

目录标题 CSRFlow源码审计 medium源码审计 high源码审计 impossible源码审计 CSRF low 先修改密码 看到地址栏 复制在另一个网页打开 成功登录 源码审计 没有任何过滤措施&#xff0c;很危险&#xff0c;并且采用了不安全的md5加密 <?phpif( isset( $_GET[ Change ] )…...

前端开发:HTML常见标签

1.注释标签 注释不会显示在界面上 . 目的是提高代码的可读性 . ctrl / 快捷键可以快速进行注释 / 取消注释 . <!-- 我是注释 --> 2.标题标签 有六个 , 从 h1 - h6. 数字越大 , 则字体越小 <h1> hello </h1> //我们所写的csdn的格式中的标题一…...

【机器学习】主动学习-增加标签的操作方法-样本池采样(Pool-Based Sampling)

Pool-Based Sampling Pool-based sampling 是一种主动学习&#xff08;Active Learning&#xff09;方法&#xff0c;与流式选择性采样不同&#xff0c;它假设有一个预先定义的未标注样本池&#xff0c;算法从中选择最有价值的样本进行标注&#xff0c;以提升模型的性能。这种…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...