要求

  • 编写一个宾馆入住程序
  • 要求:用图形用户界面实现。
  • 能实现宾馆人员入住、退房、修改入住信息、房间管理等功能。

分析

  1. 顾客信息肯定得保护好,所以得设置一个登录程序,可不能让其他人发现顾客的小秘密

  2. 得有图形化界面,就要用到JFrame

  3. 同样的,我们使用txt作为信息存储,所以得有文件的读写,就要用到文件的操作File,和数据流的操作

  4. 对房间的管理功能,可以提添加或者修改房间信息

  5. 交互方面,得参照正规入住手续来弄!得收集入住用户的一些基本信息:身份证号,入住人姓名、地址、电话等

本次编码我们将范围两部分进行

  1. 登录、提示方法的封装;房间和用户信息的数据结构设计;房间管理功能
  2. 用户入住和退房功能

代码整起

一:方法的封装

封装:在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点

  1. 良好的封装能够减少耦合。

  2. 类内部的结构可以自由修改。

  3. 可以对成员变量进行更精确的控制。

  4. 隐藏信息,实现细节。

之前在做记事本程序是已近有一个登录程序了,这里我就直接哪来用了,创建名为Login的java类将之前的代码进行封装

public class Login {Login(){// 创建 JFrame 实例JFrame frame = new JFrame("用户登录");// Setting the width and height of frame//设置窗口大小frame.setSize(350, 200);//设置窗口生出位置frame.setLocationRelativeTo(null);//添加关闭动作frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//创建JPanel 画布实例JPanel panel = new JPanel();// 将画布添加到JFrame中frame.add(panel);//调用方法初始化登录界面initLogin(panel,frame);// 设置界面可见frame.setVisible(true);}/*** 登录界面* @param panel* @param jFrame*/private void initLogin(JPanel panel,JFrame jFrame) {//布局panel.setLayout(null);// 创建 JLabel 标签 用户名JLabel userLabel = new JLabel("用户名:");//定义组件位置 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小userLabel.setBounds(10,20,80,25);panel.add(userLabel);//创建输入框组件 用户名文本域JTextField userText = new JTextField(20);userText.setBounds(100,20,165,25);panel.add(userText);// 创建 JLabel 标签 密码JLabel passwordLabel = new JLabel("密码:");passwordLabel.setBounds(10,50,80,25);panel.add(passwordLabel);//创建输入框组件 输入密码的文本域 这个类输入的信息会以点号代替,用于包含密码的安全性JPasswordField passwordText = new JPasswordField(20);passwordText.setBounds(100,50,165,25);panel.add(passwordText);// 创建登录按钮JButton loginButton = new JButton("登录");loginButton.setBounds(120,100,80,25);panel.add(loginButton);//为按钮添加点击事件,点击后判断用户名和密码正确性loginButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String userName = userText.getText();String password = String.valueOf(passwordText.getPassword());if ("admin".equals(userName) && "123456".equals(password)){jFrame.dispose();//接着做后续操作System.out.println("登录成功");Main main = new Main();List<HotelInfo> baseInfo = main.getBaseInfo();main.hotelFrame(baseInfo);}else{//创建Tip实例提示 用户密码不对Tip tip = new Tip("登录用户或密码不正确");}}});}
}

接着是提示消息的封装,之前我用的也是JFrame,用起来不是太友好,换一个简单点,更符合提示需求的方式,同样创建名为Tip的java类进行封装

/*** @Author 消逝* 消息提示*/
public class Tip{Tip(String msg){//弹窗信息JOptionPane.showMessageDialog(null,msg);}}

二:房间和用户数据结构设计

对房间和用户信息进行数据结构的设计,有利于我们对其信息的处理和存储,将房间或者用户的特性存储为一个公共类

/*** 房间信息* @Author 消逝*/
public class HotelInfo {private String roomNum;//房间号private String roomType;//房间类型private String floor;//房间所在楼层private String empty;//是否已有客户入住private String price;//价格private String deposit;//押金private String payment;//付款(可能会有多预存的情况)private String startTime;//入住时间private String endTime;//退房时间private String remarks;//备注private UserInfo user;//用户信息//用于存储到txt的String结构@Overridepublic String toString() {return"roomNum=" + roomNum +", roomType=" + roomType +", floor=" + floor +", empty=" + empty +", price=" + price +", deposit=" + deposit +", payment=" + payment +", startTime=" + startTime +", endTime=" + endTime +", remarks=" + remarks +", user=@" + user;}//无参构造public HotelInfo() {}//有参构造public HotelInfo(String roomNum, String roomType, String floor, String price) {this.roomNum = roomNum;this.roomType = roomType;this.floor = floor;this.price = price;this.deposit = "";this.payment = "";this.startTime = "";this.endTime = "";this.user = new UserInfo();this.empty = "空房";this.remarks = "新房";}...省去git和set方法
/*** 用户信息* @Author 消逝*/
public class UserInfo {//顾客名称(多个用【,】隔开)private String name;//顾客年龄private String age;//顾客省份证号private String idNum;//顾客地址private String address;//顾客电话private String phone;//入住人数private String numOfPeople;public UserInfo() {this.name = "";this.age = "";this.idNum = "";this.address = "";this.phone = "";this.numOfPeople = "";}public String getName() {return name;}//用于存储到txt的String结构@Overridepublic String toString() {return"name=" + name +", age=" + age +", idNum=" + idNum +", address=" + address +", phone=" + phone +", numOfPeople=" + numOfPeople;}...省去git和set方法

宾馆信息查询

/*** 获取房间信息  每次启动就将房间信息读入系统程序* @return*/List<HotelInfo> getBaseInfo(){List<HotelInfo> result = new ArrayList<>();String path = "C:\\Users\\20140\\Desktop\\hotel";//读取宾馆信息File file = new File(path);//判断文件夹是否存在,不存在就先创建if (!file.exists() || !file.isDirectory()){//mkdir() :  创建此抽象路径名指定的目录。//mkdirs() :  创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。file.mkdir();}//判断文件是否存在path += "\\info.txt";File file2 = new File(path);if (!file2.exists()){//如果不存在就尝试创建try {file2.createNewFile();} catch (IOException e) {e.printStackTrace();}}//读取文件信息try {//构造一个BufferedReader类来读取文件BufferedReader br = new BufferedReader(new FileReader(new File(path)));String s = null;//使用readLine方法,一次读一行while((s = br.readLine())!=null){//如果取到空字符串就跳过这次循环开始下一次if ("".equals(s)){continue;}HotelInfo hotelInfo = new HotelInfo();UserInfo userInfo = new UserInfo();//@分割房间信息和入住信息String[] baseInfo = s.split("@");//先解析房间信息String[] roomInfo = baseInfo[0].split(",");if (roomInfo.length > 0){//封装房间信息hotelInfo.setRoomNum(roomInfo[0].substring(roomInfo[0].indexOf("=")+1,roomInfo[0].length()));hotelInfo.setRoomType(roomInfo[1].substring(roomInfo[1].indexOf("=")+1,roomInfo[1].length()));hotelInfo.setFloor(roomInfo[2].substring(roomInfo[2].indexOf("=")+1,roomInfo[2].length()));hotelInfo.setEmpty(roomInfo[3].substring(roomInfo[3].indexOf("=")+1,roomInfo[3].length()));hotelInfo.setPrice(roomInfo[4].substring(roomInfo[4].indexOf("=")+1,roomInfo[4].length()));hotelInfo.setDeposit(roomInfo[5].substring(roomInfo[5].indexOf("=")+1,roomInfo[5].length()));hotelInfo.setPayment(roomInfo[6].substring(roomInfo[6].indexOf("=")+1,roomInfo[6].length()));hotelInfo.setStartTime(roomInfo[7].substring(roomInfo[7].indexOf("=")+1,roomInfo[7].length()));hotelInfo.setEndTime(roomInfo[8].substring(roomInfo[8].indexOf("=")+1,roomInfo[8].length()));hotelInfo.setRemarks(roomInfo[9].substring(roomInfo[9].indexOf("=")+1,roomInfo[9].length()));}//再解析入住信息if (baseInfo.length > 1){String[] hotelUserInfo = baseInfo[1].split(",");//封装房间入住信息userInfo.setName(hotelUserInfo[0].substring(hotelUserInfo[0].indexOf("=")+1,hotelUserInfo[0].length()));userInfo.setAge(hotelUserInfo[1].substring(hotelUserInfo[1].indexOf("=")+1,hotelUserInfo[1].length()));userInfo.setIdNum(hotelUserInfo[2].substring(hotelUserInfo[2].indexOf("=")+1,hotelUserInfo[2].length()));userInfo.setAddress(hotelUserInfo[3].substring(hotelUserInfo[3].indexOf("=")+1,hotelUserInfo[3].length()));userInfo.setPhone(hotelUserInfo[4].substring(hotelUserInfo[4].indexOf("=")+1,hotelUserInfo[4].length()));userInfo.setNumOfPeople(hotelUserInfo[5].substring(hotelUserInfo[5].indexOf("=")+1,hotelUserInfo[5].length()));hotelInfo.setUser(userInfo);}//将房间信息放入Listresult.add(hotelInfo);}br.close();return result;}catch (Exception e1){System.out.println("文件读取错误");return null;}}


不要停不要停!接着搞界面

/*** 入住系统主界面* @param baseInfo*/void hotelFrame(List<HotelInfo> baseInfo){// 创建 JFrame 实例listFrame = new JFrame("欢迎使用消逝的宾馆入住程序");//设置窗口大小listFrame.setSize(600,500);//设置窗口生出位置listFrame.setLocationRelativeTo(null);//添加关闭动作listFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//创建JPanel 画布实例JPanel panel = new JPanel();//创建菜单条JMenuBar menuBar = new JMenuBar();listFrame.setJMenuBar(menuBar);//创建房间菜单对应功能JMenu menuRoom = new JMenu("房间操作");addRoom = new JMenuItem("添加", KeyEvent.VK_F);//添加点击监听addRoom.addActionListener(this);//在房间菜单添加相应操作menuRoom.add(addRoom);//将菜单添加到菜单条里menuBar.add(menuRoom);//初始化房间显示for (HotelInfo info : baseInfo) {JButton roomButton = new JButton(info.getRoomNum()+info.getRoomType());Dimension dimension = new Dimension(120,25);roomButton.setPreferredSize(dimension);if ("空房".equals(info.getEmpty())){//空房的话用绿色表示roomButton.setBackground(Color.green);}else {//有人的话用红色色表示roomButton.setBackground(Color.red);}panel.add(roomButton);listFrame.add(panel);roomButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {hotelInfoForm(info);}});}// 设置界面可见listFrame.setVisible(true);}//添加房间点击监听@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource().equals(addRoom)){saveFrom();}}

效果展示

提示信息

主界面

添加房间

 /*** 添加房间*/private void saveFrom(){// 创建 JFrame 实例JFrame frame = new JFrame("房间信息");// Setting the width and height of frame//设置窗口大小frame.setSize(300,180);//创建JPanel 画布实例JPanel panel = new JPanel();//设置窗口生出位置frame.setLocationRelativeTo(null);//禁止改变窗口大小frame.setResizable(false);//添加用户信息操作框JLabel roomNum = new JLabel("房间号码:");roomNum.setBounds(50,50,80,25);panel.add(roomNum);//创建输入框组件文本域JTextField roomNumText = new JTextField(20);roomNumText.setBounds(140,50,165,25);panel.add(roomNumText);//添加用户信息操作框JLabel roomType = new JLabel("房间类型:");roomType.setBounds(50,75,80,25);panel.add(roomType);//创建输入框组件文本域JTextField roomTypeText = new JTextField(20);roomTypeText.setBounds(140,75,165,25);panel.add(roomTypeText);//添加用户信息操作框JLabel floor= new JLabel("所在楼层:");floor.setBounds(50,100,80,25);panel.add(floor);//创建输入框组件文本域JTextField floorText = new JTextField(20);floorText.setBounds(140,100,165,25);panel.add(floorText);//添加用户信息操作框JLabel price = new JLabel("房间价格:");price.setBounds(50,125,80,25);panel.add(price);//创建输入框组件文本域JTextField priceText = new JTextField(20);priceText.setBounds(140,125,165,25);panel.add(priceText);JButton save = new JButton("添加");save.setBounds(150,150,100,50);panel.add(save);frame.add(panel);// 设置界面可见frame.setVisible(true);save.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//保存//先校验基础参数是否填写String roomNum = roomNumText.getText();String roomType = roomTypeText.getText();String floor = floorText.getText();String price = priceText.getText();if ("".equals(roomNum) || "".equals(roomType) ||"".equals(floor) || "".equals(price)){new Tip("请填写正确房间信息");}//创建房间信息HotelInfo info = new HotelInfo(roomNum,roomType,floor,price);//获取原有的房间信息List<HotelInfo> baseInfo = getBaseInfo();baseInfo.add(info);saveHotel(baseInfo);listFrame.dispose();frame.dispose();hotelFrame(baseInfo);}});}
 /*** 存储房间信息* @param hotelInfo*/private void saveHotel(List<HotelInfo> hotelInfo){File file = new File("C:\\Users\\20140\\Desktop\\hotel\\info.txt");try {OutputStream os = new FileOutputStream(file);PrintWriter pw=new PrintWriter(os);for (HotelInfo info : hotelInfo){pw.println(info.toString()+"\n");}pw.close();new Tip("保存成功");}catch (Exception e){System.out.println("写入错误");new Tip("保存失败");}}


点击房间展示房间信息以及入住信息

/*** 客房信息* @param info*/private void hotelInfoForm(HotelInfo info){// 创建 JFrame 实例JFrame frame = new JFrame("房间信息");//设置窗口大小frame.setSize(400,480);//创建JPanel 画布实例JPanel panel = new JPanel();//设置窗口生出位置frame.setLocationRelativeTo(null);//禁止改变窗口大小frame.setResizable(false);/*** 创建内部类调用画笔工具*/class MyPant extends JPanel{@Overridepublic void paint(Graphics g) {g.drawString("房间号:"+info.getRoomNum(),50,25);g.drawString("房间类型:"+info.getRoomType(),180,25);g.drawString("所在楼层:"+info.getFloor(),50,55);g.drawString("是否空房:"+info.getEmpty(),180,55);g.drawString("价格/天:"+info.getPrice(),50,80);g.drawString("收款:"+info.getPayment(),180,80);g.drawString("入住时间:"+info.getStartTime(),50,105);g.drawString("退房时间:"+info.getEndTime(),50,130);g.drawString("天数:2",50,150);g.drawString("押金:"+info.getDeposit(),180,150);g.setColor(Color.red);g.drawString(">>>>>>>>>>入住信息<<<<<<<<<<",100,165);}}MyPant g = new MyPant();//获取用户数据UserInfo userInfo = info.getUser();//添加用户信息操作框JLabel userName = new JLabel("客户名称:");userName.setBounds(50,175,80,25);frame.add(userName);//创建输入框组件文本域JTextField userNameText = new JTextField(20);userNameText.setBounds(140,175,165,25);if (userInfo.getName() != null){userNameText.setText(userInfo.getName());}frame.add(userNameText);//身份证号JLabel userIdCard = new JLabel("省份证号:");userIdCard.setBounds(50,200,80,25);frame.add(userIdCard);JTextField userIdCardText = new JTextField(20);userIdCardText.setBounds(140,200,165,25);if (userInfo.getIdNum() != null){userIdCardText.setText(userInfo.getIdNum());}frame.add(userIdCardText);//地址JLabel userAddress = new JLabel("用户地址:");userAddress.setBounds(50,225,80,25);frame.add(userAddress);JTextField userAddressText = new JTextField(20);userAddressText.setBounds(140,225,165,25);if (userInfo.getAddress() != null){userAddressText.setText(userInfo.getAddress());}frame.add(userAddressText);//电话JLabel userPhone = new JLabel("用户电话:");userPhone.setBounds(50,250,80,25);frame.add(userPhone);JTextField userPhoneText = new JTextField(20);userPhoneText.setBounds(140,250,165,25);if (userInfo.getPhone() != null){userPhoneText.setText(userInfo.getPhone());}frame.add(userPhoneText);//备注JLabel content = new JLabel("备注:");content.setBounds(50,275,80,25);frame.add(content);//创建输入框组件 用户名文本域// 创建一个 20 行 20 列的文本区域JTextArea contentText = new JTextArea(20,20);contentText.setBounds(50,300,300,100);// 设置自动换行contentText.setLineWrap(true);if (info.getDeposit() != null){contentText.setText(info.getDeposit());}frame.add(contentText);JButton insert = new JButton("入住");insert.setBounds(50,320,100,50);panel.add(insert);JButton del = new JButton("退房");del.setBounds(180,320,100,50);panel.add(del);//将房间信息布局到中部frame.add(g,BorderLayout.CENTER);//将按钮布局到底部frame.add(panel,BorderLayout.SOUTH);// 设置界面可见frame.setVisible(true);}

已入住效果

未入住效果

至此第一部分的代码就好了!!!有错欢迎指正!!!
入住和退房以及其他代码优化会尽快完善!!!

Java基础:宾馆管理系统(一)相关推荐

  1. 基于Java基础的图书管理系统

    文章目录 前言 一.前期准备 二.需求分析 三.核心代码开发 1. model 层 1.1. Book 类 1.2. User 类 1.3. NormalUser 类 1.4. Admin 类 2. ...

  2. java基础入门-04-【集合学生管理系统】

    Java基础入门-04-[集合&学生管理系统] 11.集合&学生管理系统 11.1.ArrayList 集合和数组的优势对比: 11.1.1 ArrayList类概述 11.1.2 A ...

  3. 尚硅谷 java基础第二个项目之客户关系管理系统

    尚硅谷 java基础第二个项目之客户关系管理系统. 做了一些完善,增加性别,电话,邮箱有效性验证.其中电话和邮箱验证直接"饮用"了网友的果汁. 在此感谢各位原著大佬们的分享. 具体 ...

  4. Java项目:酒店宾馆管理系统(java+SpringBoot+html+layui+jQuery+maven+mysql)

    源码获取:博客首页 "资源" 里下载! 功能介绍 springboot酒店宾馆管理系统.该系统为后管系统,无前台.主要分三种角色:管理者/工作人员/前台人员. 主要功能有: 客房: ...

  5. Java项目:springboot酒店宾馆管理系统

    作者主页:夜未央5788 简介:Java领域优质创作者.Java项目.学习资料.技术互助 文末获取源码 功能介绍 springboot酒店宾馆管理系统.该系统为后管系统,无前台.主要分三种角色:管理者 ...

  6. 宾馆客户管理系统数据库java_数据库课程设计+宾馆管理系统+Java+Sql

    [实例简介] 数据库课程设计+宾馆管理系统+Java+Sql [实例截图] [核心代码] elz76n └── 数据库课程设计 ├── sushe │   ├── build │   │   ├── ...

  7. 数据库原理与实践课设(宾馆管理系统),java+jdbc+sqlserver2017

    第一次用java写这么多东西,发现开发方面确实比C++高很多,哈哈哈当然要记录下来 ~ ps:课设中涉及的所有数据都是存在数据库中的~~~ 1.首先当然是连接数据库啦,我这了采用的编程语言是java, ...

  8. Java 基础-课程设计-话费充值信息管理系统

    本次项目是在学校的Java基础课程结课时做的课程设计,涉及知识比较基础,适合Java刚入门的小白进行学习. 本项目提供答辩PPT,课程设计论文,仅供参考,拒绝抄袭 项目简介 本项目是一个话费充值信息管 ...

  9. 11 Java基础整合---从配置环境变量到完成学生管理系统

    文章目录 1 java基础知识梳理 2 开发环境搭建 2.1 安装JDK 2.2 配置环境变量 3 java基础语法 案例1 --- HelloWord案例 3.1 标识符和关键字 3.2 常量和变量 ...

  10. Java基础——利用DMO4J编写一个商品管理系统

    题目:这里有一份XML文件用于储存商品信息,编写一个商品管理系统,可以对XML文件进行增删查改的操作. <?xml version="1.0" encoding=" ...

最新文章

  1. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
  2. sql 忽略大小写_Flink使用Calcite解析Sql做维表关联(一)
  3. 实现困境突破:中小企业家的三项修炼
  4. Spark1.0 安装
  5. 最简单的http服务器实现
  6. 面向对象程序设计的术语
  7. linux 批量替换文件内容及查找某目录下所有包含某字符串的文件(批量修改文件内容)
  8. angularjs1.x版本,父子组件之间的双向绑定
  9. FreeMarker语言概述(1)
  10. Rust:String::from()、 into()、to_string()哪个效率高?
  11. vlfeat各种版本下载链接:
  12. ubuntu svn命令
  13. 矩阵的谱分解 (详细推导步骤~~~特征值分解特征向量
  14. android+cordova+windows打包vue一条龙服务
  15. 【Mathematica】 曲面的绘制
  16. 中美大学生阅读书单大公开,哈佛和北大差异这么大!
  17. 【Windows】Windows软件商店无法正常安装软件
  18. 墨尘 - UE4 入门教程笔记 —— 二
  19. oracle上机题库_Oracle笔试题库附参考答案
  20. JS代码:身份证号EMAIL检验

热门文章

  1. 数组14:分离整数各位
  2. 利用github和godaddy搭建使用二级域名的个人主页
  3. 三维数学基础2:矩阵、齐次坐标
  4. access中的IIf函数
  5. 问:未来5年的IT互联网行业,就业形势会是什么样的?
  6. 商务服务-建站设计思路搜索引擎SEO模型
  7. 如何成功实施结对编程
  8. Barbalat引理与类李雅普诺夫引理,及它们在自适应控制系统设计的应用
  9. AddressBook 地址簿 (电话簿) 访问与修改
  10. 《离散数学导学》精炼:第4,5章(集合论,布尔代数)