【三层】-—登录窗体为例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xml1996/article/details/81476654

What:

UI层(显示层)
简单理解为直接和用户进行交互的层次,但并不代表它只有一个界面,它对用户的体验有着很重要的作用

特点:

  1. 简易
  2. 一致性:风格结构清晰一致
  3. 色彩的舒适度
  4. 文字主次分明
  5. 易用性:易上手傻瓜式操作
BLL(业务逻辑层)
对UI层传入的内容进行逻辑处理后传递给下一层,再由下一层返回值后再进行逻辑处理呈现给用户需要的内容

作用:
1. 系统架构的核心价值部分
2. 集中在制定业务规则的
3. 实现业务流程
4. 系统设计业务需求
5. 在UI和DAL层中起承上启下的作用

DAL(数据访问层)
对BLL层进行逻辑处理后传递给DAL层,DAL层只负责查找所需要的信息,不对信息进行操作,对于查到的信息返回给BLL层后再进行操作

用一个形象的图表示三层之间的关系:
这里写图片描述
服务员=UI;厨师=BLL;采购员=DAL
具体实现对比下图:
这里写图片描述

Why:

三层
是在客户端和数据库之间的一种逻辑结构,是一种架构设计理念。界面-逻辑-数据

特点:

  1. 无需开发客户端软件,维护和升级方便
  2. 可跨平台操作
  3. 有良好的开放性和可扩充性
  4. 便于数据库移植
  5. 安全性好
  6. 资源重要性好
  7. 缺点:在UI层修改的时候可能会涉及到BLL和DBL层的修改。

How:

对比:之前用VB在弄机房登录界面的时候应用代码如下:
删减了部分内容,只留下了查询数据库验证后登录,同时在另一个登录记录表上添加登录信息。
前一部分:声明变量部分
中间部分:查询信息是否和数据库中相符验证,相符则在登录记录表上添加记录。
最后部分:如果都验证没有问题也记录在登录表上了,那么进入主界面。

Private Sub cmdOk_Click()
Dim txtSQL As String '用来存放SQL语句
Dim mrc2 As adodb.Recordset
Dim mrc As adodb.Recordset '用来存放记录集对象
Dim mrc1 As adodb.Recordset
Dim msgtext As String '用来存放返回信息
   '查询指定用户的记录
   txtSQL = "select * from User_Info where UserID = '" & txtUserName.Text & " ' "
   '执行查询语句
   Set mrc = ExecuteSQL(txtSQL, msgtext)

  '判断输入密码是否正确
  If Trim(mrc.Fields(1)) = Trim(txtPassword.Text) Then
     OK = True
             '登录的同时,要在Onworklog表上有正在登录的记录
             txtSQL1 = "select * from OnWork_info "
             Set mrc1 = ExecuteSQL(txtSQL1, msgtext1)
             ComptName = VBA.Environ("computername")
             mrc1.AddNew
             mrc1.Fields(0) = Trim(txtUserName)
             mrc1.Fields(1) =Trim(mrc.Fields(2))
             mrc1.Fields(2) = Date
             mrc1.Fields(3) = Time
             mrc1.Fields(4) = Trim(ComptName)
             mrc1.Update
             mrc1.Close

             '登录的同时,要在Worklog表上有登录的部分信息
             txtsql2 = "select * from Worklog_info "
             Set mrc2 = ExecuteSQL(txtsql2, msgtext2)
             '让电脑名称存在computername里
             ComptName = VBA.Environ("computername")
             mrc2.AddNew
             mrc2.Fields(1) = Trim(txtUserName)
             mrc2.Fields(2) = Trim(mrc.Fields(2))
             mrc2.Fields(3) = Date
             mrc2.Fields(4) = Time
             mrc2.Fields(7) = Trim(ComptName)
             mrc2.Fields(8) = "True"
             mrc2.Update
             mrc2.Close
             mrc.Close
             Me.Hide

             '登录窗体隐藏,主窗体显示之前进行赋值
              UserName = Trim(txtUserName.Text)
              frmMain.Show
     End If         
Exit Sub
End Sub

在三成中的登录窗体:
这里写图片描述
UI层:UI层引用BLL层。声明字符串、实例化BLL层下的LoginServerice类、相当于给最后用户信息验证的值找一个传递的载体通路,为了让传的值最后可以回到UI层。

private void btnLogin_Click_1(object sender, EventArgs e)
{
   string userName = TextUserName.Text.Trim();
   string password = txtPassword.Text;
   Login.BLL.LoginServerice mgr = new Login.BLL.LoginServerice();
   Login.Model .UserInfo user=mgr.UserLogin(userName, password);
   MessageBox.Show("登录用户:" + user.UserName);
}

BLL层:BLL层引用DAL层。user参数从UI层传到BLL层,通过对DAL层中的UserDAO的实例化把值传递到DAL层进行查收,查询到的结果返回到BLL层、然后进行判断。如果User不等于空那么就在积分表上给这个用户+10分的积分

public class LoginServerice
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)
        {
            //throw new NotImplementedException();
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
            Login.Model .UserInfo user = uDao.SelectUser(userName, password);

            if (user!=null )
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName,10);
                return user;
            }
            else
            {
                throw new Exception("登录失败");
            }

        }

DAL层:没有引用其他层次。数据访问层主要是进行与数据库的连接UserDAO和ScoreDAO是相似的内容。

public class UserDAO
    {
        public Login.Model .UserInfo SelectUser(string userName, string password )
        {
            //string ConnString = @"Server= ;DataBase=Login;User ID= sa;Password=123456";
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM Users WHERE UserName=@UserName AND Password=@Password";
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Password", password));

                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();

                Login.Model.UserInfo user = null;
                while (reader.Read())
                {
                    if (user == null )
                    {
                        user = new Login.Model.UserInfo();
                    }
                    user.ID = reader.GetInt32(0);
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }  
                }
                return user;
            }
        }
    }

区别于VB登录窗体,除了没有分层此外,在VB中传递的UserName和Password是String类型而且每一个都声明了一个变量用来传值。在C#中我们刚刚说了在整个查询核对的过程中传的是Users,被称为是数据模型。数据模型它可以传递多个值,可以上传下达。
所以额外建立一个程序集Model创建一个类UserInfo:专门存放这个数据模型

public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }

小结:

通过这样把每一个部分的职责都规范化,减少了不必要的耦合,在修改和维护上都方便了很多。

猜你喜欢

转载自blog.csdn.net/xml1996/article/details/81476654