酒店管理系统详解.

项目要求:


为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能。
1、该系统的用户是:酒店前台。
2、酒店使用一个二维数组来模拟。"Room[] [] rooms;"
3、酒店中的每一个房间应该是一个java对象:Room
4、每一个房间Room应该有:房间编号、房间类型、房间是否空闲.
5、系统应该对外提供的功能:
可以预定房间:用户输入房间编号,订房。
可以退房:用户输入房间编号,退房。
可以查看所有房间的状态:用户输入某个指令应该可以查看所有房间状态。

大概思路:

 酒店管理系统
大概思路:
第一步: 先把房间类创建出来, 包括房间的房间号,房间类型,房间状态等属性

第二步: 开始建酒店:抽象想以下,酒店里面应该有几楼几号房间,Room[3][10] // 三层楼,每层10个房间
所以用二维数组表示楼层和房间号,把创建的房间[通过for循环]全部存放到数组当中

第三步:给前台几个调用方法,比如前台能调用酒店类当中的房间信息列表来进行查看,
前台用来操作开房、退房等,(开房的时候前台可以先查看房间列表信息 然后传房间号来进行操作开、退房)

基本代码如下:[还可以进行优化,以下代码以基础为准]

【以下代码有bug,当定完房后房间状态为false后 还可以对其房间进行订房,因此需要优化】

房间类:

package com.bjpowernode.javase.array.homework;

import java.util.Objects;
/*
    酒店的房间
 */
public class Room  extends Object{ // 默认继承父类
    /*
    房间编号:
    1楼: 101 102 103 104 105 106.....
    2楼: 201 202 203 204 205 206.....
    3楼: 301 302 303 304 305 306.....

     */
    private int no;
    /*
    房间类型:标准间    大床房    总统套房
     */
    private String type;
    /*
    房间状态
    true 表示空闲,房间允许预定
    false 表示占用,房间不允许预定
     */
    private boolean status;

    // 无参构造
    public Room() {
    }
    // 有参构造
    public Room(int no, String type, boolean status) {
        this.no = no;
        this.type = type;
        this.status = status;
    }

    // setter and getter方法

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean getStatus (){
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    // 重写toString方法
    // 目的:是将java对象转换成字符串形式 // toString方法是将传过来的参数自动转换成字符串类型
    public String toString() {
        // return "[101,单人间,空闲]";  // 写死了.

        //动态[把一个变量塞到一个字符串当中] 口诀:加一个双引号,双引号中间加两个加号,两个加号中间加变量名
        return "[房间号:"+no+","+type+","+(status?"空闲":"占用")+"]"; // 三元运算符
    }
    // 重写equals方法
    // 你认为两个房间的编号相同,就表示同一个房间,那么你写代码比较两个房间编号就行

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Room room = (Room) o;
        // 当前房间对象编号等于传过来的对象的房间编号 认为同一个房间
        return this.getNo()==room.getNo();
    }
}

酒店类:

package com.bjpowernode.javase.array.homework;
/*
酒店对象
酒店中有二维数组,二维数组模拟大厦
 */
public class Hotel {
    // 二维数组,模拟大厦所有的房间
    private Room[][] rooms;

    // 一共有多少层,每层房间是什么,每个房间的编号是什么
    // 按照下面的方式创建每层当中的房间
    /*房间编号:
            1楼: 101 102 103 104 105 106.....    标准间
            2楼: 201 202 203 204 205 206.....    大床房
            3楼: 301 302 303 304 305 306.....    总统套房
            */

    // 盖楼通过构造方法盖楼
    public Hotel() {
        // 动态初始化
        rooms = new Room[3][10]; // 3表示楼层 10表示楼层中的房间
        // 此时创建出来的数组中的元素(房间)还默认为null,还未将房间添加进去 所以此时房间还未创建

        // 创建30个房间Room对象,放到数组当中 怎么做?
        /*
        如果一个一个创建那么太多了 效率太低
        rooms[0][0] =new Room(???); // toString方法返回的数据存入数组当中
         */
        for (int i = 0; i < rooms.length; i++) {   // i为下标:0 1 2   i+1是楼层:1 2 3
            for (int j = 0; j < rooms[i].length; j++) {    // j为楼层当中的房间数
                // rooms[i][j] =new Room(109,"房间类型","房间状态");
                /*
                注意: rooms[i][j] =new Room(房间编号,"房间类型","房间状态"); 这样写的话
                    把房间编号,房间类型给写死了, (刚盖的大厦 房间状态统一规定为空闲true)
                 */

                // 写活:
                // 根据要求,如果楼层为1楼的时候 标准间、2楼 大床房、3楼 总统套房
                if (i == 0) {
                    // 把房间对象存放入数组当中
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "标准间", true); // 房间号:(0+1)*100+(0+1) :101 依次往后类推
                } else if (i == 1) {
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "大床房", true);
                } else if (i == 2) {
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "总统套房", true);
                }

            }
        }
    }

    // 在酒店对象上提供一个打印房间列表信息的方法
    public void printRoom() {
        // 对数组进行遍历
        for (int i = 0; i < rooms.length; i++) {
            for (int j = 0; j < rooms[i].length; j++) {
                // 打印出数组中所有一维数组当中的元素
                System.out.print(rooms[i][j] + " ");
            }
            System.out.println();

        }
    }

    // 提供一个订房的方法
    // 订房的条件:就是把前台输入进来的编号对应到数组里面的房间编号,把状态status修改成占用即可
    public void order(int roomNo) {
        /*
        // 假设前台输入的编号为306,那么我们就应该把数组里面的306房间状态修改成false占用
        // 拿到306房间
        Room rooms1 = rooms[2][5];
        // 将306房间状态修改成占用
        rooms1.setStatus(false);    // 那么这样写的话就把房间号给写死了
         */
        // 改进
        // 先判断用户输入进来的房间号roomNo是否满足数组里面的数据
        if (roomNo >= 101 && roomNo <= 310) {
            // 如果前台输入的房间号是在数组里面的房间号 那么就开始订房(状态改成false)
            // 拿到房间对象 [roomNo/100-1] 假如306房间 /100 =3 数组里面下标2代表三楼 所以减1
            Room room = rooms[roomNo/100-1][roomNo%100-1];
            //把房间的状态改成false
            room.setStatus(false);
            System.out.println("房间:"+roomNo+"订房成功");

        }
        else {
            System.out.println("房间:"+roomNo+"房间不存在");
        }
        }

        // 退房方法
        // 同理退房当输入一个房间号后和数组里面的房间号进行对比 然后把status状态改成true空闲即可
    public void exit(int roomNo) {

        if (roomNo>=101 && roomNo<=310){
            Room room =rooms[roomNo/100-1][roomNo%100-1];
            room.setStatus(true);
            System.out.println("房间:"+roomNo+"退房成功");
        }
        else {
            System.out.println("输入的"+roomNo+"房间不存在");
        }
    }
    }

代码测试: 【前台】

public class HotelMgtSystem {
    public static void main(String[] args) {

        // 创建酒店对象
        Hotel hotel =new Hotel();

        // 打印房间状态
        hotel.printRoom();
        // 订房
        hotel.order(301);
        hotel.printRoom();
        // 退房
        hotel.exit(301);
        hotel.printRoom();


    }
}

输出结果:

代码优化:

房间类

package com.bjpowernode.javase.array.homework;

import java.util.Objects;
/*
    酒店的房间
 */
public class Room  extends Object{ // 默认继承父类
    /*
    房间编号:
    1楼: 101 102 103 104 105 106.....
    2楼: 201 202 203 204 205 206.....
    3楼: 301 302 303 304 305 306.....

     */
    private int no;
    /*
    房间类型:标准间    大床房    总统套房
     */
    private String type;
    /*
    房间状态
    true 表示空闲,房间允许预定
    false 表示占用,房间不允许预定
     */
    private boolean status;

    // 无参构造
    public Room() {
    }
    // 有参构造
    public Room(int no, String type, boolean status) {
        this.no = no;
        this.type = type;
        this.status = status;
    }

    // setter and getter方法

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean getStatus (){
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    // 重写toString方法
    // 目的:是将java对象转换成字符串形式
    public String toString() {
        // return "[101,单人间,空闲]";  // 写死了.

        //动态[把一个变量塞到一个字符串当中] 口诀:加一个双引号,双引号中间加两个加号,两个加号中间加变量名
        return "[房间号:"+no+","+type+","+(status?"空闲":"占用")+"]"; // 三元运算符
    }
    // 重写equals方法
    // 你认为两个房间的编号相同,就表示同一个房间,那么你写代码比较两个房间编号就行

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Room room = (Room) o;
        // 当前房间对象编号等于传过来的对象的房间编号 认为同一个房间
        return this.getNo()==room.getNo();
    }


}


酒店类:

package com.bjpowernode.javase.array.homework;
/*
酒店对象
酒店中有二维数组,二维数组模拟大厦
 */
public class Hotel {
    // 二维数组,模拟大厦所有的房间
    private Room[][] rooms;



    // 盖楼通过构造方法盖楼
    public Hotel() {
        // 动态初始化
        rooms = new Room[3][10];

        for (int i = 0; i < rooms.length; i++) {
            for (int j = 0; j < rooms[i].length; j++) {

                if (i == 0) {
                    // 把房间对象存放入数组当中
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "标准间", true);
                } else if (i == 1) {
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "大床房", true);
                } else if (i == 2) {
                    rooms[i][j] = new Room((i + 1) * 100 + (j + 1), "总统套房", true);
                }

            }
        }
    }

    // 在酒店对象上提供一个打印房间列表信息的方法
    public void printRoom() {
        // 对数组进行遍历
        for (int i = 0; i < rooms.length; i++) {
            for (int j = 0; j < rooms[i].length; j++) {
                // 打印出数组中所有一维数组当中的元素
                System.out.print(rooms[i][j] + " ");
            }
            System.out.println();

        }
    }

    // 提供一个订房的方法
    // 对订房进行优化判断
    public void order(int roomNo) {

        if (roomNo >= 101 && roomNo <= 310) {

            // 拿到数组当中的房间号和前台传进来的房间号进行判断以下此房间当中的状态是否为true
            // 空闲让其订房,占用提示房间已被占用
            Room rooms1 =rooms[roomNo/100-1][roomNo%100-1];
            boolean b =rooms1.getStatus();
            // 拿到房间当前的状态
            if (b==true){   // 空闲
                // 将房间的状态改成false 订房成功
                rooms1.setStatus(false);
                System.out.println("房间"+roomNo+"订房成功");
            }
            else{
                System.out.println("房间"+roomNo+"当前已有客户占用,订房失败");
            }
        }
        else {
            System.out.println("房间:"+roomNo+"房间不存在,请重新输入房间号");
        }
        }

        // 退房方法
        // 同理退房当输入一个房间号后和数组里面的房间号进行对比 然后把status状态改成true空闲即可
        // 退房同样可以进行和订房一样的优化
    public void exit(int roomNo) {

        if (roomNo>=101 && roomNo<=310){
            Room room =rooms[roomNo/100-1][roomNo%100-1];
            room.setStatus(true);
            System.out.println("房间:"+roomNo+"退房成功");
        }
        else {
            System.out.println("输入的"+roomNo+"房间不存在");
        }
    }
    }

代码测试:

public class HotelMgtSystem {
    public static void main(String[] args) {
        Hotel hotel =new Hotel();
        // 先判断数组里面是否有2个元素,有的话再继续判断,没有就说明错误 直接返回
        if (args.length!=2){
            System.out.println("请输入规范的前台账户信息!");
            return;
        }
        // 当执行到这里就说明前台输入了用户名和密码
        // 拿到用户名和密码
        String username =args[0];
        String password =args[1];
        if ("junker".equals(username)&&"50".equals(password)){
            // 登录成功 进入酒店管理系统
            System.out.println("========= 【欢迎使用酒店管理系统】V1.0 =========");

            while (true){
            System.out.println("[1]表示查看酒店房间列表信息。 [2]表示酒店订房。  [3]表示酒店退房。 [0]表示退出酒店管理系统");
                Scanner scanner = new Scanner(System.in);
                System.out.print("请输入功能编号:");
                int a = scanner.nextInt();
                // 判断输入的功能编号是否规范
                if (0 <= a && a <= 3) {
                    // 判断以下 如果输入的为1 则查看酒店房间列表信息
                    if (a == 1) {
                        hotel.printRoom();
                    } else if (a == 2) {    // 订房
                        hotel.order(301);
                        hotel.order(301);
                    } else if (a == 3) {    // 退房
                        hotel.exit(301);
                    } else if (a == 0) {    // 退出系统
                        System.out.println("欢迎再次光临");
                        break;
                    }
                } else {
                    System.out.println("请输入规范的编号数字");
                }
            }
        }
        else {
            System.out.println("用户名和密码不匹配,登录失败");
        }
    }
}

输出结果:

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
登陆系统:用户通过用户编号和密码登录系统,调用表tb_Admin,同时在每次登陆的时候生成一条日志记录,添加记录到tb_LoginLog,同时显示主界面,根据登陆的用户的身份角色不同,在主界面显示的操作控件会有微小差异 主界面设计与后台:界面的控件布局,美化设计,主界面的后台控制 包含功能菜单: 前台:(可返回登录时的主页面,主页面显示所有房间的状态。下级子菜单:在住顾客,今日在住客人,今日离店客人,今日到+今日离,今日明细表(当日盈利),房态分析表,在住查账) 订单:(单击预定打开所有订单查询页面,子菜单:预定,转入住,入住,取消预定,换房,退房,购买(购买商品的时候需要提供R_RoomId(房间编号,通过这个就可以确定是什么人),C_ConsumeId(商品编号)这些信息。))) 报表:(子菜单:盈利报表,登录日志,住客分析,发票表单) 提醒: 宾客在登记订单的时候会填写预住多少天,时间在到之前(次日11时给服务员发出某房间将要到期的提醒)会提示时间要到了,以提醒宾客提前办理退房手续,弹出消息提示框提示。如有超过预定时间的,将会添加一条违约记录到超时表中 商品管理: 添加商品:新进商品需要登记信息,添加到表tb_ConsumeInfo,需要连接表tb_ConsumeType 更改商品信息 删除商品 设置(管理员权限) 备份设置 计费设置 用户设置 商品设置 房间设置 锁屏 报表:(图表与列表) 盈利报表(按天,按周,按月,按季度,按年,指定日期)(按客房汇总,按商品汇总) 登录日志(查询指定日期的登录日志) 住客分析(分类汇总查询,查询当日某类型房的住客率,楼层住客信息查询) 电子发票(结账时候对个人产生的消费记录)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值