结合.NET三层机构的开发思想,完成一个C/S结构的、实际可以使用的酒店管理系统。涉及编程方面的重要技巧,如ADO.NET技术、数据验证技术、参数传递、数据显示控件及容器控件。
用途:帮助酒店管理的工具。
功能1:添加、删除、修改住房信息。
功能2:添加、删除、修改客人信息。
需求分析是开发应用系统的第一步,通过需求分析可以了解客户需要什么样的程序,需要完成什么功能。通过需求说明书描述系统的总体要求,并且作为各方面沟通的依据,也为下一步工作提供基准。系统开发人员要按照需求说明文档完成相应的功能实现。可以找一下标准的需求说明书文档参考。
酒店管理系统用于管理和维护酒店的基本信息,酒店管理人员登录系统后可以拥有该系统的所有功能,方便进行酒店内部管理。改系统使用数据库存放数据。
以下为需求分析的结果——系统功能设计图。
可登录本系统的人员管理。信息必须在用户数据中才可以登录。
功能:
用户信息的查询、增加、删除、修改。
功能:
客人住房情况管理(客人姓名、入住房间、入住时间、离开时间)。
根据客人名称对客房预定信息进行查询。
功能:
客房类型管理(客房类型分中、高、低)。
客房使用情况(空闲、入住、维修、自用)。
根据客房类型对房间进行统一定价,并设置某类客房是否可以加床以及加床的价格。
每一个房间的属性,如房号、类型、价格、床位数、对该客房的描述。
根据客房信息名称、客房房间号对信息进行查找。
客房属性:房号、类型、床位数、价格、使用情况描述。
客房使用状态:空闲、入住、维修、自用。
根据客房的房号进行信息查找。
本系统的总体架构采用三层架构模式,分为表示层、业务逻辑层、数据访问层。其中表示层负责界面的显示,提供用户交互操作界面。业务逻辑层是表示层和数据访问层之间的桥梁,主要负责数据的处理和传递。数据访问层主要实现对数据的读取和保存操作。
该系统较为简单,没有使用接口和反射技术。三个模块之间使用对象或者数据集进行通信。
每一层使用程序集实现,三层架构的程序不可跨层调用。
三层系统架构图:
实体关系概念模型设计(E-R图)
数据表设计
客人信息表(Guest):
客人类型表(GuestCategory):
客房信息表(Room)
客房类型表(RoomType)
数据表的E-R模型视图
在之前做的图书馆管理系统中,表示层界面的数据是直接从数据库中读取的数据,这种方式容易把数据结构暴露在表示层和业务逻辑层,不利于数据安全。
实体类具有面向兑现的基本特性,是业务对象的基础。在三层结构之间通过实体类传递数据有很大的灵活性,有助于项目的维护和扩展,更体现三层结构的优势。
本项目根据系统功能和数据库的设计,将五个数据表分别转换为五个实体类。
1、Guest实体类
2、GuestCategory实体类
3、Room实体类
4、RoomType实体类
5、HotelUser实体类
HotelUser实体类对应于数据库中的HotelUser数据表,将其转化成面向对象的标识形式。
一般实体类中都包含字段和属性。如果属性是可读可写,就可以采用重构的方式快速完成实体类的创建。但是如果属性只能可读或者可写,就需要手动创建类。
HotelUser实体类的类图:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelManageLib { [Serializable] public class HotelUser { private static int userID;//用户ID private static string userName = String.Empty;//用户名 private static string password = String.Empty;//用户密码 ////// 用户ID /// public int UserID { get { return userID; } set { userID = value; } } ////// 用户名 /// public string UserName { get { return userName; } set { userName = value; } } ////// 用户密码 /// public string Password { get { return password; } set { password = value; } } public HotelUser() { } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelManageLib { [Serializable] public class Guest { ////// 客人ID /// private static int guestId;//客人Id,int类型 public int GuestID { get { return guestId; } set { guestId = value; } } ////// 客人姓名 /// private static string guestName;//客人姓名 public string GuestName { get { return guestName; } set { guestName = value; } } ////// 客人类别 /// private static int guestTypeId;//客人类别 public int GuestTypeID { get { return guestTypeId; } set { guestTypeId = value; } } ////// 客人性别 /// private static string guestSex;//客人性别 public string GuestSex { get { return guestSex; } set { guestSex = value; } } ////// 电话 /// private static string guestMobile;//电话 public string GuestMobile { get { return guestMobile; } set { guestMobile = value; } } ////// 房间号 /// private static int guestRoomId;//房间号,int类型 public int GuestRoomID { get { return guestRoomId; } set { guestRoomId = value; } } ////// 入住时间 /// private static DateTime guestArriveTime;//入住时间,时间类型 public DateTime GuestArriveTime { get { return guestArriveTime; } set { guestArriveTime = value; } } ////// 离开时间 /// private static DateTime guestLeaveTime;//离开时间,时间类型 public DateTime GuestLeaveTime { get { return guestLeaveTime; } set { guestLeaveTime = value; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelManageLib { [Serializable] public class GuestType { ////// 客人类型ID /// private static int typeId;//客人类型ID public int TypeID { get { return typeId; } set { typeId = value; } } ////// 类型名称 /// private static string typeName;//类型名称 public string TypeName { get { return typeName; } set { typeName = value; } } public GuestType() { } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelManageLib { [Serializable] public class Room { protected static int roomId;//房间号Id protected static string number = String.Empty;//房间号 protected static int typeId;//房间类型ID protected static int bedNumber;//床位数 protected static string description = String.Empty;//房间描述 protected static string state = String.Empty;//房间状态 protected static int guestNumber;//入住客人数 public Room() { } ////// 房间号ID /// public int RoomID { get { return roomId; } set { roomId = value; } } ////// 房间号 /// public string Number { get { return number; } set { number = value; } } ////// 房间类型ID /// public int TypeID { get { return typeId; } set { typeId = value; } } ////// 床位数 /// public int BedNumber { get { return bedNumber; } set { bedNumber = value; } } ////// 房间描述 /// public string Description { get { return description; } set { description = value; } } ////// 房间状态 /// public string State { get { return state; } set { state = value; } } ////// 入住客人数 /// public int GuestNumber { get { return guestNumber; } set { guestNumber = value; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelManageLib { [Serializable] public class RoomType { protected static int typeId;//房间类型ID protected static string typeName;//房间类型名 protected static string typePrice;//房间类型价格 protected static string addBedPrice;//添加床位的价格 protected static string isAddBed;//是否添加床位 protected static string remark;//备注 public RoomType() { } ////// 房间类型ID /// public int TypeID { get { return typeId; } set { typeId = value; } } ////// 房间类型名 /// public string TypeName { get { return typeName; } set { typeName = value; } } ////// 房间类型价格 /// public string TypePrice { get { return typePrice; } set { typePrice = value; } } ////// 添加床位价格 /// public string AddBedPrice { get { return addBedPrice; } set { addBedPrice = value; } } ////// 是否添加床位 /// public string IsAddBed { get { return isAddBed; } set { isAddBed = value; } } ////// 备注 /// public string Remark { get { return remark; } set { remark = value; } } } }
通信模块:
public static class DBModule { public static string ServerIP = "***.***.***.***"; public static string ServerPort = "33**"; public static string ServerUser = "#####"; public static string ServerPassword = "******"; public static string ServerDBName = "hotelmanage"; }
操作模块:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Data; public class MySQLHelper { private MySqlConnection myConnection; private string mErrorString; //构造函数 public MySQLHelper(string strServerIP, string strServerPort, string strServerUser, string strPassword, string strDBName) { string strConnectionString = String.Format("server={0}; port={1}; user id={2}; password={3}; database={4}", strServerIP, strServerPort, strServerUser, strPassword, strDBName); myConnection = new MySqlConnection(strConnectionString); } //测试连接 public bool ConnectionTest() { bool result = false; try { if (myConnection.State == System.Data.ConnectionState.Closed) { myConnection.Close(); result = true; } } catch (MySqlException ex) { mErrorString = ex.ToString(); } return result; } ////// 执行查询语句,用DataTable返回结果,调用前要传入DataTable的实例化对象作为参数 /// /// 查询命令 /// 返回数据表 ///public bool ExcuteQuerySql(string strQuery, ref DataTable dt) { if (dt == null) { mErrorString = "传入的DataTable为null"; return false; } bool result = false; try { MySqlCommand myCommand = new MySqlCommand(strQuery); myCommand.Connection = myConnection; if (myConnection.State == ConnectionState.Closed) { myConnection.Open(); } dt.Load(myCommand.ExecuteReader()); result = true; } catch (MySqlException ex) { mErrorString = String.Format("ExcuteQuery {0} failed.", ex.ToString()); return false; } finally { myConnection.Close(); } return result; } /// /// 执行带参数的查询语句,使用前传入参数、DataTable实例化对象 /// /// 查询语句 /// /// ///public bool ExcuteQuerySql(string strQuery, MySqlParameter[] param, ref DataTable dt) { if (dt == null) { mErrorString = "传入的DataTable为null."; return false; } bool result = false; try { MySqlCommand myCommand = new MySqlCommand(strQuery); myCommand.Connection = myConnection; if (myConnection.State == ConnectionState.Closed) { myConnection.Open(); } for (int i = 0; i < param.Length; i++) { myCommand.Parameters.Add(param[i]); } dt.Load(myCommand.ExecuteReader()); result = true; } catch (MySqlException ex) { mErrorString = String.Format("ExcuteQuery {0} failed", strQuery) + ex.Message; return false; } finally { myConnection.Close(); } return result; } //执行非查询语句 public int ExcuteSql(string SqlCmdText) { int row = -1; try { MySqlCommand myCommand = new MySqlCommand(SqlCmdText); myCommand.CommandText = SqlCmdText; myCommand.Connection = myConnection; if (myConnection.State == ConnectionState.Closed) { myConnection.Open(); } row = myCommand.ExecuteNonQuery(); } catch (MySqlException ex) { mErrorString = String.Format("ExcuteNonQuery {0} failed", SqlCmdText); } return row; } //执行非查询语句 public int ExcuteSql(string[] SqlCmdText) { try { if (myConnection.State == ConnectionState.Closed) { myConnection.Open(); } for (int i = 0; i < SqlCmdText.Length; i++) { MySqlCommand myCommand = new MySqlCommand(SqlCmdText[i]); myCommand.CommandText = SqlCmdText[i]; myCommand.Connection = myConnection; myCommand.ExecuteNonQuery(); } } catch (MySqlException ex) { mErrorString = String.Format("ExcuteNonQuery {0} failed", SqlCmdText) + ex.Message; return -1; } return -1; } //执行带参数的非查询语句 public int ExcuteSql(string SqlCmdText, MySqlParameter[] param) { int row = -1; try { MySqlCommand myCommand = new MySqlCommand(SqlCmdText); myCommand.CommandText = SqlCmdText; myCommand.Connection = myConnection; if (myConnection.State == ConnectionState.Closed) { myConnection.Open(); } for (int i = 0; i < param.Length; i++) { myCommand.Parameters.Add(param[i]); } row = myCommand.ExecuteNonQuery(); } catch (MySqlException ex) { mErrorString = String.Format("ExecuteNonQuery {0} failed", SqlCmdText) + ex.Message; return row = -1; } return row; } public string GetErrInfo() { return mErrorString; } }
用户管理的数据访问(HotelUserService.cs)需要实现对用户(用户表)的增、删、改、查操作,使用实体对象传递数据,使用IList传递实体对象集合。此类中包含的方法有如下几种:
AddHotelUser(Hotel hotelUser):用户对象作为参数,实现添加新用户的功能。
DeleteHotelUser(Hotel hotelUser):用户对象作为参数,实现删除用户的操作。
DeleteHotelUserByUserID(int userID):根据用户ID删除用户的方法。
ModifyHotelUser(Hotel hotelUser):用户对象作为参数,实现对用户信息的更新。
GetAllHotelUsers():获取所有用户信息。
GetHotelUserByUserID(int userID):根据用户ID查询用户信息。
GetHotelUserByName(string userName):根据用户名查询用户信息。
用户管理数据访问类HotelUserService.cs代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data; using System.Data; using System.Windows.Forms; namespace HotelManageLib { [Serializable] public class HotelUserService { //建立MySQL连接 MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName); //公用数据表,用来进行操作后刷新数据 static DataTable dtAllUsers = new DataTable();//获取全部用户信息 public static int aaa = 1; ////// 添加用户 /// /// ///public static HotelUser AddHotelUser(HotelUser hotelUser) { string sql = "insert into user (UserName, Password) values ('" + hotelUser.UserName + "', '" + hotelUser.Password + "');";//定义插入sql语句 int newID = 0; DataTable dt = new DataTable(); try { //执行添加语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 0) { //获取最新一条数据的ID string sqlNew = "select max(UserId) from user;"; bool QueryFlag = MySQLHelper.ExcuteQuerySql(sqlNew, ref dt); if (QueryFlag == true) { newID = Convert.ToInt32(dt.Rows[0][0]); } else { Console.WriteLine("执行" + sqlNew + "查询最新用户ID失败");//异常写入日志 } } else { Console.WriteLine("执行" + sql + "添加用户信息失败");//异常写入日志 } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); throw ex; } return GetHotelUserByUserId(newID);//返回查询对象 } /// /// 删除用户 /// /// public static void DeleteHotelUser(HotelUser hotelUser) { HotelUser hotelUserTmp = new HotelUser(); //根据用户名查询对应的用户ID string sql = "select UserID from user where UserName='" + hotelUser.UserName + "';"; //查询用户信息 if (hotelUser.UserName != string.Empty) { hotelUserTmp = GetHotelUserByUserName(hotelUser.UserName);//查询此用户 if (hotelUserTmp != null) { DeleteHotelUserByUserId(hotelUserTmp.UserID);//根据此用户的用户ID删除信息 } else { MessageBox.Show("没有该用户信息,不能删除"); } } else { MessageBox.Show("要删除的用户名为空,不能删除该用户信息"); } } ////// 通过用户ID删除用户 /// /// public static void DeleteHotelUserByUserId(int userId) { //先查询是否有此ID的用户 HotelUser hotelUser = new HotelUser(); hotelUser = GetHotelUserByUserId(userId); if (hotelUser != null) { string sql = "delete from user where UserID = " + userId + ";"; DataTable dt = new DataTable(); try { //执行删除语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 1) { //添加后更新全部数据 GetAllHotelUsers(); MessageBox.Show("通过此用户ID" + userId.ToString() + "删除用户信息成功"); } else { //异常写入日志 Console.WriteLine("执行" + sql + "删除用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show(ex.ToString()); } } else { MessageBox.Show("输入ID" + userId.ToString() + "的用户不存在,不能删除"); } } ////// 修改用户信息 /// /// public static DataTable ModifyHotelUser(HotelUser hotelUser) { string sql = "update user set UserName='" + hotelUser.UserName + "', Password='" + hotelUser.Password + "' where UserId=" + Convert.ToInt32(hotelUser.UserID) + ";"; DataTable dt = new DataTable(); try { //执行添加语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 1) { dt = GetAllHotelUsers(); } else { //异常写入日志 Console.WriteLine("执行" + sql + "添加用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); throw ex; } return dt; } ////// 获取所有用户信息 /// ///public static DataTable GetAllHotelUsers() { string sql = "select * from user;"; try { //执行添加语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dtAllUsers); } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); throw ex; } return dtAllUsers; } /// /// 通过用户ID获取用户信息 /// /// ///public static HotelUser GetHotelUserByUserId(int userId) { HotelUser hotelUser = new HotelUser(); string sql = "select * from user where UserID = " + userId + ";"; DataTable dt = new DataTable(); try { //执行查询语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dt); if (returnValue == true) { //添加后更新DataGridView if (dt.Rows.Count > 0) { hotelUser.UserID = Convert.ToInt32(dt.Rows[0][0]);//第0列为用户ID hotelUser.UserName = dt.Rows[0][1].ToString();//第1列为用户名 hotelUser.Password = dt.Rows[0][2].ToString();//第2列为用户密码 } else { hotelUser = null; //异常写入日志 //Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } else { //异常写入日志 //Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show(ex.ToString()); } return hotelUser; } /// /// 通过用户名获取用户信息 /// /// ///public static HotelUser GetHotelUserByUserName(string userName) { HotelUser hotelUser = new HotelUser(); string sql = "select * from user where UserName='" + userName + "';"; DataTable dt = new DataTable(); try { //执行添加语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dt); if (returnValue == true) { if (dt.Rows.Count > 0) { hotelUser.UserID = Convert.ToInt32(dt.Rows[0][0]);//第0列为用户ID hotelUser.UserName = dt.Rows[0][1].ToString();//第1列为用户名 hotelUser.Password = dt.Rows[0][2].ToString();//第2列为用户密码 } else { hotelUser = null; //异常写入日志 Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); } } else { //异常写入日志 Console.WriteLine("执行" + sql + "添加用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); throw ex; } return hotelUser; } } }
客房信息数据访问类(RoomService.cs)与用户管理类相似,其中方法是对客房信息数据库进行增、删、改、查操作,操作方式、参数略有不同。
此类中包含的方法如下几种:
AddRoom(Room room):客房对象作为参数,实现增加客房信息。
DeleteRoomById(int roomId):根据客房ID删除客房信息。
ModifyRoom(Room room):客房对象作为参数,实现修改客房信息。
GetAllRooms():查询所有客房信息。
GetRoomById(int roomId):根据客房ID查询客房信息(客房实体对象)。
GetRoomListByRoomNumber(string roomNumber):根据客房编号查询同编号的客房集合。
GetRoomByRoomNumber(string roomNumber):根据客房编号查询客房信息。
在这里插入代码片
客房类型访问类(RoomTypeService.cs)实现客房类型的数据库操作,方法与客房信息的操作类似,实现对客房类型信息的增删改查。此类中实现方法如下:
AddRoomType(RoomType roomType):客房类型对象作为参数,实现增加客房类型。
DeleteRoomType(int roomTypeId):根据客房类型ID删除客房类型信息。
ModifyRoomType(RoomType roomType):客房类型对象作为参数,实现客房类型信息修改。
GetAllRoomTypes():得到所有房间类型。
GetRoomTypeListByTypeName(string typeName):根据客房类型名称得到客房类型列表。
GetTypeNameByTypeId(int typeID):根据客房类型ID得到客房类型名字。
GetRoomTypeByTypeID(int typeId):根据客房类型ID得到客房实体对象。
客人管理类(GuestService.cs)实现对客人信息的数据库操作,方法与客房信操作类似,实现对客人信息的增删改查。此类中实现方法如下:
AddGuest(Guest guest):客人对象作为参数,实现增加客人信息。
DeleteGuest(int guestId):根据客人ID删除客人信息。
ModifyGuest(Guest guest):客人对象作为参数,实现修改客人信息。
GetAllGuest():获取所有客人信息。
GetGuestByGuestName(string guestName):根据客人名字获取客人信息。
GetGuestListBySql(string safeSql):根据sql语句获取客人信息列表。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data; using System.Data; using System.Windows.Forms; namespace HotelManageLib { [Serializable] public class GuestService { //建立MySQL连接 MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName); //公用数据表,用来进行操作后刷新数据 static DataTable dtAllGuests = new DataTable();//获取全部用户信息 ////// 添加用户 /// /// ///public static Guest AddGuest(Guest guest) { string sql = "insert into guest (GuestName, GuestTypeID, GuestSex, GuestMobile, RoomID, GuestArriveTime, GuestLeaveTime) values ('" + guest.GuestName + "', " + guest.GuestTypeID + //int不需要引号 ", '" + guest.GuestSex + "', '" + guest.GuestMobile + "', " + guest.GuestRoomID + //int不需要引号 ", '" + guest.GuestArriveTime + "', '" + guest.GuestLeaveTime + "');";//定义插入sql语句 int newID = 0; DataTable dt = new DataTable(); try { //执行添加语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 0) { //获取最新一条数据的ID string sqlNew = "select max(GuestID) from guest;"; bool QueryFlag = MySQLHelper.ExcuteQuerySql(sqlNew, ref dt); if (QueryFlag == true) { newID = Convert.ToInt32(dt.Rows[0][0]); } else { Console.WriteLine("执行" + sqlNew + "查询最新客人ID失败");//异常写入日志 } } else { Console.WriteLine("执行" + sql + "添加客人信息失败");//异常写入日志 } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show("插入客人信息失败" + ex.ToString()); } return GetGuestByGuestId(newID);//返回查询对象 } /// /// 删除客人 /// /// public static void DeleteGuest(Guest guest) { Guest guestTmp = new Guest(); //根据用户名查询对应的用户ID string sql = "select GuestID from guest where GuestName='" + guest.GuestName + "';"; //查询用户信息 if (guest.GuestName != string.Empty) { guestTmp = GetGuestByGuestName(guest.GuestName);//查询此用户 if (guestTmp != null) { DeleteGuestByGuestId(guestTmp.GuestID);//根据此用户的用户ID删除信息 } else { MessageBox.Show("没有该客人信息,不能删除"); } } else { MessageBox.Show("要删除的客人名为空,不能删除该客人信息"); } } ////// 通过客人ID删除客人 /// /// public static void DeleteGuestByGuestId(int guestId) { //先查询是否有此ID的用户 Guest guest = new Guest(); guest = GetGuestByGuestId(guestId); if (guest != null) { string sql = "delete from guest where GuestID = " + guestId + ";"; DataTable dt = new DataTable(); try { //执行删除语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 1) { //添加后更新全部数据 GetAllGuests(); MessageBox.Show("通过此客人ID" + guestId.ToString() + "删除客人信息成功"); } else { //异常写入日志 Console.WriteLine("执行" + sql + "删除客人信息失败"); MessageBox.Show("执行" + sql + "删除客人信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show(ex.ToString()); } } else { MessageBox.Show("输入ID" + guestId.ToString() + "的客人不存在,不能删除"); } } ////// 修改客人信息 /// /// public static DataTable ModifyGuest(Guest guest) { string sql = "update guest set GuestName='" + guest.GuestName + "', GuestTypeID=" + guest.GuestTypeID + //int无需单引号 ", GuestSex='" + guest.GuestSex + "', GuestMobile='" + guest.GuestMobile + "', GuestRoomID=" + guest.GuestRoomID + //int无需单引号 ", GuestArriveTime='" + guest.GuestArriveTime + "', GuestLeaveTime='" + guest.GuestLeaveTime + "' where GuestID=" + Convert.ToInt32(guest.GuestID) + ";"; DataTable dt = new DataTable(); try { //执行添加语句 int returnValue = MySQLHelper.ExcuteSql(sql); if (returnValue == 1) { dt = GetAllGuests(); } else { //异常写入日志 Console.WriteLine("执行" + sql + "添加用户信息失败"); MessageBox.Show("执行" + sql + "添加用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show("修改客户信息失败" + ex.ToString()); } return dt; } ////// 获取所有客人信息 /// ///public static DataTable GetAllGuests() { string sql = "select * from guest;"; try { //执行添加语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dtAllGuests); } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show("获取所有客人信息失败" + ex.ToString()); } return dtAllGuests; } /// /// 通过客人ID获取客人信息 /// /// ///public static Guest GetGuestByGuestId(int guestId) { Guest guest = new Guest(); string sql = "select * from guest where GuestID = " + guestId + ";"; DataTable dt = new DataTable(); try { //执行查询语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dt); if (returnValue == true) { if (dt.Rows.Count > 0) { //获取客人属性 guest.GuestID = Convert.ToInt32(dt.Rows[0][0]); ; guest.GuestName = dt.Rows[0][1].ToString(); guest.GuestTypeID = Convert.ToInt32(dt.Rows[0][2]); guest.GuestSex = dt.Rows[0][3].ToString(); guest.GuestMobile = dt.Rows[0][4].ToString(); guest.GuestRoomID = Convert.ToInt32(dt.Rows[0][5]); guest.GuestArriveTime = Convert.ToDateTime(dt.Rows[0][6].ToString()); guest.GuestLeaveTime = Convert.ToDateTime(dt.Rows[0][7].ToString()); } else { guest = null; //异常写入日志 //Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } else { //异常写入日志 //Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); MessageBox.Show(ex.ToString()); } return guest; } /// /// 通过客人名获取客人信息 /// /// ///public static Guest GetGuestByGuestName(string guestName) { Guest guest = new Guest(); string sql = "select * from guest where GuestName='" + guestName + "';"; DataTable dt = new DataTable(); try { //执行添加语句 bool returnValue = MySQLHelper.ExcuteQuerySql(sql, ref dt); if (returnValue == true) { if (dt.Rows.Count > 0) { //获取客人属性 guest.GuestID = Convert.ToInt32(dt.Rows[0][0]); ; guest.GuestName = dt.Rows[0][1].ToString(); guest.GuestTypeID = Convert.ToInt32(dt.Rows[0][2]); guest.GuestSex = dt.Rows[0][3].ToString(); guest.GuestMobile = dt.Rows[0][4].ToString(); guest.GuestRoomID = Convert.ToInt32(dt.Rows[0][5]); guest.GuestArriveTime = Convert.ToDateTime(dt.Rows[0][6].ToString()); guest.GuestLeaveTime = Convert.ToDateTime(dt.Rows[0][7].ToString()); } else { guest = null; //异常写入日志 Console.WriteLine("执行" + sql + "根据用户ID查询用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } else { //异常写入日志 Console.WriteLine("执行" + sql + "添加用户信息失败"); MessageBox.Show("执行" + sql + "根据用户ID查询用户信息失败"); } } catch (Exception ex) { //异常写入日志 Console.WriteLine(ex.ToString()); throw ex; } return guest; } } }
客人类型数据访问(GuestTypeService.cs)实现对客人类型信息的数据库操作。
此类中包含方法如下:
GetAllGuestType():查询所有客人类型。
GetGuestTypeByTypeId(int typeId):根据客人类型ID查询客人信息。
GetGuestTypeListBySql(string safeSql):根据Sql语句查询客人类型集合。
在这里插入代码片
业务逻辑层负责数据的传递,概括实现业务逻辑层的步骤为:
(1)在业务逻辑类中引用数据访问层、实体层的命名空间。
(2)实例化实体对象。
(3)调用数据访问功能。
(4)实现业务逻辑。
用户管理业务逻辑类(HotelUserManage.cs)用来处理用户管理的业务逻辑,在用户管理数据访问层(HotelUserService.cs)类和用户管理界面之间进行数据传递。
用户管理业务逻辑类(HotelUserManage.cs)代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HotelManageLib; using System.Data; namespace HotelManage { class HotelUserManage { //新增用户 public static void AddHotelUser(HotelUser hotelUser) { HotelUserService.AddHotelUser(hotelUser); } //删除用户 public static void DeleteHotelUser(HotelUser hotelUser) { HotelUserService.DeleteHotelUser(hotelUser); } //根据用户ID删除用户 public static void DeleteHotelUserById(int userId) { HotelUserService.DeleteHotelUserByUserId(userId); } //修改用户 public static DataTable ModifyHotelUser(HotelUser hotelUser) { DataTable dt = new DataTable(); dt = HotelUserService.ModifyHotelUser(hotelUser); return dt; } //得到用户列表 public static DataTable GetAllHotelUsers() { return HotelUserService.GetAllHotelUsers(); } //根据用户ID得到用户列表 public static HotelUser GetHotelUserByUserID(int userId) { return HotelUserService.GetHotelUserByUserId(userId); } //根据用户名得到用户列表 public static HotelUser GetHotelUser(string userName) { return HotelUserService.GetHotelUserByUserName(userName); } } }
客房信息管理业务逻辑类(RoomManage.cs)负责在客房信息管理数据访问和客房信息界面之间进行数据访问,通过调用RoomService.cs中的方法进行业务处理。同样具有增删改查功能。
待写
客房类型业务逻辑类RoomTypeManage.cs负责在客房类型数据访问层和客房类型界面之间进行数据访问,通过调用RoomTypeService.cs中的方法进行业务处理。同样具有增删改查功能。
在这里插入代码片
客人信息管理业务逻辑类GuestManage.cs负责在客人信息数据访问层和客人信息界面之间进行数据访问,通过调用GuestService.cs中的方法进行业务处理。同样具有增删改查功能。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HotelManageLib; using System.Data; namespace HotelManage { class GuestManage { //新增客人 public static void AddGuest(Guest guest) { GuestService.AddGuest(guest); } //删除客人 public static void DeleteGuest(Guest guest) { GuestService.DeleteGuest(guest); } //根据客人ID删除客人 public static void DeleteGuestById(int guestId) { GuestService.DeleteGuestByGuestId(guestId); } //修改客人 public static DataTable ModifyGuest(Guest guest) { DataTable dt = new DataTable(); dt = GuestService.ModifyGuest(guest); return dt; } //得到客人列表 public static DataTable GetAllGuests() { return GuestService.GetAllGuests(); } //根据客人ID得到客人列表 public static Guest GetGuestByGuestID(int guestId) { return GuestService.GetGuestByGuestId(guestId); } //根据客人名得到客人列表 public static Guest GetGuest(string guestName) { return GuestService.GetGuestByGuestName(guestName); } } }
客人类型管理业务逻辑类GuestTypeManage.cs负责在客人类型数据访问和客人类型界面之间进行数据访问,通过调用GuestTypeService.cs中的方法进行业务处理。功能有查询等。
在这里插入代码片
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; using HotelManageLib; namespace HotelManage { public partial class FrmLogin : Form { public FrmLogin() { InitializeComponent(); } MainForm mainFrm = new MainForm(); private void btnLogin_Click(object sender, EventArgs e) { //输入合法性判断 if (Volidity())//合法性通过 { //定义查询语句 string sql = String.Format("select * from user where UserName='{0}' and Password='{1}'", this.txtUserName.Text.Trim(), this.txtPassword.Text.Trim()); MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName); DataTable dt = new DataTable(); bool queryFlag = MySQLHelper.ExcuteQuerySql(sql, ref dt); if (queryFlag == false) { MessageBox.Show("登录失败,没有找到该用户"); } if (dt.Rows.Count > 0) { mainFrm.Show(); this.Hide(); } else { MessageBox.Show("用户名或密码错误,请重新输入"); } } } private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } ////// 验证合法性 /// private bool Volidity() { if (this.txtUserName.Text != string.Empty && this.txtPassword.Text != string.Empty) { return true; } else { MessageBox.Show("用户名或密码不能为空"); } return false; } } }
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 HotelManage { public partial class MainForm : Form { public DialogResult result;//声明对话框返回对象 public MainForm() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //FrmLogin frmLogin = new FrmLogin(); //frmLogin.Show(); } private void tsmExit_Click(object sender, EventArgs e) { if (MessageBox.Show("确认退出系统?", "提示信息", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK) { System.Environment.Exit(0); } } ////// 查询子窗体是否存在 /// /// ///public bool CheckChildFrm(string childfrmname) { foreach (Form childFrm in this.MdiChildren)//遍历子窗体 { if (childFrm.Name == childfrmname)//如果子窗体存在 { if (childFrm.WindowState == FormWindowState.Minimized) { childFrm.WindowState = FormWindowState.Normal; } childFrm.Activate();//激活该窗体 return true; //存在返回true } } return false;//不存在返回false } private void tsbRoomInfo_Click(object sender, EventArgs e) { if (this.CheckChildFrm("FrmRoomInfo") == true) { return; } FrmRoomInfo frmRoomInfo = new FrmRoomInfo(); frmRoomInfo.MdiParent = this;//设置当前窗体的子窗体 frmRoomInfo.Show(); } private void tsbRoomType_Click(object sender, EventArgs e) { if (this.CheckChildFrm("FrmRoomType") == true) { return; } FrmRoomType frmRoomType = new FrmRoomType(); frmRoomType.MdiParent = this;//设置当前窗体的子窗体 frmRoomType.Show(); } private void tsbGuestInfo_Click(object sender, EventArgs e) { if (this.CheckChildFrm("FrmGuestInfo") == true) { return; } FrmGuestInfo frmGuestInfo = new FrmGuestInfo(); frmGuestInfo.MdiParent = this;//设置当前窗体的子窗体 frmGuestInfo.Show(); } private void tsbUserManage_Click(object sender, EventArgs e) { if (this.CheckChildFrm("FrmUserManage") == true) { return; } FrmUserManage frmUserManage = new FrmUserManage(); frmUserManage.MdiParent = this;//设置当前窗体的子窗体 frmUserManage.Show(); } } }
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; using HotelManageLib; namespace HotelManage { public partial class FrmUserManage : Form { public FrmUserManage() { InitializeComponent(); } private HotelUser hotelUser; private int userId; private void tsbExit_Click(object sender, EventArgs e) { this.Close(); } private void tsbCancel_Click(object sender, EventArgs e) { this.Close(); } private void tsbAdd_Click(object sender, EventArgs e) { lbPassword.Visible = true; lbUserName.Visible = true; txtUserName.Visible = true; txtPassword.Visible = true; lbUserName.Text = "用户名"; if (txtUserName.Text != string.Empty && txtPassword.Text != string.Empty) { HotelUser hotelUser = new HotelUser(); hotelUser.UserName = txtUserName.Text; hotelUser.Password = txtPassword.Text; HotelUserManage.AddHotelUser(hotelUser); lbPassword.Visible = false; lbUserName.Visible = false; txtUserName.Visible = false; txtPassword.Visible = false; MessageBox.Show("新增用户成功!"); DataTable dt = new DataTable(); dt = HotelUserManage.GetAllHotelUsers();//获取更新所有用户信息 dataGridView1.DataSource = dt; } else { return; } txtUserName.Text = string.Empty; txtPassword.Text = string.Empty; } private void tsbDelete_Click(object sender, EventArgs e) { lbUserName.Text = "用户ID"; lbUserName.Visible = true; txtUserName.Visible = true; lbPassword.Visible = false; txtPassword.Visible = false; if (txtUserName.Text == string.Empty) { MessageBox.Show("请输入要删除的用户ID"); } else { //删除用户信息 通过ID HotelUserManage.DeleteHotelUserById(Convert.ToInt32(txtUserName.Text)); //更新数据显示 DataTable dt = new DataTable(); dt = HotelUserManage.GetAllHotelUsers();//获取更新所有用户信息 dataGridView1.DataSource = dt; } } private void tsbUpdate_Click(object sender, EventArgs e) { //更新用户名和用户密码 lbPassword.Visible = true; lbUserName.Visible = true; txtUserName.Visible = true; txtPassword.Visible = true; lbUserName.Text = "用户名"; //查询所有用户信息,将用户ID绑定到combox中 DataTable dt = new DataTable(); dt = HotelUserManage.GetAllHotelUsers(); for (int i = 0; i < dt.Rows.Count; i++) { cmbUserId.Items.Add((dt.Rows[i][0].ToString())); } cmbUserId.Text = dt.Rows[0][0].ToString(); //选择用户ID MessageBox.Show("请选择要修改的用户ID"); } private void tsbSave_Click(object sender, EventArgs e) { //查询用户信息 DataTable dt = new DataTable(); dt = HotelUserManage.GetAllHotelUsers(); if (dt.Rows.Count > 0) { dataGridView1.DataSource = dt; //保存信息 MessageBox.Show("信息保存成功"); } else { MessageBox.Show("用户信息为空或者查询所有用户信息失败!"); } } private void cmbUserId_SelectedIndexChanged(object sender, EventArgs e) { //查询用户ID对应信息 if (cmbUserId.Text != string.Empty) { HotelUser hotelUserTmp = new HotelUser(); hotelUserTmp = HotelUserManage.GetHotelUserByUserID(Convert.ToInt32(cmbUserId.Text)); if (hotelUserTmp != null) { txtUserName.Text = hotelUserTmp.UserName; txtPassword.Text = hotelUserTmp.Password; } else { MessageBox.Show("根据当前ID查询的用户信息为空"); } } } private void tsbUpdate_DoubleClick(object sender, EventArgs e) { } private void lbPassword_Click(object sender, EventArgs e)//密码label单击为保存修改信息 { //根据用户ID查询用户信息 HotelUser hotelUser = new HotelUser(); hotelUser = HotelUserManage.GetHotelUserByUserID(Convert.ToInt32(cmbUserId.Text)); if (hotelUser != null) { hotelUser.UserName = txtUserName.Text; hotelUser.Password = txtPassword.Text; } else { MessageBox.Show("根据用户ID查询的用户信息为空"); } DataTable dt = new DataTable(); dt = HotelUserManage.ModifyHotelUser(hotelUser); if (dt.Rows.Count > 0) { MessageBox.Show("更新成功", "提示信息", MessageBoxButtons.OK); dataGridView1.DataSource = dt; } else { MessageBox.Show("更新失败", "提示信息", MessageBoxButtons.OK); } } } }
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; using HotelManageLib; using System.Text.RegularExpressions; namespace HotelManage { public partial class FrmGuestInfo : Form { public FrmGuestInfo() { InitializeComponent(); } private void tsbCancel_Click(object sender, EventArgs e) { this.Close(); } private void tsbExit_Click(object sender, EventArgs e) { this.Close(); } private void btnQuery_Click(object sender, EventArgs e) { //根据客人姓名查询客人信息 Guest guest = new Guest(); DataTable dt = new DataTable(); if (txtGuestName.Text != string.Empty) { guest = GuestManage.GetGuest(txtGuestName.Text); if (guest != null) { //把查询的客人信息装在DataGridView中 dt.Columns.Add("客人姓名", typeof(string)); dt.Columns.Add("客人类别", typeof(int)); dt.Columns.Add("性别", typeof(string)); dt.Columns.Add("电话", typeof(string)); dt.Columns.Add("房间编号", typeof(int)); dt.Columns.Add("到达时间", typeof(DateTime)); dt.Columns.Add("离开时间", typeof(DateTime)); DataRow dr = dt.NewRow(); dr["客人姓名"] = guest.GuestName; dr["客人类别"] = guest.GuestTypeID; dr["性别"] = guest.GuestSex; dr["电话"] = guest.GuestMobile; dr["房间编号"] = guest.GuestRoomID; dr["到达时间"] = guest.GuestArriveTime; dr["离开时间"] = guest.GuestLeaveTime; dt.Rows.Add(dr); dataGridView1.DataSource = dt; } else { MessageBox.Show("没有查询到姓名为:" + txtGuestName.Text + "的客人信息"); dataGridView1.DataSource = null;//清空dataGridView1 } } else { MessageBox.Show("输入的客人姓名为空"); dataGridView1.DataSource = null;//清空dataGridView1 } } private void tsbSave_Click(object sender, EventArgs e) { //查询所有客人信息 DataTable dt = new DataTable(); dt = GuestManage.GetAllGuests(); if (dt.Rows.Count > 0) { dataGridView1.DataSource = dt; } else { MessageBox.Show("没有客人信息可以保存"); } } private void tsbAdd_Click(object sender, EventArgs e) { pnlGuestInfo.Visible = true; Guest guest = new Guest(); if (Validity(txtName.Text) && Validity(cmbGuestType.Text) && Validity(txtGuestSex.Text) && Validity(txtGuestPhone.Text) && Validity(txtGuestRoomId.Text) && Validity(txtArriveTime.Text) && Validity(txtLeaveTime.Text)) { //将所有客人信息赋给对象,使用客人对象插入数据 guest.GuestName = txtName.Text; if (IsNumeric(cmbGuestType.Text) == true) { guest.GuestTypeID = Convert.ToInt32(cmbGuestType.Text); } else { MessageBox.Show("客人类型不是数字,请重新输入"); cmbGuestType.Text = string.Empty; } guest.GuestSex = txtGuestSex.Text; guest.GuestMobile = txtGuestPhone.Text; if (IsNumeric(txtGuestRoomId.Text) == true) { guest.GuestRoomID = Convert.ToInt32(txtGuestRoomId.Text); } else { MessageBox.Show("房间类型不是数字,请重新输入"); txtGuestRoomId.Text = string.Empty; } guest.GuestArriveTime = Convert.ToDateTime(txtArriveTime.Text); guest.GuestLeaveTime = Convert.ToDateTime(txtLeaveTime.Text); GuestManage.AddGuest(guest);//插入客人信息 } else { MessageBox.Show("请输入全部客人信息"); } } //判断输入字符串为空的合法性验证 public bool Validity(string str) { if (str != string.Empty) { return true; } else { MessageBox.Show("字符串" + str + "为空"); return false; } } //判断字符串是否是数字 public bool IsNumeric(string str) { bool isMatch = Regex.IsMatch(str, @"^\d+$");//正则表达式匹配 return isMatch; } private void tsbDelete_Click(object sender, EventArgs e) { //根据客人姓名 if (txtGuestName.Text != string.Empty) { //删除用户信息 通过ID Guest guest = new Guest(); //根据用户名查询用户信息 guest = GuestManage.GetGuest(txtGuestName.Text); if (guest != null) { GuestManage.DeleteGuestById(guest.GuestID); DataTable dtTemp = new DataTable(); dtTemp = GuestManage.GetAllGuests();//刷新表格 dataGridView1.DataSource = dtTemp; } else { MessageBox.Show("此客人名的客人信息不存在"); } //更新数据显示 DataTable dt = new DataTable(); dt = GuestManage.GetAllGuests();//获取更新所有用户信息 dataGridView1.DataSource = dt; } else { MessageBox.Show("请输入要删除的客人姓名"); } } } }
本文实现一个酒店管理系统,也是简化版的系统。重点在于使用三层架构、面向对象的思想进行软件开发设计的全流程设计,实现起来具体难度不大,工作量也不小(2-3周)。
除了设计过程有难度之外,数据库的增、删、改、查操作也是容易出问题的,在这个项目中由于使用了外键,所以增加了出错的概率。在这个项目中,我对于数据库的操作和外键的设置和使用有了更深的体会。另外对于UI的设计也是一门学问,这里虽然没有认真去美化,但实际上很有必要做到合理、美观的UI。
由于时间关系,在完成本项目的整个设计后,发现总共有5条从表示层到业务逻辑层到数据访问层的对象操作流要实现,通过UI界面也可以看到,5个界面都是不同对象的增删改查。
所以我主要实现了“用户管理”、“客人信息管理”这两条业务线,全部功能实现贯通。其余的三条业务线“客人类型管理”、“客房信息管理”、“客房类型管理”就没有去实现了,基本是前两条业务线的复制粘贴。有感兴趣的小伙伴也可以自行去实现。
总的来说,我认为我完成了自主设计的酒店管理系统,希望以后设计软件系统把这种规范化的思想融入进去。设计有趣,实现枯燥,二者都需要脚踏实地去做。