wpf prism使用

news2024/12/23 10:16:05

目录

1.Nuget中安装prism框架:

2.改造程序启动入口

3.View和ViewModel自动关联

4.绑定

5.Command

6.Event Aggregator(事件聚合器)、消息通知

7.弹窗、对话服务 DialogService

8.Region区域

9.Navigation导航

10.module 模块



1.Nuget中安装prism框架:

      

        Prism.Unity(IOC容器) 其中的prism.wpf和prism.core会自动添加过来

    

2.改造程序启动入口

app.xaml中按照截图改造:

 

 app.xaml 点击F7查看代码,具体代码如下图。其中CreateShell()就是程序的入口

3.View和ViewModel自动关联

  规则: ① View文件必须放在Views文件夹下,ViewModel文件必须放在ViewModels文件夹下且文件命名开头要和view文件相同,结尾则是以ViewModel结尾。如下图:

②   xaml中添加

        xmlns:prism="http://prismlibrary.com/" 

        prism:ViewModelLocator.AutoWireViewModel="True" 

如下图

 

4.绑定

 继承BindableBase,该类实现了通知属性

如下图:同时SetProperty有2个重载方法,第二种可以当该属性变化执行什么方法

5.Command

常规有参和无参方法

        public DelegateCommand noparmCommadn { get; private set; }//无参方法
        public DelegateCommand<string> haveparmCommadn { get; private set; }//有参方法

        public MainWindowViewModel()
        {
           
            noparmCommadn = new DelegateCommand(noparm);
            haveparmCommadn = new DelegateCommand<string>(haveparm);
        }

        private void haveparm(string obj)
        {
            MessageBox.Show($"我是有参方法,参数是{obj}");
        }

        private void noparm()
        {
            MessageBox.Show("我是无参方法");

        }

检查是否可执行

① 调用RaiseCanExecuteChanged的调用更新CanExecute;

public MainWindowViewModel()
{
    SaveCommand = new DelegateCommand(DoSave, CanExecute);
}

public DelegateCommand SaveCommand {get;}

private void DoSave()
{
    //执行逻辑
}
​
private bool CanExecute()
{
    //能否执行的逻辑
    return Age < 200;
}
​
private int _age= 100;
public int Age
{
    get{ return _age;}
    set
    {
        SetProperty(ref _age, value);
        SaveCommand.RaiseCanExecuteChanged();
    }
}

② ObservesProperty:

ObservesProperty是指监听一个属性的变化,当发生变化时,进行状态检查;支持多条件;

public MainWindowViewModel()
{
    SaveCommand = new DelegateCommand(DoSave, CanExecute)
        .ObservesProperty(()=>Name)
        .ObservesProperty(()=>Age);
}

public DelegateCommand SaveCommand {get;}

​private void DoSave()
{
    //执行逻辑
}

private bool CanExecute()
{
    //能否执行的逻辑
    return Age < 200 && Name!=string.Empty;
}
​
private int _age;
​
public int Age
{
    get { return _age; }
    set { SetProperty(ref _age, value); }
}
​
private int _name;
​
public int Name
{
    get { return _name; }
    set { SetProperty(ref _name, value); }
}

ObservesCanExecute 它监听一个属性值,当其为true可用,false不可用

        public DelegateCommand SaveCommand2 { get; }
           
        public MainWindowViewModel()
        {

         SaveCommand2 = new DelegateCommand(DoSave2).ObservesCanExecute(()=>IsEnable);
        }

        private bool isEnable;

        public bool IsEnable
        {
            get { return isEnable; }
            set { isEnable = value; }
        }

6.Event Aggregator(事件聚合器)、消息通知

Prism 提供了一种机制,可以实现应用程序中松散耦合组件之间的通信。这种机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,并且彼此之间仍然没有直接引用。

事件聚合器提供多播发布/订阅功能。这意味着可以有多个发布者引发相同的事件,并且可以有多个订阅者监听相同的事件。当然订阅者也可以过滤消息,只收到自己需要的。

通过事件聚合器服务可以使用IEventAggregator接口获取到事件聚合器。事件聚合器负责定位或构建事件,并在系统中保存事件的集合。首次访问一个事件时,如果该事件尚未构建,则构建
经典图如下:

 用途:一般用在VM之间的消息交互,VM调用View中的方法等其他无法直接实例化调用方法类的情况

1.创建事件(无参),继承PubSubEvent即可

    public class MessageEventNoParm:PubSubEvent
    {
    }

有参,继承PubSubEvent<T>

    public class MessageEventHaveParm :PubSubEvent<string>
    {
    }

订阅:

    public partial class MainWindow : Window
    {
        public MainWindow(IEventAggregator aggregator)
        {
            InitializeComponent();
            aggregator.GetEvent<MessageEventHaveParm>().Subscribe(ShowMethod, arg => arg == "key");//有参订阅,同时加过滤

            aggregator.GetEvent<MessageEventNoParm>().Subscribe(ShowMethodNoParm);//无参

        }

        private void ShowMethodNoParm()
        {
            //throw new NotImplementedException();
            MessageBox.Show("ShowMethodNoParm");
        }

        private void ShowMethod(string obj)
        {

            MessageBox.Show("ShowMethodHaveParm :    "+obj);
        }
    }

关于Subscribe函数,有几个重载,其中参数最多的有4个:

action: 发布事件时执行的委托。
ThreadOption枚举: 指定在哪个线程上接收委托回
KeepSubscriberReferenceAlive: 如果为true,则Prism.Events.PubSubEvent保留对订阅者的引用因此它不会收集垃圾。
filter: 进行筛选以评估订阅者是否应接收事件。是一个Predicate委托,结果为true时才接收。
 

发布:

        public DelegateCommand MessageEventNoParmCommad { get; private set; }
        public DelegateCommand<string> MessageEventHaveParmCommad { get; private set; }
       

        private readonly IEventAggregator _aggregator;//事件聚合器

        public MainWindowViewModel(IEventAggregator aggregator)
        {
            

            _aggregator=aggregator;
            MessageEventNoParmCommad = new DelegateCommand(noparmME);
            MessageEventHaveParmCommad = new DelegateCommand<string>(haveparmME);

        }

        private void haveparmME(string obj)
        {
            _aggregator.GetEvent<MessageEventHaveParm>().Publish(obj);//有参发布
        }

        private void noparmME()
        {
            _aggregator.GetEvent<MessageEventNoParm>().Publish();//无参发布
        }

该节参考:Prism事件聚合器(Event/发布订阅) - 傲慢与偏见luc - 博客园 (cnblogs.com)

7.弹窗、对话服务 DialogService

Prism提供了一组对话服务, 封装了常用的对话框组件的功能, 例如:

  • RegisterDialog/IDialogService (注册对话及使用对话)
  • 打开对话框传递参数/关闭对话框返回参数
  • 回调通知对话结果

①新建用户控件 UserControl ,比如叫DialogUserControl

<UserControl x:Class="prismDemo1.Views.DialogUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             xmlns:local="clr-namespace:prismDemo1.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
            <StackPanel>
                <TextBlock Text="{Binding Title}"/>
            <TextBlock Text="{Binding Message}" FontSize="25" Foreground="Red"/>
                <Button Command="{Binding btnCliclCommand}" Content="点击传值演示"/>
            </StackPanel>
    </Grid>
</UserControl>

②创建ViewModel,对应起名叫DialogUserControlViewModel。然后继承IDialogAware

IDialogAware中方法说明:

  • CanCloseDialog()函数是决定窗体是否关闭
  • OnDialogClosed()函数是窗体关闭时触发,触发条件取决于CanCloseDialog()函数
  • OnDialogOpened()函数时窗体打开时触发,比窗体Loaded事件早触发
  • Title为窗体的标题
  • RequestClose为关闭事件,可由此控制窗体的关闭
using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prismDemo1.ViewModels
{
    //弹窗对话在使用对话时则继承IDialogAware
    public class DialogUserControlViewModel : IDialogAware
    {
        //窗体的标题
        public string Title { get; set; }
    private string message;   

    public string Message
    {
        get { return message; }
        set { message = value; }
    }


    /// <summary>
    /// 关闭事件,可由此控制窗体的关闭
    /// </summary>
    public event Action<IDialogResult> RequestClose;

        /// <summary>
        /// 决定窗体是否关闭
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public bool CanCloseDialog()
        {
            return true;
        }
        /// <summary>
        /// 窗体关闭时触发,触发条件取决于CanCloseDialog()函数
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        public void OnDialogClosed()
        {
            //IDialogParameters parameters = new DialogParameters();
            //parameters.Add("param1", "Hello Baby");
            //RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters));  这里为何传参为空  不理解

        }
        /// <summary>
        /// 窗体打开时触发,比窗体Loaded事件早触发
        /// 一般用来接受参数
        /// </summary>
        /// <param name="parameters"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnDialogOpened(IDialogParameters parameters)
        {
            Message = parameters.GetValue<string>("message");
            Title = parameters.GetValue<string>("Title");
        }
        public DelegateCommand btnCliclCommand { get; private set; }
        public DialogUserControlViewModel()
        {
            btnCliclCommand = new DelegateCommand(btnClick);

        }

        private void btnClick()
        {
            IDialogParameters parameters = new DialogParameters();
            parameters.Add("param1", "Hello Baby");
            RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters));
        }
    }
}

 ③ 在App.cs中注册对话服务

containerRegistry.RegisterDialog<DialogUserControl, DialogUserControlViewModel>();//注册弹窗

④IdialogService接口说明

public interface IDialogService
{
    void Show(string name, IDialogParameters parameters, Action<IDialogResult> callback);
    void Show(string name, IDialogParameters parameters, Action<IDialogResult> callback, string windowName);
    void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback);
    void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback, string windowName);
}


//
// 摘要:
//     Extensions for the IDialogService
public static class IDialogServiceExtensions
{
    public static void Show(this IDialogService dialogService, string name);
    public static void Show(this IDialogService dialogService, string name, Action<IDialogResult> callback);
    public static void ShowDialog(this IDialogService dialogService, string name);
    public static void ShowDialog(this IDialogService dialogService, string name, Action<IDialogResult> callback);
}

接口的实现中,最多有四个参数:

  • name:指的是Dialog的name,由注册的时候指定,没有指定的时候默认为View类的类名
  • parameters:传递给对话框的参数
  • callback:对话框被关闭时的回调函数
  • windowName:注册对话框的父窗体名

 ⑤ 使用弹出对话:

       private readonly  IDialogService _dialogService;//弹窗服务

        public MainWindowViewModel(IEventAggregator aggregator, IDialogService dialogService)
        {

            _dialogService = dialogService;
            openDialogCommand = new DelegateCommand(openDiaglog);//打开弹窗
        }

        private void openDiaglog()
        {
            DialogParameters dialogParameters = new DialogParameters
            {
                {"Title","我是弹窗"},
                {"message","我是消息"}
            } ;
            _dialogService.ShowDialog("DialogUserControl", dialogParameters, DialogCallback);
        }
        private void DialogCallback(IDialogResult result)
        {
            //对话框关闭之后的回调函数,可以在这解析结果。
            ButtonResult result1 = result.Result;

            var param = result.Parameters.GetValue<string>("param1");
        }

8.Region区域

        什么是区域

        在Prism当中,一个页面我们可以不再为其固定显示的内容,而这种概念变成了区域(Region)划分的概念。将页面显示的区域划分成N个Region,每一个Region将动态分配区域。它将负责承担我们的UI组件或者控件。

①给页面分区域,如下代码分开leftRegion和mainRegion2个区域,注意如果是单页面切换用ContentControl,多页面用TabControl

        <Grid Grid.Row="1" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="180"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <ContentControl prism:RegionManager.RegionName="leftRegion"/>
            <!--如果是单页面切换用ContentControl,多页面用TabControl-->
            <ContentControl Grid.Column="1" prism:RegionManager.RegionName="mainRegion"/>
            <!--<TabControl Grid.Column="1" prism:RegionManager.RegionName="mainRegion"/>-->
        </Grid>

②创建4个用户控件并且关联上ViewModel,如图

 ③在App.cs注册view

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //throw new NotImplementedException();
            containerRegistry.RegisterDialog<DialogUserControl, DialogUserControlViewModel>();//注册弹窗

            //containerRegistry.RegisterDialog<DialogUserControl, DialogUserControlViewModel>("dd");//注册弹窗 dd是给弹窗起名,不写默认为类名

            //注册区域
            containerRegistry.RegisterForNavigation<leftRegion>();
            containerRegistry.RegisterForNavigation<Awin>();
            containerRegistry.RegisterForNavigation<Bwin>();
            containerRegistry.RegisterForNavigation<Cwin>();

        }

④把页面关联到区域

        private readonly IRegionManager _regionManager;//区域服务
        public MainWindowViewModel(IEventAggregator aggregator, IDialogService dialogService,IRegionManager regionManager)
        {

            _regionManager = regionManager;
            _regionManager.RegisterViewWithRegion("leftRegion", "leftRegion");
            //_regionManager.RegisterViewWithRegion("leftRegion", "leftRegion");
        }

leftRegion页面切换,这里注意用RegisterViewWithRegion来做页面切换有问题,需要用Navigation即可。接下面一章对Navigation进行讲解

9.Navigation导航

① 导航是在区域的基础上进行的。

RequestNavigate最多有4个参数:

第一个参数是RegionName,第二个参数是我们前面注册的ViewName。其实它还有很多重载函数,还有另外两个参数Action navigationCallback,导航完成时的回调NavigationParameters navigationParameters导航是传参

region.RequestNavigate("ContentRegion", page);

            _regionManager.RequestNavigate("mainRegion", obj, NavigationCallback, parameters);

        
        //请求导航完成的回调函数
        private void NavigationCallback(NavigationResult result)
        {
            MessageBox.Show(result.Context.Uri  +"  :"+ result.Error?.Message+"   :"+ result.Result);

            journal=result.Context.NavigationService.Journal;//添加到导航日志
        }

② 导航页面切换的接口INavigationAware

    public class AwinViewModel : INavigationAware
    {
        //IConfirmNavigationRequest 该类也是继承INavigationAware 允许用户针对导航请求进行拦截。同时也需要多实现一个方法ConfirmNavigationRequest
        //是否创建新示例。为true的时候表示不创建新示例,页面还是之前的;如果为false,则创建新的页面
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            //throw new NotImplementedException();
            return true;
        }
        //导航离开当前页面前。
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            //throw new NotImplementedException();
        }
        //导航到当前页面前, 此处可以传递过来的参数以及是否允许导航等动作的控制
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            var vale = navigationContext.Parameters["key"];

        }
    }

③ IConfirmNavigationRequest接口,该类也是继承INavigationAware 允许用户针对导航请求进行拦

    public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        bool result = true;

        if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)
            result = false;
        
        //true则同意 false则拒绝
        continuationCallback(result);
    }

④ IRegionNavigationJournal导航日志接口

导航日志,其实就是对导航系统的一个管理功能,理论上来说,我们应该知道我们上一步导航的位置、以及下一步导航的位置,包括我们导航的历史记录。以便于我们使用导航对应用程序可以灵活的控制。

IRegionNavigationJournal接口有如下功能:

        GoBack() : 返回上一页
        CanGoBack : 是否可以返回上一页
        GoForward(): 返回后一页
        CanGoForward : 是否可以返回后一页

 public class leftRegionViewModel
    {
        public DelegateCommand<string> openWindowCommand { get; }
        private readonly IRegionManager _regionManager;
        private IRegionNavigationJournal journal;//导航日志
        public DelegateCommand backCommand { get; }//上一页
        public DelegateCommand forwardCommand { get; }//下一页


        public leftRegionViewModel(IRegionManager regionManager)
        {
            openWindowCommand = new DelegateCommand<string>(openwin);
            backCommand = new DelegateCommand(back);
            forwardCommand = new DelegateCommand(forward);
            _regionManager = regionManager;
        }

        private void forward()
        {
            if (journal.CanGoForward)
            {
                journal.GoForward();
            }
        }

        private void back()
        {
            if (journal.CanGoBack)
            {
                journal.GoBack();
            }
        }

        private void openwin(string obj)
        {
            //用这种方法在页面切换时有问题,它只显示第一个页面
            //_regionManager.RegisterViewWithRegion("mainRegion", obj); 

            //需要用Navigation即可
            //_regionManager.RequestNavigate("mainRegion", obj);

            //其他重载
            //传参
            NavigationParameters parameters=new NavigationParameters();
            parameters.Add("key", "value");
            _regionManager.RequestNavigate("mainRegion", obj, NavigationCallback, parameters);

        }
        //请求导航完成的回调函数
        private void NavigationCallback(NavigationResult result)
        {
            MessageBox.Show(result.Context.Uri  +"  :"+ result.Error?.Message+"   :"+ result.Result);

            journal=result.Context.NavigationService.Journal;//添加到导航日志
        }
    }

10.module 模块

①首先窗体模块A和模块C 这里我使用prism在VS中的插件直接创建,安装路径 扩展-->管理扩展->搜索prism  如下图:

 ②在模块A中注册,同理模块C也是

namespace prismModuleA
{
    public class prismModuleAModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {

        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewA>();

        }
    }
}

③ 在主程序中重写ConfigureModuleCatalog方法

        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            //加入模块后这时候我就能在需要打开该窗体的地方使用 regionManager.RegisterViewWithRegion("mainRegion", 模块名); 
            moduleCatalog.AddModule<prismModuleAModule>();
            moduleCatalog.AddModule<prismModuleCModule>(); 

            base.ConfigureModuleCatalog(moduleCatalog);

        }

④ 在需要打开模块中页面地方可使用

egionManager.RegisterViewWithRegion("mainRegion", 模块名中的页面名); 

参考:Prism入门之模块(Module) - 傲慢与偏见luc - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/773368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java读取邮件标题时,突然报错Failed to load IMAP envelope

生产环境之前可以正常使用imap协议收取邮件&#xff0c;突然有一天报错Failed to load IMAP envelope&#xff0c;可以确定邮件服务器、账号密码、配置都是正确的&#xff0c;使用foxmail可以正常连接并成功收取邮件&#xff0c;因此可以推测java代码可能有兼容性问题&#xff…

翻遍200个网站,整理了这套CSDN最系统的网络安全学习路线

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

MySQL第七次

1、 string类型数据的命令操作&#xff1a; 2、 list类型数据的命令操作&#xff1a; 3、 hash类型数据的命令操作&#xff1a; 4、Keys相关的命令操作 二、举例说明list和hash的应用场景 hash&#xff1a;电商购物车 以用户id为key&#xff0c;商品id为field&#xff0c;商品数…

知识图谱推理的学习逻辑规则(上)7.19+(下)7.20

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型 &#xff08;7.20&#xff09;知识图谱推理逻辑规则概率形式化参数化规则生成器具有逻辑规则的推理预测器 优化E步骤M步骤 实验实验设置实验结果 总结 原文&#xff1a; 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则…

Airbnb 引入 HTTP Streaming,网页性能得到大幅度提升

Airbnb 通过引入HTTP Streaming来提升网站的页面加载性能。他们将测试的每个页面&#xff08;包括主页&#xff09;的首次内容绘制&#xff08;First Contentful Paint&#xff0c;FCP&#xff09;时间降低了大约 100 毫秒。他们还最小化了后端慢查询对加载时间的影响。 Airbn…

机房监控教程:管理不求人,即学即用!

供电系统的可靠性直接影响到广电数据中心机房设备的正常运转&#xff0c;涉及信息存储、节目录制采编传输、影音数据等生产质量和播出质量。 为确保数据中心机房安全运行&#xff0c;实现对数据中心机房各系统设备的统一监控与有效管理&#xff0c;减轻机房维护人员工作负担&am…

MySql5.6版本开启慢SQL功能-本次采用永久生效方式

文章目录 一、目的二、注意点说明三、操作步骤3.1 临时生效操作步骤3.2 永久生效操作步骤3.3 按日期生成日志文件3.4 执行成功后验证功能是否开启 四、慢SQL日志记录内容介绍五、Shell脚本 一、目的 开启 MySQL 的慢查询日志&#xff08;Slow Query Log&#xff09;可以帮助你…

怎么做活码二维码?动态码在线生成技巧

现在制作二维码用户大多习惯使用活码二维码&#xff0c;其优势在于能够在二维码不变的情况下修改内容&#xff0c;能够生成二维码长期使用&#xff0c;还可以设置有效期、加密等其他功能可以使用。那么怎么生成活码二维码呢&#xff1f;可以使用二维码生成器&#xff08;免费在…

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

【Jeston Nano】环境配置-部署yolov5

【Jeston Nano】环境配置-部署yolov5 一.Jeston Nano系统初始化设置1.Chinese 语言包2.备份3.更换源 二.环境配置&#xff0c;安装包1.CUDA2.pip33.jtop4.配置可能需要的库5.安装所需要的依赖环境6.安装opencv的系统级依赖&#xff0c;一些编码库7.更新CMake8.u盘兼容 三、安装…

python web开发之WSGI/uwsgi/uWSGI详解

1. 三者的定义 WSGI是一种通信协议。uwsgi是一种传输协议。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 2.三者的使用场景 WSGI&#xff0c;全称 Web Server Gateway Interface&#xff0c;是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接…

Jmeter性能测试,通过插件监控服务器资源使用情况

Jmeter作为性能测试的首选工具&#xff0c;那么在性能测试过程中如何方便快捷的监测服务器资源使用情况&#xff1f; 可以通过jmeter 安装"PerfMon(Servers Performance Monitoting)"插件并配合服务端资源监控工具进行实现&#xff0c;详细操作流程如下&#xff1a;…

MySQL 中使用变量实现排名名次

title: MySQL 中使用变量实现排名名次 date: 2023-7-16 19:45:26 tags:- SQL 高级查询 一. 数据准备: CREATE TABLE sql_rank (id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,user_id INT ( 11 ) UNSIGNED NOT NULL,score TINYINT ( 3 ) UNSIGNED NOT NULL,add_time date NO…

Spring Batch之读数据库—HibernateCursorItemReader(三十九)

一、HibernateCursorItemReader 对应关系映射(Object Relational Mapping,ORM)是一种为解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说&#xff0c;ORM是通过使用描述对象和数据库之间映射的元数据&#xff0c;将Java程序中的对象自动持久化到关系数据库中。 H…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

和chatgpt学架构03-引入UI框架(elment-plus)

目录 1 项目目录及文件的具体作用1.1 App.vue1.2 main.js的作用1.3 main.js什么时候被调用1.4 npm run serve干了什么事情1.5 package.json的作用 2 安装UI框架2.1 安装命令2.2 全局引入 3 启动工程总结 我们已经安装好了我们的vue脚手架&#xff0c;用vscode打开工程目录 要自…

有序链表转换二叉搜索树

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,nul…

封装hiredis成dll包,为老项目提供redis网络支持

第一步&#xff1a;准备VS环境 1、需要下载window8.1的SDK否则无法下载 2、平台工具集需要使用Visual Studio 2015(v140) 第二步&#xff1a;下载hiredis 去microsoft/hiredis下载windows版本的hiredis&#xff0c;并解压到本地 打开hiredis-master\msvs\vs-solutions中的sl…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

GPT 如此强大,我们可以利用它实现什么?

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer结构的预训练语言生成模型&#xff0c;由OpenAI研发。它可以生成高质量的自然语言文本&#xff0c;取得了很好的效果&#xff0c;被广泛应用于各个领域。以下是一些利用GPT实现的应用。 一…