基于SSM的酒店管理系统
一级目录
1、项目介绍
基于SSM的酒店管理系统拥有两种角色,分别为用户和管理员,具体功能如下:
用户:条件查询房间信息、预订房间、个人中心、查看订单
管理员:用户管理、楼层管理、房型管理、客户管理、预订管理、入住管理、营业统计等
2、项目技术
后端框架:SSM(Spring、SpringMVC、Mybatis)
前端框架:layui、jsp、css、JavaScript、JQuery
3、开发环境
JAVA版本:JDK1.8
tomcat版本:Tomcat 7.x、8.x、9.x、10.x版本均可
数据库版本:MySql 5.x
硬件环境:Windows 或者 Mac OS
4、功能介绍
4.1 项目结构图
4.2 项目部分结果展示
4.2.1 用户与管理登录界面
4.2.2 前台房间预定与列表
房间列表
前台预定界面
4.2.3 后台管理界面展示
员工管理界面
部门管理界面
房型管理界面
楼层管理界面
5. 部分功能的实现
5.1 部门管理功能
<%--
Created by IntelliJ IDEA.
User: wmz
Date: 2022/9/3
Time: 20:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="${pageContext.request.contextPath}/statics/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="${pageContext.request.contextPath}/statics/layui/css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<%--条件搜索区域--%>
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">部门名称</label>
<div class="layui-input-inline">
<input type="text" name="deptName" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-warm"><i class="layui-icon layui-icon-refresh-1"></i>重置</button>
</div>
</div>
</form>
</div>
</fieldset>
<%-- 添加--%>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加 </button>
</div>
</script>
<%--表格--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<%-- 行工具栏区域 --%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete"><i class="layui-icon layui-icon-delete"></i>删除</a>
</script>
<%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item">
<label class="layui-form-label">部门名称</label>
<div class="layui-input-block">
<%-- 隐藏域 --%>
<input type="hidden" name="id">
<input type="text" name="deptName" lay-verify="required" autocomplete="off"
placeholder="请输入部门名称" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">部门地址</label>
<div class="layui-input-block">
<input type="text" name="address" lay-verify="required" autocomplete="off" placeholder="请输入部门地址"
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">部门备注</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="remark" id="content"></textarea>
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/statics/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table','layer'], function () {
var $ = layui.jquery,
form = layui.form,
layer = layui.layer,
table = layui.table;
var tableIns= table.render({
elem: '#currentTableId',
url: '${pageContext.request.contextPath}/admin/dept/list',
toolbar: '#toolbarDemo',
cols: [[
{field: 'id', width: 200, title: '部门编号', align: "center"},
{field: 'deptName', minWidth: 200, title: '部门名称', align: "center"},
{field: 'address', minWidth: 200, title: '部门地址', align: "center"},
{field: 'createDate', minWidth: 200, title: '部门创建时间', align: "center"},
{field: 'remark', minWidth: 200, title: '备注', align: "center"},
{title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"}
]],
page: true,
done: function (res, curr, count) {
//判断当前页码是否是大于1并且当前页的数据量为0
if (curr > 1 && res.data.length == 0) {
var pageValue = curr - 1;
//刷新数据表格的数据
tableIns.reload({
page: {curr: pageValue}
});
}
}
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
//执行搜索重载
tableIns.reload( {
where:data.field,
page: {
curr: 1
}
});
return false;
});
/**
* toolbar监听事件
*/
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
console.log(obj);
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
break;
case "delete"://删除按钮
deleteById(obj.data);
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
/**
* 打开添加窗口
*/
function openAddWindow() {
mainIndex = layer.open({
type: 1,//打开类型
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "/admin/dept/addDept";
}
});
}
/**
* 打开修改窗口
* @param data 当前行的数据
*/
function openUpdateWindow(data) {
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1:lay-filter值 参数2:回显的数据
//修改的提交请求
url = "/admin/dept/updateDept";
}
});
}
/**
* 删除部门
* @param data 当前行数据
*/
function deleteById(data) {
//判断当前部门下是否存在员工
$.get("/admin/dept/checkDeptHasEmployee",{"id":data.id},function(result){
if(result.exist){
//提示用户无法删除
layer.msg(result.message);
}else{
//提示用户是否删除该部门
layer.confirm("确定要删除[<font color='red'>"+data.deptName+"</font>]", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("/admin/dept/deleteById",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
tableIns.reload();
}
//提示
layer.msg(result.message);
},"json");
layer.close(index);
});
}
},"json");
}
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
tableIns.reload();
//关闭窗口
layer.close(mainIndex);
}
//提示信息
layer.msg(result.message);
},"json");
//禁止页面刷新
return false;
});
});
</script>
</body>
</html>
DeptMapper
package com.wmz.Mapper;
import com.wmz.Pojo.Dept;
import com.wmz.vo.DeptVo;
import java.util.List;
public interface DeptMapper {
List<Dept> findDeptListByPage(DeptVo deptVo);
//添加部门
int addDept(Dept dept);
/**
* 修改部门
* @param dept
* @return
*/
int updateDept(Dept dept);
//删除部门
int deleteById(int id);
}
DeptService、DeptServiceImpl
package com.wmz.Service;
import com.wmz.Pojo.Dept;
import com.wmz.vo.DeptVo;
import java.util.List;
public interface DeptService {
List<Dept> findDeptListByPage(DeptVo deptVo);
// 添加部门
int addDept(Dept dept);
//修改部门
int updateDept(Dept dept);
//删除部门
int deleteById(int id);
}
package com.wmz.Service.impl;
import com.wmz.Mapper.DeptMapper;
import com.wmz.Pojo.Dept;
import com.wmz.Service.DeptService;
import com.wmz.vo.DeptVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service
@Transactional
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> findDeptListByPage(DeptVo deptVo) {
return deptMapper.findDeptListByPage(deptVo);
}
@Override
public int addDept(Dept dept) {
dept.setCreateDate(new Date());
return deptMapper.addDept(dept);
}
@Override
public int updateDept(Dept dept) {
return deptMapper.updateDept(dept);
}
@Override
public int deleteById(int id) {
return deptMapper.deleteById(id);
}
}
DeptController.java
package com.wmz.Controller.admin;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wmz.Pojo.Dept;
import com.wmz.Service.DeptService;
import com.wmz.Utils.DataGridViewResult;
import com.wmz.vo.DeptVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/admin/dept")
public class DeptController {
@Autowired
private DeptService deptService;
@RequestMapping("/list")
//查询部门列表
public DataGridViewResult list(DeptVo deptVo){
//分页信息
PageHelper.startPage(deptVo.getPage(),deptVo.getLimit());
//调用分页查询方法
List<Dept> deptList = deptService.findDeptListByPage(deptVo);
//分页对象
PageInfo<Dept> pageInfo=new PageInfo<Dept>(deptList);
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
}
//添加部门
@RequestMapping("/addDept")
public String addDept(Dept dept){
Map<String,Object> map = new HashMap<String,Object>();
//调用添加部门的方法
if(deptService.addDept(dept)>0){
map.put("success",true);//成功
map.put("message","添加成功");
}else{
map.put("success",false);//失败
map.put("message","添加失败");
}
//将map集合以JSON格式返回
return JSON.toJSONString(map);
}
//修改部门
@RequestMapping("/updateDept")
public String updateDept(Dept dept){
Map<String,Object> map = new HashMap<String,Object>();
if(deptService.updateDept(dept)>0){
map.put("success",true);//成功
map.put("message","修改成功");
}else{
map.put("success",false);//失败
map.put("message","修改失败");
}
//将map集合以JSON格式返回
return JSON.toJSONString(map);
}
/**
* 检查该部门下是否存在员工信息
* @param
* @return
*/
public String SelectEmployee(){
return null;
}
/**
* 删除部门
* @param id
* @return
*/
@RequestMapping("/deleteById")
public String deleteById(Integer id){
Map<String,Object> map = new HashMap<String,Object>();
//调用删除部门的方法
if(deptService.deleteById(id)>0){
map.put("success",true);//成功
map.put("message","删除成功");
}else{
map.put("success",false);//失败
map.put("message","删除失败");
}
return JSON.toJSONString(map);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这是执行sql语句的配置文件-->
<mapper namespace="com.wmz.Mapper.DeptMapper">
<select id="findDeptListByPage" resultType="com.wmz.Pojo.Dept">
select *from sys_dept
<where>
<if test="deptName !=null and deptName!=''">
and deptName like concat('%',#{deptName},'%')
</if>
</where>
</select>
<!-- 增-->
<insert id="addDept">
insert into sys_dept (deptName,address,createDate,remark) values(#{deptName},#{address},#{createDate},#{remark})
</insert>
<!-- 修改-->
<update id="updateDept">
update sys_dept
<set>
<if test="deptName!=null and deptName!=''">
deptName = #{deptName},
</if>
<if test="address !=null and address !=''">
address = #{address},
</if>
<if test="createDate !=null and createDate !=''">
createDate = #{createDate},
</if>
<if test="remark!=null and remark !=''">
remark = #{remark},
</if>
</set>
where id = #{id}
</update>
<delete id="deleteById">
delete from sys_dept where id = #{id}
</delete>
</mapper>