文章目录

  • 前言
      • 实现步骤
  • 一、系统分析
        • 1、需求分析
          • (1)用户管理
          • (2)客人信息管理
          • (3)客房信息管理
          • (4)客房预定信息管理
        • 2、系统设计
        • 3、数据库设计
  • 二、实体类设计
        • 1、HotelUser实体类
        • 2、Guest实体类
        • 3、GuestType实体类
        • 4、Room实体类
        • 5、RoomType实体类
  • 三、界面设计
        • 1、用户登录界面
        • 2、主界面
        • 3、客人信息界面
        • 4、客房信息界面
        • 5、客房类型设置界面
        • 6、用户管理界面
  • 四、实现数据访问层
        • 1、数据库通用操作类
        • 2、用户管理数据访问
        • 3、客房信息数据访问
        • 4、客房类型数据访问
        • 5、客人管理数据访问
        • 6、客人类型数据访问
  • 五、实现业务逻辑层
        • 1、用户管理业务逻辑类
        • 2、客房信息管理业务逻辑类
        • 3、客房类型业务逻辑类
        • 4、客房管理业务逻辑类
        • 5、客人类型业务逻辑类
  • 六、实现表示层业务逻辑
        • 1、用户登录
        • 2、主界面
        • 3、客房类型设置
        • 4、可房信息设置
        • 5、用户管理
        • 6、客人管理
  • 总结

前言

结合.NET三层机构的开发思想,完成一个C/S结构的、实际可以使用的酒店管理系统。涉及编程方面的重要技巧,如ADO.NET技术、数据验证技术、参数传递、数据显示控件及容器控件。

实现步骤

  • 酒店管理系统的系统分析。
  • 用户管理模块的设计和实现。
  • 酒店基础信息设置模块的设计和实现。
  • 酒店业务管理模块的设计和实现。

一、系统分析

用途:帮助酒店管理的工具。
功能1:添加、删除、修改住房信息。
功能2:添加、删除、修改客人信息。

1、需求分析

需求分析是开发应用系统的第一步,通过需求分析可以了解客户需要什么样的程序,需要完成什么功能。通过需求说明书描述系统的总体要求,并且作为各方面沟通的依据,也为下一步工作提供基准。系统开发人员要按照需求说明文档完成相应的功能实现。可以找一下标准的需求说明书文档参考。

酒店管理系统用于管理和维护酒店的基本信息,酒店管理人员登录系统后可以拥有该系统的所有功能,方便进行酒店内部管理。改系统使用数据库存放数据。

以下为需求分析的结果——系统功能设计图。

(1)用户管理

可登录本系统的人员管理。信息必须在用户数据中才可以登录。
功能:
用户信息的查询、增加、删除、修改。

(2)客人信息管理

功能:
客人住房情况管理(客人姓名、入住房间、入住时间、离开时间)。
根据客人名称对客房预定信息进行查询。

(3)客房信息管理

功能:
客房类型管理(客房类型分中、高、低)。
客房使用情况(空闲、入住、维修、自用)。
根据客房类型对房间进行统一定价,并设置某类客房是否可以加床以及加床的价格。
每一个房间的属性,如房号、类型、价格、床位数、对该客房的描述。
根据客房信息名称、客房房间号对信息进行查找。

(4)客房预定信息管理

客房属性:房号、类型、床位数、价格、使用情况描述。
客房使用状态:空闲、入住、维修、自用。
根据客房的房号进行信息查找。

2、系统设计

本系统的总体架构采用三层架构模式,分为表示层、业务逻辑层、数据访问层。其中表示层负责界面的显示,提供用户交互操作界面。业务逻辑层是表示层和数据访问层之间的桥梁,主要负责数据的处理和传递。数据访问层主要实现对数据的读取和保存操作。

该系统较为简单,没有使用接口和反射技术。三个模块之间使用对象或者数据集进行通信。
每一层使用程序集实现,三层架构的程序不可跨层调用。

三层系统架构图:

3、数据库设计

实体关系概念模型设计(E-R图)

数据表设计

客人信息表(Guest):

客人类型表(GuestCategory):

客房信息表(Room)

客房类型表(RoomType)

数据表的E-R模型视图

二、实体类设计

在之前做的图书馆管理系统中,表示层界面的数据是直接从数据库中读取的数据,这种方式容易把数据结构暴露在表示层和业务逻辑层,不利于数据安全。

实体类具有面向兑现的基本特性,是业务对象的基础。在三层结构之间通过实体类传递数据有很大的灵活性,有助于项目的维护和扩展,更体现三层结构的优势。

本项目根据系统功能和数据库的设计,将五个数据表分别转换为五个实体类。

1、Guest实体类
2、GuestCategory实体类
3、Room实体类
4、RoomType实体类
5、HotelUser实体类

1、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;//用户IDprivate 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() { }}}
2、Guest实体类

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; }}}}
3、GuestType实体类

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;//客人类型IDpublic int TypeID{get { return typeId; }set { typeId = value; }}/// /// 类型名称/// private static string typeName;//类型名称public string TypeName{get { return typeName; }set { typeName = value; }}public GuestType(){ }}}
4、Room实体类

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;//房间号Idprotected static string number = String.Empty;//房间号protected static int typeId;//房间类型IDprotected 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; }}}}
5、RoomType实体类

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;//房间类型IDprotected 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; }}}}

三、界面设计

1、用户登录界面

2、主界面

3、客人信息界面

4、客房信息界面

5、客房类型设置界面

6、用户管理界面

四、实现数据访问层

1、数据库通用操作类

通信模块:

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;}}
2、用户管理数据访问

用户管理的数据访问(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 staticHotelUser 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){//获取最新一条数据的IDstring 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();//根据用户名查询对应的用户IDstring 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){//添加后更新DataGridViewif (dt.Rows.Count > 0){hotelUser.UserID = Convert.ToInt32(dt.Rows[0][0]);//第0列为用户IDhotelUser.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列为用户IDhotelUser.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;}}}
3、客房信息数据访问

客房信息数据访问类(RoomService.cs)与用户管理类相似,其中方法是对客房信息数据库进行增、删、改、查操作,操作方式、参数略有不同。
此类中包含的方法如下几种:

AddRoom(Room room):客房对象作为参数,实现增加客房信息。
DeleteRoomById(int roomId):根据客房ID删除客房信息。
ModifyRoom(Room room):客房对象作为参数,实现修改客房信息。

GetAllRooms():查询所有客房信息。
GetRoomById(int roomId):根据客房ID查询客房信息(客房实体对象)。
GetRoomListByRoomNumber(string roomNumber):根据客房编号查询同编号的客房集合。
GetRoomByRoomNumber(string roomNumber):根据客房编号查询客房信息。

在这里插入代码片
4、客房类型数据访问

客房类型访问类(RoomTypeService.cs)实现客房类型的数据库操作,方法与客房信息的操作类似,实现对客房类型信息的增删改查。此类中实现方法如下:

AddRoomType(RoomType roomType):客房类型对象作为参数,实现增加客房类型。
DeleteRoomType(int roomTypeId):根据客房类型ID删除客房类型信息。
ModifyRoomType(RoomType roomType):客房类型对象作为参数,实现客房类型信息修改。

GetAllRoomTypes():得到所有房间类型。
GetRoomTypeListByTypeName(string typeName):根据客房类型名称得到客房类型列表。
GetTypeNameByTypeId(int typeID):根据客房类型ID得到客房类型名字。
GetRoomTypeByTypeID(int typeId):根据客房类型ID得到客房实体对象。

5、客人管理数据访问

客人管理类(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){//获取最新一条数据的IDstring 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();//根据用户名查询对应的用户IDstring 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;}}}
6、客人类型数据访问

客人类型数据访问(GuestTypeService.cs)实现对客人类型信息的数据库操作。
此类中包含方法如下:

GetAllGuestType():查询所有客人类型。
GetGuestTypeByTypeId(int typeId):根据客人类型ID查询客人信息。
GetGuestTypeListBySql(string safeSql):根据Sql语句查询客人类型集合。

在这里插入代码片

五、实现业务逻辑层

业务逻辑层负责数据的传递,概括实现业务逻辑层的步骤为:
(1)在业务逻辑类中引用数据访问层、实体层的命名空间。
(2)实例化实体对象。
(3)调用数据访问功能。
(4)实现业务逻辑。

1、用户管理业务逻辑类

用户管理业务逻辑类(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);}}}
2、客房信息管理业务逻辑类

客房信息管理业务逻辑类(RoomManage.cs)负责在客房信息管理数据访问和客房信息界面之间进行数据访问,通过调用RoomService.cs中的方法进行业务处理。同样具有增删改查功能。

待写
3、客房类型业务逻辑类

客房类型业务逻辑类RoomTypeManage.cs负责在客房类型数据访问层和客房类型界面之间进行数据访问,通过调用RoomTypeService.cs中的方法进行业务处理。同样具有增删改查功能。

在这里插入代码片
4、客房管理业务逻辑类

客人信息管理业务逻辑类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);}}}
5、客人类型业务逻辑类

客人类型管理业务逻辑类GuestTypeManage.cs负责在客人类型数据访问和客人类型界面之间进行数据访问,通过调用GuestTypeService.cs中的方法进行业务处理。功能有查询等。

在这里插入代码片

六、实现表示层业务逻辑

1、用户登录
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;}}}
2、主界面
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{publicDialogResult 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();}}}
3、客房类型设置
4、可房信息设置
5、用户管理
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{//删除用户信息通过IDHotelUserManage.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();//选择用户IDMessageBox.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);}}}}
6、客人管理
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){//删除用户信息通过IDGuest 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个界面都是不同对象的增删改查。

所以我主要实现了“用户管理”、“客人信息管理”这两条业务线,全部功能实现贯通。其余的三条业务线“客人类型管理”、“客房信息管理”、“客房类型管理”就没有去实现了,基本是前两条业务线的复制粘贴。有感兴趣的小伙伴也可以自行去实现。

总的来说,我认为我完成了自主设计的酒店管理系统,希望以后设计软件系统把这种规范化的思想融入进去。设计有趣,实现枯燥,二者都需要脚踏实地去做。