案例: 三次锁定(上)

输入错了三次禁止登录, 15分钟后才能继续. 用数据库记录ErrorTimes, 最后出错时间uLoginTime数据导入

第一步:

在App.config中添加连接字符串

cs 复制代码
<connectionStrings>
	<add name="conStr" connectionString="Data Source = WINGEL; Initial Catalog = People; Trusted_Connection = SSPI"/>
</connectionStrings>

创建一个在项目中的文件夹, 取名叫service, 然后创建一个接口类叫userService.cs

cs 复制代码
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dome16_三次锁定.service
{
    internal interface userService
    {
        // 判断用户是否被锁定
        bool IsLock(string name);

        // 更新错误次数归0
        void UpdateErrorTime(string name);

        // 登入是否成功
        bool IsLoginSuccess(string name, string pwd);

        // 是否注册成功
        bool IsRegister(string name, string pwd);

        // 更新时间和错误登入次数
        void UpdateLoginTime_ErrorTime(string name);
    }
}

创建一个文件夹在service文件夹内, 取名叫serviceimpl, 然后再创建一个实现接口的类叫userServiceimpl.cs

cs 复制代码
using Dome16_三次锁定.utils;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dome16_三次锁定.service.serviceimpl
{
    internal class userServiceimpl : userService
    {
        string conStr { get; set; }

        public userServiceimpl()
        {
            this.conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
        }

        // 判断用户是否被锁定
        public bool IsLock(string name)
        {
            bool b = false;

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "select * from [User] where uErrorTime = 3 and " +
                    "Datediff(minute, uLoginTime, getdate()) < 15 and uLoginName = @name";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddWithValue("@name", name);
                    conn.Open();

                    SqlDataReader reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        b = true;
                    }
                }
            }

            return b;
        }

        // 更新错误次数归0
        public void UpdateErrorTime(string name)
        {
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "update [User] set uErrorTime = 0 where uLoginName = @name";

                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddWithValue("@name", name);
                    conn.Open();

                    cmd.ExecuteNonQuery(); // 增删改
                }
            }
        }

        // 登入是否成功
        public bool IsLoginSuccess(string name, string pwd)
        {
            bool b = false;

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "select * from [User] where uLoginName = @name and uPwd = @pwd";

                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    pwd = Md5Util.Md5Create(pwd);

                    cmd.Parameters.AddWithValue("@name", name);
                    cmd.Parameters.AddWithValue("@pwd", pwd);

                    conn.Open();

                    SqlDataReader r = cmd.ExecuteReader();

                    if (r.HasRows)
                    {
                        b = true;
                    }
                }
            }

            return b;
        }

        // 是否注册成功
        public bool IsRegister(string name, string pwd)
        {
            bool b = false;

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "select * from [User] where uLoginName = @name";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddWithValue("@name", name);
                    conn.Open ();

                    SqlDataReader reader = cmd.ExecuteReader();

                    if (!reader.HasRows) 
                    {
                        if(Register(name, pwd))
                        {
                            b = true;
                        }
                    
                    }

                }

            }

            return b;
        }

        bool Register(string name, string pwd)
        {
            bool b = false;

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "INSERT into [User] VALUES (@name,@pwd,@logintime,@errortime)";
                using (SqlCommand cmd = new SqlCommand(sql, conn)) 
                {
                    pwd = Md5Util.Md5Create(pwd);

                    cmd.Parameters.AddWithValue ("@name", name);
                    cmd.Parameters.AddWithValue("@pwd", pwd);
                    cmd.Parameters.AddWithValue("@logintime", DateTime.Now);
                    cmd.Parameters.AddWithValue("@errortime", 0);
                    conn.Open ();

                    int r = cmd.ExecuteNonQuery();

                    if(r > 0)
                    {
                        b = true;
                    }
                }
            }
            return b;
        }

        // 更新时间和错误登入次数
        public void UpdateLoginTime_ErrorTime(string name)
        {
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "UPDATE [User] SET uErrorTime = uErrorTime + 1, uLoginTime = GETDATE() where uLoginName = @name";

                using(SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddWithValue("@name", name);
                    conn.Open ();
                    cmd.ExecuteNonQuery();
                }
            }
        }

    }
 
}
相关推荐
心之语歌17 分钟前
LiteFlow Spring boot使用方式
java·开发语言
人才程序员43 分钟前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
极客先躯1 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
指尖下的技术1 小时前
Mysql面试题----MyISAM和InnoDB的区别
数据库·mysql
dot.Net安全矩阵1 小时前
拒绝 Github 投毒,通过 Sharp4SuoBrowser 分析 Visual Studio 隐藏文件
ide·安全·web安全·github·.net·.netcore·visual studio
梁雨珈1 小时前
PL/SQL语言的图形用户界面
开发语言·后端·golang
励志的小陈1 小时前
C语言-----扫雷游戏
c语言·开发语言·游戏
永远是我的最爱1 小时前
数据库SQLite和SCADA DIAView应用教程
数据库·sqlite
martian6652 小时前
第19篇:python高级编程进阶:使用Flask进行Web开发
开发语言·python
gis收藏家2 小时前
利用 SAM2 模型探测卫星图像中的农田边界
开发语言·python