Java 基于 SpringBoot 的酒店管理系统,附源码和数据库

news2024/11/24 14:49:26

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

文章目录

  • 一、前言介绍
  • 二、系统结构
  • 三、系统详细实现
    • 3.1用户信息管理
    • 3.2会员信息管理
    • 3.3客房信息管理
    • 3.4收藏客房管理
    • 3.5用户入住管理
    • 3.6客房清扫管理
  • 四、部分核心代码
  • 五、源码咨询

一、前言介绍

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了酒店客房管理系统的开发全过程。通过分析酒店客房管理系统管理的不足,创建了一个计算机管理酒店客房管理系统的方案。文章介绍了酒店客房管理系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。

本酒店客房管理系统有管理员,用户,会员,清洁人员。管理员功能有个人中心,用户管理,会员管理,清洁人员管理,客房信息管理,用户预约管理,会员预约管理,用户取消管理,会员取消管理,用户入住管理,会员入住管理,用户退房管理,会员退房管理,清扫房间管理,留言板管理,系统管理等。因而具有一定的实用性。

本站是一个B/S模式系统,后台采用 Spring
Boot框架,前台采用VUE框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得酒店客房管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高酒店客房管理系统管理效率。

二、系统结构

开发语言:Java

框架:springboot

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/myeclipse/idea

Maven包:Maven3.3.9

浏览器:谷歌浏览器

本系统是基于B/S 架构的网站系统,设计的功能结构图如下图所示:

三、系统详细实现

3.1用户信息管理

酒店客房管理系统的系统管理员可以管理用户信息,可以对用户信息信息添加修改删除以及查询操作,具体界面的展示如图所示

3.2会员信息管理

系统管理员可以查看对会员信息信息进行添加,修改,删除以及查询操作。具体界面如图所示。

3.3客房信息管理

管理员可以对客房信息信息进行修改,删除以及查询操作。界面如下图所示:

3.4收藏客房管理

用户登录后可以对客房信息进行收藏,预定。界面如下图所示:

3.5用户入住管理

管理员可以对用户入住信息进行管理,可以添加,修改,删除以及清扫。界面如下图所示:

3.6客房清扫管理

清洁人员登录可以对用户入住的客房进行清扫。界面如下图所示:

四、部分核心代码

    
    /**
     * 上传文件映射表
     */
    @RestController
    @RequestMapping("file")
    @SuppressWarnings({"unchecked","rawtypes"})
    public class FileController{
    	@Autowired
        private ConfigService configService;
    	/**
    	 * 上传文件
    	 */
    	@RequestMapping("/upload")
    	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
    		if (file.isEmpty()) {
    			throw new EIException("上传文件不能为空");
    		}
    		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
    		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
    		if(!path.exists()) {
    		    path = new File("");
    		}
    		File upload = new File(path.getAbsolutePath(),"/upload/");
    		if(!upload.exists()) {
    		    upload.mkdirs();
    		}
    		String fileName = new Date().getTime()+"."+fileExt;
    		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
    		file.transferTo(dest);
    		/**
      		 * 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开
       		 * 请将以下的"D:\\springbootq33sd\\src\\main\\resources\\static\\upload"替换成你本地项目的upload路径,
     		 * 并且项目路径不能存在中文、空格等特殊字符
     		 */
    //		FileUtils.copyFile(dest, new File("D:\\springbootq33sd\\src\\main\\resources\\static\\upload"+"/"+fileName)); /**修改了路径以后请将该行最前面的//注释去掉**/
    		if(StringUtils.isNotBlank(type) && type.equals("1")) {
    			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
    			if(configEntity==null) {
    				configEntity = new ConfigEntity();
    				configEntity.setName("faceFile");
    				configEntity.setValue(fileName);
    			} else {
    				configEntity.setValue(fileName);
    			}
    			configService.insertOrUpdate(configEntity);
    		}
    		return R.ok().put("file", fileName);
    	}
    	
    	/**
    	 * 下载文件
    	 */
    	@IgnoreAuth
    	@RequestMapping("/download")
    	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
    		try {
    			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
    			if(!path.exists()) {
    			    path = new File("");
    			}
    			File upload = new File(path.getAbsolutePath(),"/upload/");
    			if(!upload.exists()) {
    			    upload.mkdirs();
    			}
    			File file = new File(upload.getAbsolutePath()+"/"+fileName);
    			if(file.exists()){
    				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
    					getResponse().sendError(403);
    				}*/
    				HttpHeaders headers = new HttpHeaders();
    			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
    			    headers.setContentDispositionFormData("attachment", fileName);    
    			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
    	}
    	
    }
    
    
    
    RestController
    @RequestMapping("/kechengchengji")
    public class KechengchengjiController {
        @Autowired
        private KechengchengjiService kechengchengjiService;
    
    
        
    
    
        /**
         * 后端列表
         */
        @RequestMapping("/page")
        public R page(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji,
    		HttpServletRequest request){
    		String tableName = request.getSession().getAttribute("tableName").toString();
    		if(tableName.equals("jiaoshi")) {
    			kechengchengji.setJiaoshizhanghao((String)request.getSession().getAttribute("username"));
    		}
    		if(tableName.equals("xuesheng")) {
    			kechengchengji.setXuehao((String)request.getSession().getAttribute("username"));
    		}
            EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();
    		PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));
    
            return R.ok().put("data", page);
        }
        
        /**
         * 前端列表
         */
    	@IgnoreAuth
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji, 
    		HttpServletRequest request){
            EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();
    		PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));
            return R.ok().put("data", page);
        }
    
    	/**
         * 列表
         */
        @RequestMapping("/lists")
        public R list( KechengchengjiEntity kechengchengji){
           	EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();
          	ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); 
            return R.ok().put("data", kechengchengjiService.selectListView(ew));
        }
    
    	 /**
         * 查询
         */
        @RequestMapping("/query")
        public R query(KechengchengjiEntity kechengchengji){
            EntityWrapper< KechengchengjiEntity> ew = new EntityWrapper< KechengchengjiEntity>();
     		ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); 
    		KechengchengjiView kechengchengjiView =  kechengchengjiService.selectView(ew);
    		return R.ok("查询课程成绩成功").put("data", kechengchengjiView);
        }
    	
        /**
         * 后端详情
         */
        @RequestMapping("/info/{id}")
        public R info(@PathVariable("id") Long id){
            KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);
            return R.ok().put("data", kechengchengji);
        }
    
        /**
         * 前端详情
         */
    	@IgnoreAuth
        @RequestMapping("/detail/{id}")
        public R detail(@PathVariable("id") Long id){
            KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);
            return R.ok().put("data", kechengchengji);
        }
        
    
    
    
        /**
         * 后端保存
         */
        @RequestMapping("/save")
        public R save(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){
        	kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
        	//ValidatorUtils.validateEntity(kechengchengji);
            kechengchengjiService.insert(kechengchengji);
            return R.ok();
        }
        
        /**
         * 前端保存
         */
        @RequestMapping("/add")
        public R add(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){
        	kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
        	//ValidatorUtils.validateEntity(kechengchengji);
            kechengchengjiService.insert(kechengchengji);
            return R.ok();
        }
    
        /**
         * 修改
         */
        @RequestMapping("/update")
        public R update(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){
            //ValidatorUtils.validateEntity(kechengchengji);
            kechengchengjiService.updateById(kechengchengji);//全部更新
            return R.ok();
        }
        
    
        /**
         * 删除
         */
        @RequestMapping("/delete")
        public R delete(@RequestBody Long[] ids){
            kechengchengjiService.deleteBatchIds(Arrays.asList(ids));
            return R.ok();
        }
        
        /**
         * 提醒接口
         */
    	@RequestMapping("/remind/{columnName}/{type}")
    	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
    						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
    		map.put("column", columnName);
    		map.put("type", type);
    		
    		if(type.equals("2")) {
    			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    			Calendar c = Calendar.getInstance();
    			Date remindStartDate = null;
    			Date remindEndDate = null;
    			if(map.get("remindstart")!=null) {
    				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
    				c.setTime(new Date()); 
    				c.add(Calendar.DAY_OF_MONTH,remindStart);
    				remindStartDate = c.getTime();
    				map.put("remindstart", sdf.format(remindStartDate));
    			}
    			if(map.get("remindend")!=null) {
    				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
    				c.setTime(new Date());
    				c.add(Calendar.DAY_OF_MONTH,remindEnd);
    				remindEndDate = c.getTime();
    				map.put("remindend", sdf.format(remindEndDate));
    			}
    		}
    		
    		Wrapper<KechengchengjiEntity> wrapper = new EntityWrapper<KechengchengjiEntity>();
    		if(map.get("remindstart")!=null) {
    			wrapper.ge(columnName, map.get("remindstart"));
    		}
    		if(map.get("remindend")!=null) {
    			wrapper.le(columnName, map.get("remindend"));
    		}
    
    		String tableName = request.getSession().getAttribute("tableName").toString();
    		if(tableName.equals("jiaoshi")) {
    			wrapper.eq("jiaoshizhanghao", (String)request.getSession().getAttribute("username"));
    		}
    		if(tableName.equals("xuesheng")) {
    			wrapper.eq("xuehao", (String)request.getSession().getAttribute("username"));
    		}
    
    		int count = kechengchengjiService.selectCount(wrapper);
    		return R.ok().put("count", count);
    	}
    	
    
    
    
    
    
    
    
    }
    

五、源码咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析linux异步io框架 io_uring

前言 Linux内核5.1支持了新的异步IO框架iouring&#xff0c;由Block IO大神也即Fio作者Jens Axboe开发&#xff0c;意在提供一套公用的网络和磁盘异步IO&#xff0c;不过io_uring目前在磁盘方面要比网络方面更加成熟。 目录 背景简介 io_uring 系统API liburing 高级特性…

SpringBoot实例类-@Data

1.配置pom.xml 说明&#xff1a;添加lombok依赖 <!-- lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 2.刷新maven 说明&#xff1a;一般修改xml文件就需要刷…

数据库相关基础知识

第一章 概念 1、数据&#xff1a;描述事物的符号记录称为数据。特点&#xff1a;数据和关于数据的解释不可分。 2、数据库&#xff1a;长期存储在计算机内、有组织、可共享的大量的数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、…

Linux —— 信号阻塞

目录 一&#xff0c;信号内核表示 sigset_t sigprocmask sigpending 二&#xff0c;捕捉信号 sigaction 三&#xff0c;可重入函数 四&#xff0c;volatile 五&#xff0c;SIGCHLD 信号常见概念 实际执行信号的处理动作&#xff0c;称为信号递达Delivery&#xff1b;信…

广东智科与涂鸦智能达成合作,引领热泵市场智能转型新风向

全球能源危机正推动热泵市场的增长&#xff0c;据国际能源署报道&#xff0c;2022年全球热泵的销售额增长达11%&#xff0c;欧洲的销售额增长更是达到了40%。中国作为热泵市场的最大出口国&#xff0c;全球热泵市场需求的激增对于中国企业而言无疑是一剂“振奋剂”。 广东智科电…

QT/QTCreator开发/使用技巧

调试模式完整的展示过长的字符串 如图&#xff0c;当字符串过长时在调试模式下&#xff0c;无法非常清晰的看到全部的字符串&#xff0c;此时可以通过 右键菜单→ change value display format→spearate Window。此时字符串将单独显示在一个独立的窗口里。如果你想回到原状勾选…

关于“找不到mfc140u.dll,无法继续执行代码”问题的分析处理方法

我想和大家分享一个在编程过程中经常会遇到的问题——找不到mfc140u.dll,无法继续执行代码。找不到 mfc140u.dll&#xff0c;这个问题可能会让我们感到困扰。mfc140u.dll 是 Microsoft Foundation Classes&#xff08;MFC&#xff09;库的一部分&#xff0c;它是一个 Windows 系…

MySQL——读写分离

简介 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制&#xff…

领域驱动设计:领域事件

文章目录 领域事件识别领域事件领域事件相关案例领域事件总体架构 领域事件 领域事件是领域模型中非常重要的一部分&#xff0c;用来表示领域中发生的事件。一个领域事件将导致进一步的业务操作&#xff0c;在实现业务解耦的同时&#xff0c;还有助于形成完整的业务闭环。 举例…

脚本:python实现动态爱心

文章目录 效果代码Reference python实现dynamic heart 效果 代码 import turtle as tu import random as ratu.setup(0.5, 0.5) # 设置画板大小&#xff08;小数表示比例&#xff0c;整数表示大小&#xff09; tu.screensize(1.0, 1.0) # 设置屏幕大小 tu.bgcolor(black) #…

Linux安装logstash

相关链接 项⽬主⻚&#xff1a; https://www.elastic.co/cn/downloads/logstash 下载地址&#xff1a; wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.tar.gz 官网下载可能比较慢&#xff0c;下面提供下载地址 百度云链接&#xff1a;https://pan.…

C# wpf 实现桌面放大镜

文章目录 前言一、如何实现&#xff1f;1、制作无边框窗口2、Viewbox放大3、截屏显示&#xff08;1&#xff09;、截屏&#xff08;2&#xff09;、转BitmapSource&#xff08;3&#xff09;、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…

【关于Java:认识异常】

文章目录 一、1. 异常概念与体系结构1.1 异常的概念1.2 常见的异常1.算数异常2.数组越界异常3.空指针异常 1.3 异常的体系结构1.4 异常的分类1. 编译时异常2. 运行时异常&#xff08;RuntimeException&#xff09; 二、 异常的处理方式2.1 防御式编程2.2 EAFP:&#xff08;异常…

API 架构学习

MQTT架构 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在…

uni-app运行到微信开发者工具-没有打印的情况

前言 到我们进场使用微信开发者工具时&#xff0c;就会发现它经常会有bug&#xff0c;特别是在软件更新&#xff0c;组件库更新之后 最近在更新微信开发者工具之后发现所有打印都不显示了&#xff0c;虽然是小问题-但对于强迫症很烦 以为是代码配置问题-结果是更新之后打印开…

代码随想录算法训练营第五十八天 | 739. 每日温度,496.下一个更大元素 I

代码随想录算法训练营第五十八天 | 739. 每日温度&#xff0c;496.下一个更大元素 I 739. 每日温度496.下一个更大元素 I 739. 每日温度 题目链接 视频讲解 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answe…

MySQL基础与库的基本操作

目录 1 MySQL基础一种存储解决方案SQL分类查看MySQL存储引擎 2 MySQL 库的操作数据库基本增删认识系统编码校验规则对数据库的影响数据库的查看与删除修改数据库数据库的备份与恢复查看连接情况 1 MySQL基础 一种存储解决方案 mysql本质是一种网络服务 mysql – 数据库服务的…

华为Mate60Pro携麒麟芯片回归,下半年国内手机市场出货量有望提升

本文由群狼调研**&#xff08;长沙产品价格监测&#xff09;**出品&#xff0c;欢迎转载&#xff0c;请注明出处。8月29日中午&#xff0c;华为以“Mate 60 Pro先锋计划”方式让Mate 60 Pro悄然开卖&#xff0c;线上线下用户纷纷前往抢购&#xff0c;据购买到新机的网友网络测速…

2672. 有相同颜色的相邻元素数目;1947. 最大兼容性评分和;958. 二叉树的完全性检验

2672. 有相同颜色的相邻元素数目 核心思想&#xff1a;枚举。每次操作只会影响index左右两边的数&#xff0c;所以我们只需要判断操作前index左右是否存在相同的数&#xff0c;然后减少一&#xff1b;然后将颜色修改&#xff0c;然后判断修改后index左右相邻的数是否是相同的&…

极致精细的jmeter+ant+jenkins 搭建接口自动化测试

一、jmeter 相信大家对jmeter并不陌生哈&#xff0c;如果没有安装和配置环境的小伙伴&#xff0c;可以直接找到我哈&#xff0c;我发给你。 二、ant 安装ant 第一步&#xff1a;下载ant http://ant.apache.org/ 第二步&#xff1a;配置ant window中设置ant环境变量&…