运用WPF和ADO.Net实现限制登录错误次数的简单登录界面

  最近看了一下传智播客的免费公开课视频,有一个登录界面的小练习。其中涉及到登录时间的限定功能,并未实现。所以我就自己动手写了一个,大家可以看看。

首先编写SqlHelper类,通过SqlHelper类实现SQL单语句操作数据库。代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Data.SqlClient;
 6 using System.Data;
 7
 8 namespace 登录界面
 9 {
10     class SqlHelper
11     {
12         //此处没有设置为App.Config文件里的配置,只是想简单实现本项目。
13         private static string connectStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=JJLogin;Integrated Security=True;";
14
15         public static void ExecuteNonQuery(string sql, params SqlParameter[] parameters)
16         {
17             using (SqlConnection conn = new SqlConnection(connectStr))
18             {
19                 conn.Open();
20                 using (SqlCommand cmd = conn.CreateCommand())
21                 {
22                     cmd.CommandText = sql;
23                     cmd.Parameters.AddRange(parameters);
24                     cmd.ExecuteNonQuery();
25                 }
26             }
27         }
28
29         public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
30         {
31             using (SqlConnection conn = new SqlConnection(connectStr))
32             {
33                 conn.Open();
34                 using (SqlCommand cmd = conn.CreateCommand())
35                 {
36                     cmd.CommandText = sql;
37                     cmd.Parameters.AddRange(parameters);
38                     object obj = cmd.ExecuteScalar();
39                     return obj;
40                 }
41             }
42         }
43
44         public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
45         {
46             using (SqlConnection conn = new SqlConnection(connectStr))
47             {
48                 conn.Open();
49                 using (SqlCommand cmd =conn.CreateCommand())
50                 {
51                     cmd.CommandText = sql;
52                     cmd.Parameters.AddRange(parameters);
53                     SqlDataAdapter adapter = new SqlDataAdapter(cmd);
54                     DataTable ds = new DataTable();
55                     adapter.Fill(ds);
56                     return ds;
57                 }
58             }
59         }
60     }
61 }

  因最近半个月都在学习WPF技术,所以本示例采用的是WPF显示层技术。XAML代码如下:

 1 <Window x:Class="登录界面.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="微博登录" Height="200" Width="250" ResizeMode="NoResize">
 5     <Grid>
 6         <Grid.RowDefinitions>
 7             <RowDefinition Height="Auto"></RowDefinition>
 8             <RowDefinition Height="Auto"></RowDefinition>
 9             <RowDefinition Height="Auto"></RowDefinition>
10             <RowDefinition Height="*"></RowDefinition>
11         </Grid.RowDefinitions>
12         <Grid.ColumnDefinitions>
13             <ColumnDefinition Width="Auto"></ColumnDefinition>
14             <ColumnDefinition Width="*"></ColumnDefinition>
15             <ColumnDefinition Width="Auto"></ColumnDefinition>
16         </Grid.ColumnDefinitions>
17         <TextBlock Grid.Row="0" Grid.Column="0" Text="用户名"></TextBlock>
18         <TextBlock Grid.Row="1" Grid.Column="0" Text="密码"></TextBlock>
19         <TextBox x:Name="txt_UserName" Grid.Row="0" Grid.Column="1" Margin="3"></TextBox>
20         <PasswordBox x:Name="txt_PassWord" Grid.Row="1" Grid.Column="1" Margin="3"></PasswordBox>
21         <DockPanel x:Name="btndock_login" Grid.Row="2" Grid.Column="1" Margin="3" Button.Click="btndock_login_Click">
22             <Button x:Name="btn_loginIn" Content="登录" HorizontalAlignment="Left" Margin="3"></Button>
23             <Button x:Name="btn_loginOut" Content="取消" HorizontalAlignment="Right" Margin="3"></Button>
24         </DockPanel>
25         <TextBlock x:Name="tbk_LoginMessage" Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Stretch" TextWrapping="Wrap"></TextBlock>
26     </Grid>
27 </Window>

  逻辑层代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Windows;
  6 using System.Windows.Controls;
  7 using System.Windows.Data;
  8 using System.Windows.Documents;
  9 using System.Windows.Input;
 10 using System.Windows.Media;
 11 using System.Windows.Media.Imaging;
 12 using System.Windows.Navigation;
 13 using System.Windows.Shapes;
 14 using System.Data.SqlClient;
 15 using System.Data;
 16 using System.ComponentModel;
 17
 18 namespace 登录界面
 19 {
 20     /// <summary>
 21     /// MainWindow.xaml 的交互逻辑
 22     /// </summary>
 23     public partial class MainWindow : Window
 24     {
 25         private Message message;
 26         public MainWindow()
 27         {
 28             InitializeComponent();
 29
 30             message = new Message();
 31             tbk_LoginMessage.SetBinding(TextBlock.TextProperty, new Binding("LoginInfo") { Source = message });
 32         }
 33
 34         private void btndock_login_Click(object sender, RoutedEventArgs e)
 35         {
 36             if (e.OriginalSource is Button)
 37             {
 38                 switch (((Button)e.OriginalSource).Name)
 39                 {
 40                     case "btn_loginIn":
 41                         {
 42                             LoginIn(txt_UserName.Text, txt_PassWord.Password);
 43                         } break;
 44                     case "btn_loginOut":
 45                         {
 46                             txt_UserName.Text = string.Empty;
 47                             txt_PassWord.Password = string.Empty;
 48                         }
 49                         break;
 50                     default: break;
 51                 }
 52             }
 53             else
 54             {
 55                 throw new Exception("请点击登录或取消按钮");
 56             }
 57         }
 58
 59         private void LoginIn(string userName, string password)
 60         {
 61             //查询SQLServer默认情况下不区分大小写,因此对于用户名需要采取区分大小写的查询方式,此程序有待升级
 62             string sqlSelect = "select * from T_User where [email protected]";
 63             DataTable table = SqlHelper.ExecuteDataTable(sqlSelect, new SqlParameter("@UserName", txt_UserName.Text));
 64             int count = table.Rows.Count;
 65             if (count <= 0)
 66             {
 67                 message.LoginInfo = "用户不存在";
 68                 return;
 69             }
 70             else if (count > 1)
 71             {
 72                 message.LoginInfo = "不好啦,用户名重复啦";
 73                 return;
 74             }
 75             DataRow row = table.Rows[0];
 76             long id = (long)row["ID"];
 77             string dbPassword = (string)row["PassWord"];
 78             int frequency = (int)row["Frequency"];
 79             DateTime dbTime = (DateTime)row["ErrorTime"];
 80             if (frequency >= 3)
 81             {
 82                 //如果frequency>=4就会比较dbTime与DateTime.Now之间的时间间隔是否大于15s
 83                 if (frequency >= 4)
 84                 {
 85                     TimeSpan timespan = DateTime.Now - dbTime;
 86                     double d = timespan.TotalSeconds;
 87                     if (d < 15.0)
 88                     {
 89                         message.LoginInfo = "请15s后再来登陆";
 90                         return;
 91                     }
 92                     //只要超过15s间隔再登陆就应该设置错误次数=0
 93                     frequency = 0;
 94                     goto passwordValidate;
 95                 }
 96
 97                 string sqlUpdateErrorTime = "Update T_User set [email protected],[email protected]+1";
 98                 SqlHelper.ExecuteNonQuery(sqlUpdateErrorTime, new SqlParameter("@ErrorTime", DateTime.Now), new SqlParameter("@Frequency", frequency));
 99                 message.LoginInfo = "输入错误次数太多,请耐心等待15s后再登陆";
100                 return;
101             }
102
103         passwordValidate:
104             if (dbPassword != password)
105             {
106                 string sqlUpdateFrequency = "Update T_User set [email protected]+1";
107                 SqlHelper.ExecuteNonQuery(sqlUpdateFrequency, new SqlParameter("@Frequency", frequency));
108                 message.LoginInfo = "密码输入错误"+(frequency+1)+"次";
109                 return;
110             }
111             else
112             {
113                 frequency = 0;
114                 string sqlUpdateFrequency = "Update T_User set [email protected]";
115                 SqlHelper.ExecuteNonQuery(sqlUpdateFrequency, new SqlParameter("@Frequency", frequency));
116                 message.LoginInfo = "登陆成功";
117             }
118         }
119     }
120
121     public class Message : INotifyPropertyChanged
122     {
123         private string loginInfo;
124         public string LoginInfo
125         {
126             get { return loginInfo; }
127             set
128             {
129                 loginInfo = value;
130                 if (PropertyChanged != null)
131                 {
132                     PropertyChanged(this, new PropertyChangedEventArgs("LoginInfo"));
133                 }
134             }
135         }
136
137         public event PropertyChangedEventHandler PropertyChanged;
138     }
139 }

  数据库设计:

1 //ID                    bigint
2 //UserName       nvchar(20)
3 //PassWord       nvchar(20)
4 //Frequency       int
5 //ErrorTime        datetime

  关于登录时间的处理,本示例的思路是:如果连续三次登录错误,就会将当前系统时间存进数据库,但是输入错误次数(frequency)不清零。当你再次尝试登录时,会从数据库中读出本用户上次错误登录时的时间,将该值与现在的系统时间进行比较,如果小于规定的时间间隔,则提示用户耐心等待。如果时间间隔(timespan)大于规定的时间间隔,则将错误登录次数清零,接着进行经常的密码验证流程。

  本示例是一个简单版本,当然会有很多考虑不周到的地方。目前的不足:

  1.数据库查询如何进行大小写敏感设置,目前我还不会如何设置,所以数据库中的用户名输入大小写都能登录成功,这个肯定要改。

  2.因为是用WPF做的界面,所以关于登录信息提示的TextBlock,其文本属性应该绑定到Message消息中,所以可设置一个Message类,将提示信息文本保存在Message类的LoginInfo属性中。但是用户名和密码等输入文本框也应该以Mode=OneWayToSource绑定到User类的UserName与Password属性中。并对输入的数据进行Validation,通过自定义UserNameValidationRule和PasswordValidationRule。这些细节目前还没完全实现,正在编码中。在接下来的WPF学习中会继续研究。

  最后,大家如有好的意见可以留言。

时间: 2024-10-06 11:33:59

运用WPF和ADO.Net实现限制登录错误次数的简单登录界面的相关文章

python学习之路之案例0(实现登录功能,登录错误次数超过3次,自动退出登录)

一.整个案例运用到的知识点 1.python字典.字符串.列表的灵活转换和使用 2.python数据结构之字符串:字符串的格式化.字符串的去空格(strip()) 3.python数据结构之字典:字典的构建.字典和字符串的转换 4.python数据结构列表:列表的构建.列表和字符串的转换 5.if....else....判断的使用 6.for循环.while True死循环的使用 5.文件的打开.读取.关闭等功能的使用 二.整个案例的设计的中心思想 1.首先读取用户表文件里面的字符串:包括用户名

【ADO.NET】2、各种版本的 简单登录验证

一.简单登录验证(防SQL注入) GetString(序号) 返回某一列的值(当用户不记得列名序号时,可使用GetOrdinal()获取到序号)GetInt32(序号) 针对的是 int 字段,返回int字段的值GetOrdinal("列名") 根据列名得到序号 Console.WriteLine("请输入用户名:"); string Uname=Console.ReadLine(); Console.WriteLine("请输入密码:"); s

[uwp]MVVM之MVVMLight,一个登录注销过程的简单模拟

之前学MVVM,从ViewModelBase,RelayCommand都是自己瞎写,许多地方处理的不好,接触到MVVMLigth后,就感觉省事多了. 那么久我现在学习MVVMLight的收获,简单完成以下一个Demo Demo主要功能是: 用户在登录界面登陆,登录成功后跳转到另一个页面,同时把登录时的用户信息作为参数传递过去,然后用户可以选择注销,注销时会弹出对话框,让用户选择是否真的注销,如果是,就真的注销,回退到       登录页面,否则就不做任何处理. 功能很简洁,接下来就用MVVMLi

SQL Server 2008登录错误:无法连接到(local)解决方法

在一些朋友安装完SQL Server 2008之后大多会遇到连接出错的问题比如:SQL Server 2008登录错误:无法连接到(local)等等相关问题,本文将详细介绍解决方法,需要的朋友可以参考下 在一些朋友安装完SQL Server 2008之后大多会遇到连接出错的问题.特别对于我们这样的新手而言简直郁闷的要死,好不容易装玩了又出现了问题.此篇文章意在解决安装步骤没有问题,但安装后无法登录的问题. 在解决问题之前请朋友们打开服务窗口,看“SQL Server”主服务是否打开,如下图. 若

单点登录技术:微软Passport单点登录协议和自由联盟规范

随着互联网络应用的普及,越来越多的人开始使用互联网上提供的服务.然而目前提供服务的网站大多采用用户名.口令的方式来识别用户身份,这使得用户需要经常性的输入自己的用户名.口令.显然这种认证方式存在着弊端:随着用户网络身份的增多,用户相应的需要记忆多组用户名.口令,这给用户造成记忆上的负担:另外频繁的输入用户名.口令,会相应的增大用户的口令密码被破解的机率.为了改变这一现状,单点登录技术应运而生. 单点登录技术的核心思想是通过一定的方式使得各提供服务的网站之间建立某种联系,用户只需要在其中一个认证网

简单登录,退出系统,练习

1, 步骤:    1) 创建一个登录页面, LoginPage.java        1> 页面内有 账号,密码框, 登录按钮,退出按钮    2) 登录成功跳转页面        1> 取得账号,密码            a. request.getParameter("uname");            b. request.getParameter("password");        2> 判断账号密码正确性        3&

shell脚本精华----在10秒内SSH登录失败次数超过3次就使用iptables/tcpwrappers拒绝

#!/bin/bash while true do badip=$(lastb -i -a | awk '/ssh:notty/ {print $NF}'|sort|uniq -c|awk '($1>3) {print $2}') for i in $badip do iptables -t filter -I INPUT -s $i -p tcp --dport 22 -j DROP done : > /var/log/btmp sleep 10s done shell脚本精华----在10

【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

上面博文,主要简单的介绍了一下SSH的基本概念,比較宏观.作为刚開始学习的人可以有一个总体上的认识,个人觉得对学习有非常好的辅助功能,它不不过一个"瞭望塔".更是检验是否真正掌握全部内容的一个前提. Struts是基于MVC的框架,它进一步的对MVC进行了封装,它是怎么封装的,我们从先回想一下MVC再到Struts.再用Struts给大家实现一个简单登录的实例.我们開始吧. MVC 概念 MVC全名是Model View Controller,是模型(model)-视图(view)-控

ubuntu14.04忽然不能登录,输入密码一直返回登录界面

ubuntu14.04忽然不能登录,输入密码一直返回登录界面 http://www.myexception.cn/operating-system/1707766.html ubuntu14.04突然不能登录,输入密码一直返回登录界面 解决方法: 1.ctrl + alt + F1进入命令终端 2.重装gdm,sudo apt-get install gdm 3.修改启动顺序:dpkg -reconfigure gdm 4.重启reboot可登录.