zoukankan      html  css  js  c++  java
  • 分层应用——怎样实现登录?

            三层这个阶段的学习主要是靠自学,但从网上找到的相关资料、博客都是零散的,没有体系。资料看了不少,但一直没有一个大概的轮廓。查到的资料都是理论性的,那如何在详细的样例中实现分层呢?导图之后就是详细的小样例。



           以初识三层中登录的小样例为例,来看看分层的详细应用吧。

           主要步骤:用户在登录界面输入username和password,并进行登录。若登录成功,弹出登录成功提示框,并添加�对应的积分。若不成功,抛出登录失败。


    1、U层:表现层,用户输入数据和指令,并终于显示出信息。

    界面



    namespace LoginUI
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            //输入username与password,单击登录按钮
            private void button1_Click(object sender, EventArgs e)
            {
                string userName = textBox1.Text.Trim();
                string password = textBox2.Text;
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
                Login.Model01.UserInfo user = mgr.UserLogin(userName, password);  //实例化对象
                MessageBox.Show("登录用户:" + user.UserName);
            }
    
        }
    }
    


    2、B层:业务逻辑层,处理与业务相关的逻辑,把从U层传来的username和password经过处理,传到D层作对应的数据处理。

    namespace Login.BLL
    {
        //推断用户是否存在,若存在,登录成功并添加�积分;若不存在,抛出异常。
        public class LoginManager
        {
            public Login.Model01.UserInfo UserLogin(string userName, string password)
            {
    
                Login.DAL.UserDAO uDao = new Login.DAL .UserDAO();
                Login.Model01 .UserInfo user = uDao.SelectUser(userName, password); //传入username与password
    
                if (user != null)// login successfully.
                {
                    Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                    sDao.UpdateScore(userName, 10);
                    return user;
                }
                else
                {
                    throw new Exception("登录失败。");    //异常处理
                }
    
            }
        }
    }
    

    3、D层:数据訪问层,运行与数据源相关的操作。在这里,包含DbUtil, ScoreDAO,UserDAO。

    DbUtil负责打开数据库,訪问数据库。

    namespace Login.DAL
    {
        class DbUtil
        {
            public static string ConnString = @"Server=yang; Database=Login; User ID=sa; Password=123456";//yang为server地址,Login是数据库名称
        }
    }

    UserDAO用来推断该username是否存在,password是否正确。

    namespace Login.DAL
    {
        public class UserDAO
        {
            public Login.Model01.UserInfo SelectUser(string userName, string password)    //username与password通过B层传到D层,在D层实现查找
            {
                using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))        //建立一个sql连接,using可实现自己主动关闭。
                {
                    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.Model01.UserInfo user = null;  //推断记录是否存在
                    while (reader.Read())
                    {
                        if (user == null)
                        {
                            user = new Login.Model01.UserInfo();
                        }
    
                        user.ID = reader.GetInt32(0);    //字符转义
                        user.UserName = reader.GetString(1);
                        user.Password = reader.GetString(2);// not suggestion
                        if (!reader.IsDBNull(3))
                        {
                            user.Email = reader.GetString(3);
                        }
                    }
    
                    return user;
                }
            }
        }
    }

    ScoreDAO负责当用户登录成功后,更新数据库中的积分。

    namespace Login.DAL
    {
        public class ScoreDAO
        {
            //登录成功后,自己主动添加�积分
            public void UpdateScore(string userName, int value)
            {
                using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))      //建立数据库连接
                {
                    SqlCommand cmd = conn.CreateCommand();
                    cmd.CommandText = @"INSERT INTO SCORES(UserName, Score) Values(@UserName,@Score)";
                    cmd.Parameters.Add(new SqlParameter("@UserName", userName));      //Parameters加入�记录
                    cmd.Parameters.Add(new SqlParameter("@Score", value));
    
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
    

    4、实体类

    namespace Login.Model
    {
        //实体类
        public class UserInfo
        {
            public int ID { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public string Email { get; set; }
    
        }
    }
    

          

           这样,各层分工明白,职责清晰。既有利于合作开发,也大大减少了维护的成本和维护的时间。与我们第一次机房收费系统的登录界面相比,分层之后的登录界面就显得效果好多了。可是分层不是分的越多越好,过多的分层限制了开发者与客户对系统的理解能力,限制了客户与开发者的交流。分层越多的话,可靠性有时也是不稳定; 项目开发中实在是要详细分析,盲目套用耦合不降反升,效率不高反低,维护不便反繁。

         分层不是目的,是软件发展的产物和毕竟之路。层化是把软件横向切了几刀,模块化是把软件纵向切了几刀。我们要灵活使用分层,更好的为我们服务。

  • 相关阅读:
    failed: unacceptable content-type: text/html
    iOS button点击更换图片
    支付宝ios SDK官方下载页面
    xcode6 中使用OC代码时,在NSObject的子类中报错
    CocoaPods安装和使用教程
    Mac 下安装Ruby环境
    iOS .a与.framewofk
    Couldn't find preset "es2015" relative to directory问题解决
    yarn依赖管理工具的使用
    java.io.IOException: Could not delete path 'D:mycode eactnativeSecondTestandroidappuildgeneratedsource eleaseandroidsupportv7
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3911188.html
Copyright © 2011-2022 走看看