酒店管理|基于Springboot+Vue前后端分离实现酒店管理系统
作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
收藏点赞不迷路 关注作者有好处
文末获取源码
项目编号:BS-XX-166
一,项目简介
随着我国经济发展水平的迅速提高,酒店行业作为服务行业出的重要组成部分,已经越来越显示出其强劲的发展势头。纵观国内外酒店业信息化发展轨迹和趋势,我们不难看出,随着洒店业竞争的加剧,酒店之间客源的争夺越来越激烈,客房销售的利润空间越来越小,酒店需要使用更有效的信息化手段,拓展经营空间,降低运营成本,提高管理和决策效率。而经济型酒店通过信息化管理提高收益的需求更加突出。尤其是在疫情的影响下,酒店之间的竞争更加激烈,而线上预定能够使中小型酒店在同类型酒店更具竞争。
本系统分为前台、后台两部分。前台用户需要通过手机短信验证,进行注册后,再通过手机号、密码进行登录。未登录时,可以看到展示的酒店信息,包括酒店环境、客房展示图;登陆前台后,用户可以进行客房预定,预定后进行订单支付、订单查询,还可以点击右上角查看用户中心,在用户中心,用户可以修改头像、密码等信息。后台用户分为两种角色:酒店员工与酒店管理员。员工可以进行房间信息的管理,例如添加新的房间、修改房间状态、房间信息批量导入等,也可以进行房客登记、退房、查看订单等操作。前台系统功能图如图3-1所示吗,后台系统功能图如图3-2所示。
图3-1 前台系统功能图
图3-2 后台系统功能图
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Mybatis-plus持久层框架处理数据+SpringBoot整合依赖;
前端页面开发技术:Vue+ElementUI
三,系统展示
用户进行登录后,点击右上角用户名出现的下拉框内中户中心选项,进入用户中心界面。在这个界面,用户可以查看到用户名、性别、头像等信息。界面实现效果如图5-3所示。
用户在点击预定后,进入订单核对页面,核对后点击支付订单,进行支付宝沙箱支付。扫码或登录支付宝沙箱账号支付成功后,发起异步通知,修改数据库订单状态,页面跳至成功支付界面。界面实现效果如图5-6所示。
后台用户点击入住信息,分页查看入住信息列表。在此页面的条件搜索框中输入条件信息,点击查询按钮,进行条件分页查询。界面实现效果如图5-10所示。
后台用户点击新增用户,跳转至入住信息新增界面。用户在此输入房客登记的信息,点击保存,即可将此条入住信息传至后端,由后端程序将数据插入数据库保存。界面实现效果如图5-11所示。
后台用户在进入房间添加界面,可以填写房间信息,如房间号、房间类型、备注信息等。点击保存,将数据传输到后端,保存至数据库。界面实现效果如图5-13所示。
四,核心代码展示
package com.tsx.boot.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tsx.boot.entity.Admin;
import com.tsx.boot.entity.query.adminQuery;
import com.tsx.boot.entity.vo.admin.adminVo;
import com.tsx.boot.service.AdminService;
import com.tsx.boot.utils.R;
import io.swagger.annotations.ApiOperation;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;/*** <p>* 前端控制器* </p>** @author testjava* @since 2022-07-21*/
@RestController
@RequestMapping("/admin")
@CrossOrigin
public class AdminController {@Autowiredprivate AdminService adminService;@DeleteMapping("/delete/{id}")//通过路径传id值(逻辑删除需要在实体类的逻辑删除的成员属性上加注解@TableLogic)//效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法就会变成修改public R removeAdmin(@PathVariable String id){boolean flag = adminService.removeById(id);if(flag){return R.ok();}else {return R.error();}}//修改@PostMapping("/updateAdmin")public R updateAdmin(@RequestBody Admin admin){boolean flag = adminService.updateById(admin);if(flag){return R.ok();}else {return R.error();}}//添加方法@PostMapping("/addAdmin")public R addMember(@RequestBody Admin admin){boolean flag=adminService.save(admin);if(flag){return R.ok();}else {return R.error();}}//根据id获取信息,用于回显修改@GetMapping("/getInfo/{id}")public R getInfoById(@PathVariable String id){QueryWrapper<Admin> wrapper=new QueryWrapper<>();wrapper.eq("id",id);Admin admin = adminService.getOne(wrapper);return R.ok().data("admin",admin);}//登陆@PostMapping("/login")public R login(@RequestBody adminVo adminVo){Admin admin = adminService.login(adminVo);if(admin != null){return R.ok().data("token",admin.getId());}else {return R.error();}}//退出登录@PostMapping("/logout")public R logout(){return R.ok();}@GetMapping("/info/{id}")public R info(@PathVariable String id){List<String> list=new ArrayList<>();QueryWrapper<Admin> wrapper=new QueryWrapper<>();wrapper.eq("id",id);Admin admin=adminService.getOne(wrapper);if(admin.getStatus()==1){list.add("admin");}else {list.add("staff");}return R.ok().data("roles",list).data("name",admin.getName()).data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");}//分页查询后台用户@ApiOperation(value = "用户分页查询")@PostMapping("/pageAdmin/{current}/{limit}")//当前页与每页数目public R pageListTeacher(@PathVariable long current,@PathVariable long limit,@RequestBody(required = false) adminQuery adminQuery){Page<Admin> pageAdmin = new Page<>(current, limit);//构建条件QueryWrapper<Admin> wrapper=new QueryWrapper<>();//wrapper.String name = adminQuery.getName();Integer status = adminQuery.getStatus();String begin = adminQuery.getBegin();String end = adminQuery.getEnd();if(!StringUtils.isEmpty(name)){wrapper.like("name",name);}if(!StringUtils.isEmpty(status)){wrapper.eq("status",status);}if(!StringUtils.isEmpty(begin)){wrapper.ge("create_time",begin);//大于表中起始时间字段}if(!StringUtils.isEmpty(end)){wrapper.le("update_time",end);//小于表中起始时间字段}//排序wrapper.orderByDesc("update_time");//实现条件分页查询adminService.page(pageAdmin,wrapper);long total=pageAdmin.getTotal();List<Admin> records=pageAdmin.getRecords();return R.ok().data("total",total).data("rows",records);}}
package com.tsx.boot.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tsx.boot.entity.Checkin;
import com.tsx.boot.entity.other.Pie;
import com.tsx.boot.service.CheckinService;
import com.tsx.boot.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@RestController
@RequestMapping("/charts")
@CrossOrigin
public class ChartController {@Autowiredprivate CheckinService checkinService;@GetMapping("/getWeekIncome")public R getWeekIncome() throws ParseException {List<Float> list=checkinService.countWeekIncount();List<String> timeList=checkinService.getTimeWeek();return R.ok().data("list",list).data("times",timeList);}/*获取当月的不同房型入住情况*/@GetMapping("/getMonthType")public R getMonthType(){//获取所有房型集合List<String> types =checkinService.countype();//获取不同房型在当月的入住次数List<Integer> Typelist=checkinService.countMonthTypeNum(types);//封装成图标需要的数据形式List<Pie> list=new ArrayList<>();for(int i=0;i<types.size();i++){Pie pie=new Pie();pie.setName(types.get(i));pie.setValue(Typelist.get(i));list.add(pie);}return R.ok().data("list",list).data("types",types);}/*计算今日收入*/@GetMapping("/getToDayMoney")public R getToDayMoney(){Date date=new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String day=formatter.format(date);String day_start=day+" 00:00:00";String day_end=day+" 23:59:59";System.out.println(day_start);QueryWrapper<Checkin> wrapper=new QueryWrapper<>();wrapper.select("sum(money) as sumAll");try{wrapper.ge("create_time",formatter1.parse(day_start));wrapper.le("create_time",formatter1.parse(day_end));Checkin checkin=checkinService.getOne(wrapper);System.out.println(checkin.getSumAll());}catch (Exception e){e.printStackTrace();return R.error();}return R.ok();}}
package com.tsx.boot.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tsx.boot.entity.*;
import com.tsx.boot.entity.query.checkQuery;
import com.tsx.boot.service.CheckinService;
import com.tsx.boot.service.ChecksService;
import com.tsx.boot.service.RoomService;
import com.tsx.boot.service.RoomtypeService;
import com.tsx.boot.utils.R;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.ws.rs.Path;
import java.math.BigDecimal;
import java.nio.file.Watchable;
import java.util.Date;
import java.util.List;/*** <p>* 前端控制器* </p>** @author testjava* @since 2022-07-27*/
@RestController
@RequestMapping("/check")
@CrossOrigin
public class CheckinController {@Autowiredprivate CheckinService checkService;@Autowiredprivate ChecksService checksService;@Autowiredprivate RoomService roomService;@Autowiredprivate RoomtypeService roomtypeService;/*退房功能,当点击退房按钮,根据主客的入住记录id,将主客、从客入住状态转为已退房再将房间状态转换为空闲*/@PostMapping("/checkOut/{id}")public R checkOut(@PathVariable String id){//根据id,将主客、从客入住状态转换为退房UpdateWrapper<Checkin> wrapper1=new UpdateWrapper<>();wrapper1.eq("id",id);wrapper1.set("state",0);checkService.update(null,wrapper1);UpdateWrapper<Checks> wrapper2=new UpdateWrapper<>();wrapper2.eq("zid",id);wrapper2.set("state",0);checksService.update(null,wrapper2);//将房间状态转换为空闲 先获取房间号,再将房间状态改为空闲QueryWrapper<Checkin> queryWrapper=new QueryWrapper<>();queryWrapper.eq("id",id);Checkin checkin=checkService.getOne(queryWrapper);UpdateWrapper<Room> wrapper=new UpdateWrapper<>();wrapper.eq("id",checkin.getRoomId());wrapper.set("state",1);roomService.update(null,wrapper);return R.ok().message("退房成功!");}/*通过房号查到房费*/@GetMapping("/calculate/{roomId}")public R calculate(@PathVariable String roomId){QueryWrapper<Room> wrapper1=new QueryWrapper<>();wrapper1.eq("id",roomId);Room room = roomService.getOne(wrapper1);if(null==room){return R.error().message("房间号不存在!");}BigDecimal fee= roomService.getFeebyRoomId(roomId);return R.ok().data("money",fee);}/*通过id查询入住信息*/@GetMapping("/getCheckInfoById/{id}")public R getCheckInfoById(@PathVariable String id){QueryWrapper<Checkin> wrapper=new QueryWrapper<>();wrapper.eq("id",id);Checkin checkin = checkService.getOne(wrapper);return R.ok().data("check",checkin);}/*逻辑删除入住信息(逻辑删除需要在实体类的逻辑删除的成员属性上加注解@TableLogic在isDelete字段上加上这个注解再执行BaseMapper的删除方法时,删除方法就会变成修改)通过传id值,逻辑删除入住信息*/@DeleteMapping("/deleteCheck/{id}")public R removeCheck(@PathVariable String id){// 房间状态改为1,再删除roomService.updateRoomState(id);boolean flag = checkService.removeById(id);if(flag){//修改该类型剩余房间数量roomtypeService.updateAllSTypeNum();return R.ok();}else {return R.error();}}/*修改入住信息*/@PostMapping("/updateCheck")public R updateCheck(@RequestBody Checkin checkin){boolean flag = checkService.updateById(checkin);if(flag){//修改该类型剩余房间数量roomtypeService.updateAllSTypeNum();return R.ok();}else {return R.error();}}//退房 需要修改房间状态、入住状态,剩余空闲房间数量@PostMapping("/tRoom")public R TRoom(@PathVariable String id){//修改入住状态为退房UpdateWrapper<Checkin> wrapper=new UpdateWrapper<>();wrapper.eq("id",id);wrapper.set("state",2);boolean flag = checkService.update(wrapper);if(flag){// 删除后,房间状态改为1roomService.updateRoomState(id);return R.ok();}else {return R.error();}}//添加方法@PostMapping("/addCheck")public R addCheck(@RequestBody Checkin checkin){//入住状态初始为:1 表示入住中checkin.setState(1);//查出房间信息、判断该记录的房间状态是否为1(空闲状态)QueryWrapper<Room> wrapper1=new QueryWrapper<>();wrapper1.eq("id",checkin.getRoomId());Room room = roomService.getOne(wrapper1);if(null==room){return R.error();}int state=room.getState();//初始化入住记录的类型名checkin.setTypeName(room.getTypeName());boolean flag;//如果该房间状态为1(空闲),才能够入住if(state==1){flag=checkService.save(checkin);}else {return R.error();}//新增if(flag){//添加入住记录,将该房间的状态修改为已经入住UpdateWrapper<Room> wrapper=new UpdateWrapper<>();wrapper.eq("id",checkin.getRoomId());wrapper.set("state",2);roomService.update(wrapper);//修改该类型剩余房间数量roomtypeService.updateAllSTypeNum();return R.ok();}else {return R.error();}}/** 分页条件查询入住信息*/@ApiOperation(value = "入住信息分页查询")@PostMapping("/pageCheck/{current}/{limit}")//当前页与每页数目public R pageListTeacher(@PathVariable long current,@PathVariable long limit,@RequestBody(required = false) checkQuery checkQuery){System.out.println(checkQuery);Page<Checkin> pageRoom = new Page<>(current, limit);//构建条件QueryWrapper<Checkin> wrapper=new QueryWrapper<>();//wrapper.String roomId = checkQuery.getRoomId();List<Date> dates = checkQuery.getDates();String name = checkQuery.getName();String idNumber=checkQuery.getIdNumber();Integer state=checkQuery.getState();if(!StringUtils.isEmpty(roomId)){wrapper.eq("room_id",roomId);}if(!StringUtils.isEmpty(name)){wrapper.like("name",name);}if(!StringUtils.isEmpty(idNumber)){wrapper.like("id_number",idNumber);}if(!StringUtils.isEmpty(state)){wrapper.eq("state",state);}if(!StringUtils.isEmpty(dates)){//前端日期传到后端出了问题,在此进行处理。将日期左右边界都加1long time1 = dates.get(0).getTime();long time2 = dates.get(1).getTime();Date DateStart = new Date();Date DateEnd = new Date();DateStart.setTime(time1 + 1000*60*60*10);DateEnd.setTime(time2 + 1000*60*60*34-1000);wrapper.between("create_time",new Date(DateStart.toString()),new Date(DateEnd.toString()));}//排序wrapper.orderByDesc("create_time");//实现条件分页查询checkService.page(pageRoom,wrapper);long total=pageRoom.getTotal();List<Checkin> records=pageRoom.getRecords();return R.ok().data("total",total).data("rows",records);}}
五,项目总结
酒店管理|基于Springboot+Vue前后端分离实现酒店管理系统相关推荐
- 基于SpringBoot+Vue前后端分离的在线教育平台项目
基于SpringBoot+Vue前后端分离的在线教育平台项目 赠给有缘人,希望能帮助到你!也请不要吝惜你的大拇指,你的Star.点赞将是对我最大的鼓励与支持! 开源传送门: 后台:Gitee | Gi ...
- 基于springboot vue前后端分离的图书借阅管理系统源码
请观看视频: 基于springboot vue前后端分离的图书借阅管理系统源码 <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...
- 基于springboot+vue前后端分离的婚礼服装租赁系统
1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于springboot+vue前后端分离的婚礼服装租赁系统. 计算机毕业生设计,课程设计需要帮助的可以找我 源码获取------> ...
- 基于springboot+vue前后端分离的学生在线考试管理系统
一.基于springboot+vue前后端分离的学生在线考试管理系统 本系统通过教师用户创建班级编写试卷信息然后发布到班级.学生用户进入班级,在线作答,考试结果数据通过网络回收,系统自动进行判分,生成 ...
- 【JAVA程序设计】基于SSM+VUE前后端分离的物流管理系统
基于SSM+VUE前后端分离的物流管理系统 零.项目获取 一.项目简介 二.开发环境 三.项目技术 四.系统架构 五.运行截图 零.项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可 ...
- Jeecg-Boot 2.0.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台
Jeecg-Boot 2.0.0 版本发布,前后端分离快速开发平台 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot ...
- 基于Springboot+vue前后端分离的项目--后端笔记
效果图: 1.前言 从零开始搭建一个项目最重要的是选择一个自己熟悉的框架,此项目使用Springboot框架来构建后端结构,使用vue来构建前端页面.数据层我们常用的是Mybatis,这里我大部分使 ...
- springboot+vue前后端分离实现宿舍管理系统
作者主页:编程指南针简介:Java领域优质创作者.CSDN博客专家 Java项目.简历模板.学习资料.面试题库.技术互助文末获取源码 项目编号:BS-GX-032 开发技术: 后台:Spring ...
- 基于Springboot vue前后端分离在线培训考试系统源码
# 云帆培训考试系统 管理账号:admin/admin 学员账号:person/person # 介绍 一款多角色在线培训考试系统,系统集成了用户管理.角色管理.部门管理.题库管理.试题管理.试题导入 ...
最新文章
- 当莎士比亚遇见Google Flax:教你用​字符级语言模型和归递神经网络写“莎士比亚”式句子...
- FAT文件系统原理(转)
- 径向基函数插值(3)二维数据的插值
- java绘图板_Java中的画图板简单功能实现
- SAP之成本中心类型与功能范围
- c在linux中怎样执行文件,如何在Linux中编译和运行C/C+程序,简单示例教懂你
- 如何给远程计算机添加用户,如何访问远程计算机以添加/删除/管理用户帐户?...
- php递归无限极分类
- 图片压缩但质量不减,这个工具很不错
- formrules 表单验证限制最大值_HTML5表单
- MySQL中int(11)最大长度是多少?
- 这37个自学网站,一年让你省下十几万。钱买辆车他不香嘛
- 6款反垃圾邮件产品横向比较测试
- 中国车联网行业市场现状分析及投资趋势预测报告2022-2028年
- java8 lambda 处理分类和子分类的技巧
- d3中为每个rect元素绑定带数据的点击事件
- app pour android,Pokédex pour Android (FR)
- Linux中shell的ls,linux系统shell中ls指令
- 基于随机森林模型的葡萄酒品质分析
- AlexNet架构重现与解析