【C#项目】酒店管理系统-WinForm+MySQL


前言

结合.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;//用户ID
        private static string userName = String.Empty;//用户名
        private static string password = String.Empty;//用户密码

        /// <summary>
        /// 用户ID
        /// </summary>
        public int UserID
        {
    
    
            get {
    
     return userID; }
            set {
    
     userID = value; }
        }

        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName
        {
    
    
            get {
    
     return userName; }
            set {
    
     userName = value; }
        }

        /// <summary>
        /// 用户密码
        /// </summary>
        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
    {
    
    
        /// <summary>
        /// 客人ID
        /// </summary>
        private static int guestId;//客人Id,int类型
        public int GuestID
        {
    
    
            get {
    
     return guestId; }
            set {
    
     guestId = value; }
        }

        /// <summary>
        /// 客人姓名
        /// </summary>
        private static string guestName;//客人姓名
        public string GuestName
        {
    
    
            get {
    
     return guestName; }
            set {
    
     guestName = value; }
        }

        /// <summary>
        /// 客人类别
        /// </summary>
        private static int guestTypeId;//客人类别
        public int GuestTypeID
        {
    
    
            get {
    
     return guestTypeId; }
            set {
    
     guestTypeId = value; }
        }

        /// <summary>
        /// 客人性别
        /// </summary>
        private static string guestSex;//客人性别
        public string GuestSex
        {
    
    
            get {
    
     return guestSex; }
            set {
    
     guestSex = value; }
        }

        /// <summary>
        /// 电话
        /// </summary>
        private static string guestMobile;//电话
        public string GuestMobile
        {
    
    
            get {
    
     return guestMobile; }
            set {
    
     guestMobile = value; }
        }

        /// <summary>
        /// 房间号
        /// </summary>
        private static int guestRoomId;//房间号,int类型
        public int GuestRoomID
        {
    
    
            get {
    
     return guestRoomId; }
            set {
    
     guestRoomId = value; }
        }

        /// <summary>
        /// 入住时间
        /// </summary>
        private static DateTime guestArriveTime;//入住时间,时间类型
        public DateTime GuestArriveTime
        {
    
    
            get {
    
     return guestArriveTime; }
            set {
    
     guestArriveTime = value; }
        }

        /// <summary>
        /// 离开时间
        /// </summary>
        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
    {
    
    
        /// <summary>
        /// 客人类型ID
        /// </summary>
        private static int typeId;//客人类型ID
        public int TypeID
        {
    
    
            get {
    
     return typeId; }
            set {
    
     typeId = value; }
        }

        /// <summary>
        /// 类型名称
        /// </summary>
        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;//房间号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()
        {
    
     }

        /// <summary>
        /// 房间号ID
        /// </summary>
        public int RoomID
        {
    
    
            get {
    
     return roomId; }
            set {
    
     roomId = value; }
        }

        /// <summary>
        /// 房间号
        /// </summary>
        public string Number
        {
    
    
            get {
    
     return number; }
            set {
    
     number = value; }
        }

        /// <summary>
        /// 房间类型ID
        /// </summary>
        public int TypeID
        {
    
    
            get {
    
     return typeId; }
            set {
    
     typeId = value; }
        }

        /// <summary>
        /// 床位数
        /// </summary>
        public int BedNumber
        {
    
    
            get {
    
     return bedNumber; }
            set {
    
     bedNumber = value; }
        }

        /// <summary>
        /// 房间描述
        /// </summary>
        public string Description
        {
    
    
            get {
    
     return description; }
            set {
    
     description = value; }
        }

        /// <summary>
        /// 房间状态
        /// </summary>
        public string State
        {
    
    
            get {
    
     return state; }
            set {
    
     state = value; }
        }

        /// <summary>
        /// 入住客人数
        /// </summary>
        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;//房间类型ID
        protected static string typeName;//房间类型名
        protected static string typePrice;//房间类型价格
        protected static string addBedPrice;//添加床位的价格
        protected static string isAddBed;//是否添加床位
        protected static string remark;//备注

        public RoomType()
        {
    
     }

        /// <summary>
        /// 房间类型ID
        /// </summary>
        public int TypeID
        {
    
    
            get {
    
     return typeId; }
            set {
    
     typeId = value; }
        }

        /// <summary>
        /// 房间类型名
        /// </summary>
        public string TypeName
        {
    
    
            get {
    
     return typeName; }
            set {
    
     typeName = value; }
        }

        /// <summary>
        /// 房间类型价格
        /// </summary>
        public string TypePrice
        {
    
    
            get {
    
     return typePrice; }
            set {
    
     typePrice = value; }
        }

        /// <summary>
        /// 添加床位价格
        /// </summary>
        public string AddBedPrice
        {
    
    
            get {
    
     return addBedPrice; }
            set {
    
     addBedPrice = value; }
        }

        /// <summary>
        /// 是否添加床位
        /// </summary>
        public string IsAddBed
        {
    
    
            get {
    
     return isAddBed; }
            set {
    
     isAddBed = value; }
        }

        /// <summary>
        /// 备注
        /// </summary>
        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;
    }

    /// <summary>
    /// 执行查询语句,用DataTable返回结果,调用前要传入DataTable的实例化对象作为参数
    /// </summary>
    /// <param name="strQuery">查询命令</param>
    /// <param name="dt">返回数据表</param>
    /// <returns></returns>
    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;
    }

    /// <summary>
    /// 执行带参数的查询语句,使用前传入参数、DataTable实例化对象
    /// </summary>
    /// <param name="strQuery">查询语句</param>
    /// <param name="param"></param>
    /// <param name="dt"></param>
    /// <returns></returns>
    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;

        
        /// <summary>
        /// 添加用户
        /// </summary>
        /// <param name="hotelUser"></param>
        /// <returns></returns>
        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);//返回查询对象
        }

        /// <summary>
        /// 删除用户
        /// </summary>
        /// <param name="hotelUser"></param>
        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("要删除的用户名为空,不能删除该用户信息");
            }
        }

        /// <summary>
        /// 通过用户ID删除用户
        /// </summary>
        /// <param name="userId"></param>
        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() + "的用户不存在,不能删除");
            }
        }

        /// <summary>
        /// 修改用户信息
        /// </summary>
        /// <param name="hotelUser"></param>
        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;
        }

        /// <summary>
        /// 获取所有用户信息
        /// </summary>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 通过用户ID获取用户信息
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 通过用户名获取用户信息
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        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;
        }
    }
}


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();//获取全部用户信息

        /// <summary>
        /// 添加用户
        /// </summary>
        /// <param name="guest"></param>
        /// <returns></returns>
        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);//返回查询对象
        }

        /// <summary>
        /// 删除客人
        /// </summary>
        /// <param name="guest"></param>
        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("要删除的客人名为空,不能删除该客人信息");
            }
        }

        /// <summary>
        /// 通过客人ID删除客人
        /// </summary>
        /// <param name="userId"></param>
        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() + "的客人不存在,不能删除");
            }
        }

        /// <summary>
        /// 修改客人信息
        /// </summary>
        /// <param name="guest"></param>
        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;
        }

        /// <summary>
        /// 获取所有客人信息
        /// </summary>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 通过客人ID获取客人信息
        /// </summary>
        /// <param name="guestId"></param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 通过客人名获取客人信息
        /// </summary>
        /// <param name="guestName"></param>
        /// <returns></returns>
        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();
        }

        /// <summary>
        /// 验证合法性
        /// </summary>
        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
    {
    
    
        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);
            }
        }

        /// <summary>
        /// 查询子窗体是否存在
        /// </summary>
        /// <param name="childfrmname"></param>
        /// <returns></returns>
        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
            {
    
    
                //删除用户信息  通过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);
            }
        }
    }
}

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)
            {
    
    
                //删除用户信息  通过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个界面都是不同对象的增删改查。

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

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

猜你喜欢

转载自blog.csdn.net/qq_38628970/article/details/129156225