WPF监控平台(科技大屏)[一]

        跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结.

系统介绍和配置及主窗口设计_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Wy421Y7QD?p=1&vd_source=4796b18a2e4c1ec8a310391a5644b6da

     成果展示 

    实现过程

        总体来说,我的理解都是设计框架,再具体的画里面的布局.

        界面整体背景设计

         我们不需要窗口自带的边框,所以需要隐藏,这里调用设计WindowChrome中的GlassFrameThickness 为0或者负数即可.

<WindowChrome.WindowChrome>
        <!--隐藏边框-->
        <WindowChrome GlassFrameThickness="0"></WindowChrome>
    </WindowChrome.WindowChrome> 

        界面整体颜色为渐变色,进行设计,渐变色使用画刷,这里介绍两种画刷,两种画刷的写法一致,只是颜色的方向有所差别,都是使用offset表示与开始点的距离

       1.LinearGradientBrush,这种画刷是由左上角向右下.

       2.RadialGradientBrush,这种画刷是有中心向外面渐变(此项目使用这种)

<!--设计背景颜色渐变-->
        <Grid.Background>
            <RadialGradientBrush>
                <GradientStop Color="#ff285173" Offset="0"></GradientStop>
                <GradientStop Color="#ff244967" Offset="0.5"></GradientStop>
                <GradientStop Color="#13164B" Offset="1"></GradientStop>
            </RadialGradientBrush>
        </Grid.Background>

        运行结果:

        首页设计

         首页分为三行进行设计,标题为第一行,中间的内容为第二行,底部为第三行.

         代码先分出三行:类似于代码中Height之类的属性,可以自己试着调,让界面看起来美观即可

        <!--主界面分三行-->
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition Height="auto"></RowDefinition>
            <RowDefinition Height="25"></RowDefinition>
        </Grid.RowDefinitions>
       第一行:

        第一行下面的分割线颜色设计为#5518aabd,整体分为3列,第三列再分为两行进行设计.

        第一列最左边为一个图标,直接将文件中的Image拖入即可

<!--图标-->
 <Image Source="/Res/Img/Logo.png" Margin="10,7" />

        第二列放置一个垂直吧方向的堆面板,再用TextBlock放置文字

                <!--文字-->
                <StackPanel Orientation="Vertical" Grid.Column="1">
                    <TextBlock Text="生产监控平台" Foreground="White" FontSize="16" VerticalAlignment="Center" Margin="0,5,0,0"></TextBlock>
                    <TextBlock Text="阻碍你前行的,其实就是你自己!" Foreground="White" FontSize="12" Margin="0,3,0,0" ></TextBlock>
                </StackPanel>

        第三列整体分为两行,第一行使用对面板放置三个按钮,第二行画纹路.,下面代码中的最小化和关闭按钮我与视频中的处理方法不一样,我这里是直接设计了一个点击事件,在此界面对应的代码中直接对窗口进行控制.

<!--右侧按钮和下面的图案-->
                <Grid Grid.Column="2">
                    <!--分为两行-->
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition Height="15"></RowDefinition>
                    </Grid.RowDefinitions>
                    <!--三个图标-->
                    <!--WindowChrome.IsHitTestVisibleInChrome="True" 一定要加,否则自定义的不会显示-->
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Background="Transparent" WindowChrome.IsHitTestVisibleInChrome="True">
                        <Button Style="{StaticResource MinClose_BtnStyle}" Content="&#xe624;" Click="Button_Click_Min"></Button>
                        <Button Style="{StaticResource MinClose_BtnStyle}" Content="&#xe600;"></Button>
                        <Button Style="{StaticResource MinClose_BtnStyle}" Content="&#xe609;" Background="DarkRed" Click="Button_Click_Close"></Button>
                    </StackPanel>
                    <!--图案-->
                    <Border  Grid.Row="1" BorderBrush="#5518aabd" BorderThickness="0,1,0,0" >
                        <Border.Background>
                            <VisualBrush TileMode="FlipXY" Viewport="0,0,7,7" ViewportUnits="Absolute">
                                <VisualBrush.Visual>
                                    <Line X1="0" Y1="10" X2="10" Y2="0" Stroke="Gray" StrokeThickness="1"></Line>
                                </VisualBrush.Visual>
                            </VisualBrush>
                        </Border.Background>
                    </Border>
                </Grid>

        其中,设计三个图标时引入了一个自定义的资源字典,因为不止这里会用到,故定义的全局变量.

 <!--关闭\最小化按钮字典-->
    <Style TargetType="Button" x:Key="MinClose_BtnStyle">
        <Setter Property="Width" Value="40"></Setter>
        <Setter Property="Background" Value="#11ffffff"></Setter>
        <Setter Property="Foreground" Value="White"></Setter>
        <Setter Property="FontFamily" Value="../Res/Fonts/#iconfont"></Setter>
        
        <!--模板-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <!--grid的背景就是按钮的背景-->
                    <Grid Background="{TemplateBinding Background}">
                        <Border x:Name="border">
                            <!--用于显示控件的内容-->
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                        </Border>
                    </Grid>
                    
                    <!--触发器-->
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="Background" Value="#33ffffff"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                    
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

        这里字典中的FontFamily是再阿里巴巴资源图标库下载的后缀为.ttf的文件,content设置为里面的代码即可显示对应的图标 

        然后需要设计 WindowChrome.IsHitTestVisibleInChrome="True"

        最后的图案是再boder中使用画笔画出

        运行的结果

         第三行

         第三行是底部,比较简单和第一行类似,因此我们先进行设计.

        底部分为两列,第一列绘制图案,第二列是相关文字

        运行的结果

        第二行

        第二行内容很多,我们自定义一个用户控件放入.

        首先要做的就是定义一个用户控件嵌入到主窗口之中,这里先新定义一个用户控件文件,再创建一个ViewModel层的文件,在里面将二者绑定起来

 public event PropertyChangedEventHandler PropertyChanged;

        #region  中间那个 用户控件
        private UserControl _MonitorUC;

        public UserControl MonitorUC
        {
            get { 
                if(_MonitorUC == null)
                {
                   _MonitorUC = new MonitorUC();  
                }
                return _MonitorUC;
            }
            set {
                _MonitorUC = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MonitorUC"));
                }
            }
        }

             然后在主界面的 代码下实例化viewModel,设置数据上下文

 //实例化
        MainWindowVM mainWindowVM = new MainWindowVM();
        public MainWindow()
        {
            InitializeComponent();
            //设置数据上下文
            this.DataContext = mainWindowVM;
        }

        最后主界面一定要嵌入此用户控件,嵌入使用ContentControl

<ContentControl Grid.Row="1" Content="{Binding MonitorUC}"></ContentControl>

        运行结果:

        接着对第二行内部(自定义用户控件)进行设计,分为三行:

        第二行内部的第一行分为两列,左边的日期为一列,右边剩下的为一列

        左边第一列日期用一个水平方向的对面板里面放置一个TextBlock和一个垂直方向的堆面板,时间和日期视频里面是静态的,我这里进行动态获取,可参考这篇专栏里面的另一篇实时时间显示.

        右边分为左右两部分,用靠左和靠右实现即可,左边使用水平方向的堆面板进行排列,文字换行使用WPF里面的换行符,中间有背景的字是再border里面嵌套了一个TextBlock,之后使用ItemsControl控件循环获取显示数据.

<!--资源-->
                <StackPanel.Resources>
                    <!--动态数据模板-->
                    <DataTemplate x:Key="machineCount">
                        <!--将当前数据项(通常是一个对象)的默认属性值绑定到 TextBlock 的 Text 属性上-->
                        <Border Width="15" Background="#3318aabd" Margin="2,0">
                            <TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" FontSize="16"></TextBlock>
                        </Border>
                    </DataTemplate>
                </StackPanel.Resources>

         右边的按钮也是进行了一个资源编写.这里需要注意的是属性绑定,定义的目标对象是按钮,我们要放文字和一个图标进去,文字可以直接绑定按钮的Content属性,这里的图标绑定的是按钮的Tag属性,Tag在原按钮中什么也不代表,类似于官方预留的留给我们自定义的接口.

    <Style TargetType="Button" x:Key="Setting_BtnStyle">
        <Setter Property="Foreground" Value="#aaa"></Setter>
        <!--模板设置触发器\渐变色-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Background="Transparent" BorderThickness="1" x:Name="border">
                        <!--渐变色-->
                        <Border.BorderBrush>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                                <GradientStop Color="#22ffffff" Offset="0"></GradientStop>
                                <GradientStop Color="#77ffffff" Offset="0.5"></GradientStop>
                                <GradientStop Color="#22ffffff" Offset="1"></GradientStop>
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        
                        <!--里面放置一个图标 一个文字 Tag类似自定义属性  Content就是对应按钮的Content-->
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock Text="{TemplateBinding Tag}" FontFamily="../Res/Fonts/#iconfont" Margin="0,2,5,0"></TextBlock>
                            <TextBlock Text="{TemplateBinding Content}" VerticalAlignment="Center"></TextBlock>
                        </StackPanel>
                    </Border>
                    <!--触发器  放入按钮变颜色-->
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="Background" Value="#11ffffff"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        
    </Style>

        运行结果:

        第二行的中间部分也是分为3列,三列里面每一列再分为三行,当然也已使用UniformGrid,因为每部分的大小一致

        这里我们注意到GroupBox 几乎在每个部分都出现了,所以我们可以先把他画出来.

这里我们使用了Polyline画线,Ellipse画圆(点就是半径很小的圆),Path画路径,Polygon 画多边形. <ContentPresenter></ContentPresenter> 一定要加这句,才能显示重新定义的标题

<UserControl.Resources>
        <Style TargetType="GroupBox">
            <Setter Property="Margin" Value="10,3"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GroupBox">
                        <Grid>
                            <!--左上角的线条-->
                            <Polyline Points="0 30,0 10,10 0,30 0" Stroke="#9918aabd" StrokeThickness="1" VerticalAlignment="Top" HorizontalAlignment="Left"></Polyline>
                            <!--左上 横的点  小圆-->
                            <Ellipse Width="4" Height="4" HorizontalAlignment="Left" Fill="#9918aabd" VerticalAlignment="Top" Margin="24,-2,0,0"></Ellipse>
                            <!--左侧的点  小圆-->
                            <Ellipse Width="4" Height="4" HorizontalAlignment="Left" Fill="#9918aabd" VerticalAlignment="Top" Margin="-2,24,0,0"></Ellipse>

                            <!--Moveto-->
                            <Path Data="M0 0,3 3,30 3,33 0,68 0,73 7,78 7,78,10M8 0,25 0" Stroke="#9918aabd" VerticalAlignment="Top" HorizontalAlignment="Right"></Path>

                            <!--左下角的线条-->
                            <Polyline Points="0 0,0 15,10 15" Stroke="#9918aabd" StrokeThickness="1" VerticalAlignment="Bottom"  HorizontalAlignment="Left"></Polyline>

                            <!--右下角的线-->
                            <Polyline Points="10 0,0,10" Stroke="#9918aabd" StrokeThickness="1" HorizontalAlignment="Right" VerticalAlignment="Bottom"></Polyline>

                            <!--右下角的三角形-->
                            <Polygon Points="0 7,7 7,7 0" Fill="#9918aabd" HorizontalAlignment="Right" VerticalAlignment="Bottom"></Polygon>

                            <!--上面的线-->
                            <Border BorderThickness="0,1,0,0" BorderBrush="#9918aabd" VerticalAlignment="top" Margin="30,-0.5,78,0"></Border>
                            <!--右边的线-->
                            <Border BorderThickness="0,0,1,0" BorderBrush="#9918aabd"  HorizontalAlignment="Right" Margin="0,10"></Border>

                            <!--下面的线-->
                            <Border BorderThickness="0,0,0,1" BorderBrush="#9918aabd" VerticalAlignment="Bottom" Margin="10,0"></Border>

                            <!--左边的线-->
                            <Border BorderThickness="1,0,0,0" BorderBrush="#9918aabd"  HorizontalAlignment="Left" Margin="-0.5,15"></Border>

                            <!--文字前的装饰-->
                            <Path Data="M0 0,3 0,5 4,3 8,0 8,3 4"   Fill="#9918aabd" Margin="10,13"></Path>
                            <Path Data="M0 0,3 0,5 4,3 8,0 8,3 4"   Fill="#5518aabd" Margin="16,13"></Path>
                            <TextBlock Text="{TemplateBinding Header}" Foreground="White" FontWeight="Bold" Margin="25,8" HorizontalAlignment="Left" VerticalAlignment="Top"></TextBlock>
                            <!--显示内容-->
                            <ContentPresenter></ContentPresenter>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

        运行结果:

        

        然后进行里面具体内容的绘制,这一部分要创建一个Nodels层来管理数据,里面绘制的柱状图等需要使用到LiveCharts的插件.

        柱状图

<!--定义X数据-->
                        <lvc:CartesianChart Margin="20,35,20,5">
                            <lvc:CartesianChart.AxisX>
                                <lvc:Axis Labels="8:00,9:00,10:00,11:00,12:00,13:00,14:00,15:00,16:00">
                                    <lvc:Axis.Separator>
                                        <lvc:Separator Step="1" StrokeThickness="0"></lvc:Separator>
                                    </lvc:Axis.Separator>
                                </lvc:Axis>
                            </lvc:CartesianChart.AxisX>

                            <!--定义Y的数据-->
                            <lvc:CartesianChart.Series>
                                <lvc:ColumnSeries Values="300,400,480,450,380,450,450,330,340" Title="生产计数"  MaxColumnWidth="10">
                                    <!--渐变色-->
                                    <lvc:ColumnSeries.Fill>
                                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                            <GradientStop Color="#ff3fbbe6" Offset="0"></GradientStop>
                                            <GradientStop Color="#ff2bedf1" Offset="1"></GradientStop>
                                        </LinearGradientBrush>
                                    </lvc:ColumnSeries.Fill>
                                </lvc:ColumnSeries>

                                <lvc:ColumnSeries Values="15,55,15,40,38,45,56,42,24" Title="不良计数"  MaxColumnWidth="10">
                                    <!--渐变色-->
                                    <lvc:ColumnSeries.Fill>
                                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                            <GradientStop Color="#fffb9a9a" Offset="0"></GradientStop>
                                            <GradientStop Color="#ffff5151" Offset="1"></GradientStop>
                                        </LinearGradientBrush>
                                    </lvc:ColumnSeries.Fill>
                                </lvc:ColumnSeries>
                            </lvc:CartesianChart.Series>

                            <!--Y数据刻度-->
                            <lvc:CartesianChart.AxisY>
                                <lvc:Axis MinValue="0" MaxValue="500" >
                                    <lvc:Axis.Separator>
                                        <lvc:Separator Step="100" Stroke="#11ffffff"></lvc:Separator>
                                    </lvc:Axis.Separator>
                                </lvc:Axis>
                            </lvc:CartesianChart.AxisY>
                        </lvc:CartesianChart>

饼形图

 <!--饼形图-->
                    <!--定义数据标签样式-->
                    <lvc:PieChart InnerRadius="45" Margin="0,40,0,20">
                        <lvc:PieChart.Resources>
                            <Style TargetType="lvc:PieSeries">
                                <Setter Property="DataLabelsTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Point.SeriesView.Title}" Margin="0,0,5,0" Foreground="#44ffffff"></TextBlock>
                                                <TextBlock Text="{Binding Point.SeriesView.Values[0]}" Foreground="#44ffffff"></TextBlock>
                                            </StackPanel>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </lvc:PieChart.Resources>
                        <!--定义饼形图数据-->
                        <lvc:PieChart.Series>
                            <lvc:PieSeries Values="20" Title="压差" StrokeThickness="0" DataLabels="True" LabelPosition="OutsideSlice"></lvc:PieSeries>
                            <lvc:PieSeries Values="40" Title="振动" StrokeThickness="0" DataLabels="True" LabelPosition="OutsideSlice"></lvc:PieSeries>
                            <lvc:PieSeries Values="10" Title="设备温度" StrokeThickness="0" DataLabels="True" LabelPosition="OutsideSlice"></lvc:PieSeries>
                            <lvc:PieSeries Values="30" Title="光照" StrokeThickness="0" DataLabels="True" LabelPosition="OutsideSlice"></lvc:PieSeries>
                        </lvc:PieChart.Series>
                    </lvc:PieChart>

雷达:在界面中定义名字,在后台进行绘制

     <!--画布-->
        <Canvas x:Name="mainCanvas"></Canvas>
        
        <!--4规则多边形-->
        <Polygon x:Name="P1" Stroke="#22ffffff" StrokeThickness="1"></Polygon>
        <Polygon x:Name="P2" Stroke="#22ffffff" StrokeThickness="1"></Polygon>
        <Polygon x:Name="P3" Stroke="#22ffffff" StrokeThickness="1"></Polygon>
        <Polygon x:Name="P4" Stroke="#22ffffff" StrokeThickness="1"></Polygon>
        
        <!--数据多边形-->
        <Polygon x:Name="P5" Stroke="Orange" Fill="#550091F0" StrokeThickness="1" ></Polygon>
 /// <summary>
    /// RaderUC.xaml 的交互逻辑
    /// </summary>
    public partial class RaderUC : UserControl
    {
        public RaderUC()
        {
            InitializeComponent();

            SizeChanged += OnSizeChanged;//Alt+Enter
        }

        /// <summary>
        /// 窗体大小发生变化 重新画图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            Drag();
        }

        /// <summary>
        /// 数据源。支持数据绑定 依赖属性
        /// </summary>
        public List<RaderModel> ItemSource
        {
            get { return (List<RaderModel>)GetValue(ItemSourceProperty); }
            set { SetValue(ItemSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemSourceProperty =
            DependencyProperty.Register("ItemSource", typeof(List<RaderModel>), typeof(RaderUC));

        /// <summary>
        /// 画图方法
        /// </summary>
        public void Drag()
        {
            //判断是否有数据
            if (ItemSource == null || ItemSource.Count == 0)
            {
                return;
            }

            //清楚之前画的
            mainCanvas.Children.Clear();
            P1.Points.Clear();
            P2.Points.Clear();
            P3.Points.Clear();
            P4.Points.Clear();
            P5.Points.Clear();

            //调整大小(正方形)
            double size = Math.Min(RenderSize.Width, RenderSize.Height);
            LayGrid.Height = size;
            LayGrid.Width = size;
            //半径
            double raduis = size / 2;

            //步子跨度
            double step = 360.0 / ItemSource.Count;

            for (int i = 0; i < ItemSource.Count; i++)
            {
                double x = (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180);//x偏移量
                double y = (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180);//y偏移量

                //X Y坐标
                P1.Points.Add(new Point(raduis + x, raduis + y));

                P2.Points.Add(new Point(raduis + x * 0.75, raduis + y * 0.75));

                P3.Points.Add(new Point(raduis + x * 0.5, raduis + y * 0.5));

                P4.Points.Add(new Point(raduis + x * 0.25, raduis + y * 0.25));

                //数据多边形
                P5.Points.Add(new Point(raduis + x * ItemSource[i].Value * 0.01, raduis + y * ItemSource[i].Value * 0.01));

                //文字处理
                TextBlock txt = new TextBlock();
                txt.Width = 60;
                txt.FontSize = 10;
                txt.TextAlignment = TextAlignment.Center;
                txt.Text = ItemSource[i].ItemName;
                txt.Foreground = new SolidColorBrush(Color.FromArgb(100, 255, 255, 255));
                txt.SetValue(Canvas.LeftProperty, raduis + (raduis - 10) * Math.Cos((step * i - 90) * Math.PI / 180) - 30);//设置左边间距
                txt.SetValue(Canvas.TopProperty, raduis + (raduis - 10) * Math.Sin((step * i - 90) * Math.PI / 180) - 7);//设置上边间距

                mainCanvas.Children.Add(txt);
            }
        }
    }

        运行结果:

        最后一个部分 整体分为两行两列设计,获取数据方法和上面类似;样式这些可以自己慢慢条.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shell常用脚本:hadoop集群启动、停止、重启脚本

脚本内容以我搭建的hadoop集群为例&#xff0c;你们自用的时候自行根据你们的情况进行修改即可 hadoop-cluster-manager.sh #!/bin/bash # 1. 调用此脚本前&#xff0c;请使用ssh-keygen -t rsa、ssh-copy-id -f 目标机器这两个命令使得目标机器是免密登录的 # 2. ssh远程执行…

Linux常用操作命令和服务器硬件基础知识

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

【开源】SpringBoot框架开发班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09;。 实现步骤 监控摄像头可以有效地用于各种场景下的车辆计数和交通流量统计。先进的计算机视觉技术&#xff08;例如对象检测和跟踪&#xff09;可应用于监控录像&#xff0c;…

2023 收入最高的十大编程语言

本期共享的是 —— 地球上目前已知超过 200 种可用的编程语言&#xff0c;了解哪些语言在 2023 为开发者提供更高的薪水至关重要。 过去一年里&#xff0c;我分析了来自地球各地超过 1000 万个开发职位空缺&#xff0c;辅助我们了解市场&#xff0c;以及人气最高和收入最高的语…

C++_智能指针

目录 1、内存泄漏 1.1 什么是内存泄漏 1.2 内存泄漏的危害 1.3 如何避免内存泄漏 2、智能指针的应用场景 3、智能指针的原理 3.1 RAII 3.2 智能指针的使用 4、智能指针的拷贝问题 5、auto_ptr 6、unique_ptr 7、share_ptr 7.1 循环引用 7.2 weak_ptr 结…

Linux系统运维命令:查看系统的平均负载(查看CPU的负载)

目 录 一、要求 二、快速了解系统资源利用情况的Linux命令 &#xff08;一&#xff09;cat /proc/loadavg命令 1、命令介绍 2、命令输出 3、命令解释 &#xff08;1&#xff09;前三个数字&#xff1a; &#xff08;2&#xff09;第四个值&#xff1a; &…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextClock)

TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0c;最高精度到秒级。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextClock(options?…

c++进阶(c++里的继承)

文章目录 1.继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承类成员访问方式的变化 2.基类和派生类对象赋值转化3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承域静态成员 1.继承的概念及定义 1.1继承的概念 继承机制…

23、设计模式之访问者模式(Visitor)

一、什么是访问者模式 访问者模式是一种行为型设计模式&#xff0c;它可以用于在不修改已有对象结构的情况下&#xff0c;定义新的操作方式。简单地说就是在不改变数据结构的前提下&#xff0c;通过在数据结构中加入一个新的角色——访问者&#xff0c;来达到执行不同操作的目的…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

【C++】—— 代理模式

目录 &#xff08;一&#xff09;什么是代理模式 &#xff08;二&#xff09;为什么使用代理模式 &#xff08;三&#xff09;代理模式实现步奏 &#xff08;四&#xff09;代码示例 &#xff08;五&#xff09;代理模式优缺点 &#xff08;一&#xff09;什么是代理模式 …

车辆路径优化问题(VRP)变体及数学模型

车辆路径优化问题变体及数学模型 一、旅行商问题&#xff08;Travelling salesman problem&#xff0c;TSP&#xff09;TSP问题数学模型TSP问题求解 二、车辆路径问题&#xff08;Vehicle Routing Problem&#xff0c;VRP&#xff09;三、带容量约束的车辆路径优化问题&#xf…

【项目】C++ 基于多设计模式下的同步异步日志系统

前言 一般而言&#xff0c;业务的服务都是周而复始的运行&#xff0c;当程序出现某些问题时&#xff0c;程序员要能够进行快速的修复&#xff0c;而修复的前提是要能够先定位问题。 因此为了能够更快的定位问题&#xff0c;我们可以在程序运行过程中记录一些日志&#xff0c;通…

MySQL8.0 通过data文件恢复数据库

情景&#xff1a; mysql突然访问不了&#xff0c;也启动不了&#xff0c;需要保存之前的数据库文件&#xff0c;在卸载重装恢复数据 步骤&#xff1a; 1、Mysql里的数据一般会自动保存到C:\ProgramData\MySQL\MySQL Server 8.0\Data目录下&#xff0c;卸载前要将其备份。这是…

数据结构之树(Topk问题, 链式二叉树)

一.topk问题 取N个数中最大(小)的前k个值,N远大于k 这道题可以用堆的方法来解决,首先取这N个数的前k个值,用它们建堆 时间复杂度O(k) 之后将剩余的N-k个数据依次与堆顶数据进行比较,如果比堆顶数据大,则将堆顶数据覆盖后向下调整 时间复杂度(N-k)*log(N) 总共的时间复杂度…

【05】消失的数字

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5;所属专栏&#xff1a;C语言函数实现 感谢大家的观看与支持&#x1f339;&#x1f339;&#x1f339; 有问题可以写在评论区或者私信我哦…

缓冲区与C库函数的实现

目录 一、缓冲区 二、C库函数的实现 一、缓冲区 缓冲区本质就是一块内存&#xff0c;而缓冲区存在的意义本质是提高使用者(用户)的效率【把缓冲区理解成寄送包裹的菜鸟驿站】 缓冲区的刷新策略 1. 无缓冲(立即刷新) 2. 行缓冲(行刷新) 3. 全缓冲(缓冲区满了&#xff0c;再刷…