案例: 三次锁定(上)

输入错了三次禁止登录, 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();
                }
            }
        }

    }
 
}
相关推荐
初夏睡觉5 小时前
从0开始c++,但是重置版,第1篇(c++基本框架)
开发语言·c++
workflower11 小时前
时序数据获取事件
开发语言·人工智能·python·深度学习·机器学习·结对编程
CoderYanger11 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
廋到被风吹走12 小时前
【数据库】【MySQL】InnoDB外键解析:约束机制、性能影响与最佳实践
android·数据库·mysql
C++业余爱好者12 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
林杜雨都12 小时前
Action和Func
开发语言·c#
皮卡龙12 小时前
Java常用的JSON
java·开发语言·spring boot·json
掘根12 小时前
【消息队列】交换机数据管理实现
网络·数据库
Logic10112 小时前
《Mysql数据库应用》 第2版 郭文明 实验6 数据库系统维护核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
火山灿火山12 小时前
Qt常用控件(三)
开发语言·qt