【机房重构】登录+权限判别

前言

登录运用的是数据库中查询操作,在下面SQLHelper中会介绍查询与其他不同的地方

实现顺序

  • 创建Entity,实现业务实体
  • 创建IDAL,实现接口
  • 创建DAL,实现接口中的方法
  • 增加APP.config里的配置信息,为DAL提供程序集
  • 创建Factory,返回程序集的指定类的实例
  • 创建BLL,调用Factory,得到程序集指定类的实例,完成数据操作方法
  • 创建Facade,调用BLL,得到BLL层的返回值
  • 创建UI,调用Facade中数据操作方法,实现登录

引用

  • 记得各层之间添加引用_ 「如果你不知道该引用谁,就去看看其他人画的包图吧」

代码

Entity层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Entity
{
    public class UserInfo
    {   
	    //定义用户ID字段
        public int UserID { set; get; }
        //定义用户名字段
        public string UserName { set; get; }
        //定义密码字段
        public string PassWord { set; get; }
        //定义等级字段
        public string Level { set; get; }
        //定义状态字段
        public string state { set; get; }
    }
}

IDAL层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;

namespace IDAL
{
    public interface LoginIDAL
    {
        DataTable selectUser(Entity.UserInfo UserInfo);
    }
}

DAL层

LoginDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;//操作Sql Server数据库,需要引用
using System.Configuration;

namespace DAL
{      
    public class LoginDAL:IDAL.LoginIDAL
    {
        public DataTable selectUser(Entity.UserInfo UserInfo)
        {
            //实例化一个SQLHelper
            SQLHelper sqlHelper = new SQLHelper();

            //定义需要传递的参数
            SqlParameter[] sqlParams = { new SqlParameter("@UserID", UserInfo.UserID), new SqlParameter("@PassWord", UserInfo.PassWord)}; 
            string sql = @"SELECT * FROM [User_Info] WHERE UserID=@UserID and PWD =@PassWord ";

            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
            return table;
        }
    }
}
SQLHelper

代码请参考【C#】机房重构——七层登录

SQLHelper中为什么把查询增删改的SQL语句分开,请看下图

  • 查询语句返回的结果是一个临时表
  • 增、删、改语句返回的结果是一个数
    这里写图片描述

配置文件

写在UI层中的App.config中,为了便于日后的程序维护

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
  
  <appSettings>
    <add key="ConnStr" value="Server=GHZ\SQLEXPRESS; Database=JiFang; User ID=sa;Password=123456"/>              <!--   Server=数据库名字,Database=表名     -->
    <add key="DB" value="DAL"/>
  </appSettings>

</configuration>

##Factory层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Configuration;
using System.Reflection;

namespace Factory
{
    public class LoginFactory
    {
        //接受来自配置文件的数据
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        public IDAL.LoginIDAL CreateUser()
        { 
            //DAL层的类名
            string ClassName = StrDB + "." + "LoginDAL";
            //反射加工厂的应用
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }
}

BLL层

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLL
{
    public class LoginBLL
    {
        public Boolean UserBLL(Entity.UserInfo UserInfo)
        { 
            //实例化工厂
            Factory.LoginFactory fact = new Factory.LoginFactory();
            //调用工厂方法创建接口
            IDAL.LoginIDAL idal = fact.CreateUser();
            //接收D层的返回值
            DataTable table = idal.selectUser(UserInfo);
            bool flag;
            //返回的DataTable类型,如果他的行数等于0,说明没有符合该账号密码的账户
            if (table.Rows.Count == 0)
                { flag = false; }
            else
                { flag = true;
                
                }
            return flag;
        }

        public DataTable LevelBLL(Entity.UserInfo UserInfo)
        {
            //实例化工厂
            Factory.LoginFactory fact = new Factory.LoginFactory();
            //调用工厂方法创建接口
            IDAL.LoginIDAL idal = fact.CreateUser();
            //接收D层的返回值
            DataTable level = idal.selectUser(UserInfo);

            return level;
        }

    }
}

Facade层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using BLL;
using System.Data;

namespace Facade
{
    public class LoginFacade
    {
        public Boolean SelectUser(Entity.UserInfo user)
        {
            bool flag;
            //实例化B层
            LoginBLL userBLL = new LoginBLL();
            flag = userBLL.UserBLL(user);
   //返回布尔flag
            return flag;
        }

        public DataTable SelectLevel(Entity.UserInfo level1)
        {
            LoginBLL levelBLL = new LoginBLL();
            DataTable level = levelBLL.LevelBLL(level1);
   //返回DataTable level
            return level;
        }

    }
}

##UI层

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UI
{
    public partial class UILogin : Form
    {                   
        public UILogin()
        {
            InitializeComponent();
        }



        private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtUserID.Text.Trim() == "")
            {
                MessageBox.Show("请输入账号", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            if (txtPWD.Text == "")
            {
                MessageBox.Show("请输入密码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            try
            {
                //实例化登录外观将参数传递给外观层
                Facade.LoginFacade Facade = new Facade.LoginFacade();
                Entity.UserInfo user = new Entity.UserInfo();
                user.UserID = Convert.ToInt32(txtUserID.Text.Trim());
                user.PassWord = txtPWD.Text;

                Boolean flag = false;
                //实例化外观
                Facade.LoginFacade FLogin = new Facade.LoginFacade();

                //调用外观的方法,返回给user
                flag = FLogin.SelectUser(user);

                if (flag != false)
                {
                    //隐藏当前窗体
                    this.Hide();
                    this.DialogResult = System.Windows.Forms.DialogResult.OK;

                    DataTable level = FLogin.SelectLevel(user);
                    if (level.Rows[0][2].ToString() == "学生" ) 
                    {
                        //实例化窗体
                        frmStudent frmstu = new frmStudent();
                        //显示实例化的学生界面
                        frmstu.Show();
                    }
                    else if (level.Rows[0][2].ToString() == "操作员")
                    {
                        frmOpert frmopert = new frmOpert();
                        frmopert.Show();
                    }
                    else
                    { 
                    	  frmAdmin frmadmin = new frmAdmin();
                        frmadmin.Show();
                    }

                }
                else
                {
                    MessageBox.Show("密码或者用户名错误");
                }
            }
            //如果try中代码出现异常,进入catch中
            catch (Exception)
            {

                throw;
            }
        }
  • 到这里相信你马上就能通过你好看的小手看到小框「登录成功」啦!
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值