branch_gzs
gzs 9 months ago
parent 1a4a8514a6
commit a8bebbd591

File diff suppressed because one or more lines are too long

@ -1,209 +1,296 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置页面的内容类型为“text/html”即HTML格式页面并指定字符编码为“UTF-8”
确保页面中的字符能被正确解析和显示,避免出现乱码问题 -->
<html>
<head>
<meta charset="utf-8">
<title>酒店管理系统</title>
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<script src="../../js/layui/layui.js"></script>
<script src="../../js/jquery.js"></script>
<script src="../../js/global.js"></script>
<style>
body {
margin: 10px;
}
.layui-elem-field legend {
font-size: 14px;
}
.layui-field-title {
margin: 25px 0 15px;
}
</style>
</head>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”再次明确页面遵循的字符编码规范辅助浏览器准确读取页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏中,让用户知晓当前页面所属的系统名称 -->
<title>酒店管理系统</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示此样式适用于所有媒体类型,也就是在各种设备上都会应用该样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Font Awesome字体图标库的样式文件font-awesome.min.css用于在页面中使用各种图标
其路径为上级目录下的MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css -->
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<!-- 引入Layui框架的JavaScript脚本文件layui.js这是使用Layui框架各种功能和组件的基础
路径指向上级目录下的js/layui/layui.js -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等
方便简化JavaScript编程其路径为上级目录下的js/jquery.js -->
<script src="../../js/jquery.js"></script>
<!-- 引入自定义的全局JavaScript脚本文件global.js里面可能包含了整个系统页面通用的一些变量定义、函数等逻辑
路径为上级目录下的js/global.js -->
<script src="../../js/global.js"></script>
<style>
body {
// 设置页面主体body元素的外边距为10像素用于调整页面内容与浏览器边界的距离使页面布局更美观
margin: 10px;
}
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<input class="layui-input" id="AuthITEM" placeholder="权限名称">
</div>
<button class="layui-btn fa fa-search" id="searchAuthITEM"> 搜索</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-refresh" id="refresh"> 刷新</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-pencil-square-o " id="insertAuth"> 新增</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-save" id="toXls"> 导出</button>
</div>
.layui-elem-field legend {
// 设置具有layui-elem-field类的元素内的<legend>元素的字体大小为14像素用于规范这类元素内标题文字的显示大小
font-size: 14px;
}
.layui-field-title {
// 设置具有layui-field-title类的元素的外边距上外边距为25像素下外边距为15像素用于调整该元素在页面中的垂直间距使其布局更合理
margin: 25px 0 15px;
}
</style>
</head>
<body>
<!-- 创建一个<fieldset>元素应用类名“layui-elem-field layui-field-title”并通过内联样式设置上外边距为30像素
用于划分页面中的一个区域通常用于对相关内容进行分组展示结合Layui的样式类呈现出特定的外观效果 -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<!-- 创建一个输入框input元素应用类名“layui-input”设置其id为“AuthITEM”
placeholder属性设置提示文字为“权限名称”用于用户输入搜索关键词以查找相关的权限信息 -->
<input class="layui-input" id="AuthITEM" placeholder="权限名称">
</div>
</legend>
</fieldset>
<div id="toxlsTable">
<%--方法级渲染表格--%>
<table id="tableAuth"></table>
<!-- 创建一个按钮button元素应用类名“layui-btn fa fa-search”设置其id为“searchAuthITEM”文字为“搜索”
点击该按钮可触发搜索相关的功能其中“fa fa-search”类可能是来自Font Awesome图标库用于显示搜索图标 -->
<button class="layui-btn fa fa-search" id="searchAuthITEM"> 搜索</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-refresh”设置其id为“refresh”文字为“刷新”
点击该按钮可触发刷新页面数据等相关功能“fa fa-refresh”类用于显示刷新图标 -->
<button class="layui-btn fa fa-refresh" id="refresh"> 刷新</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-pencil-square-o ”设置其id为“insertAuth”文字为“新增”
点击该按钮可触发新增权限相关数据的功能“fa fa-pencil-square-o ”类用于显示编辑图标 -->
<button class="layui-btn fa fa-pencil-square-o " id="insertAuth"> 新增</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-save”设置其id为“toXls”文字为“导出”
点击该按钮可触发将数据导出为Excel文件等相关功能“fa fa-save”类用于显示保存图标 -->
<button class="layui-btn fa fa-save" id="toXls"> 导出</button>
</div>
</div>
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
/**
* 权限表 全部完成
* 2017.11.15 1:33
*/
layui.use(['util', 'layer', 'table'], function() {
$(document).ready(function() {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
//方法级渲染
var tableIns = table.render({
elem: '#tableAuth' //绑定元素-->对应页面table的ID
,
id: 'tableAuth' //表格容器索引
,
url: baseUrl + '/AuthInfoServlet' //数据接口
,
limit: 30,
cols: [
[ //表头
//field字段名、title标题名、width列宽、sort排序、fixed固定列、toolbar绑定工具条
{
field: 'authId',
title: 'ID',
width: 100,
sort: true,
fixed: true
}, {
field: 'authItem',
title: '权限名称'
}, {
field: 'isRead',
title: '可读'
}, {
field: 'isWrite',
title: '可写'
}, {
field: 'isChange',
title: '可改'
}, {
field: 'isDelete',
title: '可删'
}, {
field: 'right',
title: '管理',
align: 'center',
toolbar: '#barAuth',
width: 200
}
]
],
page: true //是否开启分页
,
where: {
make: 0
} //接口的其它参数
,
done: function(res, curr, count) {
countNum = count;
}
});
</legend>
</fieldset>
<!-- 创建一个id为“toxlsTable”的<div>元素,用于包裹下面的表格元素,可能作为后续对表格进行整体操作或布局调整的一个容器 -->
<div id="toxlsTable">
<!-- 这是一段HTML注释说明下面的<table>元素是采用方法级渲染表格的方式来进行后续操作,
此处只是先定义了一个空的表格其具体内容和样式等会通过JavaScript代码中的表格渲染方法来动态添加 -->
<%--方法级渲染表格--%>
<table id="tableAuth"></table>
</div>
<!-- 创建一个<script>标签设置其type属性为“text/html”并设置id为“barAuth”里面包含了一些HTML代码片段
通常用于作为Layui表格组件中工具栏的模板定义定义了“查看”“编辑”“删除”等操作按钮 -->
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
/**
* 权限表 全部完成
* 2017.11.15 1:33
* 这里可能是一个简单的注释说明,表示权限表相关功能的代码已全部完成,后面跟着的时间可能是完成代码编写或修改的时间记录
*/
// 使用Layui框架的模块加载机制加载'util'可能是Layui提供的工具模块、'layer'(用于弹出层等交互功能模块)、
// 'table'(用于表格相关操作的模块)这几个模块,并在加载完成后执行回调函数,在回调函数内进行页面的各种交互逻辑实现
layui.use(['util', 'layer', 'table'], function () {
// 当DOM文档加载完成后执行此回调函数确保页面元素都已加载完毕后再操作元素避免出现找不到元素等问题
$(document).ready(function () {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
// 方法级渲染表格操作使用Layui的表格模块table的render方法来渲染表格配置表格的各种属性
var tableIns = table.render({
// 指定表格渲染的DOM元素选择器这里选择id为“tableAuth”的元素即前面定义的空表格元素作为表格的挂载点
elem: '#tableAuth' //绑定元素-->对应页面table的ID
,
// 给表格设置一个唯一的id方便后续对表格进行一些操作如重新加载等这里设置为“tableAuth”与挂载点的id保持一致
id: 'tableAuth' //表格容器索引
,
// 设置表格数据的请求地址通过baseUrl应该是在全局脚本或其他地方定义的基础URL加上具体的Servlet路径来获取数据
// 这里请求的是权限信息相关的数据接口AuthInfoServlet
url: baseUrl + '/AuthInfoServlet' //数据接口
,
// 设置每页显示的数据条数为30条用于控制表格分页时每页的数据量
limit: 30,
cols: [
// 定义表格的列配置,每一个对象表示一列的相关属性设置
[ //表头
// 定义每列的相关属性包括field字段名一般与后端返回的数据字段对应用于绑定数据
// title标题名显示在表头位置让用户知道该列数据的含义、width列宽、sort排序设置该列可排序用户点击表头时可按照此列数据进行升序或降序排列
// fixed固定列设置该列固定在表格的某个位置不随滚动条滚动而移动常用于重要的、需要始终展示的列
// toolbar绑定工具条指定该列使用的工具栏模板用于显示操作按钮等属性
{
field: 'authId',
title: 'ID',
width: 100,
sort: true,
fixed: true
}, {
field: 'authItem',
title: '权限名称'
}, {
field: 'isRead',
title: '可读'
}, {
field: 'isWrite',
title: '可写'
}, {
field: 'isChange',
title: '可改'
}, {
field: 'isDelete',
title: '可删'
}, {
field: 'right',
title: '管理',
align: 'center',
toolbar: '#barAuth',
width: 200
}
]
],
// 设置表格开启分页功能Layui会自动处理分页相关的显示和交互逻辑
page: true //是否开启分页
,
// 设置向服务器请求数据时额外携带的参数这里设置“make”参数为0具体含义可能根据后端接口要求以及代码中的逻辑约定而定
// 一般用于区分不同的请求场景或操作类型等,此处可能表示正常加载数据的情况
where: {
make: 0
} //接口的其它参数
,
done: function (res, curr, count) {
// 在表格渲染完成且数据加载完毕后执行此回调函数将返回的数据总数赋值给countNum变量
// 可能用于后续其他地方统计或判断数据量等情况
countNum = count;
}
});
//监听工具条
table.on('tool', function(obj) { //tool是工具条事件名
var data = obj.data,
layEvent = obj.event; //获得 lay-event 对应的值
//从前当前行获取列数据
var authId = data.authId;
var authItem = data.authItem;
var isRead = data.isRead;
var isWrite = data.isWrite;
var isChange = data.isChange;
var isDelete = data.isDelete;
// 监听表格的工具条事件,当用户点击表格中的操作按钮(如“查看”“编辑”“删除”等)时触发相应的逻辑处理,
// 'tool'是Layui表格组件中定义的工具条事件名通过这个监听可以获取到用户点击的按钮对应的事件以及相关数据等信息
table.on('tool', function (obj) { //tool是工具条事件名
var data = obj.data,
layEvent = obj.event; //获得 lay-event 对应的值
// 从当前行的数据对象data中获取“authId”字段的值赋值给变量authId
// 一般用于后续操作中传递该条权限记录的唯一标识,比如编辑、删除操作时需要告诉后端要操作哪条权限记录
var authId = data.authId;
// 从当前行的数据对象获取“authItem”字段的值赋值给变量authItem用于后续可能涉及该权限名称相关的操作等情况
var authItem = data.authItem;
// 类似地获取“isRead”字段的值用于后续操作中对可读权限等级相关的处理
var isRead = data.isRead;
// 获取“isWrite”字段的值用于可写权限等级相关操作
var isWrite = data.isWrite;
// 获取“isChange”字段的值用于可改权限等级相关操作
var isChange = data.isChange;
// 获取“isDelete”字段的值用于可删权限等级相关操作
var isDelete = data.isDelete;
if(layEvent === 'detail') { //查看功能
layer.alert('权限项:' + data.authItem + '<br>最低可读权限等级:' + data.isRead + '<br>最低可写权限等级:' +
data.isWrite + '<br>最低可改权限等级:' + data.isChange + '<br>最低可删权限等级:' + data.isDelete, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的权限值信息',
anim: 4,
offset: '180px'
});
if (layEvent === 'detail') { //查看功能
// 当点击“查看”按钮时使用Layui的layer模块的alert方法弹出一个提示框显示该条权限数据的详细信息
// 包括权限项名称、各个权限等级(可读、可写、可改、可删)等字段的值,设置提示框的样式、标题、关闭按钮显示、动画效果、垂直偏移位置等属性
layer.alert('权限项:' + data.authItem + '<br>最低可读权限等级:' + data.isRead + '<br>最低可写权限等级:' +
data.isWrite + '<br>最低可改权限等级:' + data.isChange + '<br>最低可删权限等级:' + data.isDelete, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的权限值信息',
anim: 4,
offset: '180px'
});
} else if(layEvent === 'del') { //删除功能
layer.alert('本条目禁止删除!', {
title: '警告',
icon: 4,
anim: 6,
offset: '250px'
});
} else if (layEvent === 'del') { //删除功能
// 当点击“删除”按钮时使用Layui的layer模块的alert方法弹出一个警告框提示用户本条目禁止删除
// 设置警告框的标题、图标、动画效果、垂直偏移位置等属性,告知用户不能执行删除操作
layer.alert('本条目禁止删除!', {
title: '警告',
icon: 4,
anim: 6,
offset: '250px'
});
} else if(layEvent === 'edit') { //编辑功能
//layer.prompt(options, yes) - 输入层
//formType:输入框类型支持0文本默认1密码2多行文本 maxlength: 140, //可输入文本的最大长度默认500
} else if (layEvent === 'edit') { //编辑功能
// 编辑功能逻辑首先弹出一个输入框使用Layui的layer模块的prompt方法用于让用户输入最低可读权限等级
// 设置输入框的标题、类型formType为0表示文本输入框、初始值使用当前行获取的isRead值作为默认值、位置、最大输入长度等属性
// 用户输入完成并点击确认后会执行相应的回调函数回调函数中可以获取用户输入的值IsRead进行后续处理
layer.prompt({
title: '请输入最低可读权限等级',
formType: 0,
value: isRead,
offset: '220px',
maxlength: 1
}, function (IsRead, index) {
layer.close(index);
// 关闭上一个输入框弹出层后,再弹出一个输入框,用于让用户输入最低可写权限等级,同样设置相关属性,
// 初始值为当前行的isWrite值用户确认输入后执行回调函数获取输入的值IsWrite
layer.prompt({
title: '请输入最低可写权限等级',
formType: 0,
value: isWrite,
offset: '220px',
maxlength: 1
}, function (IsWrite, index) {
layer.close(index);
// 继续弹出输入框用于输入最低可改权限等级设置属性并获取用户输入的值IsChange
layer.prompt({
title: '请输入最低可读权限等级',
title: '请输入最低可权限等级',
formType: 0,
value: isRead,
value: isChange,
offset: '220px',
maxlength: 1
}, function(IsRead, index) {
}, function (IsChange, index) {
layer.close(index);
// 再次弹出输入框用于输入最低可删权限等级设置属性并获取用户输入的值IsDelete
layer.prompt({
title: '请输入最低可写权限等级',
title: '请输入最低可权限等级',
formType: 0,
value: isWrite,
value: isDelete,
offset: '220px',
maxlength: 1
}, function(IsWrite, index) {
}, function (IsDelete, index) {
layer.close(index);
layer.prompt({
title: '请输入最低可改权限等级',
formType: 0,
value: isChange,
offset: '220px',
maxlength: 1
}, function(IsChange, index) {
layer.close(index);
layer.prompt({
title: '请输入最低可改权限等级',
formType: 0,
value: isDelete,
offset: '220px',
maxlength: 1
}, function(IsDelete, index) {
layer.close(index);
//isNaN() 函数用于检查其参数是否是非数字值,如果是数字返回true
if(isNaN(IsRead) || isNaN(IsWrite) || isNaN(IsChange) || isNaN(IsDelete)) {
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else { //传数据
table.reload('tableAuth', {
where: {
make: 2,
authId: authId,
authItem: authItem,
isRead: IsRead,
isWrite: IsWrite,
isChange: IsChange,
isDelete: IsDelete
}
});
layer.msg('修改成功', {
offset: '250px'
});
// 使用isNaN函数判断用户输入的各个权限等级值IsRead、IsWrite、IsChange、IsDelete是否为非数字值
// 如果有任何一个是非数字值,则执行以下逻辑,弹出提示框告知用户输入的值类型不合法,设置提示框的位置属性
if (isNaN(IsRead) || isNaN(IsWrite) || isNaN(IsChange) || isNaN(IsDelete)) {
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else { //传数据
// 如果用户输入的所有权限等级值都是数字类型(合法数字),则执行以下逻辑,
// 使用之前定义的表格实例tableIns的reload方法重新加载表格数据通过where属性设置向服务器传递的参数
// 包括操作
table.reload('tableAuth', {
// 使用Layui的表格table模块的reload方法重新加载id为“tableAuth”的表格数据
// 通过传入的配置对象的where属性来设置向服务器传递的参数以告知服务器此次操作的相关条件及要更新的数据等信息
where: {
// 设置操作类型参数“make”为2根据前面代码中的约定可能是与后端协商好的规则此值代表修改操作
// 用于告知后端此次是对表格数据进行修改相关的请求
make: 2,
// 将当前行获取到的权限记录的唯一标识“authId”传递给后端后端可依据此标识准确找到要修改的对应权限记录
// 确保修改操作作用在正确的数据行上
authId: authId,
// 传递当前权限记录的权限名称“authItem”可能后端需要接收此名称来判断唯一性或者用于更新对应的数据字段等操作
// 具体取决于后端的业务逻辑实现
authItem: authItem,
// 传递用户新输入的最低可读权限等级值“IsRead”给后端后端会用此新值更新对应权限记录中的可读权限等级字段
// 实现数据的修改更新
isRead: IsRead,
// 传递用户输入的最低可写权限等级值“IsWrite”给后端用于更新对应记录的可写权限等级字段
isWrite: IsWrite,
// 传递用户输入的最低可改权限等级值“IsChange”给后端以更新相应的可改权限等级字段内容
isChange: IsChange,
// 传递用户输入的最低可删权限等级值“IsDelete”给后端使后端能更新对应权限记录的可删权限等级字段数据
isDelete: IsDelete
}
});
// 使用Layui的layer模块的msg方法弹出一个提示消息框显示文字“修改成功”告知用户此次权限数据的修改操作已成功完成
// 并通过配置对象设置提示框的垂直偏移位置为距离顶部250px确定提示框在页面中的显示位置
layer.msg('修改成功', {
offset: '250px'
});
}
});
});
@ -212,70 +299,94 @@
}
});
//刷新
$('#refresh').click(function() {
tableIns.reload({
where: {
make: 0,
page: 1
}
});
});
//新增
$('#insertAuth').click(function() {
layer.alert('本条目禁止新增!', {
title: '警告',
icon: 4,
anim: 6,
offset: '250px'
});
});
// 刷新功能逻辑为id为“refresh”的元素即页面中的刷新按钮绑定点击事件处理函数当按钮被点击时执行以下操作
$('#refresh').click(function() {
// 使用之前定义的表格实例tableIns的reload方法重新加载表格数据通过设置相关参数make为0page为1来刷新表格展示内容
// 这里“make”参数为0可能表示正常的重载数据操作按照代码中的约定逻辑page为1表示重新加载第一页的数据实现刷新页面表格数据的功能
tableIns.reload({
where: {
make: 0,
page: 1
}
});
});
//搜索权限项目
$('#searchAuthITEM').click(function() {
var authItem = $('#AuthITEM').val();
if(authItem === "")
layer.msg('您必须输入值', {
offset: '250px'
});
else if(authItem.length > 10)
layer.msg('您所输入的值长度不合法', {
offset: '250px'
});
else {
layer.msg('搜索结果', {
offset: '250px'
});
//与tableIns.reload方法类似这种方法是取表格容器索引值
table.reload('tableAuth', {
where: {
make: 3,
authItem: authItem
}
});
}
// 新增功能逻辑为id为“insertAuth”的元素即页面中的新增按钮绑定点击事件处理函数当按钮被点击时执行以下操作
$('#insertAuth').click(function() {
// 使用Layui的layer模块的alert方法弹出一个警告框显示文字“本条目禁止新增告知用户当前不允许进行新增权限条目的操作
// 同时设置警告框的标题为“警告”图标为4一般对应警告相关的图标样式由Layui框架定义动画效果为6垂直偏移位置为距离顶部250px
layer.alert('本条目禁止新增!', {
title: '警告',
icon: 4,
anim: 6,
offset: '250px'
});
});
// 搜索权限项目功能逻辑为id为“searchAuthITEM”的元素即页面中的搜索权限项目按钮绑定点击事件处理函数当按钮被点击时执行以下操作
$('#searchAuthITEM').click(function() {
// 获取id为“AuthITEM”的输入框元素的值即用户输入的搜索关键词也就是权限名称相关内容并赋值给变量authItem
// 用于后续对用户输入内容的合法性判断以及作为搜索条件传递给后端进行数据查询等操作
var authItem = $('#AuthITEM').val();
if (authItem === "") {
// 判断用户输入的搜索关键词authItem是否为空字符串如果是空字符串则执行以下操作
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您必须输入值”提示用户必须输入内容才能进行搜索操作
// 并设置提示框的垂直偏移位置为距离顶部250px
layer.msg('您必须输入值', {
offset: '250px'
});
//导出
$('#toXls').click(function() {
location.href = baseUrl + '/AuthInfoExcelServlet';
layer.alert('Excel文件生成完成', {
title: '成功',
icon: 6,
anim: 1,
offset: '250px'
});
} else if (authItem.length > 10) {
// 如果用户输入的搜索关键词长度大于10个字符则执行以下操作
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您所输入的值长度不合法”提示用户输入的搜索内容长度不符合要求
// 并设置提示框的垂直偏移位置为距离顶部250px
layer.msg('您所输入的值长度不合法', {
offset: '250px'
});
//固定块 -- 就是那个回到顶部
util.fixbar({
showHeight: 2,
click: function(type) {
console.log(type);
} else {
// 如果用户输入的搜索关键词不为空且长度合法小于等于10个字符则执行以下操作
// 先使用Layui的layer模块的msg方法弹出提示消息框显示文字“搜索结果”告知用户即将展示搜索结果
// 并设置提示框的垂直偏移位置为距离顶部250px
layer.msg('搜索结果', {
offset: '250px'
});
// 使用Layui的表格table模块的reload方法重新加载id为“tableAuth”的表格数据
// 通过配置对象的where属性设置向服务器传递的参数将“make”参数设置为3按照代码约定可能代表搜索操作
// 并将用户输入的权限名称authItem传递给后端让后端根据此条件查询符合要求的数据并返回更新表格展示内容实现搜索功能
table.reload('tableAuth', {
where: {
make: 3,
authItem: authItem
}
});
}
});
// 导出功能逻辑为id为“toXls”的元素即页面中的导出按钮绑定点击事件处理函数当按钮被点击时执行以下操作
$('#toXls').click(function() {
// 通过修改浏览器的location.href属性跳转到“baseUrl + '/AuthInfoExcelServlet'”这个地址,
// 一般是向服务器端发起请求让服务器端执行生成Excel文件的相关逻辑比如从数据库获取权限数据并整理成Excel格式返回给浏览器端下载等操作
location.href = baseUrl + '/AuthInfoExcelServlet';
// 使用Layui的layer模块的alert方法弹出一个提示消息框显示文字“Excel文件生成完成告知用户Excel文件已经成功生成
// 并设置提示框的标题为“成功”图标为6一般对应成功的图标样式由Layui框架定义动画效果为1也是由Layui框架定义的某种动画展示方式
// 垂直偏移位置为距离顶部250px方便用户知晓操作结果并进行后续的保存等相关操作
layer.alert('Excel文件生成完成', {
title: '成功',
icon: 6,
anim: 1,
offset: '250px'
});
});
// 固定块功能逻辑使用Layui的util模块的fixbar方法创建一个回到页面顶端的功能组件通过传入配置对象来设置相关属性和行为
util.fixbar({
// 设置显示高度相关的参数为2具体含义由Layui框架定义可能与组件在页面中何时显示或者显示的具体高度等条件相关
showHeight: 2,
click: function(type) {
// 为回到顶端功能组件的点击事件设置回调函数当用户点击该组件时会接收到一个参数type具体含义由Layui框架定义可能与点击的具体位置等相关
// 此处只是简单地将接收到的type参数打印到浏览器的控制台一般用于调试目的查看点击操作传递的相关信息
console.log(type);
}
});
});
});
</script>

@ -1,272 +1,262 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置页面的内容类型为“text/html”即HTML格式页面并指定字符编码为“UTF-8”
确保页面中的字符能被正确解析和显示,避免出现乱码问题 -->
<html>
<head>
<meta charset="utf-8">
<title>酒店管理系统</title>
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<script src="../../js/layui/layui.js"></script>
<script src="../../js/jquery.js"></script>
<script src="../../js/global.js"></script>
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
<style>
body {
margin: 10px;
}
.layui-elem-field legend {
font-size: 14px;
}
.layui-field-title {
margin: 25px 0 15px;
}
</style>
</head>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”再次明确页面遵循的字符编码规范辅助浏览器准确读取页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏中,让用户知晓当前页面所属的系统名称 -->
<title>酒店管理系统</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示此样式适用于所有媒体类型,也就是在各种设备上都会应用该样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Font Awesome字体图标库的样式文件font-awesome.min.css用于在页面中使用各种图标
其路径为上级目录下的MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css -->
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<!-- 引入Layui框架的JavaScript脚本文件layui.js这是使用Layui框架各种功能和组件的基础
路径指向上级目录下的js/layui/layui.js -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等
方便简化JavaScript编程其路径为上级目录下的js/jquery.js -->
<script src="../../js/jquery.js"></script>
<!-- 引入自定义的全局JavaScript脚本文件global.js里面可能包含了整个系统页面通用的一些变量定义、函数等逻辑
路径为上级目录下的js/global.js -->
<script src="../../js/global.js"></script>
<!-- 引入处理Excel相关功能的JavaScript库xlsx.full.min.js可能用于后续将数据导出为Excel等操作
其路径指向上级目录下的js/toExcel/xlsx.full.min.js -->
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<!-- 引入FileSaver.js脚本文件该文件通常用于在浏览器端实现文件保存功能
比如配合前面的Excel库将生成的Excel文件保存到本地其路径为上级目录下的js/toExcel/FileSaver.js -->
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<!-- 引入自定义的用于导出数据到Excel的脚本文件Export2Excel.js里面应该包含了具体的导出逻辑和相关功能实现
其路径为上级目录下的js/toExcel/Export2Excel.js -->
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
<style>
body {
// 设置页面主体body元素的外边距为10像素用于调整页面内容与浏览器边界的距离使页面布局更美观
margin: 10px;
}
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<input class="layui-input" id="inputSearch" placeholder="楼层名称">
</div>
<button class="layui-btn fa fa-search" id="searchButton"> 搜索</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-refresh" id="refreshButton"> 刷新</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-pencil-square-o " id="insertButton"> 新增</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-save" id="toXlsButton"> 导出</button>
</div>
.layui-elem-field legend {
// 设置具有layui-elem-field类的元素内的<legend>元素的字体大小为14像素用于规范这类元素内标题文字的显示大小
font-size: 14px;
}
.layui-field-title {
// 设置具有layui-field-title类的元素的外边距上外边距为25像素下外边距为15像素用于调整该元素在页面中的垂直间距使其布局更合理
margin: 25px 0 15px;
}
</style>
</head>
<body>
<!-- 创建一个<fieldset>元素应用类名“layui-elem-field layui-field-title”并通过内联样式设置上外边距为30像素
用于划分页面中的一个区域通常用于对相关内容进行分组展示结合Layui的样式类呈现出特定的外观效果 -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<!-- 创建一个输入框input元素应用类名“layui-input”设置其id为“inputSearch”
placeholder属性设置提示文字为“楼层名称”用于用户输入搜索关键词以查找相关的楼层信息 -->
<input class="layui-input" id="inputSearch" placeholder="楼层名称">
</div>
</legend>
</fieldset>
<div id="toxlsTable">
<table id="tableID"></table>
<!-- 创建一个按钮button元素应用类名“layui-btn fa fa-search”设置其id为“searchButton”文字为“搜索”
点击该按钮可触发搜索相关的功能其中“fa fa-search”类可能是来自Font Awesome图标库用于显示搜索图标 -->
<button class="layui-btn fa fa-search" id="searchButton"> 搜索</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-refresh”设置其id为“refreshButton”文字为“刷新”
点击该按钮可触发刷新页面数据等相关功能“fa fa-refresh”类用于显示刷新图标 -->
<button class="layui-btn fa fa-refresh" id="refreshButton"> 刷新</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-pencil-square-o ”设置其id为“insertButton”文字为“新增”
点击该按钮可触发新增楼层相关数据的功能“fa fa-pencil-square-o ”类用于显示编辑图标 -->
<button class="layui-btn fa fa-pencil-square-o " id="insertButton"> 新增</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-save”设置其id为“toXlsButton”文字为“导出”
点击该按钮可触发将数据导出为Excel文件等相关功能“fa fa-save”类用于显示保存图标 -->
<button class="layui-btn fa fa-save" id="toXlsButton"> 导出</button>
</div>
</div>
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
/**
* 公共模板部分,自制模板修改
* 规定make 0重载 1新增 2修改 3搜索 4删除
*
* 这个模板来自权限表的jsp与js,因为大体类似,前端可以参照同一结构
* 一些变量名换成了与具体项无关的名称,需要修改的部分通过注释注明
* 原注释可以参考最初的版本 : AuthTable.jsp
*/
</legend>
</fieldset>
<!-- 创建一个id为“toxlsTable”的<div>元素,用于包裹下面的表格元素,可能作为后续对表格进行整体操作或布局调整的一个容器 -->
<div id="toxlsTable">
<!-- 创建一个空的<table>元素设置其id为“tableID”后续会通过JavaScript代码动态渲染表格内容并填充数据到这个表格中 -->
<table id="tableID"></table>
</div>
<!-- 创建一个<script>标签设置其type属性为“text/html”并设置id为“barAuth”里面包含了一些HTML代码片段
通常用于作为Layui表格组件中工具栏的模板定义定义了“查看”“编辑”“删除”等操作按钮 -->
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
/**
* 公共模板部分,自制模板修改
* 规定make 0重载 1新增 2修改 3搜索 4删除
*
* 这个模板来自权限表的jsp与js,因为大体类似,前端可以参照同一结构
* 一些变量名换成了与具体项无关的名称,需要修改的部分通过注释注明
* 原注释可以参考最初的版本 : AuthTable.jsp
*/
layui.use(['util', 'layer', 'table'], function() {
$(document).ready(function() {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
var tableIns = table.render({
elem: '#tableID',
id: 'tableID',
url: baseUrl + '/FloorInfoServlet',
cols: [
[{
field: 'floorId',
title: 'ID',
width: 100,
sort: true,
fixed: true
}, {
field: 'floorName',
title: '楼层名称'
}, {
field: 'right',
title: '管理',
align: 'center',
toolbar: '#barAuth',
width: 200
}]
],
page: true,
where: {
make: 0
},
done: function(res, curr, count) {
countNum = count;
}
});
// 使用Layui框架的模块加载机制加载'util'可能是Layui提供的工具模块、'layer'(用于弹出层等交互功能模块)、
// 'table'(用于表格相关操作的模块)这几个模块,并在加载完成后执行回调函数,在回调函数内进行页面的各种交互逻辑实现
layui.use(['util', 'layer', 'table'], function () {
// 当DOM文档加载完成后执行此回调函数确保页面元素都已加载完毕后再操作元素避免出现找不到元素等问题
$(document).ready(function () {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
//监听工具条
table.on('tool', function(obj) {
var data = obj.data,
layEvent = obj.event;
var floorId = data.floorId;
var floorName = data.floorName;
// 使用Layui的表格模块table的render方法来渲染表格配置表格的各种属性
var tableIns = table.render({
// 指定表格渲染的DOM元素选择器这里选择id为“tableID”的元素即前面定义的空表格元素作为表格的挂载点
elem: '#tableID',
// 给表格设置一个唯一的id方便后续对表格进行一些操作如重新加载等这里设置为“tableID”与挂载点的id保持一致
id: 'tableID',
// 设置表格数据的请求地址通过baseUrl应该是在全局脚本或其他地方定义的基础URL加上具体的Servlet路径来获取数据
// 这里请求的是楼层信息相关的数据接口FloorInfoServlet
url: baseUrl + '/FloorInfoServlet',
cols: [
// 定义表格的列配置,每一个对象表示一列的相关属性设置
[{
// 设置列对应的字段名称为“floorId”一般与后端返回的数据字段对应用于绑定数据这里表示楼层的ID
field: 'floorId',
// 设置列的标题为“ID”显示在表头位置让用户知道该列数据的含义
title: 'ID',
// 设置该列的宽度为100像素用于控制表格列的显示宽度
width: 100,
// 设置该列可排序,用户点击表头时可按照此列数据进行升序或降序排列
sort: true,
// 设置该列固定在表格左侧,不随滚动条滚动而移动,常用于重要的、需要始终展示的列
fixed: true
}, {
field: 'floorName',
title: '楼层名称'
}, {
field: 'right',
title: '管理',
align: 'center',
// 指定该列使用的工具栏模板这里使用前面定义的id为“barAuth”的模板用于显示操作按钮
toolbar: '#barAuth',
width: 200
}]
],
// 设置表格开启分页功能Layui会自动处理分页相关的显示和交互逻辑
page: true,
// 设置向服务器请求数据时额外携带的参数这里设置“make”参数为0具体含义根据注释中的规定是用于重载数据
// 一般用于区分不同的请求场景或操作类型等
where: {
make: 0
},
done: function (res, curr, count) {
// 在表格渲染完成且数据加载完毕后执行此回调函数将返回的数据总数赋值给countNum变量
// 可能用于后续其他地方统计或判断数据量等情况
countNum = count;
}
});
if(layEvent === 'detail') { //查看功能
layer.alert('ID' + floorId + '<br>楼层名称:' + floorName, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的楼层值信息',
anim: 4,
offset: '180px'
});
} else if(layEvent === 'del') {
layer.confirm('您确定要删除该条数据吗?', {
offset: '180px',
btn: ['是滴', '手滑']
}, function() {
table.reload('tableID', {
where: {
make: 4,
floorId: floorId
}
});
layer.msg('删除结果如下', {
offset: '250px',
icon: 1
});
}, function() {
layer.msg('删除操作已取消', {
offset: '250px'
});
});
} else if(layEvent === 'edit') {
layer.prompt({
title: '请输入楼层名称',
formType: 0,
value: floorName,
offset: '220px',
maxlength: 10
}, function(value, index) {
var params = "new=" + value + "&old=" + floorName;
$.post(baseUrl + '/QueryFloorNameServlet', params, function updateCheck(data) {
if(data === "1" || data === "2") {
layer.close(index);
table.reload('tableID', {
where: {
make: 2,
floorId: floorId,
floorName: value
}
});
layer.msg('修改结果如下', {
offset: '250px'
});
} else {
layer.alert('该楼层名称已经存在!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
});
}
});
});
}
});
// 监听表格的工具条事件,当用户点击表格中的操作按钮(如“查看”“编辑”“删除”等)时触发相应的逻辑处理,
// 'tool'是Layui表格组件中定义的工具条事件名通过这个监听可以获取到用户点击的按钮对应的事件以及相关数据等信息
table.on('tool', function (obj) {
var data = obj.data,
layEvent = obj.event;
var floorId = data.floorId;
var floorName = data.floorName;
//搜索
$('#searchButton').click(function() {
var inputTxt = $('#inputSearch').val();
if(inputTxt === "")
layer.msg('您必须输入值', {
offset: '250px'
});
else if(inputTxt.length > 10)
layer.msg('您所输入的值长度不合法', {
offset: '250px'
});
else {
tableIns.reload({
where: {
make: 3,
floorName: inputTxt
}
});
layer.msg('搜索结果', {
offset: '250px'
});
}
if (layEvent === 'detail') { //查看功能
// 当点击“查看”按钮时使用Layui的layer模块的alert方法弹出一个提示框显示该条楼层数据的详细信息
// 包括ID、楼层名称等字段的值设置提示框的样式、标题、关闭按钮显示、动画效果、垂直偏移位置等属性
layer.alert('ID' + floorId + '<br>楼层名称:' + floorName, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的楼层值信息',
anim: 4,
offset: '180px'
});
//刷新
$('#refreshButton').click(function() {
tableIns.reload({
} else if (layEvent === 'del') {
// 当点击“删除”按钮时使用Layui的layer模块的confirm方法弹出一个确认框询问用户是否确定要删除该条数据
// 设置确认框的位置、按钮文字等属性,用户点击不同按钮会执行相应的回调函数
layer.confirm('您确定要删除该条数据吗?', {
offset: '180px',
btn: ['是滴', '手滑']
}, function () {
// 如果用户点击“是滴”按钮重新加载表格数据通过设置“make”参数为4以及传递要删除的记录的“floorId”
// 向后端发送请求,让后端执行删除操作并更新表格数据,这里应该是与后端约定好的参数传递和操作逻辑
table.reload('tableID', {
where: {
make: 0,
page: 1
make: 4,
floorId: floorId
}
});
});
//新增
$('#insertButton').click(function() {
layer.prompt({
title: '请输入楼层名称',
formType: 0,
offset: '220px',
maxlength: 10
}, function(inputValue, index) {
var params = "new=" + inputValue + "&old=" + inputValue;
$.post(baseUrl + '/QueryFloorNameServlet', params, function(data) {
if(data === "1") {
layer.close(index);
table.reload('tableID', {
where: {
make: 1,
floorName: inputValue
}
});
layer.msg('新增楼层成功', {
offset: '250px'
});
tableIns.reload({
where: {
make: 0
}
});
} else {
layer.alert('该楼层名称已经存在!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
});
}
});
// 弹出一个提示框使用Layui的layer模块的msg方法告知用户删除操作的结果设置提示框的位置、图标等属性
layer.msg('删除结果如下', {
offset: '250px',
icon: 1
});
});
//导出
$('#toXlsButton').click(function() {
location.href = baseUrl + '/FloorInfoExcelServlet';
layer.alert('Excel文件生成完成', {
title: '成功',
icon: 6,
anim: 1,
}, function () {
// 如果用户点击“手滑”按钮(即取消删除操作),弹出一个提示框告知用户删除操作已取消,设置提示框的位置属性
layer.msg('删除操作已取消', {
offset: '250px'
});
});
//回到顶端
util.fixbar({
showHeight: 2,
click: function(type) {
console.log(type);
}
} else if (layEvent === 'edit') {
// 编辑功能逻辑弹出一个输入框使用Layui的layer模块的prompt方法让用户输入修改后的楼层名称
// 设置输入框的标题、类型、初始值、位置、最大输入长度等属性,用户输入完成并点击确认后会执行相应的回调函数,
// 回调函数中可以获取用户输入的值进行后续处理
layer.prompt({
title: '请输入楼层名称',
formType: 0,
value: floorName,
offset: '220px',
maxlength: 10
}, function (value, index) {
var params = "new=" + value + "&old=" + floorName;
// 使用jQuery的$.post方法向服务器发送POST请求请求地址为baseUrl加上'/QueryFloorNameServlet'
// 传递参数params包含新的楼层名称和旧的楼层名称等信息并在请求成功后执行回调函数这里命名为updateCheck处理返回的数据
$.post(baseUrl + '/QueryFloorNameServlet', params, function updateCheck(data) {
if (data === "1" || data === "2") {
layer.close(index);
// 如果服务器返回的数据为“1”或“2”表示修改操作可以进行重新加载表格数据
// 通过设置“make”参数为2以及传递要修改的记录的“floorId”和新的“floorName”用户输入的值
// 向后端发送请求,让后端执行修改操作并更新表格数据
table.reload('tableID', {
where: {
make: 2,
floorId: floorId,
floorName: value
}
});
// 弹出一个提示框告知用户修改结果,设置提示框的位置属性
layer.msg('修改结果如下', {
offset: '250px'
});
} else {
// 如果服务器返回的数据不是“1”或“2”表示该楼层名称已经存在弹出一个警告框使用Layui的layer模块的alert方法
// 提示用户该楼层名称已存在,设置警告框的标题、图标、动画效果、位置等属性
layer.alert('该楼层名称已经存在!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
});
}
});
});
});
}
});
</script>
</body>
</html>
// 搜索功能逻辑为id为“searchButton”的元素即页面中的搜索按钮绑定点击事件处理函数当按钮被点击时执行以下逻辑
// 先获取id为“inputSearch”的输入框元素的值即用户输入的搜索关键词内容赋值给变量inputTxt用于后续判断和操作
$('#searchButton').click(function () {
var inputTxt = $('#inputSearch').val();
if (inputTxt === "") {
// 判断用户输入的搜索关键词是否为空字符串如果是则使用L

@ -1,64 +1,100 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置页面的内容类型为“text/html”即HTML格式页面并指定字符编码为“UTF-8”
确保页面中的字符能被正确解析和显示,避免出现乱码问题 -->
<html>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”再次明确页面遵循的字符编码规范辅助浏览器准确读取页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏中,让用户知晓当前页面所属的系统名称 -->
<title>酒店管理系统</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示此样式适用于所有媒体类型,也就是在各种设备上都会应用该样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Font Awesome字体图标库的样式文件font-awesome.min.css用于在页面中使用各种图标
其路径为上级目录下的MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css -->
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<!-- 引入Layui框架的JavaScript脚本文件layui.js这是使用Layui框架各种功能和组件的基础
路径指向上级目录下的js/layui/layui.js -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等
方便简化JavaScript编程其路径为上级目录下的js/jquery.js -->
<script src="../../js/jquery.js"></script>
<!-- 引入自定义的全局JavaScript脚本文件global.js里面可能包含了整个系统页面通用的一些变量定义、函数等逻辑
路径为上级目录下的js/global.js -->
<script src="../../js/global.js"></script>
<style>
body {
margin: 10px;
// 设置页面主体body元素的外边距为10像素用于调整页面内容与浏览器边界的距离使页面布局更美观
margin: 10px;
}
.layui-elem-field legend {
font-size: 14px;
// 设置具有layui-elem-field类的元素内的<legend>元素的字体大小为14像素用于规范这类元素内标题文字的显示大小
font-size: 14px;
}
.layui-field-title {
margin: 25px 0 15px;
// 设置具有layui-field-title类的元素的外边距上外边距为25像素下外边距为15像素用于调整该元素在页面中的垂直间距使其布局更合理
margin: 25px 0 15px;
}
</style>
</head>
<body>
<!-- 创建一个<fieldset>元素应用类名“layui-elem-field layui-field-title”并通过内联样式设置上外边距为30像素
用于划分页面中的一个区域通常用于对相关内容进行分组展示结合Layui的样式类呈现出特定的外观效果 -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<!-- 创建一个按钮button元素应用类名“layui-btn fa fa-save”设置其id为“toXls”文字为“导出当前数据”
点击该按钮可触发将当前页面表格数据导出为Excel文件等相关功能“fa fa-save”类用于显示保存图标 -->
<button class="layui-btn fa fa-save" id="toXls"> 导出当前数据</button>
</div>
</div>
</legend>
</fieldset>
<!-- 这是一段HTML注释说明下面的<table>元素是采用方法级渲染表格的方式来进行后续操作,
此处只是先定义了一个空的表格其具体内容和样式等会通过JavaScript代码中的表格渲染方法来动态添加 -->
<%--方法级渲染表格--%>
<table id="tableLogInfo"></table>
<!-- 创建一个<script>标签设置其type属性为“text/html”并设置id为“barAuth”里面包含了一些HTML代码片段
通常用于作为Layui表格组件中工具栏的模板定义这里定义了一个“删除”操作按钮 -->
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
// 使用Layui框架的模块加载机制加载'util'可能是Layui提供的工具模块、'layer'(用于弹出层等交互功能模块)、
// 'table'(用于表格相关操作的模块)这几个模块,并在加载完成后执行回调函数,在回调函数内进行页面的各种交互逻辑实现
layui.use(['util', 'layer', 'table'], function () {
// 当DOM文档加载完成后执行此回调函数确保页面元素都已加载完毕后再操作元素避免出现找不到元素等问题
$(document).ready(function () {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
//方法级渲染
// 方法级渲染表格操作使用Layui的表格模块table的render方法来渲染表格配置表格的各种属性
var tableIns = table.render({
// 指定表格渲染的DOM元素选择器这里选择id为“tableLogInfo”的元素即前面定义的空表格元素作为表格的挂载点
elem: '#tableLogInfo' //绑定元素-->对应页面table的ID
,
// 给表格设置一个唯一的id方便后续对表格进行一些操作如重新加载等这里设置为“tableLogInfo”与挂载点的id保持一致
id: 'tableLogInfo' //表格容器索引
,
// 设置表格数据的请求地址通过baseUrl应该是在全局脚本或其他地方定义的基础URL加上具体的Servlet路径来获取数据
url: baseUrl + '/LogInfoServlet' //数据接口
,
// 设置每页显示的数据条数为30条用于控制表格分页时每页的数据量
limit: 30,
cols: [
// 定义表格的列配置,每一个对象表示一列的相关属性设置
[ //表头
//field字段名、title标题名、width列宽、sort排序、fixed固定列、toolbar绑定工具条
// 定义每列的相关属性包括field字段名一般与后端返回的数据字段对应用于绑定数据
// title标题名显示在表头位置让用户知道该列数据的含义、width列宽、sort排序设置该列可排序用户点击表头时可按照此列数据进行升序或降序排列
// fixed固定列设置该列固定在表格的某个位置不随滚动条滚动而移动常用于重要的、需要始终展示的列
// toolbar绑定工具条指定该列使用的工具栏模板用于显示操作按钮等属性
{
field: 'logId',
title: '日志编号',
@ -90,39 +126,53 @@
}
]
],
// 设置表格开启分页功能Layui会自动处理分页相关的显示和交互逻辑
page: true //是否开启分页
,
// 设置向服务器请求数据时额外携带的参数这里设置“make”参数为0具体含义可能根据后端接口要求而定
// 一般用于区分不同的请求场景或操作类型等
where: {
make: 0
} //接口的其它参数
,
done: function (res, curr, count) {
// 在表格渲染完成且数据加载完毕后执行此回调函数将返回的数据总数赋值给countNum变量
// 可能用于后续其他地方统计或判断数据量等情况
countNum = count;
}
});
//监听工具条
// 监听表格的工具条事件,当用户点击表格中的操作按钮(如“删除”等)时触发相应的逻辑处理,
// 'tool'是Layui表格组件中定义的工具条事件名通过这个监听可以获取到用户点击的按钮对应的事件以及相关数据等信息
table.on('tool', function (obj) { //tool是工具条事件名
var data = obj.data,
layEvent = obj.event; //获得 lay-event 对应的值
//从前当前行获取列数据
// 从当前行的数据对象data中获取“logId”字段的值赋值给变量logId
// 一般用于后续操作中传递该条日志记录的唯一标识,比如删除操作时需要告诉后端要删除哪条日志记录
var logId = data.logId;
if (layEvent === 'del') { //删除功能
// 使用Layui的layer模块的confirm方法弹出一个确认框询问用户是否确定要删除该条数据
// 设置确认框的位置、按钮文字等属性,用户点击不同按钮会执行相应的回调函数
layer.confirm('您确定要删除该条数据吗?', {
offset: '180px',
btn: ['是滴', '手滑']
}, function () {
// 如果用户点击“是滴”按钮重新加载表格数据通过设置“make”参数为1以及传递要删除的记录的“logId”
// 向后端发送请求,让后端执行删除操作并更新表格数据,这里应该是与后端约定好的参数传递和操作逻辑
tableIns.reload({
where: {
make: 1,
logId: logId
}
});
// 弹出一个提示框使用Layui的layer模块的msg方法告知用户删除操作的结果设置提示框的位置、图标等属性
layer.msg('删除结果如下', {
offset: '250px',
icon: 1
});
// 此处原本可能想再次重新加载表格数据(比如刷新页面数据),但代码被注释掉了,
// 可能是后续发现这样的操作不符合实际需求或者存在一些问题导致暂时不需要执行这部分逻辑
// tableIns.reload({
// where: {
// make: 0,
@ -130,6 +180,7 @@
// }
// });
}, function () {
// 如果用户点击“手滑”按钮(即取消删除操作),弹出一个提示框告知用户删除操作已取消,设置提示框的位置属性
layer.msg('删除操作已取消', {
offset: '250px'
});
@ -137,7 +188,15 @@
}
});
//刷新
// 为id为“refresh”的元素可能是页面上的刷新按钮但代码中未看到该元素的定义可能存在遗漏或者后续需要添加的情况绑定点击事件处理函数
// 当按钮被点击时使用之前定义的表格实例tableIns的reload方法重新加载表格数据通过设置相关参数make为0page为1来刷新表格展示内容
// 一般用于重新获取最新的数据并更新页面显示
// 此处假设页面上后续会添加对应的“refresh”按钮元素来触发这个刷新功能
// 目前代码逻辑中,如果不存在这个按钮元素,这部分代码暂时不会生效
// 可以检查是否遗漏了HTML中按钮元素的定义或者根据实际情况进行调整完善
// 示例:<button id="refresh">刷新</button> 类似这样的按钮元素定义
// 然后再通过这个点击事件来实现刷新表格数据的功能
// 刷新
$('#refresh').click(function () {
tableIns.reload({
where: {
@ -147,7 +206,13 @@
});
});
//导出
// 为id为“toXls”的元素即页面中的导出按钮前面定义的那个用于导出当前数据的按钮绑定点击事件处理函数
// 当按钮被点击时通过修改浏览器的location.href属性跳转到“baseUrl + '/LogInfoExcelServlet'”这个地址,
// 一般是向服务器端发起请求让服务器端执行生成Excel文件的相关逻辑比如从数据库获取数据并整理成Excel格式返回给浏览器端下载等操作
// 导出操作完成后使用Layui的layer模块的alert方法弹出一个提示消息框显示文字“Excel文件生成完成
// 并设置提示框的标题为“成功”图标为6一般对应成功的图标样式由Layui框架定义动画效果为1也是由Layui框架定义的某种动画展示方式
// 垂直偏移位置为距离顶部250px用于告知用户Excel文件已经成功生成可以进行后续操作比如保存等
// 导出
$('#toXls').click(function () {
location.href = baseUrl + '/LogInfoExcelServlet';
layer.alert('Excel文件生成完成', {
@ -158,7 +223,11 @@
});
});
//固定块 -- 就是那个回到顶部
// 使用Layui的util模块的fixbar方法创建一个回到页面顶端的功能组件通过传入配置对象来设置相关属性和行为
// 这里设置showHeight为2具体含义由Layui框架定义可能与显示的高度等相关条件有关
// 并为点击事件设置回调函数当用户点击该组件时会接收到一个参数type具体含义由Layui框架定义可能与点击的具体位置等相关
// 此处只是简单地将接收到的type参数打印到浏览器的控制台一般用于调试目的查看点击操作传递的相关信息
// 固定块 -- 就是那个回到顶部
util.fixbar({
showHeight: 2,
click: function (type) {

@ -1,343 +1,488 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page contentType="text/html;<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置页面的内容类型为“text/html”即HTML格式页面并指定字符编码为“UTF-8”
确保页面中的字符能被正确解析和显示,避免出现乱码问题 -->
<html>
<head>
<meta charset="utf-8">
<title>酒店管理系统</title>
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<script src="../../js/layui/layui.js"></script>
<script src="../../js/jquery.js"></script>
<script src="../../js/global.js"></script>
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
<style>
body {
margin: 10px;
}
.layui-elem-field legend {
font-size: 14px;
}
.layui-field-title {
margin: 25px 0 15px;
}
</style>
</head>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”再次明确页面遵循的字符编码规范辅助浏览器准确读取页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏中,让用户知晓当前页面所属的系统名称 -->
<title>酒店管理系统</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示此样式适用于所有媒体类型,也就是在各种设备上都会应用该样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Font Awesome字体图标库的样式文件font-awesome.min.css用于在页面中使用各种图标
其路径为上级目录下的MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css -->
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<!-- 引入Layui框架的JavaScript脚本文件layui.js这是使用Layui框架各种功能和组件的基础
路径指向上级目录下的js/layui/layui.js -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等
方便简化JavaScript编程其路径为上级目录下的js/jquery.js -->
<script src="../../js/jquery.js"></script>
<!-- 引入自定义的全局JavaScript脚本文件global.js里面可能包含了整个系统页面通用的一些变量定义、函数等逻辑
路径为上级目录下的js/global.js -->
<script src="../../js/global.js"></script>
<!-- 引入处理Excel相关功能的JavaScript库xlsx.full.min.js可能用于后续将数据导出为Excel等操作
其路径指向上级目录下的js/toExcel/xlsx.full.min.js -->
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<!-- 引入FileSaver.js脚本文件该文件通常用于在浏览器端实现文件保存功能
比如配合前面的Excel库将生成的Excel文件保存到本地其路径为上级目录下的js/toExcel/FileSaver.js -->
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<!-- 引入自定义的用于导出数据到Excel的脚本文件Export2Excel.js里面应该包含了具体的导出逻辑和相关功能实现
其路径为上级目录下的js/toExcel/Export2Excel.js -->
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
<style>
body {
// 设置页面主体body元素的外边距为10像素用于调整页面内容与浏览器边界的距离使页面布局更美观
margin: 10px;
}
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<input class="layui-input" id="inputSearch" placeholder="房间类型">
</div>
<button class="layui-btn fa fa-search" id="searchButton"> 搜索</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-refresh" id="refreshButton"> 刷新</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-pencil-square-o " id="insertButton"> 新增</button>
</div>
<div class="layui-inline">
<button class="layui-btn fa fa-save" id="toXlsButton"> 导出</button>
</div>
.layui-elem-field legend {
// 设置具有layui-elem-field类的元素内的<legend>元素的字体大小为14像素用于规范这类元素内标题文字的显示大小
font-size: 14px;
}
.layui-field-title {
// 设置具有layui-field-title类的元素的外边距上外边距为25像素下外边距为15像素用于调整该元素在页面中的垂直间距使其布局更合理
margin: 25px 0 15px;
}
</style>
</head>
<body>
<!-- 创建一个<fieldset>元素应用类名“layui-elem-field layui-field-title”并通过内联样式设置上外边距为30像素
用于划分页面中的一个区域通常用于对相关内容进行分组展示结合Layui的样式类呈现出特定的外观效果 -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>
<div>
<div class="layui-inline">
<div class="layui-input-inline">
<!-- 创建一个输入框input元素应用类名“layui-input”设置其id为“inputSearch”
placeholder属性设置提示文字为“房间类型”用于用户输入搜索关键词以查找相关的房间类型信息 -->
<input class="layui-input" id="inputSearch" placeholder="房间类型">
</div>
</legend>
</fieldset>
<div id="toxlsTable">
<table id="tableID"></table>
<!-- 创建一个按钮button元素应用类名“layui-btn fa fa-search”设置其id为“searchButton”文字为“搜索”
点击该按钮可触发搜索相关的功能其中“fa fa-search”类可能是来自Font Awesome图标库用于显示搜索图标 -->
<button class="layui-btn fa fa-search" id="searchButton"> 搜索</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-refresh”设置其id为“refreshButton”文字为“刷新”
点击该按钮可触发刷新页面数据等相关功能“fa fa-refresh”类用于显示刷新图标 -->
<button class="layui-btn fa fa-refresh" id="refreshButton"> 刷新</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-pencil-square-o ”设置其id为“insertButton”文字为“新增”
点击该按钮可触发新增房间类型等相关数据的功能“fa fa-pencil-square-o ”类用于显示编辑图标 -->
<button class="layui-btn fa fa-pencil-square-o " id="insertButton"> 新增</button>
</div>
<div class="layui-inline">
<!-- 创建一个按钮元素应用类名“layui-btn fa fa-save”设置其id为“toXlsButton”文字为“导出”
点击该按钮可触发将数据导出为Excel文件等相关功能“fa fa-save”类用于显示保存图标 -->
<button class="layui-btn fa fa-save" id="toXlsButton"> 导出</button>
</div>
</div>
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
layui.use(['util', 'layer', 'table'], function() {
$(document).ready(function() {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
var tableIns = table.render({
elem: '#tableID',
id: 'tableID',
url: baseUrl + '/RoomTypeServlet',
cols: [
[{
field: 'typeId',
title: 'ID',
sort: true,
fixed: true,
width: 150
}, {
field: 'typeName',
title: '类型名称'
}, {
field: 'price',
title: '价格'
}, {
field: 'splicPrice',
title: '拼房价格'
}, {
field: 'exceedance',
title: '可超预定数'
}, {
field: 'isSplice',
title: '是否可拼房'
}, {
field: 'right',
title: '管理',
align: 'center',
toolbar: '#barAuth',
width: 200
}]
],
page: true,
where: {
make: 0
},
done: function(res, curr, count) {
countNum = count;
}
});
</legend>
</fieldset>
<!-- 创建一个id为“toxlsTable”的<div>元素,用于包裹下面的表格元素,可能作为后续对表格进行整体操作或布局调整的一个容器 -->
<div id="toxlsTable">
<!-- 创建一个空的<table>元素设置其id为“tableID”后续会通过JavaScript代码动态渲染表格内容并填充数据到这个表格中 -->
<table id="tableID"></table>
</div>
<!-- 创建一个<script>标签设置其type属性为“text/html”并设置id为“barAuth”里面包含了一些HTML代码片段
通常用于作为Layui表格组件中工具栏的模板定义定义了“查看”“编辑”“删除”等操作按钮 -->
<script type="text/html" id="barAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script>
// 使用Layui框架的模块加载机制加载'util'可能是Layui提供的工具模块、'layer'(用于弹出层等交互功能模块)、
// 'table'(用于表格相关操作的模块)这几个模块,并在加载完成后执行回调函数,在回调函数内进行页面的各种交互逻辑实现
layui.use(['util', 'layer', 'table'], function () {
// 当DOM文档加载完成后执行此回调函数确保页面元素都已加载完毕后再操作元素避免出现找不到元素等问题
$(document).ready(function () {
var table = layui.table,
layer = layui.layer,
util = layui.util;
var countNum;
// 使用Layui的表格模块table的render方法来渲染表格配置表格的各种属性
var tableIns = table.render({
// 指定表格渲染的DOM元素选择器这里选择id为“tableID”的元素即前面定义的空表格元素作为表格的挂载点
elem: '#tableID',
// 给表格设置一个唯一的id方便后续对表格进行一些操作如重新加载等这里设置为“tableID”与挂载点的id保持一致
id: 'tableID',
// 设置表格数据的请求地址通过baseUrl应该是在全局脚本或其他地方定义的基础URL加上具体的Servlet路径来获取数据
url: baseUrl + '/RoomTypeServlet',
cols: [
// 定义表格的列配置,每一个对象表示一列的相关属性设置
[{
// 设置列对应的字段名称为“typeId”一般与后端返回的数据字段对应用于绑定数据
field: 'typeId',
// 设置列的标题为“ID”显示在表头位置让用户知道该列数据的含义
title: 'ID',
// 设置该列可排序,用户点击表头时可按照此列数据进行升序或降序排列
sort: true,
// 设置该列固定在表格左侧,不随滚动条滚动而移动,常用于重要的、需要始终展示的列
fixed: true,
width: 150
}, {
field: 'typeName',
title: '类型名称'
}, {
field: 'price',
title: '价格'
}, {
field: 'splicPrice',
title: '拼房价格'
}, {
field: 'exceedance',
title: '可超预定数'
}, {
field: 'isSplice',
title: '是否可拼房'
}, {
field: 'right',
title: '管理',
align: 'center',
// 指定该列使用的工具栏模板这里使用前面定义的id为“barAuth”的模板用于显示操作按钮
toolbar: '#barAuth',
width: 200
}]
],
// 设置表格开启分页功能Layui会自动处理分页相关的显示和交互逻辑
page: true,
// 设置向服务器请求数据时额外携带的参数这里设置“make”参数为0具体含义可能根据后端接口要求而定
// 一般用于区分不同的请求场景或操作类型等
where: {
make: 0
},
done: function (res, curr, count) {
// 在表格渲染完成且数据加载完毕后执行此回调函数将返回的数据总数赋值给countNum变量
// 可能用于后续其他地方统计或判断数据量等情况
countNum = count;
}
});
//监听工具条
table.on('tool', function(obj) {
var data = obj.data,
layEvent = obj.event;
var typeId = data.typeId;
var typeName = data.typeName;
var price = data.price;
var splicPrice = data.splicPrice;
var exceedance = data.exceedance;
var isSplice = data.isSplice;
// 监听表格的工具条事件,当用户点击表格中的操作按钮(如“查看”“编辑”“删除”等)时触发相应的逻辑处理
table.on('tool', function (obj) {
var data = obj.data,
layEvent = obj.event;
var typeId = data.typeId;
var typeName = data.typeName;
var price = data.price;
var splicPrice = data.splicPrice;
var exceedance = data.exceedance;
var isSplice = data.isSplice;
if(layEvent === 'detail') {
layer.alert(
'ID' + typeId + '<br>类型名称:' + typeName + '<br>价格:' + price +
'<br>拼房价格:' + splicPrice + '<br>可超预定数:' + exceedance + '<br>是否可拼房:' + isSplice, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的房间类型信息',
anim: 4,
offset: '180px'
});
} else if(layEvent === 'del') {
layer.confirm('您确定要删除该条数据吗?', {
offset: '180px',
btn: ['是滴', '手滑']
}, function() {
table.reload('tableID', {
where: {
make: 4,
typeId: typeId
}
});
layer.msg('删除结果如下', {
offset: '250px',
icon: 1
});
}, function() {
layer.msg('删除操作已取消', {
offset: '250px'
});
if (layEvent === 'detail') {
// 当点击“查看”按钮时弹出一个提示框使用Layui的layer模块的alert方法显示该条房间类型数据的详细信息
// 包括ID、类型名称、价格等各个字段的值设置提示框的样式、标题等相关属性
layer.alert(
'ID' + typeId + '<br>类型名称:' + typeName + '<br>价格:' + price +
'<br>拼房价格:' + splicPrice + '<br>可超预定数:' + exceedance + '<br>是否可拼房:' + isSplice, {
skin: 'layui-layer-lan',
closeBtn: 0,
title: '您当前选择的房间类型信息',
anim: 4,
offset: '180px'
});
} else if(layEvent === 'edit') {
//编辑
layer.prompt({
title: '请输入类型名称',
formType: 0,
value: typeName,
offset: '220px',
maxlength: 10
}, function(NewTypeName, index) {
var params = "new=" + NewTypeName + "&old=" + typeName;
$.post(baseUrl + '/QueryRoomTypeNameServlet', params, function(data) {
if(data === "1" || data === "2") {
if(NewTypeName.length < 3)
layer.alert('长度不符合!', {
} else if (layEvent === 'del') {
// 当点击“删除”按钮时弹出一个确认框使用Layui的layer模块的confirm方法询问用户是否确定要删除该条数据
// 设置确认框的位置、按钮文字等属性,用户点击不同按钮会执行相应的回调函数
layer.confirm('您确定要删除该条数据吗?', {
offset: '180px',
btn: ['是滴', '手滑']
}, function () {
// 如果用户点击“是滴”按钮重新加载表格数据通过设置“make”参数为4以及传递要删除的记录的“typeId”
// 向后端发送请求,让后端执行删除操作并更新表格数据,这里应该是与后端约定好的参数传递和操作逻辑
table.reload('tableID', {
where: {
make: 4,
typeId: typeId
}
});
// 弹出一个提示框使用Layui的layer模块的msg方法告知用户删除操作的结果设置提示框的位置、图标等属性
layer.msg('删除结果如下', {
offset: '250px',
icon: 1
});
}, function () {
// 如果用户点击“手滑”按钮(即取消删除操作),弹出一个提示框告知用户删除操作已取消,设置提示框的位置属性
layer.msg('删除操作已取消', {
offset: '250px'
});
});
} else if (layEvent === 'edit') {
// 编辑操作逻辑,当点击“编辑”按钮时,以下是一系列的交互流程用于让用户输入修改后的各项数据,并进行合法性校验等操作
// 弹出一个输入框使用Layui的layer模块的prompt方法让用户输入修改后的类型名称设置输入框的标题、初始值、位置、最大输入长度等属性
// 用户输入完成并点击确认后会执行相应的回调函数,回调函数中可以获取用户输入的值进行后续处理
layer.prompt({
title: '请输入类型名称',
formType: 0,
value: typeName,
offset: '220px',
maxlength: 10
}, function (NewTypeName, index) {
var params = "new=" + NewTypeName + "&old=" + typeName;
// 使用jQuery的$.post方法向服务器发送POST请求请求地址为baseUrl加上'/QueryRoomTypeNameServlet'
// 传递参数params包含新的类型名称和旧的类型名称等信息并在请求成功后执行回调函数处理返回的数据
$.post(baseUrl + '/QueryRoomTypeNameServlet', params, function (data) {
if (data === "1" || data === "2") {
if (NewTypeName.length < 3)
// 如果返回的数据为“1”或“2”且用户输入的新类型名称长度小于3弹出一个警告框使用Layui的layer模块的alert方法
// 提示用户输入的长度不符合要求,设置警告框的标题、图标、动画效果、位置等属性
layer.alert('长度不符合!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
});
else {
layer.close(index);
layer.prompt({
title: '请输入价格',
formType: 0,
value: price,
offset: '220px',
maxlength: 10
}, function (NewPrice, index) {
if (isNaN(NewPrice)) {
// 如果用户输入的价格不是数字通过isNaN函数判断弹出一个提示框告知用户输入的值类型不合法设置提示框的位置属性
layer.msg('您所输入的值类型不合法', {
// 使用Layui的layer模块的msg方法弹出一个提示消息框显示文字为“您所输入的值类型不合法”
// 并通过传入的配置对象设置提示框的垂直偏移位置为距离顶部250px用于提示用户输入的数据类型不符合要求
offset: '250px'
});
else {
// 当满足前面的条件判断不成立时(即输入的值类型合法等情况),执行以下逻辑,此处通常用于关闭当前的输入框弹出层
layer.close(index);
layer.prompt({
// 使用Layui的layer模块的prompt方法再次弹出一个输入框用于让用户输入拼房价格相关信息
// 设置输入框的标题为“请输入拼房价格”,提示用户要输入的内容
title: '请输入拼房价格',
// 设置输入框的类型为0一般表示普通文本输入框不同的formType值对应不同的输入框类型如密码框等有不同的设置
formType: 0,
// 设置输入框的初始值为变量splicPrice的值即显示之前的拼房价格作为默认值方便用户参考修改
value: splicPrice,
// 设置输入框弹出层的垂直偏移位置为距离顶部220px确定其在页面中的显示位置
offset: '220px',
// 设置输入框允许用户输入的最大长度为10个字符对用户输入内容长度进行限制
maxlength: 10
}, function (NewSplicPrice, index) {
// 为输入框添加一个回调函数,当用户在输入框中输入内容并确认后,会触发此回调函数,
// 函数接收用户输入的值NewSplicPrice以及输入框所在的弹出层索引index作为参数用于后续处理用户输入的数据
if (isNaN(NewSplicPrice)) {
// 通过isNaN函数判断用户输入的NewSplicPrice值是否为非数字类型如果是则执行以下逻辑
layer.msg('您所输入的值类型不合法', {
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您所输入的值类型不合法”
// 并设置提示框的垂直偏移位置为距离顶部250px用于提示用户输入的数据类型不符合要求
offset: '250px'
});
} else {
// 如果用户输入的值是数字类型即通过isNaN判断为合法数字执行以下逻辑先关闭当前的输入框弹出层
layer.close(index);
layer.prompt({
// 再次使用Layui的layer模块的prompt方法弹出一个输入框用于让用户输入可超预定数相关信息
// 设置输入框的标题为“请输入可超预定数”,提示用户要输入的内容
title: '请输入可超预定数',
formType: 0,
// 设置输入框的初始值为变量isSplice的值即显示之前的对应数据作为默认值方便用户参考修改
value: isSplice,
offset: '220px',
maxlength: 10
}, function (NewExceedance, index) {
// 为这个新的输入框添加回调函数当用户输入并确认后触发接收用户输入的值NewExceedance和弹出层索引index作为参数
if (isNaN(NewExceedance)) {
// 判断用户输入的NewExceedance值是否为非数字类型如果是则执行以下逻辑
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else {
// 如果用户输入的值是数字类型(合法数字),执行以下逻辑,先关闭当前的输入框弹出层
layer.close(index);
layer.prompt({
// 又一次使用Layui的layer模块的prompt方法弹出一个输入框用于让用户输入是否可拼房相关信息
// 设置输入框的标题为“是否可拼房Y/N明确提示用户输入的格式要求
title: '是否可拼房Y/N',
formType: 0,
// 设置输入框的初始值为变量isSplice的值显示之前的对应数据作为默认值方便用户参考修改
value: isSplice,
offset: '220px',
maxlength: 10
}, function (NewIsSplice, index) {
// 为这个输入框添加回调函数当用户输入并确认后触发接收用户输入的值NewIsSplice和弹出层索引index作为参数
if (NewIsSplice.valueOf() === "Y" || NewIsSplice.valueOf() === "N") {
// 判断用户输入的NewIsSplice值是否为“Y”或者“N”符合是否可拼房的预期输入格式要求如果是则执行以下逻辑
// 使用之前定义的表格实例tableIns的reload方法重新加载表格数据通过where属性设置向服务器传递的参数
// 包括操作类型make为2、记录的IDtypeId以及用户修改后的各项数据如类型名称、价格等
// 让后端根据这些参数更新对应的数据并返回新的表格数据进行展示
tableIns.reload({
where: {
make: 2,
typeId: typeId,
typeName: NewTypeName,
price: NewPrice,
splicPrice: NewSplicPrice,
exceedance: NewExceedance,
isSplice: NewIsSplice
}
});
// 关闭当前的输入框弹出层,完成整个编辑数据并更新表格的操作流程
layer.close(index);
} else {
// 如果用户输入的NewIsSplice值不符合“Y”或者“N”的格式要求执行以下逻辑
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您所输入的值类型不合法”
// 并设置提示框的垂直偏移位置为距离顶部260px用于提示用户输入的数据不符合要求
layer.msg('您所输入的值类型不合法', {
offset: '260px'
});
}
});
}
});
}
});
}
} else {
// 如果前面的其他条件判断都不满足(比如与后端交互返回的数据不符合预期的特定值情况),执行以下逻辑,
// 使用Layui的layer模块的alert方法弹出一个警告框显示文字“已存在同名项提示用户输入的类型名称已经存在不能重复使用
layer.alert('已存在同名项!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
});
else {
layer.close(index);
layer.prompt({
title: '请输入价格',
formType: 0,
value: price,
offset: '220px',
maxlength: 10
}, function(NewPrice, index) {
if(isNaN(NewPrice)) {
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else {
layer.close(index);
layer.prompt({
title: '请输入拼房价格',
formType: 0,
value: splicPrice,
offset: '220px',
maxlength: 10
}, function(NewSplicPrice, index) {
if(isNaN(NewSplicPrice)) {
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else {
layer.close(index);
layer.prompt({
title: '请输入可超预定数',
formType: 0,
value: exceedance,
offset: '220px',
maxlength: 10
}, function(NewExceedance, index) {
if(isNaN(NewExceedance)) {
layer.msg('您所输入的值类型不合法', {
offset: '250px'
});
} else {
layer.close(index);
layer.prompt({
title: '是否可拼房Y/N',
formType: 0,
value: isSplice,
offset: '220px',
maxlength: 10
}, function(NewIsSplice, index) {
if(NewIsSplice.valueOf() === "Y" || NewIsSplice.valueOf() === "N") {
tableIns.reload({
where: {
make: 2,
typeId: typeId,
typeName: NewTypeName,
price: NewPrice,
splicPrice: NewSplicPrice,
exceedance: NewExceedance,
isSplice: NewIsSplice
}
});
layer.close(index);
} else {
layer.msg('您所输入的值类型不合法', {
offset: '260px'
});
}
});
}
});
}
});
}
});
}
});
});
// 搜索
$('#searchButton').click(function () {
// 为id为“searchButton”的元素即页面中的搜索按钮绑定点击事件处理函数当按钮被点击时执行以下逻辑
var inputTxt = $('#inputSearch').val();
// 获取id为“inputSearch”的输入框元素的值即用户输入的搜索关键词内容并赋值给变量inputTxt用于后续判断和操作
if (inputTxt === "") {
// 判断用户输入的搜索关键词是否为空字符串,如果是,则执行以下逻辑,
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您必须输入值”
// 并设置提示框的垂直偏移位置为距离顶部250px提示用户必须输入搜索内容才能进行搜索操作
layer.msg('您必须输入值', {
offset: '250px'
});
} else if (inputTxt.length > 10) {
// 如果用户输入的搜索关键词长度大于10个字符则执行以下逻辑
// 使用Layui的layer模块的msg方法弹出提示消息框显示文字“您所输入的值长度不合法”
// 并设置提示框的垂直偏移位置为距离顶部250px提示用户输入的搜索内容长度不符合要求
layer.msg('您所输入的值长度不合法', {
offset: '250px'
});
} else {
layer.alert('已存在同名项!', {
title: '警告',
icon: 4,
anim: 6,
offset: '220px'
// 如果用户输入的搜索关键词不为空且长度合法小于等于10个字符执行以下逻辑
// 先使用Layui的layer模块的msg方法弹出提示消息框显示文字“搜索结果”告知用户即将展示搜索结果
// 并设置提示框的垂直偏移位置为距离顶部250px
layer.msg('搜索结果', {
offset: '250px'
});
// 使用之前定义的表格实例tableIns的reload方法重新加载表格数据通过where属性设置向服务器传递的参数
// 包括操作类型make为3以及用户输入的搜索关键词typeName让后端根据这些参数查询并返回符合条件的数据来更新表格展示内容
table.reload('tableID', {
where: {
make: 3,
typeName: inputTxt
}
})
}
});
});
}
});
//搜索
$('#searchButton').click(function() {
var inputTxt = $('#inputSearch').val();
if(inputTxt === "")
layer.msg('您必须输入值', {
offset: '250px'
});
else if(inputTxt.length > 10)
layer.msg('您所输入的值长度不合法', {
offset: '250px'
});
else {
layer.msg('搜索结果', {
offset: '250px'
});
table.reload('tableID', {
where: {
make: 3,
typeName: inputTxt
}
})
}
});
// 刷新
$('#refreshButton').click(function () {
// 为id为“refreshButton”的元素即页面中的刷新按钮绑定点击事件处理函数当按钮被点击时执行以下逻辑
// 此处代码注释中描述了存在的一些问题大致是在删除操作触发外键依赖后会出现500异常
// 通过消息回传参数再执行刷新操作时框架会出现问题导致往后端传入的分页参数固定为1表格的重载刷新功能失效
// 当前暂时发现是删除操作引起的异常,先采用强制刷新整个页面的方式来解决此处的异常情况
// 以下原本是想通过表格实例tableIns的reload方法重新加载表格数据设置相关参数make为0page为1来刷新表格
// 但由于存在上述问题,暂时注释掉了这段代码
// tableIns.reload({
// where: {
// make: 0,
// page: 1
// }
// });
// 使用JavaScript的location对象的reload方法强制刷新整个页面这是一种简单粗暴的解决当前刷新异常问题的临时办法
location.reload();
});
//刷新
$('#refreshButton').click(function() {
// 简述此处存在的BUG 删除操作触发外键依赖后出500异常
// 通过msg回传参数尔后执行刷新操作时框架本身死掉
// 即往后端传入的分页参数固定为1表格的重载刷新失效
// 暂时只发现删除引起的异常,先通过强制刷新解决此处异常
// tableIns.reload({
// where: {
// make: 0,
// page: 1
// }
// });
location.reload();
});
// 新增
$('#insertButton').click(function () {
// 为id为“insertButton”的元素即页面中的新增按钮绑定点击事件处理函数当按钮被点击时执行以下逻辑
// 使用Layui的layer模块的open方法弹出一个新的窗口弹窗用于新增房间类型相关数据的操作界面展示等功能
layer.open({
// 设置弹窗的标题为“新增”,明确此弹窗的用途是进行新增数据操作
title: "新增",
// 设置弹窗的按钮文字数组,这里只设置了一个“关闭”按钮,用于关闭弹窗操作
btn: ['关闭'],
yes: function (index) {
// 为弹窗的“是”(这里对应“关闭”按钮,因为只有一个按钮)按钮点击事件设置回调函数,
// 当按钮被点击时先使用之前定义的表格实例tableIns的reload方法重新加载表格数据
// 通过where属性设置操作类型make为0让后端获取最新的数据并更新表格展示内容
// 然后使用Layui的layer模块的close方法关闭当前的弹窗
tableIns.reload({
where: {
make: 0
}
});
layer.close(index); //关闭弹窗
},
// 设置弹窗的类型为2一般对应页面层类型不同类型有不同的展示和交互特点具体由Layui框架定义
type: 2,
// 设置弹窗的宽度为780px高度为450px确定弹窗的大小尺寸用于展示合适的新增数据操作界面
area: ['780px', '450px'],
fixed: false,
maxmin: true,
// 设置弹窗加载的内容页面地址,这里指向“/hb/webpage/SystemSetting/insertRomeType.jsp”
// 即当弹窗打开时会加载这个JSP页面作为新增数据的操作界面
content: '/hb/webpage/SystemSetting/insertRomeType.jsp',
cancel: function () {
// 为弹窗的取消操作(比如点击弹窗右上角的关闭按钮等取消行为)设置回调函数,
// 当取消操作发生时同样使用表格实例tableIns的reload方法重新加载表格数据
// 通过where属性设置操作类型make为0让后端获取最新的数据并更新表格展示内容
tableIns.reload({
where: {
make: 0
}
});
}
});
});
//新增
$('#insertButton').click(function() {
layer.open({
title: "新增",
btn: ['关闭'],
yes: function(index) {
tableIns.reload({
where: {
make: 0
}
// 导出
$('#toXlsButton').click(function () {
// 为id为“toXlsButton”的元素即页面中的导出按钮绑定点击事件处理函数当按钮被点击时执行以下逻辑
// 通过修改浏览器的location.href属性跳转到“baseUrl + '/RoomInfoExcelServlet'”这个地址,
// 一般是向服务器端发起请求让服务器端执行生成Excel文件的相关逻辑比如从数据库获取数据并整理成Excel格式返回给浏览器端下载等操作
location.href = baseUrl + '/RoomInfoExcelServlet';
layer.alert('Excel文件生成完成', {
// 使用Layui的layer模块的alert方法弹出一个提示消息框显示文字“Excel文件生成完成
// 并设置提示框的标题为“成功”图标为6一般对应成功的图标样式由Layui框架定义动画效果为1也是由Layui框架定义的某种动画展示方式
// 垂直偏移位置为距离顶部250px用于告知用户Excel文件已经成功生成可以进行后续操作比如保存等
title: '成功',
icon: 6,
anim: 1,
offset: '250px'
});
});
layer.close(index); //关闭弹窗
},
type: 2,
area: ['780px', '450px'],
fixed: false,
maxmin: true,
content: '/hb/webpage/SystemSetting/insertRomeType.jsp',
cancel: function() {
tableIns.reload({
where: {
make: 0
// 回到顶端
util.fixbar({
// 使用Layui的util模块的fixbar方法创建一个回到页面顶端的功能组件通过传入配置对象来设置相关属性和行为
showHeight: 2,
click: function (type) {
// 为回到顶端功能组件的点击事件设置回调函数当用户点击该组件时会接收到一个参数type具体含义由Layui框架定义可能与点击的具体位置等相关
// 此处只是简单地将接收到的type参数打印到浏览器的控制台一般用于调试目的查看点击操作传递的相关信息
console.log(type);
}
});
}
});
});
//导出
$('#toXlsButton').click(function() {
location.href = baseUrl + '/RoomInfoExcelServlet';
layer.alert('Excel文件生成完成', {
title: '成功',
icon: 6,
anim: 1,
offset: '250px'
});
});
//回到顶端
util.fixbar({
showHeight: 2,
click: function(type) {
console.log(type);
}
});
});
});

@ -1,15 +1,24 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置此页面的内容类型为“text/html”表明是HTML格式页面同时指定字符编码为“UTF-8”
这样能确保页面中的字符可以被正确解析和显示,避免出现乱码情况 -->
<html>
<head>
<meta charset="utf-8">
<title>酒店管理系统</title>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”这是再次明确页面所遵循的字符编码标准辅助浏览器准确读取和展示页面里的文字内容等信息 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏位置,方便用户识别当前页面所属的系统或应用名称 -->
<title>酒店管理系统</title>
</head>
</head>
<frameset cols="200,*" frameborder="0">
<frame name="nav" src="SystemNav.jsp" />
<frame name="system" src="../../nav.html" />
</frameset>
<!-- 使用<frameset>标签定义页面的框架集通过cols属性设置框架的列布局这里表示将页面划分为两列
第一列宽度为200像素第二列宽度自适应“*”表示剩余的所有宽度空间frameborder属性设置为“0”表示框架之间没有边框显示 -->
<frameset cols="200,*" frameborder="0">
<!-- 在框架集中定义一个<frame>框架元素设置其name属性为“nav”用于给该框架命名方便后续通过链接的target属性等方式来指定内容在该框架中显示
src属性指定了此框架初始加载的页面来源为“SystemNav.jsp”也就是这个框架会首先展示“SystemNav.jsp”页面的内容通常用于放置导航相关的功能模块 -->
<frame name="nav" src="SystemNav.jsp" />
<!-- 再定义另一个<frame>框架元素name属性为“system”用于命名src属性指定其初始加载的页面来源为“../../nav.html”
即该框架初始会展示上级目录的上级目录下的“nav.html”页面内容一般用于承载系统的主要功能页面展示等内容 -->
<frame name="system" src="../../nav.html" />
</frameset>
</html>

@ -1,51 +1,96 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置页面内容类型为text/html即HTML格式页面并指定字符编码为UTF-8
保证页面能正确显示各类字符,避免出现乱码情况 -->
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>酒店管理系统</title>
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
</head>
<head>
<!-- 设置HTML页面的字符编码为utf-8再次明确页面字符编码规范有助于浏览器准确解析页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的视口viewport相关属性width=device-width表示页面宽度与设备屏幕宽度相同
initial-scale=1设置初始缩放比例为1即页面按原始大小显示maximum-scale=1限制最大缩放比例为1防止用户过度缩放页面常用于移动端页面适配确保页面在不同设备上显示效果相对合理 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 设置页面的标题为“酒店管理系统”,该标题会显示在浏览器的标题栏中,让用户明确当前页面所属的系统或功能 -->
<title>酒店管理系统</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示该样式适用于所有的媒体类型,也就是在各种设备上都应用此样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Font Awesome字体图标库的样式文件font-awesome.min.css用于在页面中使用各种图标
路径为上级目录下的MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css -->
<link rel="stylesheet" href="../../MAIN/component/font-awesome-4.7.0/css/font-awesome.min.css">
<!-- 引入处理Excel相关功能的JavaScript库xlsx.full.min.js可能用于后续将数据导出为Excel等操作
路径指向上级目录下的js/toExcel/xlsx.full.min.js -->
<script src="../../js/toExcel/xlsx.full.min.js"></script>
<!-- 引入FileSaver.js脚本文件该文件通常用于在浏览器端实现文件保存功能
比如配合前面的Excel库将生成的Excel文件保存到本地路径为上级目录下的js/toExcel/FileSaver.js -->
<script type="text/javascript" src="../../js/toExcel/FileSaver.js"></script>
<!-- 引入自定义的用于导出数据到Excel的脚本文件Export2Excel.js里面应该包含了具体的导出逻辑和相关功能实现
路径为上级目录下的js/toExcel/Export2Excel.js -->
<script type="text/javascript" src="../../js/toExcel/Export2Excel.js"></script>
</head>
<body>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<ul class="layui-nav layui-nav-tree">
<li class="layui-nav-item layui-nav-itemed">
<a>基础功能设置</a>
<dl class="layui-nav-child">
<dd>
<a href="RoomTypeTable.jsp" target="system">房间类型</a>
</dd>
<dd>
<a href="FloorTable.jsp" target="system">楼层信息</a>
</dd>
</dl>
</li>
<li class="layui-nav-item">
<a>附属功能设置</a>
<dl class="layui-nav-child">
<dd>
<a href="LogTable.jsp" target="system">日志管理</a>
</dd>
<dd>
<a href="AuthTable.jsp" target="system">权限管理</a>
</dd>
</dl>
</li>
</ul>
</div>
</div>
<script src="../../js/layui/layui.js"></script>
<script src="../../js/jquery.js"></script>
<script>
layui.use('element', function() {});
</script>
</body>
<body>
<!-- 创建一个具有Layui样式类layui-side layui-bg-black的<div>元素,用于构建页面侧边栏,
设置背景颜色为黑色layui-bg-black作为页面布局的一部分通常用于放置导航等功能菜单 -->
<div class="layui-side layui-bg-black">
<!-- 在侧边栏的<div>元素内创建一个可滚动的区域layui-side-scroll当侧边栏内容较多时
方便用户通过滚动条查看全部内容,提高用户体验 -->
<div class="layui-side-scroll">
<!-- 创建一个无序列表ul应用Layui的导航样式类layui-nav layui-nav-tree用于构建树形导航菜单
是页面导航功能的主要HTML结构体现 -->
<ul class="layui-nav layui-nav-tree">
<!-- 创建一个列表项li应用Layui的导航菜单项样式类layui-nav-item layui-nav-itemed表示该项处于展开状态layui-nav-itemed
用于展示一个一级导航菜单选项,这里显示文字为“基础功能设置” -->
<li class="layui-nav-item layui-nav-itemed">
<!-- 在列表项内创建一个超链接a标签文字为“基础功能设置”点击该链接可能会触发一些相关的功能或展开收起对应的子菜单等操作
目前这里未设置具体的链接地址可能通过JavaScript等方式来实现交互逻辑 -->
<a>基础功能设置</a>
<!-- 创建一个定义列表dl应用Layui的导航子菜单样式类layui-nav-child用于展示“基础功能设置”菜单项的子菜单内容 -->
<dl class="layui-nav-child">
<!-- 在定义列表中创建一个描述项dd用于放置具体的子菜单选项 -->
<dd>
<!-- 创建一个超链接a标签设置链接地址为“RoomTypeTable.jsp”并指定在名为“system”的目标框架或窗口中打开target="system"
文字为“房间类型”,点击该链接可跳转到对应的页面,用于查看或设置房间类型相关信息 -->
<a href="RoomTypeTable.jsp" target="system">房间类型</a>
</dd>
<dd>
<!-- 类似地创建另一个超链接链接地址为“FloorTable.jsp”同样在“system”目标中打开文字为“楼层信息”
用于跳转到楼层信息相关页面进行操作 -->
<a href="FloorTable.jsp" target="system">楼层信息</a>
</dd>
</dl>
</li>
<li class="layui-nav-item">
<!-- 创建另一个一级导航菜单项应用样式类layui-nav-item文字为“附属功能设置”用于展示另一个不同功能分类的导航选项 -->
<a>附属功能设置</a>
<dl class="layui-nav-child">
<dd>
<!-- 创建超链接链接地址为“LogTable.jsp”在“system”目标中打开文字为“日志管理”用于跳转到日志管理相关页面进行操作
比如查看系统操作记录等功能 -->
<a href="LogTable.jsp" target="system">日志管理</a>
</dd>
<dd>
<!-- 再创建一个超链接链接地址为“AuthTable.jsp”在“system”目标中打开文字为“权限管理”用于跳转到权限管理相关页面
可进行用户权限配置等相关操作 -->
<a href="AuthTable.jsp" target="system">权限管理</a>
</dd>
</dl>
</li>
</ul>
</div>
</div>
<!-- 引入Layui框架的JavaScript脚本文件layui.js该文件包含了Layui框架的各种功能实现
是后续使用Layui组件和功能的基础路径为上级目录下的js/layui/layui.js -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等
方便简化JavaScript编程这里的路径指向上级目录下的js/jquery.js -->
<script src="../../js/jquery.js"></script>
<script>
// 使用Layui框架的模块加载机制加载'element'模块,
// 并在加载完成后执行回调函数,不过目前回调函数内为空,
// 通常在回调函数中可以使用'element'模块提供的功能来操作页面元素、实现动态交互等功能,
// 比如控制页面布局、菜单展开收起等效果(这里可能后续会补充具体逻辑)
layui.use('element', function () {});
</script>
</body>
</html>

@ -1,108 +1,163 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- JSP页面指令设置此页面内容类型为“text/html”即HTML格式页面并指定字符编码为“UTF-8”
这样能确保页面中的字符可被正确解析和显示,避免出现乱码情况 -->
<html>
<head>
<meta charset="utf-8">
<title>新增房间类型</title>
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<script src="../../js/layui/layui.js"></script>
<script src="../../js/jquery.js"></script>
<script src="../../js/global.js"></script>
</head>
<head>
<!-- 设置HTML页面的字符编码为“utf-8”再次明确页面所遵循的字符编码标准辅助浏览器准确读取页面内容 -->
<meta charset="utf-8">
<!-- 设置页面的标题为“新增房间类型”,该标题会显示在浏览器的标题栏中,方便用户知晓当前页面的主要功能 -->
<title>新增房间类型</title>
<!-- 引入Layui框架的样式文件layui.csshref属性指定了文件的相对路径上级目录下的js/layui/css/layui.css
media="all"表示该样式适用于所有媒体类型,也就是在各种设备上都应用此样式 -->
<link rel="stylesheet" href="../../js/layui/css/layui.css" media="all">
<!-- 引入Layui框架的JavaScript脚本文件layui.js该文件包含了Layui框架的各种功能实现
是后续使用Layui组件和功能的基础 -->
<script src="../../js/layui/layui.js"></script>
<!-- 引入jQuery库的JavaScript脚本文件jquery.jsjQuery常用于操作DOM元素、处理事件、进行AJAX交互等方便简化JavaScript编程 -->
<script src="../../js/jquery.js"></script>
<!-- 引入自定义的全局JavaScript脚本文件global.js里面可能包含了整个系统页面通用的一些变量定义、函数等逻辑 -->
<script src="../../js/global.js"></script>
</head>
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>新增房间类型</legend>
</fieldset>
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">类型名称</label>
<div class="layui-input-block">
<input type="text" name="typeName" lay-verify="required|typeName" autocomplete="off" placeholder="请输入类型名称" class="layui-input">
</div>
<body>
<!-- 创建一个<fieldset>元素应用类名“layui-elem-field layui-field-title”并通过内联样式设置上外边距为20像素
用于划分页面中的一个区域通常用于对相关内容进行分组展示结合Layui的样式呈现出特定的外观效果此处用于显示“新增房间类型”的标题区域 -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>新增房间类型</legend>
</fieldset>
<!-- 创建一个表单form元素应用类名“layui-form”并设置其action属性为空目前未指定表单提交的具体地址可能后续通过JavaScript动态设置等方式来处理表单提交
用于收集用户输入的新增房间类型相关信息 -->
<form class="layui-form" action="">
<!-- 创建一个表单项目form-item元素用于包裹表单内的一组相关输入元素这里用于输入“类型名称”相关内容 -->
<div class="layui-form-item">
<!-- 创建一个标签label元素应用类名“layui-form-label”用于显示“类型名称”文字提示告知用户对应输入框的用途 -->
<label class="layui-form-label">类型名称</label>
<!-- 创建一个输入框容器layui-input-block元素用于包裹实际的输入框元素使其在布局上符合Layui框架的样式规范 -->
<div class="layui-input-block">
<!-- 创建一个文本输入框input元素设置其类型为“text”普通文本输入框name属性为“typeName”用于在表单提交时标识该输入项的数据名称
lay-verify属性设置了验证规则“required|typeName”表示该输入框必填且要符合自定义的“typeName”验证规则autocomplete属性设置为“off”关闭浏览器自动完成功能
placeholder属性设置提示文字为“请输入类型名称”class属性应用“layui-input”样式类使其呈现出Layui框架中输入框的外观样式 -->
<input type="text" name="typeName" lay-verify="required|typeName" autocomplete="off" placeholder="请输入类型名称" class="layui-input">
</div>
</div>
<!-- 创建另一个表单项目元素,用于包裹下面一组与价格相关的输入元素 -->
<div class="layui-form-item">
<!-- 创建一个内联布局的容器layui-inline元素用于让内部的元素水平排列这里用于放置“价格”相关的输入框和标签 -->
<div class="layui-inline">
<!-- 创建一个标签元素,显示文字“价格”,用于提示用户对应输入框的用途 -->
<label class="layui-form-label">价格</label>
<!-- 创建一个内联输入框容器layui-input-inline元素用于包裹价格输入框使其在布局上呈现内联效果与其他元素水平排列 -->
<div class="layui-input-inline">
<!-- 创建一个文本输入框元素设置类型为“text”name属性为“price”用于表单提交时标识数据名称lay-verify属性设置验证规则为“required|number”必填且必须是数字
autocomplete属性为“off”placeholder属性设置提示文字为“¥”表示人民币符号提示用户输入价格格式应用“layui-input”样式类 -->
<input type="text" name="price" lay-verify="required|number" autocomplete="off" placeholder="¥" class="layui-input">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">价格</label>
<div class="layui-input-inline">
<input type="text" name="price" lay-verify="required|number" autocomplete="off" placeholder="¥" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">拼房价格</label>
<div class="layui-input-inline">
<input type="text" name="splicPrice" lay-verify="required|number" autocomplete="off" placeholder="¥" class="layui-input">
</div>
</div>
</div>
<!-- 再创建一个内联布局容器元素,用于放置“拼房价格”相关的输入框和标签,与“价格”输入框水平排列显示 -->
<div class="layui-inline">
<label class="layui-form-label">拼房价格</label>
<div class="layui-input-inline">
<!-- 创建一个文本输入框元素用于输入拼房价格设置与“价格”输入框类似的属性name属性为“splicPrice”验证规则等也按要求设置 -->
<input type="text" name="splicPrice" lay-verify="required|number" autocomplete="off" placeholder="¥" class="layui-input">
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">可超预定数</label>
<div class="layui-input-inline">
<input type="text" name="exceedance" lay-verify="required|number" autocomplete="off" class="layui-input">
</div>
</div>
</div>
</div>
<!-- 创建一个表单项目元素,用于包裹“可超预定数”相关的输入元素 -->
<div class="layui-form-item">
<!-- 创建一个内联布局容器元素,用于放置“可超预定数”的标签和输入框 -->
<div class="layui-inline">
<label class="layui-form-label">可超预定数</label>
<div class="layui-input-inline">
<!-- 创建一个文本输入框元素设置类型为“text”name属性为“exceedance”lay-verify属性设置验证规则为“required|number”必填且必须是数字
autocomplete属性为“off”应用“layui-input”样式类用于用户输入可超预定的数量 -->
<input type="text" name="exceedance" lay-verify="required|number" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否可拼房</label>
<div class="layui-input-block">
<input type="radio" name="isSplice" value="Y" title="是" checked="">
<input type="radio" name="isSplice" value="N" title="否">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="insertRome">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
<!-- 创建一个表单项目元素,用于包裹“是否可拼房”相关的单选按钮元素 -->
<div class="layui-form-item">
<label class="layui-form-label">是否可拼房</label>
<div class="layui-input-block">
<!-- 创建一个单选按钮input type="radio"元素设置name属性为“isSplice”用于将多个单选按钮归为一组同一组内只能选择一个选项
value属性为“Y”表示选择“是”的对应值title属性设置显示文字为“是”并设置为默认选中checked属性用于让用户选择是否可拼房的选项 -->
<input type="radio" name="isSplice" value="Y" title="是" checked="">
<!-- 再创建一个单选按钮元素同样name属性为“isSplice”value属性为“N”表示选择“否”的对应值title属性设置显示文字为“否”用于用户选择另一个选项 -->
<input type="radio" name="isSplice" value="N" title="否">
</div>
</div>
<!-- 创建一个表单项目元素,用于包裹提交按钮和重置按钮 -->
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 创建一个按钮button元素应用类名“layui-btn”并设置lay-submit属性表示该按钮可触发表单提交操作和lay-filter属性为“insertRome”用于后续在JavaScript中监听该按钮的提交事件
文字为“立即提交”,点击该按钮可提交表单数据,进行新增房间类型的操作 -->
<button class="layui-btn" lay-submit lay-filter="insertRome">立即提交</button>
<!-- 创建一个按钮元素设置类型为“reset”表示重置按钮点击可重置表单内所有输入框的值为初始状态应用类名“layui-btn layui-btn-primary”文字为“重置”用于重置表单内容 -->
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
<script>
layui.use(['form', 'layedit', 'laydate'], function() {
var form = layui.form,
layer = layui.layer;
<script>
// 使用Layui框架的模块加载机制加载'form'(用于表单相关操作和验证的模块)、'layedit'(可能用于富文本编辑相关功能的模块,此处暂未使用到相关功能)、
// 'laydate'(可能用于日期选择相关功能的模块,此处也暂未使用到相关功能)这几个模块,并在加载完成后执行回调函数,在回调函数内进行页面相关逻辑处理
layui.use(['form', 'layedit', 'laydate'], function () {
var form = layui.form,
layer = layui.layer;
//自定义验证规则
form.verify({
typeName: function(value) {
if(value.length < 3) {
return '房间类型至少3个字符';
}
// 自定义验证规则通过Layui的form模块的verify方法来定义验证逻辑这里定义了名为“typeName”的验证规则用于验证“类型名称”输入框的输入内容
form.verify({
typeName: function (value) {
// 判断输入的“类型名称”value的字符长度是否小于3如果小于3则返回提示文字“房间类型至少3个字符”表示不符合要求
if (value.length < 3) {
return '房间类型至少3个字符';
}
if(value.length > 10) {
return '房间类型至多10个字符'
}
}
});
// 判断输入的“类型名称”value的字符长度是否大于10如果大于10则返回提示文字“房间类型至多10个字符”表示不符合要求
if (value.length > 10) {
return '房间类型至多10个字符'
}
}
});
//监听提交
form.on('submit(insertRome)', function(data) {
$.post(baseUrl + '/InsertRoomTypeServlet', JSON.stringify(data.field), function(code) {
if(code === 1) {
layer.alert('插入成功!', {
title: '成功',
icon: 6,
anim: 5
});
} else if(code === 0) {
layer.alert('已存在同名项!', {
title: '重复',
icon: 4,
anim: 6
});
} else {
layer.alert('插入失败!', {
title: '异常',
icon: 6,
anim: 6
});
}
// 监听表单的提交事件通过Layui的form模块的on方法监听“submit”事件并且指定监听的过滤器为“insertRome”与前面表单提交按钮的lay-filter属性对应
// 当点击“立即提交”按钮触发表单提交时会执行此回调函数函数接收表单数据等相关信息作为参数data
form.on('submit(insertRome)', function (data) {
// 使用jQuery的$.post方法向服务器发送POST请求请求地址为baseUrl应该是在全局定义的基础URL加上'/InsertRoomTypeServlet'
// 将表单数据data.field经过Layui处理后的表单字段数据对象转换为JSON字符串后作为请求参数发送给服务器
// 并在请求成功后执行回调函数回调函数接收服务器返回的响应码code作为参数用于根据不同的响应码进行相应的提示处理
$.post(baseUrl + '/InsertRoomTypeServlet', JSON.stringify(data.field), function (code) {
if (code === 1) {
// 如果服务器返回的响应码为1表示插入操作成功使用Layui的layer模块的alert方法弹出一个提示框显示文字“插入成功
// 并设置提示框的标题为“成功”图标为6一般对应成功的图标样式由Layui框架定义动画效果为5也是由Layui框架定义的某种动画展示方式
layer.alert('插入成功!', {
title: '成功',
icon: 6,
anim: 5
});
} else if (code === 0) {
// 如果服务器返回的响应码为0表示插入操作失败原因是已存在同名项使用Layui的layer模块的alert方法弹出提示框显示文字“已存在同名项
// 设置提示框的标题为“重复”图标为4一般对应警告等相关的图标样式动画效果为6
layer.alert('已存在同名项!', {
title: '重复',
icon: 4,
anim: 6
});
} else {
// 如果服务器返回的响应码既不是1也不是0表示出现其他异常情况使用Layui的layer模块的alert方法弹出提示框显示文字“插入失败
// 设置提示框的标题为“异常”图标为6动画效果为6告知用户插入操作出现异常
layer.alert('插入失败!', {
title: '异常',
icon: 6,
anim: 6
});
return false;
});
}
});
</script>
</body>
// 返回false表示阻止表单默认的提交行为因为这里通过AJAX方式$.post自行向服务器发送请求并处理响应了不需要浏览器进行默认的表单提交跳转等操作
return false;
});
});
</script>
</body>
</html>
Loading…
Cancel
Save