聊聊软件登录界面的设计与交互

前面说了一堆废话,想看代码的可直接看第二章。

版本记录

日期备注
2020-06-13初稿

零、前言

这个登录界面提取自最近正在做的一个项目,此项目曾被我自豪地称为是公司数采软件的颜值担当,虽然这里面有不少夸大的成分,但也并非担不起这个称号。这个项目能做出今天的程度,是项目组一起努力的结果,并非我一个人的功劳。

纵观公司这么多年的数采软件界面,清一色的都是很刻板、很标准的Windows风格。甚至在嵌入式数采仪上,这么多年来都是沿袭了Win8风格的磁贴界面,一成不变。我并不是说界面古板、简陋、一成不变不好,曾经的界面、功能能沿袭这么多年,最大的原因无非就是稳定。对于工控数采软件来说,稳定性尤其重要,一般都要求7×24小时不间断运行,界面简洁易用就够了。当然这也不是说工控数采软件不配拥有花哨华丽的界面,在我看来,以往一成不变的界面、特别是不管什么业务都复用同一个界面结构,虽然减少了开发工作,但最终出来的产品往往都千篇一律,突出不了软件的特色。

自从我接手柄主刀DATS(即所谓的数据采集传输系统)系列项目开发后,最开始分离了核心数采功能和业务功能,提炼出来一个相对纯粹的DATS内核,业务系统都基于此内核进行开发。

有关数采的内核架构,不是三言两语就能说得清。今天不聊数采,我只想聊聊其中最常见、但放在数采软件上很容易被忽略的的一个功能——用户登录。

一、登录界面的演化

用户登录功能在任何一个B/S、移动App项目上都有,甚至还会花大功夫去设计、打磨出一个耳目一新的界面。但对于公司的数采软件来说,一直都没重视过,有的场合还会带来不好的操作体验。

1.1 数采软件对权限控制的特殊要求

说起登录界面,那首先得聊聊权限控制。

数采软件正常都是无人值守运行的,但当需要维护、修改设置,尤其是需要下置命令修改仪器内部的设置时,如果任何人都有权限去操控,后果会很严重。这时候就需要一套简单的权限控制功能,这个权限控制功能跟B/S项目上的还略有出入。B/S项目中通常基于角色实现权限控制,角色对应的权限可以动态配置,但在缺少上下位一体的云平台的情况下,纯粹基于角色控制权限的思路并不完全适用于DATS。

在DATS的权限控制模块中,定义了四个等级的角色。

  • 普通用户
  • 高级用户
  • 管理员
  • 超级管理员

超级管理员之外,其余三个角色具备的权限由具体地业务系统分配,且分配好了就不能任意更改。这也是和常规B/S系统中的权限控制不同的地方。

超级管理员是系统内最高权限的角色,我们内置了唯一个超级管理员账号,此账号仅用于开发组,不对实施、售后、甚至客户公开。

1.2 前世

简单地提了下权限控制,下面贴几张图,看看之前几个系统的登录界面长啥样。

  • 前辈做的二代数采登录界面,是目前在运行的最古老的数采软件
    EQMS登录界面
  • 第三代数采登录界面
    DATS3登录界面
  • 第四代数采初期登录界面
    DATS.Water登录界面
    这三个界面的时间跨度超过六年,开发语言也从VB6换到C#,但外表完完全全是一个模子里刻出来的,除了简约,看不出别的特点了

1.3 演变

自从去年开始用WPF技术重构整个数采系统的UI,登录界面已经改过一个版本了,就是下面这个样子。
DATS.WasteWater登录界面

操作逻辑是当执行需要进行权限控制的功能前,如果发现尚未登录,则通过消息框提示用户。用户需要手动去点登录按钮,弹出该对话框,通过用户名和密码登录到系统,再返回到刚才要执行的操作,如下(请忽略原先的一个Bug)。
登录流程
这样的操作方式对于用户来说很不友好,特别是来回切换可能会造成上一次执行结果的丢失,让软件的易用性下降不止一个档次。

尤其是手头这个项目最终运行在带触摸屏的Windows一体机中,在没有鼠标键盘的情况下,让用户通过软键盘做重复的操作简直是噩梦,这怎么对得起颜值担当的称号呢?

1.4 今生

考虑到操作方式以触摸为主,我参考了手机银行App的交互逻辑,重新设计了如下的登录流程。
旧版登录交互效果
从上图中可以看出,正常运行时系统无需登录,当某个需要登录才能执行操作前,自动弹出登录画面,通过用户名和密码登录到系统后,此页面自动关闭,并继续往下执行原有逻辑。

大概的操作效果如下,交互已经友好多了,基本达到了我期望。
登录页面交互效果

二、登录界面的实现

2.1 思路

要实现上面的效果,其实也不难。说下思路吧。

将登录界面封装为一个用户控件放到主界面底部,通过设置高度为0,确保主界面刚显示的时候隐藏登录界面。绑定IsShow属性来实现调出和隐藏,当需要登录时,设置IsShow=True,通过StoryBoard增加其高度,直到铺满整个操作区域。登录成功或点击左上角的返回按钮,则设置IsShow=False,通过StoryBoard减少高度直至0。

2.2 代码

直接上代码,很简单,一看就懂,懒得写注释了。

首先是登录界面的ViewModel,通过单例模式保证全局共用同一个实例。其中WaitForLogin方法由需要权限控制的界面调用,登录成功后通过回调函数继续执行原有的逻辑。

class LoginViewModel : BaseViewModel
{private static LoginViewModel s_Instance = null;public static LoginViewModel Current{get{if (s_Instance == null){s_Instance = new LoginViewModel();}return s_Instance;}}private string m_LoginName;public string LoginName{get { return m_LoginName; }set{if (m_LoginName != value){m_LoginName = value;OnPropertyChanged(nameof(LoginName));}}}private string m_Password;public string Password{get { return m_Password; }set{if (m_Password != value){m_Password = value;OnPropertyChanged(nameof(Password));}}}private bool m_IsShow = false;public bool IsShow{get { return m_IsShow; }set{if (m_IsShow != value){LoginName = "";Password = "";m_IsShow = value;OnPropertyChanged(nameof(IsShow));}}}private LoginViewModel(){Minimize = new SimpleCommand(a => true, OnMinimize);Login = new SimpleCommand(a => true, OnLogin);}public ICommand Minimize { get; private set; }private void OnMinimize(object obj){IsShow = false;}public ICommand Login { get; private set; }private void OnLogin(object obj){if (string.IsNullOrEmpty(LoginName)){ShowWarning("用户名不能为空");return;}if (string.IsNullOrEmpty(Password)){ShowWarning("密码不能为空");return;}if (AccountService.LoginByPassword(LoginName, Password, false, out string errMsg)){this.IsShow = false;}else{this.Password = string.Empty;ShowError(errMsg);}}public Task WaitForLogin(Action callback){return Task.Run(() =>{if (!LoginAccountInfo.Current.IsLogin){IsShow = true;do{Thread.Sleep(500);}while (this.IsShow);}if (LoginAccountInfo.Current.IsLogin){App.Current.Dispatcher.Invoke(() =>{callback();});}});}
}

登录界面布局代码如下。

<UserControl x:Class="DATS.WasteWater.UI.Views.Permission.LoginView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"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:local="clr-namespace:DATS.WasteWater.UI.Views.Permission"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"xmlns:ViewModel="clr-namespace:DATS.WasteWater.UI.ViewModels.Permission"xmlns:ctrlib="http://sinoyd.gitlab.com/ctrlib"mc:Ignorable="d"x:Name="uc"d:DataContext="{d:DesignInstance ViewModel:LoginViewModel,IsDesignTimeCreatable=False}"d:DesignHeight="350" d:DesignWidth="300" Background="Transparent"><UserControl.Resources><Style x:Key="masklayerBackButton" TargetType="Button"><Setter Property="Height" Value="30" /><Setter Property="Width" Value="75" /><Setter Property="Background" Value="Transparent" /><Setter Property="Foreground" Value="White" /><Setter Property="Template"><Setter.Value><ControlTemplate><Border x:Name="grdMain" Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock Style="{StaticResource fa_angle_left}" Margin="0 0 5 0" VerticalAlignment="Center" HorizontalAlignment="Center" /><TextBlock Text="返回" VerticalAlignment="Center" HorizontalAlignment="Center" /></StackPanel></Border></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsPressed" Value="True"><Setter Property="Background" Value="#3FFF" /></Trigger></Style.Triggers></Style></UserControl.Resources><UserControl.Style><Style TargetType="UserControl"><Style.Triggers><DataTrigger Binding="{Binding IsShow}" Value="True"><DataTrigger.EnterActions><StopStoryboard BeginStoryboardName="collapseStoryBoard" /><BeginStoryboard x:Name="expandStoryBoard"><Storyboard><DoubleAnimation Storyboard.TargetProperty="Height" BeginTime="00:00:00" From="0" To="718" DecelerationRatio="1" Duration="00:00:00.300"/><BooleanAnimationUsingKeyFrames BeginTime="00:00:00.300" Storyboard.TargetProperty="IsEnabled"><DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:0" /><DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0.1" /></BooleanAnimationUsingKeyFrames></Storyboard></BeginStoryboard></DataTrigger.EnterActions><DataTrigger.ExitActions><StopStoryboard  BeginStoryboardName="expandStoryBoard"/><BeginStoryboard x:Name="collapseStoryBoard"><Storyboard><DoubleAnimation Storyboard.TargetProperty="Height" BeginTime="00:00:00" From="718" To="0" DecelerationRatio="1" Duration="00:00:00.300"/><BooleanAnimationUsingKeyFrames BeginTime="00:00:00.300" Storyboard.TargetProperty="IsEnabled"><DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:0" /></BooleanAnimationUsingKeyFrames></Storyboard></BeginStoryboard></DataTrigger.ExitActions></DataTrigger></Style.Triggers></Style></UserControl.Style><Grid><!--遮罩层--><Grid Background="#9000"></Grid><Button x:Name="backBtn" Margin="0 10 0 0" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding Minimize}" Style="{StaticResource masklayerBackButton}" /><StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"><Image Height="100" Width="100" HorizontalAlignment="Center" Source="/DATS.WasteWater.UI;component/Resources/Images/userIcon.jpg" Margin="0 0 0 50"><Image.Clip><GeometryGroup FillRule="Nonzero"><EllipseGeometry RadiusX="50" RadiusY="50" Center="50,50" /></GeometryGroup></Image.Clip></Image><ContentControl x:Name="ctLoginName" Grid.Row="1" VerticalAlignment="Center" Height="40" Grid.Column="1" HorizontalAlignment="Stretch" Width="220" IsTabStop="False"><Border BorderBrush="Silver" BorderThickness="1" Background="White" Padding="10 0 2 0" CornerRadius="5"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="25"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Style="{StaticResource fa_account}" Margin="0,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="18" /><TextBox x:Name="txtLoginName" Grid.Column="1" Text="{Binding LoginName}" Style="{StaticResource TextBoxExtend}" hc:InfoElement.Placeholder="用户名" hc:InfoElement.Necessary="True" HorizontalAlignment="Stretch" FontSize="15" VerticalContentAlignment="Center" BorderThickness="0" MaxLength="15" TabIndex="1" input:InputMethod.IsInputMethodEnabled="False" IsEnabledChanged="txtLoginName_IsEnabledChanged"/></Grid></Border></ContentControl><ContentControl x:Name="ctPassword" Grid.Row="2" VerticalAlignment="Center" Margin="10" Height="40" Grid.Column="1" HorizontalAlignment="Stretch" Width="220" IsTabStop="False"><Border BorderBrush="Silver" BorderThickness="1" Background="White" Padding="10 0 2 0" CornerRadius="5"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="25"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Style="{StaticResource fa_lock}" Margin="0,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="18" /><PasswordBox x:Name="txtPassword" Grid.Column="1" Style="{StaticResource PasswordBoxExtend}" hc:InfoElement.Placeholder="密码" hc:InfoElement.Necessary="True" HorizontalAlignment="Stretch" FontSize="15" VerticalContentAlignment="Center" BorderThickness="0" MaxLength="15" TabIndex="2"ctrlib:PasswordBoxHelper.Attach="True" ctrlib:PasswordBoxHelper.Password="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /></Grid></Border></ContentControl><Button Height="35" Content="登录" Style="{StaticResource ButtonPrimary}" FontSize="14" HorizontalAlignment="Center" Name="btnLogin" VerticalAlignment="Center" Width="220" Grid.Row="3" TabIndex="3" BorderBrush="DarkGray" FontWeight="Normal" Command="{Binding Login}" IsDefault="True" /></StackPanel></Grid>
</UserControl>

设计时的效果如下,在运行的时候会铺满整个屏幕。
DATS.WasteWater登录界面设计时效果

2.3 调用

到这一步,我们已经实现了一套沉浸式的用户登录界面以及交互流程,在业务模块中只需要通过这几行代码即可调出登录界面。

await LoginViewModel.Current.WaitForLogin(() =>
{// 登录成功后执行的业务逻辑
});

三、增加背景高斯模糊效果

仔细的读者可能会注意到上面的效果图中,背景做了模糊效果。没错,就是这个样子。
登录界面静态效果
而刚才的代码并没有实现这么个效果。其实这个高斯模糊(也就是BlurEffect)并没有加在登录界面上,了解WPF的同学都清楚,在页面的根元素上加入BlurEffect会导致该节目整个都被模糊了。

因此,高斯模糊只能加在背景层上。我这边是通过StroyBoard在显示的时候逐步增加模糊程度,关闭的时候逐步减少模糊程序,实现了渐变的效果。对于用户来说,有一个平滑的过度,视觉上不会很突兀。

代码如下

<Grid x:Name="grdBody" Grid.Row="1"><Grid.Effect><BlurEffect x:Name="bodyBlurEffect" Radius="0" RenderingBias="Performance" /></Grid.Effect><Grid.Style><Style TargetType="Grid"><Style.Triggers><DataTrigger Binding="{Binding LoginViewModel.IsShow}" Value="True"><DataTrigger.EnterActions><StopStoryboard BeginStoryboardName="unBlurStoryBoard" /><BeginStoryboard x:Name="blurStoryBoard"><Storyboard><DoubleAnimation Storyboard.TargetProperty="(Grid.Effect).(BlurEffect.Radius)" BeginTime="00:00:00" From="0" To="30" DecelerationRatio="1" Duration="00:00:00.300"/></Storyboard></BeginStoryboard></DataTrigger.EnterActions><DataTrigger.ExitActions><StopStoryboard BeginStoryboardName="blurStoryBoard" /><BeginStoryboard x:Name="unBlurStoryBoard"><Storyboard><DoubleAnimation Storyboard.TargetProperty="(Grid.Effect).(BlurEffect.Radius)" BeginTime="00:00:00" From="30" To="0" DecelerationRatio="1" Duration="00:00:00.300"/></Storyboard></BeginStoryboard></DataTrigger.ExitActions></DataTrigger></Style.Triggers></Style></Grid.Style><Frame x:Name="frameHost" Visibility="{Binding IsRealMonitorVisible, Converter={StaticResource booleanToUnVisibilityConverter}}" Source="{Binding DataContext.CurrentUrl, ElementName=mainWindow, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" NavigationUIVisibility="Hidden" FocusVisualStyle="{x:Null}" Background="{DynamicResource DefaultBrush}" /><Frame x:Name="frameRealTimeMonitor" Visibility="{Binding IsRealMonitorVisible, Converter={StaticResource booleanToVisibilityConverter}}" Source="/DATS.WasteWater.UI;component/Views/RealTimeMonitor/FactorViewPage.xaml" NavigationUIVisibility="Hidden" FocusVisualStyle="{x:Null}" Background="{DynamicResource DefaultBrush}" />
</Grid>

四、尾声

到此为止,一个能配地上颜值担当称号的登录界面就完成了。本文的主要目的只是陈述下思路,贴的代码中还引用了第三方库,直接复制是没法运行的,而且暂时也没有抽取Demo的计划。

2020年6月13日星期六

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交互设计介绍

交互设计是一门需要结合用户体验和设计思维的复杂学科。作为Ul设计师&#xff0c;我们需要通过了解用户需求和市场趋势&#xff0c;以及深入了解产品的特点和功能&#xff0c;来设计出符合用户需求的交互方式&#xff0c;以提高产品的用户体验和用户满意度。以下是一些交互设计…

Midjourney助力交互设计师设计网站主页

Midjourney的一大核心优势是提供创意设计&#xff0c;这个功能也可以用在网站主页设计上&#xff0c;使用Midjourney prompt 应尽量简单&#xff0c;只需要以"web design for..." or "modern web design for..."开头即可 比如设计一个通用SAAS服务的初创企…

诚意满满的奉上2000套Axure原型图设计源文件UI UX交互设计案例

网络上的Axure教程看了很多&#xff0c;大多数都是讲软件如何操作&#xff0c;讲交互逻辑和用户体验的却寥寥无几&#xff0c;而实际项目中却非常重交互逻辑和用户体验。把这2000套原型文件一一拆解&#xff0c;慢慢分析作者的设计思路&#xff0c;会发现&#xff0c;互联网产品…

11个优秀的交互设计作品集

本文转自墨刀编译自Vanschneider的10 inspiring ux portfolios and why they work。 不管你做什么样的设计&#xff0c;一个在线交互设计作品集都是必备的。在大多数情况下&#xff0c;公司和客户根本不会考虑你是做什么工作的。虽然很多交互设计师可能认为自己的工作不能很好…

Websocket的基本认识、使用与封装

目录 一、Websocket是什么 二、Websocket的基本使用 使用介绍 第一步 第二步 第三步 第四步 常用API介绍 WebSocket(url[, protocols]) WebSocket.readyState WebSocket.send(data) WebSocket.close([code[, reason]]) WebSocket.bufferedAmount WebSocket.exten…

asp.net paypal信用卡支付功能

前段时间有个客户网站需要用到信用卡支付功能&#xff0c;客户有个Website Payments Pro的帐号&#xff0c;第一次做这东西花了很多时间在上面&#xff0c;已做好运行了一段日子&#xff0c; 现在总结一下&#xff1a; 1. 先注册一个paypal开发者帐号&#xff0c;这个主要用于s…

通义听悟诞生背后,AI大模型打响应用第一枪

配图来自Canva可画 2023年伊始&#xff0c;ChatGPT的爆火出圈&#xff0c;迅速引发了业界对于生成式AI应用的关注&#xff0c;AI大模型的竞争更是愈演愈烈。 作为参与其中的重要玩家&#xff0c;阿里云先是在4月11日举行的阿里云峰会上&#xff0c;推出了通义千问大模型。紧接…

开发私有chatGPT(二)openai前景展望

使用 OpenAI 的强大模型构建下一代应用程序。 GPT-3可以执行各种自然语言任务、Codex 可以将自然语言转换为代码的 &#xff0c;DALLE&#xff0c;用于创建和编辑原始图像。 DALLE 开发人员现在可以开始使用&#xff0c;已经有超过3万人已经在使用DALLE来扩展他们的创造力并加…

快给你的对象做一个微信公众号播报吧-java版

一、前期准备 1.注册微信测试公众号 使用微信扫码登录此网站https://mp.weixin.qq.com/debug/cgi-bin/sandbox?tsandbox/login就能得到一个微信公众号测试号 推送消息需要用到的信息 用户扫码关注得到用户的id 编辑消息模板 此步骤的模板id、用户微信号id、以及自己的appID、…

2013年10月微软MVP当选名单揭晓!

微软公司于2001年8月起开始在亚洲与各大主要的第三方网站上的微软技术相关论坛合作&#xff0c;微软称之为“亚洲社区支持”计划。 为了鼓励大家在论坛中更好地互相帮助&#xff0c;共同提高&#xff0c;微软在全亚洲的微软论坛参与者中评选出那些技术水平高&#xff0c;积…

八大排序·希尔排序

大家好&#xff0c;我是安然无虞。 文章目录 希尔排序1.基本思想预排序 2.算法实现3.时间复杂度 遇见安然遇见你&#xff0c;不负代码不负卿。 插入排序分为两种&#xff1a;直接插入排序&希尔排序 希尔排序 1.基本思想 希尔排序是在直接插入排序基础上的优化&#xff0c…

十大排序之希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种算法&#xff0c;是对直接插入排序的一个优化&#xff0c;也称缩小增量排序。 希尔排序是非稳定排序算法。 希尔排序因DL&#xff0e;Shell于1959年提出而得名。 希尔排序是将待排序的数组元素按下标的一定增量分组 &#xff…

NBA球员出手位置分布图

小白一只&#xff0c;想转行互联网行业的数据分析&#xff0c;通过寒假的佛系学习对python有了一定的了解。记录一下第一个小玩意儿。 在刷crossin论坛的时候突然看到一篇关于NBA的数据分析&#xff0c;因为本身自己也非常喜欢打球&#xff0c;顿时就有了兴趣。 由于对python…

【八大排序(二)】希尔排序(谁说天才都短命?)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; Shell排序 1. 前言&#x1f6a9;2. 希尔排…

网络安全工程师需要考什么证吗?

目前网络安全行业&#xff0c;国内都有哪些证书可以考。 一、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09; CISP-PTE即注册信息安全渗透测试工程师&#xff0c;该证书由中国信息安全测评中心颁发&#xff0c;证书是国内唯一认可的渗透测试认证&#xff0c;专业性…

网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?

网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f;其中&#xff0c;网络安全工程师工作内容具体有哪些&#xff1f; 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而受到破坏、更改、泄露&#xff0c;系统…

为什么说,网络安全工程师是网安行业的天花板?

为什么说&#xff0c;网络安全工程师是网安行业的天花板&#xff1f; 最近看到网上有很多人在问诸如&#xff1a;“怎样成为网络信息安全工程师”等相关问题&#xff0c;甚至还有人说“网络安全工程师已经成为这个行业的天花板”&#xff0c;这可能与近几年网络安全事件频发&a…

网络安全工程师必备的七大技能

网络安全有多重要 网络安全非常重要&#xff0c;因为在现代社会中&#xff0c;人们日常生活中的很多方面都与网络有关。随着互联网和数字技术的不断发展&#xff0c;人们已经变得越来越依赖网络&#xff0c;网络已经成为了商业、金融、通信、交通、能源、医疗、教育等各个领域…

软考网络工程师

网络工程师备考经验 2022年上半年网络工程师的考试已经接近尾声&#xff0c;成绩也在7月23号出来了&#xff0c;本人运气很好&#xff0c;在这次考试中取到了满意的成绩&#xff0c;下面是查询结果。 配套资料&#xff1a; 链接: https://pan.baidu.com/s/1b486ZUOYpjsNN-9oK…

网络安全工程师是做什么的?

顾名思义&#xff0c;网络安全工程师主要是维护网络的安全和稳定&#xff0c;对网页篡改、计算机病毒、系统非法入侵、数据泄密、网站欺骗、服务瘫痪、漏洞非法利用等信息安全事件进行维护。从社会角度来看&#xff0c;网络安全工程师在维护个人信息安全和解开黑客攻击上发挥着…