首先是分为七层:

实体层:Enitity

数据访问层:DAL

连接DAL的接口层:IDAL

业务逻辑处理层:BLL

连接BLL的接口处:IBLL

通过反射连接BLL,DAL,UI的抽象工厂层:Factory

引用逻辑为其他六层都引用实体层Enitity,DAL引用IDAL;BLL引用IBLL,Factory,IDAL;UI引用Factory,IBLL,DAL,BLL。

首先是实体层Enitity的代码:

UserLevel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Enitity
{//登录用户实体层public class UserLevel{//用户IDprivate int userid;public int UserID{get { return userid; }set { userid = value; }}//用户密码private string userpwd;public string UserPwd{get { return userpwd; }set { userpwd = value; }}//用户级别private string userlevel;public string Userlevel{get { return userlevel; }set { userlevel = value; }}//全局变量private static int useridall;public static int UserIdall{get { return useridall; }set { useridall = value; }}}
}

UserOnWork

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Enitity
{/// <summary>/// 管理者正在工作实体/// </summary>public class UserOnWork{/// <summary>/// 管理者ID字段/// </summary>private int manId;/// <summary>/// 管理者ID属性/// </summary>public int ManId{get { return manId; }set { manId = value; }}/// <summary>/// 管理姓名字段/// </summary>private string name;/// <summary>///管理者 姓名属性/// </summary>public string Name{get { return name; }set { name = value; }}/// <summary>/// 管理者等级字段/// </summary>private string level;/// <summary>/// 管理者等级属性/// </summary>public string Level{get { return level; }set { level = value; }}/// <summary>/// 上机日期字段/// </summary>private DateTime onDate;/// <summary>/// 上机日期属性/// </summary>public DateTime Ondate{get { return onDate; }set { onDate = value; }}/// <summary>/// 上机时间字段/// </summary>private DateTime onTime;/// <summary>/// 上机上机属性/// </summary>public DateTime OnTime{get { return onTime; }set { onTime = value; }}/// <summary>/// 计算机名字段/// </summary>private string computer;/// <summary>/// 计算机名属性/// </summary>public string Computer{get { return computer; }set { computer = value; }}}
}

Managerial

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Enitity
{/// <summary>/// 管理者实体/// </summary>public class Managerial{/// <summary>/// 管理者ID字段/// </summary>private int manId;/// <summary>/// 管理者ID属性/// </summary>public int ManId{get { return manId; }set { manId = value; }}/// <summary>/// 管理姓名字段/// </summary>private string name;/// <summary>///管理者 姓名属性/// </summary>public string Name{get { return name; }set { name = value; }}/// <summary>/// 管理者等级字段/// </summary>private string level;/// <summary>/// 管理者等级属性/// </summary>public string Level{get { return level; }set { level = value; }}/// <summary>/// 管理者状态字段/// </summary>private string state;/// <summary>/// 管理者状态属性/// </summary>public string State{get { return state; }set { state = value; }}}
}

StudentOnLine

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Enitity
{/// <summary>/// 学生正在上机实体/// </summary>public class StudentOnLine{/// <summary>/// 卡号字段/// </summary>private int studentCardno;/// <summary>/// 卡号属性/// </summary>public int StudentCardno{get { return studentCardno; }set { studentCardno = value; }}/// <summary>/// 类型字段/// </summary>private string studentLevel;/// <summary>/// 类型属性/// </summary>public string StudentLevel{get { return studentLevel; }set { studentLevel = value; }}/// <summary>/// 上机日期字段/// </summary>private DateTime onDate;/// <summary>/// 上机日期属性/// </summary>public DateTime OnDate{get { return onDate; }set { onDate = value; }}/// <summary>/// 上机时间字段/// </summary>private string onTime;/// <summary>/// 上机时间属性/// </summary>public string OnTime{get { return onTime; }set { onTime = value; }}/// <summary>/// 电脑名字段/// </summary>private string computer;/// <summary>/// 电脑名属性/// </summary>public string Computer{get { return computer; }set { computer = value; }}private double nowCash;/// <summary>/// 当前余额属性/// </summary>public double NowCash{get { return nowCash; }set { nowCash = value; }}}
}

RegistrationCardno

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Enitity
{/// <summary>/// 卡号注册实体/// </summary>public class RegistrationCardno{/// <summary>/// 卡号字段/// </summary>private int studentCardno;/// <summary>/// 卡号属性/// </summary>public int StudentCardno{get { return studentCardno; }set { studentCardno = value; }}/// <summary>/// 余额字段/// </summary>private double studentbalanc;/// <summary>/// 余额属性/// </summary>public double Studentbalance{get { return studentbalanc; }set { studentbalanc = value; }}/// <summary>/// 开卡金额字段/// </summary>private int initialamount;public int Initialamount{get { return initialamount; }set { initialamount = value; }}/// <summary>/// 卡号类型字段/// </summary>private string studentLeve;public string StudentLeve{get { return studentLeve; }set { studentLeve = value; }}/// <summary>/// 卡号使用状态字段/// </summary>private string state;public string State{get { return state; }set { state = value; }}/// <summary>/// 操作员ID/// </summary>private int opertionID;public int OpertionID{get { return opertionID; }set { opertionID = value; }}/// <summary>/// 结账状态/// </summary>private string accountsState;public string AccountsState{get { return accountsState; }set { accountsState = value; }}}
}

抽象工厂层Factory的代码:

FactoryBLL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace Factory
{/// <summary>/// 创建业务层工厂/// </summary>public class FactoryBLL{//获取配置文件,要实例化的程序集名称。string StrDB = System.Configuration.ConfigurationManager.AppSettings["FU"];/// <summary>///应用反射获得BLL层操作 。///缺点:数据类型是死的,不同数据类型的工厂调用需要在调用处强制转换。/// </summary>/// <param name="CreatClassName">要实例化的类</param>/// <returns>BLL层类</returns>public object CreateUser(string CreatClassName){//具体要实例化的类string ClassName = StrDB + "." + CreatClassName;//利用反射返回要实例化的具体类return (object)Assembly.Load(StrDB).CreateInstance(ClassName);}}
}

FactoryDAL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace Factory
{/// <summary>/// 创建数据库层查询功能/// </summary>public class FactoryDAL{//获取配置文件,要实例化的程序集名称。string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];/// <summary>///应用反射获得DAL层操作,来返回D层的登录查询类。///缺点:数据类型是死的,不同数据类型的工厂调用需要在调用处强制转换。/// </summary>/// <param name="CreatClassName">要实例化的类</param>/// <returns>d层具体查询</returns>public object CreateUser(string CreatClassName){//具体要实例化的类string ClassName = StrDB + "." + CreatClassName;//利用反射返回要实例化的具体类return (object)Assembly.Load(StrDB).CreateInstance(ClassName);}}
}

FactoryUI:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Factory
{/// <summary>/// 创建UI层窗体,通用工厂。/// </summary>public class FactoryUI{/// <summary>/// 创建窗体/// </summary>/// <param name="CreatFrom">窗体名称</param>/// <returns>一个窗体实例</returns>public Form CreatFrom(string CreatFrom){#region 显示管理员窗体//获取配置文件string StrDB = System.Configuration.ConfigurationManager.AppSettings["UI"];string ClassName = StrDB + "." + CreatFrom;//具体要实例化的窗体return (Form)Assembly.Load(StrDB).CreateInstance(ClassName);#endregion}}
}

如果System.Configuration.ConfigurationManager报错,请引用程序集里的System.Configuration,这样就会没有问题了。

如果Form报错,请引用程序集的System.Windows.Forms,在显示错误修正里有这个选项。

数据访问接口层IDAL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引用
using Enitity;
using System.Data;namespace IDAL
{//登录接口public interface LoginIDAL{/// <summary>/// 判断用户是否存在,判断用户等级/// </summary>/// <param name="userLevel">用户</param>/// <returns></returns>DataTable SelectUserLevel(UserLevel userLevel);/// <summary>/// 获取管理者账号的使用状态/// </summary>/// <param name="managerial">管理者实体</param>/// <returns></returns>DataTable SelectState(Managerial managerial);/// <summary>/// 判断管理者是否已经登录/// </summary>/// <param name="OnWork">管理者</param>/// <returns></returns>DataTable SelectOnUser(UserOnWork OnWork);/// <summary>/// 查询卡号信息/// </summary>/// <param name="StudentCardno">卡号实体</param>/// <returns>整个表的卡号信息</returns>DataTable SelectStuCardno(RegistrationCardno StudentCardno);/// <summary>///  判断学生是否已经登录/// </summary>/// <param name="OnStudent">学生</param>/// <returns>临时表</returns>DataTable SelectOnStudent(StudentOnLine OnStudent);/// <summary>/// 基础信息/// </summary>/// <param name="BasitInfo">基础信息实体</param>/// <returns>整个基础信息表</returns>DataTable SelectBasitInfo();/// <summary>/// 向正在上机的学生表插入数据/// </summary>/// <param name="StudentOnlies"></param>/// <returns></returns>int InsertStudentOnLie(StudentOnLine StudentOnlies);/// <summary>/// 向正在值班的管理者表插入管理者信息/// </summary>/// <param name="UserOnWork">管理者</param>/// <returns>整型</returns>int InsertUser(UserOnWork UserOnWork);}
}

数据访问DAL层:

SQLHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引用
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace DAL
{/// <summary>/// 操作查询====数据访问层/// </summary>public class SQLHelper{//定义数据库连接操作,指定在数控上的操作类型。//定义数据库读取操作private SqlConnection conn = null;//连接private SqlCommand cmd = null;//命令private SqlDataReader sdr = null;//数据集/// <summary>/// 数据库连接,初始化类的时候链接数据库!/// </summary>public SQLHelper(){//通过配置文件,获取数据库的账号密码string connStr = ConfigurationManager.AppSettings["connStr"];conn = new SqlConnection(connStr);//链接数据}/// <summary>/// 判断数据库状态/// </summary>/// <returns>是否打开</returns>private SqlConnection GetConn(){//判断状态是否为空打开状态if (conn.State == ConnectionState.Closed){conn.Open();//打开}//end ifreturn conn;}/// <summary>/// 执行不带参数的数据库操作或储存过程/// </summary>/// <param name="cmdText">增删改操作</param>/// <param name="ct">命令类型</param>/// <returns>返回受影响的行数</returns>public int ExecuteNonQuery(string cmdText, CommandType ct){//受影响的行数int res;//执行SQL命令cmd = new SqlCommand(cmdText, GetConn());//命令的类型cmd.CommandType = ct;//受影响的行数res = cmd.ExecuteNonQuery();//使用完之后释放连接if (conn.State == ConnectionState.Open){conn.Close();}return res;}/// <summary>/// 执行带参数的数据库操作或储存过程/// </summary>/// <param name="cmdText">增删改操作</param>/// <param name="ct">命令类型</param>/// <returns>返回受影响的行数</returns>public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct){int res;using (cmd = new SqlCommand(cmdText, GetConn())){cmd.CommandType = ct;cmd.Parameters.AddRange(paras);res = cmd.ExecuteNonQuery();}return res;}/// <summary>/// 执行不带参数的SQL查询语句或储存过程/// </summary>/// <param name="cmdText">查询sql语句或储存过程</param>/// <param name="ct">命令类型</param>/// <returns>返回受影响行数</returns>public DataTable ExecuteQuery(string cmdText, CommandType ct){//存储读取到的内容DataTable dt = new DataTable();cmd = new SqlCommand(cmdText, GetConn());cmd.CommandType = ct;//using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)){dt.Load(sdr);//向DataTable填充值}return dt;//把表里的内容返回给本方法}/// <summary>/// 执行带参数的sql语句查询或储存过程/// </summary>/// <param name="cmdText">查询SQL语句或储存过程</param>/// <param name="paras">参数集合</param>/// <param name="ct">命令类型</param>/// <returns>返回受影响的行数</returns>public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct){DataTable dt = new DataTable();cmd = new SqlCommand(cmdText, GetConn());cmd.CommandType = ct;cmd.Parameters.AddRange(paras);using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)){dt.Load(sdr);}return dt;}}
}

LoginDAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引用
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using Enitity;namespace DAL
{/// <summary>/// 登录查询/// </summary>public class LoginDAL:IDAL.LoginIDAL{//实例化一个SQHelp层,用于连接数据库进行查询。SQLHelper sqlHelper = new SQLHelper();/// <summary>/// 向正在上机学生表插入信息/// </summary>/// <param name="StudentOnlies">学生上机实体</param>/// <returns>返回整个表信息</returns>public int InsertStudentOnLie(StudentOnLine StudentOnlies){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@StudentCardno", StudentOnlies.StudentCardno),new SqlParameter("@StudentLevel",StudentOnlies.StudentLevel),new SqlParameter("@NowCash",StudentOnlies.NowCash),new SqlParameter("@OnDate",StudentOnlies.OnDate),new SqlParameter("@OnTime",StudentOnlies.OnTime),new SqlParameter("@Computer",StudentOnlies.Computer) };//定义SQL语句string sql = @"insert into OnLineStudent values(@StudentCardno,@StudentLevel,@NowCash,@OnDate,@OnTime,@Computer)";//接受受影响的行数int Relust = sqlHelper.ExecuteNonQuery(sql, sqlparams, CommandType.Text);//返回收影响的行数return Relust;}/// <summary>/// 向管理者值班表插入信息/// </summary>/// <param name="UserOnWork">值班表实体</param>/// <returns>整个值班表信息</returns>public int InsertUser(UserOnWork UserOnWork){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@ManID",UserOnWork.ManId),new SqlParameter("@ManLevel",UserOnWork.Level),new SqlParameter("@OpertionName",UserOnWork.Name),new SqlParameter("@OnDate",UserOnWork.Ondate),new SqlParameter("@OnTime",UserOnWork.OnTime),new SqlParameter("@Computer",UserOnWork.Computer) };//定义SQL语句string sql = @"insert into OnWorkMan values(@ManID,@ManLevel,@OpertionName,@OnDate,@OnTime,@Computer)";//接受受影响的行数int Relust = sqlHelper.ExecuteNonQuery(sql, sqlparams, CommandType.Text);return Relust;//返回受影响的行数}/// <summary>/// 基础信息/// </summary>/// <param name="BasitInfo">基础信息实体</param>/// <returns>整个基础信息表</returns>public DataTable SelectBasitInfo(){//定义SQL语句string sql = @"select * from Basis";//获取查询结果DataTable BasiTable = sqlHelper.ExecuteQuery(sql, CommandType.Text);//返回查询结果return BasiTable;}/// <summary>/// 查询学生是否已经上机/// </summary>/// <param name="OnStudent">学生上机实体</param>/// <returns>返回整个表信息</returns>public DataTable SelectOnStudent(StudentOnLine OnStudent){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@StudentCardno", OnStudent.StudentCardno) };//定义SQL语句string sql = @"select * from OnLineStudent where StudentCardno=@StudentCardno";//接受查询结果DataTable OnstuTable = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);//返回查询结果return OnstuTable;}/// <summary>/// 查询管理者是否已经登录/// </summary>/// <param name="OnUser">值班表管理者实体</param>/// <returns>整个管理者表的信息</returns>public DataTable SelectOnUser(UserOnWork OnUser){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@ManID", OnUser.ManId) };//定义SQL语句string sql = @"select * from OnWorkMan where ManID=@ManID";//把查询结果储存到临时表DataTable OnWorkTable = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);//返回整个表的信息return OnWorkTable;}/// <summary>/// 管理者使用状态/// </summary>/// <param name="ManageState">管理者信息</param>/// <returns>整个表的管理者信息</returns>public DataTable SelectState(Managerial ManageState){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@ManID", ManageState.ManId) };//定义SQL语句string sql = @"select * from Managerial where ManID=@ManID";//把查询结果储存到临时表DataTable ManTable = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);//返回整个表的信息return ManTable;}/// <summary>/// 查询卡号信息/// </summary>/// <param name="StudentCardno">卡号实体</param>/// <returns>整个表的卡号信息</returns>public DataTable SelectStuCardno(RegistrationCardno StudentCardno){//定义参数SqlParameter[] sqlparams = { new SqlParameter("@StudentCardno", StudentCardno.StudentCardno) };//定义SQL语句string sql = @"select * from RegistrationCardno where StudentCardno=@StudentCardno";//接受查询结果DataTable StuCarTable = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);//一表的形式返回查询结果return StuCarTable;}/// <summary>/// 用户是否存在和级别/// </summary>/// <param name="UserLevel">用户登录实体</param>/// <returns>整个登录表</returns>public DataTable SelectUserLevel(UserLevel UserLevel){//定义需要传递的参数SqlParameter[] sqlparams = { new SqlParameter("@UserID", UserLevel.UserID),new SqlParameter("@Pwd", UserLevel.UserPwd) };//定义SQL语句string sql = @"select * from UserLonin where UserId=@UserId and Pwd=@Pwd";//把查询结果储存到临时表DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);return table;//返回整个临时表}}
}

业务逻辑接口层IBLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace IBLL
{/// <summary>/// 登录接口/// </summary>public interface LoginIBLL{/// <summary>/// 登录方法/// </summary>/// <param name="userid">用户ID</param>/// <param name="pwd">密码</param>/// <param name="form">登录窗体</param>/// <returns>是否登录成功</returns>string loginFacade(string userid, string pwd, Form form);}
}

业务逻辑层BLL:

获取计算机名称

Computer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace BLL
{/// <summary>/// 获取计算名字/// </summary>public class Computer{/// <summary>/// 获取计算机名/// </summary>/// <returns>计算机名</returns>public static string GetMachineName(){try{return System.Environment.MachineName;}catch (Exception ex){return ex.Message;}}}
}

创建个文件夹为Level,为判断级别而建立的类

userLevel:

using Enitity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BLL.Level
{/// <summary>/// 用户等级的抽象类/// </summary>public abstract class userlevel{/// <summary>/// 级别字段/// </summary>protected string Level;/// <summary>/// 给等级字段赋值/// </summary>/// <param name="Level"></param>public userlevel(string Level){this.Level = Level;}/// <summary>/// 继续处理者字段/// </summary>protected userlevel user;/// <summary>/// 设置继续处理者/// </summary>/// <param name="superior">具体的继续处理者</param>public void SetSupertior(userlevel superior){this.user = superior;}/// <summary>/// 登录/// </summary>/// <param name="userlevel">登录实体</param>abstract public string UserLogin(UserLevel userlevel, Form form);}
}

LoginAdmin

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引用using System.Data;
using System.Windows.Forms;
using System.Reflection;
using System.Configuration;
using Enitity;
using Microsoft.VisualBasic.Devices;namespace BLL.Level
{/// <summary>/// 管理员职责/// </summary>public class LoginAdmin:userlevel{/// <summary>/// 实例化工厂,用于创建D层登录查询类。/// </summary>Factory.FactoryDAL fact = new Factory.FactoryDAL();/// <summary>/// 实例化创建UI层窗体工厂/// </summary>Factory.FactoryUI CreatfactForm = new Factory.FactoryUI();/// <summary>/// 调用父类构造函数/// </summary>/// <param name="Level">给级别赋值</param>public LoginAdmin(string Level) : base(Level){}/// <summary>/// 向值班表插入用户数据/// </summary>/// <param name="insertonwork">值班人员</param>/// <returns>整数</returns>private int InserUserOnWork(UserOnWork insertonwork){//调用接口实例化,D层查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//接收接口的返回值int Result = idal.InsertUser(insertonwork);return Result;}/// <summary>/// 用户登录/// </summary>/// <param name="userlevel">用户</param>/// <returns>是否登录成功!</returns>public override string UserLogin(UserLevel userlevel, Form form){//返回信息string StrMesg = "";//调用接口实例化D层查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//实例化管理者实体和赋值Managerial Manageria = new Managerial();Manageria.ManId = userlevel.UserID;//登录id赋值给管理者ID//接受管理者信息DataTable ManTable = idal.SelectState(Manageria);//判断账号是否使用if (ManTable.Rows[0][3].ToString().Trim() == "使用"){#region 判断管理者是否已经登录//实例化值班实体与赋值UserOnWork userOnWork = new UserOnWork();userOnWork.ManId = userlevel.UserID;//值班实体的管理者id赋值//接受接口的返回值,返回整个值班表的信息。DataTable OnWorkTable = idal.SelectOnUser(userOnWork);//判断管理者是否已经登录if (OnWorkTable.Rows.Count == 0)//没有登录{form.Hide();//隐藏窗体#region 向值班表插入信息//给值班实体赋值userOnWork.Level = userlevel.Userlevel;//管理者级别userOnWork.Name = ManTable.Rows[0][1].ToString().Trim();//管理者姓名userOnWork.Ondate = DateTime.Now.Date;//登录日期userOnWork.OnTime = DateTime.Parse(DateTime.Now.ToShortTimeString());//登录时间userOnWork.Computer = Computer.GetMachineName();//计算机名//调用插入方法InserUserOnWork(userOnWork);#endregion//给全局ID赋值UserLevel.UserIdall = userlevel.UserID;StrMesg = "登录成功!";//显示管理员窗体Form CreatForm = CreatfactForm.CreatFrom("FormAdminMain");//实例化管理员窗体CreatForm.Show();//显示窗体}else{StrMesg = "此账号已登录!";}#endregion}else{StrMesg = "此账号未使用,请激活使用!";}//end ifreturn StrMesg;}}
}

LoginOpetion

using Enitity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BLL.Level
{/// <summary>/// 操作员/// </summary>public class LoginOpetion:userlevel{/// <summary>/// 获取父类的构造函数/// </summary>/// <param name="level"></param>public LoginOpetion(string level) : base(level){ }/// <summary>/// 实例化工厂,用于创建D登录查询类。/// </summary>Factory.FactoryDAL fact = new Factory.FactoryDAL();/// <summary>/// 实例化创建UI层窗体工厂/// </summary>Factory.FactoryUI CreatfactForm = new Factory.FactoryUI();/// <summary>/// 向值班表插入用户数据/// </summary>/// <param name="insertonwork">值班人员</param>/// <returns>整数</returns>private int InserUserOnWork(UserOnWork insertonwork){//调用接口实例化,D层查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//接收接口的返回值int Result = idal.InsertUser(insertonwork);return Result;}/// <summary>/// 登录/// </summary>/// <param name="userlevel">用户</param>/// <returns>是否登录成功!</returns>public override string UserLogin(UserLevel userlevel, Form form){#region 实例化与赋值//返回信息string StrMesg = "";//调用接口实例化D层查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//实例化管理者实体和赋值Managerial Manageria = new Managerial();Manageria.ManId = userlevel.UserID;//登录id赋值给管理者ID#endregionDataTable ManTable = idal.SelectState(Manageria); //接受接口返回值//判断管理者账号是否使用if (ManTable.Rows[0][3].ToString().Trim() == "使用"){#region 判断管理者是否已经登录UserOnWork userOnWork = new UserOnWork();//实例化值班实体与赋值userOnWork.ManId = userlevel.UserID;//值班实体的管理者id赋值//接受接口的返回值,返回整个值班表的信息。DataTable OnWorkTable = idal.SelectOnUser(userOnWork);//判断管理者是否已经登录if (OnWorkTable.Rows.Count == 0)//没有登录{form.Hide();//隐藏窗体#region 向值班表插入信息//给值班实体赋值userOnWork.Level = userlevel.Userlevel;//管理者级别userOnWork.Name = ManTable.Rows[0][1].ToString().Trim();//管理者姓名userOnWork.Ondate = DateTime.Now.Date;//登录日期userOnWork.OnTime = DateTime.Parse(DateTime.Now.ToShortTimeString());//登录时间userOnWork.Computer = Computer.GetMachineName();//计算机名//调用插入方法InserUserOnWork(userOnWork);#endregion//给全局ID赋值UserLevel.UserIdall = userlevel.UserID;StrMesg = "登录成功!";//显示操作员窗体Form CreatForm = CreatfactForm.CreatFrom("FormOperatorMain");//实例化操作员窗体CreatForm.Show();//显示窗体}else{StrMesg = "此账号已登录!";}#endregion}else{StrMesg = "此账号未使用,请激活使用!";}//end ifreturn StrMesg;}}
}

LoginStudnet

using Enitity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BLL.Level
{/// <summary>/// 学生职责/// </summary>public class LoginStudnet:userlevel{/// <summary>/// 实例化工厂,用于创建D登录查询类。/// </summary>Factory.FactoryDAL fact = new Factory.FactoryDAL();/// <summary>/// 实例化创建UI层窗体工厂/// </summary>Factory.FactoryUI CreatfactForm = new Factory.FactoryUI();public LoginStudnet(string Level) : base(Level){}/// <summary>/// 向正在上机表插入学生信息/// </summary>/// <param name="studentOnLien"></param>/// <returns></returns>private int InserStudentOnlien(StudentOnLine studentOnLien){//调用接口实例化,D层查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//接收接口的返回值int Result = idal.InsertStudentOnLie(studentOnLien);return Result;}/// <summary>/// 登录/// </summary>/// <param name="userlevel">用户</param>/// <returns>是否上机成功!</returns>public override string UserLogin(UserLevel userlevel, Form form){#region 实例化与赋值string StrMsg = "";//要返回的信息IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL"); //调用接口实例化,D层查询类RegistrationCardno RegisCardno = new RegistrationCardno(); //实例化实体RegisCardno.StudentCardno = userlevel.UserID;//给卡号赋值                                          #endregionDataTable StuCardnoTable = idal.SelectStuCardno(RegisCardno);//接受卡号信息RegisCardno.Studentbalance = double.Parse(StuCardnoTable.Rows[0][1].ToString());//给余额赋值DataTable BasitInfoTable = idal.SelectBasitInfo();//接受基础信息#region 判断卡号状态//判断卡号状态if (StuCardnoTable.Rows[0][4].ToString() == "已激活"){//判断余额是否充足if (RegisCardno.Studentbalance >= double.Parse(BasitInfoTable.Rows[0][0].ToString())){//实例化上机表实体与赋值StudentOnLine stuOnLine = new StudentOnLine();stuOnLine.StudentCardno = userlevel.UserID;//给卡号赋值//获取上机表信息DataTable OnWorkTable = idal.SelectOnStudent(stuOnLine);//查询卡号是否已经登录if (OnWorkTable.Rows.Count == 0)//没有登录{form.Hide();//隐藏窗体#region 给上机实体赋值stuOnLine.StudentLevel = StuCardnoTable.Rows[0][3].ToString();//卡号类型赋值stuOnLine.OnDate = DateTime.Now.Date;//上机日期stuOnLine.OnTime = DateTime.Now.ToShortTimeString();//上机时间stuOnLine.NowCash = RegisCardno.Studentbalance;//当前余额stuOnLine.Computer = Computer.GetMachineName();//电脑名称#endregionInserStudentOnlien(stuOnLine);//向上机表插入信息UserLevel.UserIdall = userlevel.UserID; //给全局ID赋值StrMsg = "上机成功!";Form CreatForm = CreatfactForm.CreatFrom("FormStudentMain");//实例化学生窗体CreatForm.Show();//显示窗体}else{StrMsg = "此卡号已登录!";}//end if}else{StrMsg = "余额不足,请充值";}//end if}else{StrMsg = "此卡号未激活,请激活使用!";}//end if#endregionreturn StrMsg;//返回登录信息    }}
}

接下来是限制输入内容

IsNull

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BLL
{/// <summary>/// 限制输入内容/// </summary>public class IsNull{/// <summary>/// 判断窗体文本是否为空/// </summary>/// <param name="form">窗体</param>/// <returns>是否为空</returns>public static string isNull(Form form){//返回信息string Str = "";foreach (var item in form.Controls){if (item.GetType().Name.Equals("TextBox") && ((TextBox)item).Text == string.Empty){Str = "填写信息不完整,请检查";}}return Str;}/// <summary>/// 判断输入值是否是数字/// </summary>/// <param name="StrNumber">要转换的内容</param>/// <returns></returns>public static bool IsNumber(string StrNumber){int i = 0;//要转成的类型bool Flage = int.TryParse(StrNumber, out i);return Flage;}/// <summary>/// 判断一组文本框输入的是否是数字/// </summary>/// <param name="form"></param>/// <returns>是否是数字</returns>public static string GroupIsNumber(Form form){//返回提示信息string flage = "";//默认是“”foreach (var item in form.Controls){double a = 0;if (item.GetType().Name.Equals("TextBox") && double.TryParse(((TextBox)item).Text, out a) != true){flage = "文本框内容不全是数字,请改为数字!";//改变标签的值为true}}return flage;}}
}

登录逻辑代码LoginBLL

using Enitity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BLL
{/// <summary>/// 登录业务/// </summary>public class LoginBLL:IBLL.LoginIBLL{/// <summary>/// 实例化工厂,用于创建D登录查询类。/// </summary>Factory.FactoryDAL fact = new Factory.FactoryDAL();/// <summary>/// 实例化临时表,储存UserLevel用户的所有信息/// </summary>public static DataTable UserTable = new DataTable();/// <summary>/// 登录业务/// </summary>/// <param name="userid">用户id</param>/// <param name="pwd">密码</param>/// <returns>是否登录成功</returns>public string loginFacade(string userid, string pwd, Form form){//用于返回信息string strMsger = "";//接受判空返回值,判断文本框是否为空。string isNull = IsNull.isNull(form);//接受是不是数字的判断返回值bool isNumber = IsNull.IsNumber(userid);//判断文本框是否为空if (isNull == "")//没有返回值说明文本框不为空!{//判断UserID是不是数字if (isNumber == true)//等于true,说明输入的是数字!{#region 赋值与转化实体//转换为实体UserLevel user = new UserLevel();user.UserID = Convert.ToInt32(userid);user.UserPwd = pwd;#endregion#region 调用D层登录查询//利用反射,实例化D层登录查询类IDAL.LoginIDAL idal = (IDAL.LoginIDAL)fact.CreateUser("LoginDAL");//获取D层返回值UserTable = idal.SelectUserLevel(user);#endregion#region 判断用户是否存在//判断账号是否存在if (UserTable.Rows.Count != 0){//给级别赋值user.Userlevel = UserTable.Rows[0][1].ToString().Trim();#region 设置继续处理者Level.LoginAdmin admin = new Level.LoginAdmin("管理员");Level.LoginOpetion operation = new Level.LoginOpetion("操作员");Level.LoginStudnet student = new Level.LoginStudnet("学生");#endregion#region 级别判断//判断级别if (user.Userlevel == "管理员"){//继续处理者,跳转到对应的职责链admin.SetSupertior(operation);admin.SetSupertior(student);strMsger = admin.UserLogin(user, form);}else if (user.Userlevel == "操作员"){//继续处理者,跳转到对应的职责链operation.SetSupertior(admin);operation.SetSupertior(student);strMsger = operation.UserLogin(user, form);}else if (user.Userlevel == "学生"){//继续处理者,跳转到对应的职责链student.SetSupertior(admin);student.SetSupertior(operation);strMsger = student.UserLogin(user, form);}#endregion}else{strMsger = "账号不存在,或密码错误!";}//end if #endregion}else{//输入值不是数字strMsger = "登录账号请输入数字!";}}else{//文本框为空!strMsger = isNull;//把返回结果赋值给strMsger返回给U层}return strMsger;}}
}

最后是UI层

两个text文本框,一个确定登录按钮Button,命名为:TxtUserName,TxtPassWord,Login。这你要看不懂那就不是我的问题了。

U层代码:

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 LoginForm : Form{public LoginForm(){InitializeComponent();}//实例化创建BLL层的工厂Factory.FactoryBLL factoryBLL = new Factory.FactoryBLL();private void Login_Click(object sender, EventArgs e){//使用工厂创建登录接口IBLL.LoginIBLL LoginIbll = (IBLL.LoginIBLL)factoryBLL.CreateUser("LoginBLL");//登录string strMsg = LoginIbll.loginFacade(TxtUserName.Text, TxtPassWord.Text, this);MessageBox.Show(strMsg);}}
}

APP文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections></configSections><connectionStrings><add name="UI.Properties.Settings.charging_systemConnectionString"connectionString="Data Source=.;Initial Catalog=charging_system;Persist Security Info=True;User ID=sa;Password=123"providerName="System.Data.SqlClient" /></connectionStrings><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup><appSettings><!--用于实例化D层类--><add key="DB" value="DAL" /><!--用于实例化UI层窗体-->    <add key="UI" value="UI"/><!--用于实例化BLL层类--><add key="FU" value="BLL"/><!-- 这里的配置文件是用来连接数据库的。在XML配置文件中写入连接数据库的代码方便打包后其他电脑进行数据连接,其他电脑只需在这里把关键信息改变为他的数据库服务器地址和登录ID与密码即可,不再需要重新生成等操作 --><add key="connStr" value="Server=.; Database=charging_system; User ID=sa; Password=123456"/></appSettings>
</configuration>

本人按照此文本重新建立了一个测试登录,是可以使用的,中间会有一些错误,建议把代码写完,看看是否是没有引用项目或程序集,然后再去排除其他的问题。

机房重构之权限判断登录窗体相关推荐

  1. 个人机房重构--七层实现登录

    一.概述: 现在准备开始个人机房重构,那么就从简单的来,先用七层实现登录.我们常说的七层是指哪七层呢?其实七层就是在三层的基础上,添加了外观层--设计模式的外观模式,抽象工厂加反射,接口层.外观层主要 ...

  2. C#机房重构三层登陆与设计模式结合

    前言: 七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层.庆幸的是发现的早,在刚敲完登录就发现了.没有在完成整个重构再发现,哪个时候改代 ...

  3. 机房收费系统--登录窗体

    在对机房收费系统有了大致的认识后,就开始做登录窗体了.登录窗体是最简单的,但是我们需要先理清思路,最好是能画一个简单的流程图,这样就能理清逻辑,在敲代码的时候就会非常简单. 在这里需要注意以下几点: ...

  4. 【机房重构】C#子窗体关闭父窗体

    [机房重构]-----[修改密码] 最原始我的修改密码是用户在修改密码之后仍然处于登录状态,自己想想其实也挺对的,为啥用户修改密码了就必须要重新登录? 应该有很多人和我有同样的想法. 但是经过和其他人 ...

  5. 用Adapter模式重构以前系统的登录权限验证

    Adapter模式概述 Adapter模式有两种形式,一种是类的形式,一种则是对象的形式.目标就是用Adapter将原本不兼容的几个接口可以一起工作,简单的说,就是将引用的东西转变成我们自己系统需要的 ...

  6. rails + devise 用户注册登录及权限判断

    Mac环境 macOS High Sierra 版本 10.13.1 ruby 2.4.1p111 Rails 5.1.4 编辑软件:Atom(你可以选择其它软件,例如:Sublime Text.Ru ...

  7. 三层结构的任务管理系统可以实现登录,判断登录用户权限等操作

    任务要求 idea jdk1.8 三层结构的任务管理系统可以实现登录,判断登录用户权限等操作 任务管理系统 一.系统需求 查询所有任务信息:展示所有任务信息 录入任务信息: 用户输入:任务名, 预计完 ...

  8. 【C#】七层登录机房重构

    前言 终于开始机房重构了,在此之前,我用三层敲了机房的部分功能,感觉还不错,现在真正到了七层,还是蛮紧张的.话不多说,开始机房的七层登录. 包图 我发现好多伙伴写七层登录的时候,都喜欢分析一下包图,那 ...

  9. vue登录权限判断方法

    在路由配置里,使用路由的全局导航守卫来判断是否登录: // 实例化对象 let router = new VueRouter({routes }) // 注册导航守卫(回调函数) router.bef ...

最新文章

  1. squid命中率分析参数注释
  2. MegaCli查看RAID
  3. Linux实验三:Shell编程
  4. 编译原理——实验壹预习——TINY语言的词法分析
  5. 实战:轻量级分布式文件系统FastDFS(GraphicsMagick图片压缩)
  6. 10kv电压互感器型号_《装表接电》知识点16:设备型号
  7. Kong API Gateway 配置文件详解
  8. PHP系统学习3 正则
  9. Free Ebook #1
  10. chrome.storage和window.localStorage的区别
  11. 微信小程序背景图片设置问题
  12. 手机连接蓝牙扫码枪_如何正确使用蓝牙扫描枪
  13. 微信小游戏马甲包过审策略
  14. 电脑文件删除不掉什么原因?程序显示被占用清理不掉如何操作?
  15. Docker(2) 安全加密,habor仓库和Docker网络
  16. 一阶电路暂态响应的结果分析。_第八讲 线性电路的过渡过程分析二
  17. PTC过流保护器件工作原理及选型方法
  18. Linux网卡限速下载,端口限速下载脚本,网卡流量监控脚本
  19. ThreadX学习(2)——线程
  20. 线性回归分析学习笔记第一篇:一元线性回归

热门文章

  1. 中信银行×百特搭丨赋能数字化管理平台全新升级 探索打造智慧银行最佳实践
  2. xp系统添加凭据服务器格式,winxpsp3密钥XP连接win10共享打印机,添加时需要凭据...
  3. 用java代码根据html页面生成图片
  4. DM数据库表空间管理和归档
  5. tk.mybatis.mapper.MapperException: 当前实体类不包含名为XXXXX的属性!
  6. 最近常常干出一些骑着驴找驴的事来
  7. 春运铁路杭州站预计发客835万人次 加开列车89.5对
  8. 不见棺材不落泪,不到黄河不死心
  9. 详解STS(SpringToolSuite)常用设置
  10. Linux 怎么显示开火车动画