分层应用——怎样实现登录?

分层应用——怎样实现登录?

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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

分层应用——怎样实现登录?

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

       主要步骤:用户在登录界面输入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; }

    }
}

      

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118666.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • avc中质量和大小是什么意思_avc设备是什么意思

    avc中质量和大小是什么意思_avc设备是什么意思avc在微观经济学意为:平均可变成本(averagevariablecost,avc)短期平均成本又可分为平均固定成本(averagefixedcost)和平均可变成本(averagevariablecost).电力行业的AVC系统是做什么的?AVC就是自动电压控制,就是大家常说的“无功优化”,实际上就是因为电压和无功是不可分割相互影响的。AVC和“无功优化”的实际意义有偏差,因为…

    2022年9月19日
    5
  • PyCharm如何设置 “ctrl+滚轮” 实现字体的放大和缩小「建议收藏」

    PyCharm如何设置 “ctrl+滚轮” 实现字体的放大和缩小「建议收藏」一、PyCharm字体放大的设置File–>setting–>Keymap–>在搜索框中输入increase—>IncreaseFontSize(双击)–>在弹出的对话框中选择AddMouseShortcut–>弹出的对话框后按住ctrl键的同时鼠标滚轮向上滑。二、Pycharm字体缩小的设置:File–>setting–>Keymap–>在搜索框中输入decrease—>

    2022年8月27日
    8
  • 微信video 视频

    <videowidth=”320″height=”240″controls><sourcesrc=”movie.mp4″type=”video/mp4″></video>这是很正常的video写法,我们查看微信是什么样式  这样种video控件样式并不是我们想要的。所有我们需要自己来写视频封面的样式。…

    2022年4月4日
    56
  • jmeter发送kafka数据key错误且无法生成时间戳解决方案「建议收藏」

    jmeter发送kafka数据key错误且无法生成时间戳解决方案「建议收藏」前言:最近在做kafka、mq、redis、fink、kudu等在中间件性能压测,压测kafka的时候遇到了一个问题,我用jmeter往kafka发消息没有时间戳,同样的数据我用python发送就有时间戳,且jmeter会自动生成错误的变量key,那我是怎么解决的呢,容我一一道来!一、jmeter怎么往kafka发送数据jmeter往kafka发送数据我之前有写过博客,大家可以参考下,遇到我前言说的问题就可以参考本篇文章二、jmeter生成错误key解决方案我们用了kafka插件后jmeter中引入

    2022年8月31日
    5
  • eclipse配置插件(eclipse安装反编译插件)

    最近大一刚学习Java,编译器用的eclipse,实验中又需要画类图,所以用到了这个插件,写出来给各位菜鸟们参考……一、安装GEF插件1、打开eclipse官网https://www.eclipse.org/ 2、点击Projects,搜索GEF,然后看到GEF项目点击旁边的download(现在的地址是这个:https://projects.eclipse.org/projects/t…

    2022年4月16日
    47
  • What Are You Talking About HDU1075[通俗易懂]

    What Are You Talking About HDU1075[通俗易懂]一开始我也想用map但是处理不好其他字符。。看了题解多多学习!很巧妙就是粗暴的一个字符一个字符的来分为小写字母和非小写字母两个部分一但单词结束的时候就开始判断。#include<

    2022年7月4日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号