【机房重构】之七层登录

一、实体层(Enitity):定义属性,供其他各层之间传递

public class UserInfo
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Level { get; set; }
    }

二、接口层(IDAL):声明一个方法,让DAL层实现这个接口,并实现该接口中的方法

 public interface LoginIDAL
    {
        //放置接口函数,判断要登录的用户名是否在数据表中存在
        DataTable SelectUser(Entity.UserInfo user);
        //DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表)
    }

三、数据访问层(DAL):

 

说明:上一个项目是三层学习,直接跳到七层登录,确实有点困难。不过数据操作类(SQLHelper),如果有不懂的小伙伴可以先去看下一个项目【牛腩】的6—8集视频,老师讲的还挺清楚的。

public class LoginDAL:IDAL.LoginIDAL
    {
        public DataTable SelectUser(Entity.UserInfo user)
        {
            //实例化数据操作类,进行数据查询,并获取返回值
            SQLHelper sqlHelper = new SQLHelper();
            SqlParameter[] sqlparams = {new SqlParameter("@UserName", user.UserName), new SqlParameter
            ("@Password", user.Password)};//,new SqlParameter ("@Level",user.Level )
            string sql = @"SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password";//AND cobUserType=@Level
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);
            return table;           
        }
    }

四、工厂层(Factory):解除数据库的依赖,可随意转换数据库。(SQLserver、Access)

public class LoginFactory
    {
        //读配置文件
        string StrDB = ConfigurationManager.AppSettings["DB"];

        //应用反射来获取DAL层操作
        public IDAL.LoginIDAL CreateUser()
        {
            string ClassName = StrDB + "." + "LoginDAL";

            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
            //Assembly程序集
        }      
    }

五、业务逻辑层(BLL):判断信息是否存在

public class LoginBLL
    {
        //判断用户是否存在
        public bool UserBLL(Entity.UserInfo user)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory();   //实例化工厂

            IDAL.LoginIDAL idal = fact.CreateUser();    //调用工厂方法创建接口

            DataTable table = idal.SelectUser(user);    //接收D层的返回值

            bool flag;
            if (table.Rows.Count == 0)      //返回数据表类型,如果行数=0,说明没有符合该账号密码的用户
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;    //返回数值,帐号存在
        }

六、外观层(Facade):解耦UI层和BLL层,调用BLL层 的方法对信息进行验证

public class Facade
    {
        //判断用户是否存在,并提供返回值flag
        public Boolean SelectUser(Entity.UserInfo user)
        {
            bool flag;

            BLL.LoginBLL userBLL = new BLL.LoginBLL();

            flag = userBLL.UserBLL(user);

            return flag;
        }
    }

七、用户显示层(UI层)

private void btnLogin_Click(object sender, EventArgs e)
         {
            

            if (UserName.Text.Trim() == "" || Password.Text == "")//后面不加 Trim(),密码可能包含空格
            {
                MessageBox.Show("请输入你的用户名和密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }         
            //实例化一个外观
            Facade.Facade Facade = new Facade.Facade();
            
            //实例化一个用户
            Entity.UserInfo user = new Entity.UserInfo();

            //接受信息            
            user.UserName = UserName.Text.Trim ();
            user.Password = Password.Text;
          
            
            //调用外观方法,返回给user
            Boolean flag = false;
            Facade.Facade FLogin = new Facade.Facade();

            flag = FLogin.SelectUser(user);
         
            //判断是否登录成功
            if (flag != false)
            {
                MessageBox.Show("登录成功");
                this.Hide();

                this.DialogResult = DialogResult.OK;
               
               
                frmMain main = new frmMain();
                main.Show();                                     
            }
            else
            {
                lblShow.Text = "用户名或密码不正确";
            }
        }

总结:万事开头难,这句话总没错的。但,开始了就不难了,哈哈……其中的痛和快乐只有经历过的人才能真正明白,Fighting

 

你可能感兴趣的:(机房重构)