大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT)、PYTHON、PHP、C#、安卓等多项技术。
今天将为大家分析一个小型酒店管理系统(当前酒店管理系统已经得到了充足的发展和完善,一些大的酒店购买了功能强大、数据量处理快速、客户行为研究的软件,借此来提升酒店的核心竞争力。但是对于一些中小规模的酒店而言,昂贵的系统花费、专人的维护是不现实的,也是非常不灵活的。一款简单、灵活、经济适用的中小型酒店管理系统的开发非常具有市场前景。 本文针对上面提到的问题,基于JavaEE平台设计并实现了一套基于B/S模式的中小型酒店管理系统,其主要研究的内容如下: 1.本文基于B/S的应用实现模式,在MVC架构的基础上设计并实现了一套中小型酒店管理系统,包括了客户订房管理、接待管理、收银管理、客房管理和系统管理五大功能模块,重点解决了人工管理酒店方式的缺点、客房信息的及时反馈问题以及系统访问安全性等难题。 2.本文的开发过程遵守软件工程的理论,采用了瀑布开发的模型,详细地介绍了中小型酒店管理系统的开发背景、研究现状、系统业务需求、功能需求、非功能需求、系统架构设计、数据库设计、安全设计,给出了核心功能模块的界面实现和代码实现过程,并对系统做了较为详细的功能测试和性能测试,保证了系统的正确性。 通过在酒店的模拟运行,本系统能够实现简化酒店原有工作流程、提高人员与相关资源利用率的目的,同时B/S模式的应用能够在一定程度上节约酒店成本,提高了酒店科学化管理水平。),该项目使用框架为SSM(MYECLIPSE),选用开发工具为MYECLIPSE。小型酒店管理系统为一个 后台项目。
为了完成该系统,我们首先需要对该系统进行需求分析。一个小型酒店管理系统应包含用户角色有管理员、顾客。为了能让用户顺利登陆系统完成相关操作,需要为每种登陆角色设置账户和密码字段。
为了完成系统的功能需要为客房、顾客设置订房表,记录订房信息。在订房表中定义了两者的关联关系,其中订房的客房与客房的biaoti字段对应、订房的客房id与客房的id字段对应、订房的顾客与顾客的mingzi字段对应、订房的顾客id与顾客的id字段对应
。
总结得出该系统所有数据为:管理员(admin)、客房(kefang)、订房(dingfang)、顾客(guke)
管理员表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 管理员id username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码
客房表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 客房id biaoti | VARCHAR(255) | | 标题 jieshao | VARCHAR(255) | | 介绍 jiage | VARCHAR(255) | | 价格
订房表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 订房id kefang | VARCHAR(255) | | 客房 kefangid | VARCHAR(255) | | 客房id guke | VARCHAR(255) | | 顾客 gukeid | VARCHAR(255) | | 顾客id shijian | VARCHAR(255) | | 时间 dingj | VARCHAR(255) | | 定金
顾客表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 顾客id mingzi | VARCHAR(255) | | 名字 username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码 yue | VARCHAR(255) | | 余额
sql建表语句
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ---------------------------- -- Table structure for ggjiudianguanli -- ---------------------------- DROP TABLE IF EXISTS `t_admin`; CREATE TABLE `t_admin` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '管理员id',`username` VARCHAR(255) DEFAULT NULL COMMENT '账号',`password` VARCHAR(255) DEFAULT NULL COMMENT '密码',PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='管理员'; -- ---------------------------- DROP TABLE IF EXISTS `t_kefang`; CREATE TABLE `t_kefang` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '客房id',`biaoti` VARCHAR(255) DEFAULT NULL COMMENT '标题',`jieshao` VARCHAR(5000) DEFAULT NULL COMMENT '介绍',`jiage` VARCHAR(255) DEFAULT NULL COMMENT '价格',PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='客房'; -- ---------------------------- DROP TABLE IF EXISTS `t_dingfang`; CREATE TABLE `t_dingfang` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '订房id',`kefang` VARCHAR(255) DEFAULT NULL COMMENT '客房',`kefangid` INT(11) DEFAULT NULL COMMENT '客房id',`guke` VARCHAR(255) DEFAULT NULL COMMENT '顾客',`gukeid` INT(11) DEFAULT NULL COMMENT '顾客id',`shijian` VARCHAR(255) DEFAULT NULL COMMENT '时间',`dingj` VARCHAR(255) DEFAULT NULL COMMENT '定金',PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='订房'; -- ---------------------------- DROP TABLE IF EXISTS `t_guke`; CREATE TABLE `t_guke` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '顾客id',`mingzi` VARCHAR(255) DEFAULT NULL COMMENT '名字',`username` VARCHAR(255) DEFAULT NULL COMMENT '账号',`password` VARCHAR(255) DEFAULT NULL COMMENT '密码',`yue` VARCHAR(255) DEFAULT NULL COMMENT '余额',PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='顾客';
客房控制层
package org.mypro.front; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import javax.jms.Session; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mypro.dao.KefangMapper; import org.mypro.entity.Kefang; import org.mypro.entity.KefangExample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(value = "/") public class KefangController { private static final Log logger = LogFactory.getLog(KefangController.class); @Autowired private KefangMapper kefangdao; //定义方法tianjiakefang,响应页面tianjiakefang请求 @RequestMapping(value = "tianjiakefang") public String tianjiakefang(HttpServletRequest request, HttpServletResponse response,HttpSession session,String backurl) { logger.debug("KefangController.tianjiakefang ......"); if(backurl != null && backurl.indexOf("tianjiakefang.action") == -1){ return "forward:/" + backurl; } return "tianjiakefang"; } @RequestMapping(value = "tianjiakefangact") public String tianjiakefangact(HttpServletRequest request,HttpSession session, HttpServletResponse response,Kefang kefang,String backurl) throws IOException { logger.debug("KefangController.tianjiakefangact ......"); kefangdao.insert(kefang); request.setAttribute("message", "添加客房成功"); if(backurl != null && backurl.indexOf("tianjiakefangact.action") == -1){ return "forward:/" + backurl; } //返回tianjiakefang方法 return "forward:/tianjiakefang.action"; } //定义kefangguanli方法响应页面请求 @RequestMapping(value = "kefangguanli") public String kefangguanli(HttpServletRequest request,HttpSession session, HttpServletResponse response,String backurl) { logger.debug("KefangController.kefangguanli ......"); KefangExample example = new KefangExample(); List kefangall = kefangdao.selectByExample(example); request.setAttribute("kefangall", kefangall); if(backurl != null && backurl.indexOf("kefangguanli.action") == -1){ return "forward:/" + backurl; } return "kefangguanli"; } // 定义 kefangchakan方法 @RequestMapping(value = "kefangchakan") public String kefangchakan(HttpServletRequest request,HttpSession session, HttpServletResponse response,String backurl) { logger.debug("KefangController.kefangchakan ......"); KefangExample example = new KefangExample(); List kefangall = kefangdao.selectByExample(example); request.setAttribute("kefangall", kefangall); if(backurl != null && backurl.indexOf("kefangchakan.action") == -1){ return "forward:/" + backurl; } return "kefangchakan"; } // 定义 xiugaikefang方法 @RequestMapping(value = "xiugaikefang") public String xiugaikefang(HttpServletRequest request, HttpServletResponse response,HttpSession session,int id,String backurl){ logger.debug("KefangController.xiugaikefang ......"); Kefang kefang = kefangdao.selectByPrimaryKey(id); request.setAttribute("kefang", kefang); if(backurl != null && backurl.indexOf("xiugaikefang.action") == -1){ return "forward:/" + backurl; } return "xiugaikefang"; } // 定义xiugaikefangact处理客房修改 @RequestMapping(value = "xiugaikefangact") public String xiugaikefangact(HttpServletRequest request, HttpServletResponse response,Kefang kefang,HttpSession session,String backurl) throws IOException { logger.debug("KefangController.xiugaikefangact ......"); kefangdao.updateByPrimaryKeySelective(kefang); request.setAttribute("message", "修改客房信息成功"); if(backurl != null && backurl.indexOf("xiugaikefangact.action") == -1){ return "forward:/" + backurl; } return "forward:/kefangguanli.action"; } // 定义shanchukefang,处理删除客房 @RequestMapping(value = "shanchukefang") public String shanchukefang(HttpServletRequest request, HttpServletResponse response,HttpSession session,int id,String backurl){ logger.debug("KefangController.shanchukefang ......"); kefangdao.deleteByPrimaryKey(id); request.setAttribute("message", "删除客房成功"); if(backurl != null && backurl.indexOf("shanchukefang.action") == -1){ return "forward:/" + backurl; } return "forward:/kefangguanli.action"; } // 定义sousuokefang方法,处理搜索操作 @RequestMapping(value = "sousuokefang") public String sousuokefang(HttpServletRequest request, HttpServletResponse response,HttpSession session,String search,String backurl) { logger.debug("KefangController.sousuokefang ......"); KefangExample example = new KefangExample(); KefangExample.Criteria criteria = example.createCriteria(); if(search != null){ criteria.andBiaotiLike("%" + search + "%"); } List kefangall = kefangdao.selectByExample(example); request.setAttribute("kefangall", kefangall); if(backurl != null && backurl.indexOf("sousuokefang.action") == -1){ return "forward:/" + backurl; } return "sousuokefang"; } // 定义KefangpinglunMapper@RequestMapping (value = "kefangxiangqing") public String kefangxiangqing(HttpServletRequest request,HttpSession session, HttpServletResponse response,int id,String backurl) {logger. debug("KefangController.kefangxiangqing ......");Kefang kefang = kefangdao.selectByPrimaryKey(id);request. setAttribute("kefang", kefang); if(backurl != null && backurl.indexOf("kefangxiangqing.action") == -1){ return "forward:/" + backurl; } return "kefangxiangqing"; } // 上传文件图片等 public String uploadUtile(MultipartFile file, HttpServletRequest request) throws IOException { // 根据当前时间生成时间字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS"); String res = sdf.format(new Date()); // uploads文件夹位置 String rootPath = request.getSession().getServletContext().getRealPath("resource/uploads/"); // 原始名称 String originalFileName = file.getOriginalFilename(); // 新文件名 String newFileName = "sliver" + res + originalFileName.substring(originalFileName.lastIndexOf(".")); // 创建年月文件夹 Calendar date = Calendar.getInstance(); File dateDirs = new File(date.get(Calendar.YEAR) + File.separator + (date.get(Calendar.MONTH)+1)); // 新文件 File newFile = new File(rootPath + File.separator + dateDirs + File.separator + newFileName); // 判断目标文件所在目录是否存在 if( !newFile.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录newFile. getParentFile().mkdirs(); } System.out.println(newFile); // 将内存中的数据写入磁盘file. transferTo(newFile); // 完整的url String fileUrl = date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH)+1) + "/" + newFileName; return fileUrl; }}