首先是分为七层:
实体层: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 { //用户ID private 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 if return 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 if return 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 #endregion 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("FormOperatorMain");//实例化操作员窗体 CreatForm.Show();//显示窗体 } else { StrMesg = "此账号已登录!"; } #endregion } else { StrMesg = "此账号未使用,请激活使用!"; }//end if return 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;//给卡号赋值 #endregion DataTable 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();//电脑名称 #endregion InserStudentOnlien(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 #endregion return 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>
本人按照此文本重新建立了一个测试登录,是可以使用的,中间会有一些错误,建议把代码写完,看看是否是没有引用项目或程序集,然后再去排除其他的问题。