Compare commits

...

27 Commits

@ -3,47 +3,67 @@
User: ASUS
Date: 2022/4/15
Time: 22:20
To change this template use File | Settings | File Templates.
这是一段JSP页面的代码模板注释说明了该文件创建的相关信息如创建工具、用户、创建时间等并且提示了如何修改此模板通过指定的文件菜单操作
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面字符编码为utf-8确保页面能正确显示各种字符 -->
<meta charset="utf-8">
<!-- 页面标题,显示在浏览器标签栏,这里是酒店后台管理系统 -->
<title>酒店后台管理系统</title>
<!-- 页面关键词用于搜索引擎优化SEO方便搜索引擎识别页面相关主题 -->
<meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini">
<!-- 页面描述信息同样用于SEO简要介绍layuimini框架的特点和优势 -->
<meta name="description" content="layuimini基于layui的轻量级前端后台管理框架最简洁、易用的后台框架模板面向所有层次的前后端程序,只需提供一个接口就直接初始化整个框架,无需复杂操作。">
<!-- 指定页面渲染使用WebKit内核用于在浏览器中更好地呈现页面效果尤其是一些CSS样式和HTML5特性的支持 -->
<meta name="renderer" content="webkit">
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器以解决浏览器兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置允许跨域访问,这里允许任意来源的跨域请求,通常在开发环境或者特定需要跨域的场景下使用,生产环境需谨慎配置 -->
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<!-- 设置页面视口相关属性使页面能在不同设备如手机、平板、电脑上自适应显示初始缩放比例为1最大缩放比例为1 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 设置苹果移动设备上Web应用的状态栏样式为黑色用于优化在苹果设备上的显示效果 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- 声明页面在苹果移动设备上可作为Web应用运行具备类似原生应用的一些特性 -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- 禁止页面自动识别电话号码等格式,避免一些号码被误识别为可点击的链接 -->
<meta name="format-detection" content="telephone=no">
<!-- 设置页面图标图标文件路径通过表达式获取指向项目特定位置下的favicon.ico文件用于在浏览器标签栏等位置显示页面的图标标识 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/layui/images/favicon.ico">
<!-- 引入layui框架的核心CSS文件用于构建页面的样式布局该文件包含了layui框架提供的各种UI组件的默认样式 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入基于layui的自定义样式文件layuimini.css可能用于对layui框架进行个性化的样式扩展或修改版本号为2.0.4.2 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/layuimini.css?v=2.0.4.2" media="all">
<!-- 引入默认主题的样式文件,可能用于定义页面在默认主题下的颜色、字体等样式细节 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/themes/default.css" media="all">
<!-- 引入Font Awesome字体图标库的CSS文件用于在页面中使用各种图标版本为4.7.0 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
<!-- 定义一个空的样式标签可能用于后续通过JavaScript动态添加或修改页面的样式规则 -->
<style id="layuimini-bg-color">
</style>
</head>
<body class="layui-layout-body layuimini-all">
<div class="layui-layout layui-layout-admin">
<!-- 页面头部区域开始 -->
<div class="layui-header header">
<!-- 显示网站的logo使用了layuimini的自定义logo类名 -->
<div class="layui-logo layuimini-logo"></div>
<div class="layuimini-header-content">
<a>
<!-- 一个工具图标按钮用于展开或收起侧边栏等操作使用了Font Awesome的图标并通过自定义属性data-side-fold来传递相关操作标识 -->
<div class="layuimini-tool"><i title="展开" class="fa fa-outdent" data-side-fold="1"></i></div>
</a>
<!--电脑端头部菜单-->
<!-- 电脑端头部菜单区域这里目前为空通常会通过JavaScript动态生成菜单项 -->
<ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-menu-header-pc layuimini-pc-show">
</ul>
<!--手机端头部菜单-->
<!-- 手机端头部菜单区域,包含一个菜单选项,点击可展开选择模块的下拉菜单 -->
<ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-mobile-show">
<li class="layui-nav-item">
<a href="javascript:;"><i class="fa fa-list-ul"></i> 选择模块</a>
@ -54,66 +74,78 @@
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item" lay-unselect>
<!-- 链接到前台首页页面路径通过表达式获取跳转到对应的JSP页面 -->
<a href="${pageContext.request.contextPath}/fronts/home.jsp" >前台首页</a>
</li>
<li class="layui-nav-item" lay-unselect>
<!-- 一个刷新按钮通过自定义属性data-refresh来标识点击可触发刷新操作使用了Font Awesome的刷新图标 -->
<a href="javascript:;" data-refresh="刷新"><i class="fa fa-refresh"></i></a>
</li>
<li class="layui-nav-item" lay-unselect>
<!-- 一个清理按钮通过自定义属性data-clear来标识点击可触发清理缓存等相关操作使用了Font Awesome的垃圾桶图标 -->
<a href="javascript:;" data-clear="清理" class="layuimini-clear"><i class="fa fa-trash-o"></i></a>
</li>
<li class="layui-nav-item mobile layui-hide-xs" lay-unselect>
<!-- 一个用于切换全屏显示的按钮通过自定义属性data-check-screen来标识使用了Font Awesome的箭头图标在手机端隐藏 -->
<a href="javascript:;" data-check-screen="full"><i class="fa fa-arrows-alt"></i></a>
</li>
<li class="layui-nav-item layuimini-setting">
<!-- 显示当前登录用户的用户名 -->
<a href="javascript:;">${sessionScope.user.username}</a>
<dl class="layui-nav-child">
<dd>
<!-- 链接到基本资料页面通过自定义属性layuimini-content-href指定页面路径data-title指定页面标题data-icon指定对应的图标并且添加了一个小红点标识可能用于提示有未读信息等情况 -->
<a href="javascript:;" layuimini-content-href="${pageContext.request.contextPath}/admin/myInfo" data-title="基本资料" data-icon="fa fa-gears">基本资料<span class="layui-badge-dot"></span></a>
</dd>
<dd>
<!-- 链接到修改密码页面,同样通过相关自定义属性指定页面路径、标题和图标 -->
<a href="javascript:;" layuimini-content-href="${pageContext.request.contextPath}/admin/mypassword" data-title="修改密码" data-icon="fa fa-gears">修改密码</a>
</dd>
<dd>
<!-- 水平分割线,用于在下拉菜单中区分不同功能区域 -->
<hr>
</dd>
<dd>
<!-- 退出登录按钮,点击会触发确认退出的弹框 -->
<a href="javascript:;" class="login-out">退出登录</a>
</dd>
</dl>
</li>
<li class="layui-nav-item layuimini-select-bgcolor" lay-unselect>
<!-- 用于选择配色方案的按钮通过自定义属性data-bgcolor来标识使用了Font Awesome的省略号图标 -->
<a href="javascript:;" data-bgcolor="配色方案"><i class="fa fa-ellipsis-v"></i></a>
</li>
</ul>
</div>
</div>
<!-- 页面头部区域结束 -->
<!--无限极左侧菜单-->
<!-- 无限极左侧菜单区域目前为空通常会通过JavaScript动态生成菜单树结构 -->
<div class="layui-side layui-bg-black layuimini-menu-left">
</div>
<!--初始化加载层-->
<!-- 初始化加载层,用于在页面初始化或加载数据等过程中显示加载动画,提示用户系统正在处理中 -->
<div class="layuimini-loader">
<div class="layuimini-loader-inner"></div>
</div>
<!--手机端遮罩层-->
<!-- 手机端遮罩层可能用于在手机端特定场景下遮挡部分页面内容具体功能需结合JavaScript代码实现 -->
<div class="layuimini-make"></div>
<!-- 移动导航 -->
<!-- 移动导航按钮可能用于在手机端展开或收起侧边栏等导航相关操作使用了layui的图标 -->
<div class="layuimini-site-mobile"><i class="layui-icon"></i></div>
<div class="layui-body">
<!-- 选项卡式的内容区域用于展示不同的页面模块或功能页面通过layui的tab组件实现 -->
<div class="layuimini-tab layui-tab-rollTool layui-tab" lay-filter="layuiminiTab" lay-allowclose="true">
<ul class="layui-tab-title">
<li class="layui-this" id="layuiminiHomeTabId" lay-id=""></li>
</ul>
<div class="layui-tab-control">
<div class="layuimini-tab-control">
<li class="layuimini-tab-roll-left layui-icon layui-icon-left"></li>
<li class="layuimini-tab-roll-right layui-icon layui-icon-right"></li>
<li class="layui-tab-tool layui-icon layui-icon-down">
<li class="layuimini-tab-tool layui-icon layui-icon-down">
<ul class="layui-nav close-box">
<li class="layui-nav-item">
<a href="javascript:;"><span class="layui-nav-more"></span></a>
@ -143,19 +175,29 @@
miniTongji = layui.miniTongji;
var options = {
iniUrl: "${pageContext.request.contextPath}/static/layui/api/init1.json", // 初始化接口
clearUrl: "${pageContext.request.contextPath}/static/layui/api/clear.json", // 缓存清理接口
urlHashLocation: true, // 是否打开hash定位
bgColorDefault: false, // 主题默认配置
multiModule: true, // 是否开启多模块
menuChildOpen: false, // 是否默认展开菜单
loadingTime: 0, // 初始化加载时间
pageAnim: true, // iframe窗口动画
maxTabNum: 20, // 最大的tab打开数量
// 初始化接口的URL通过表达式获取指向项目中特定的JSON数据接口用于加载初始化页面相关数据
iniUrl: "${pageContext.request.contextPath}/static/layui/api/init1.json",
// 缓存清理接口的URL同样通过表达式获取用于触发清理缓存的相关操作
clearUrl: "${pageContext.request.contextPath}/static/layui/api/clear.json",
// 是否打开hash定位用于实现页面内的锚点定位或者基于URL hash值的页面状态记录等功能
urlHashLocation: true,
// 主题默认配置这里设置为false可能表示不使用默认的主题配置具体含义需结合框架文档进一步明确
bgColorDefault: false,
// 是否开启多模块设置为true表示支持在页面中加载多个不同的功能模块通常涉及多个页面或功能区域的切换与管理
multiModule: true,
// 是否默认展开菜单设置为false表示菜单默认处于收起状态需要用户手动展开查看子菜单等内容
menuChildOpen: false,
// 初始化加载时间这里设置为0具体用途需结合框架的加载逻辑来确定可能表示不需要额外等待时间等情况
loadingTime: 0,
// 是否开启iframe窗口动画设置为true表示在切换不同的tab页面通常是通过iframe加载不同页面内容时会有动画过渡效果
pageAnim: true,
// 最大的tab打开数量限制了同时能打开的tab页签数量为20个防止过多页面打开占用过多资源等情况
maxTabNum: 20,
};
// 调用miniAdmin的渲染方法传入配置参数options用于初始化页面的整体布局、加载数据以及各种功能组件的设置等操作
miniAdmin.render(options);
// 百度统计代码,只统计指定域名
// 百度统计代码相关配置与渲染,只统计指定域名下的访问情况通过设置specific为true以及指定具体的域名列表来实现
miniTongji.render({
specific: true,
domains: [
@ -165,6 +207,7 @@
],
});
// 为退出登录按钮添加点击事件监听器点击时弹出确认框询问是否确定退出确认后跳转到指定的退出登录页面通过location.href设置跳转路径并关闭弹框
$('.login-out').on("click", function () {
layer.confirm('确定要退出吗?', {icon: 3, title:'提示'}, function(index){
location.href="${pageContext.request.contextPath}/admin/logout.html"
@ -174,4 +217,4 @@
});
</script>
</body>
</html>
</html>

@ -3,40 +3,132 @@
User: ASUS
Date: 2022/4/15
Time: 13:18
To change this template use File | Settings | File Templates.
这是一段JSP页面的代码模板注释说明了该文件创建的相关信息如创建工具、用户、创建时间等同时也提示了如何去修改这个模板通过指定的文件菜单操作
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面字符编码为UTF-8确保页面能正确显示各种字符 -->
<meta charset="UTF-8">
<!-- 页面标题,显示在浏览器标签栏,这里明确是后台管理系统的登录页面 -->
<title>后台管理-登陆</title>
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器以解决浏览器兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置允许跨域访问,这里允许任意来源的跨域请求,通常在开发环境或者特定需要跨域的场景下使用,生产环境需谨慎配置 -->
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<!-- 设置页面视口相关属性使页面能在不同设备如手机、平板、电脑上自适应显示初始缩放比例为1最大缩放比例为1 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 设置苹果移动设备上Web应用的状态栏样式为黑色用于优化在苹果设备上的显示效果 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- 声明页面在苹果移动设备上可作为Web应用运行具备类似原生应用的一些特性 -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- 禁止页面自动识别电话号码等格式,避免一些号码被误识别为可点击的链接 -->
<meta name="format-detection" content="telephone=no">
<!-- 引入layui框架的核心CSS文件用于构建页面的样式布局该文件包含了layui框架提供的各种UI组件的默认样式 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<style>
/* 设置html和body元素的宽度和高度都为100%,并且隐藏超出部分的内容,使页面充满整个浏览器窗口 */
html, body {width: 100%;height: 100%;overflow: hidden}
body {
/* 设置页面的背景图片,图片路径通过表达式获取,指向项目特定位置下的图片文件,背景图片会根据页面大小进行自适应显示 */
background-image: url(${pageContext.request.contextPath}/static/layui/images/bgt.jpg) ;
}
body:after {content:'';background-repeat:no-repeat;background-size:cover;-webkit-filter:blur(3px);-moz-filter:blur(3px);-o-filter:blur(3px);-ms-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;}
.layui-container {width: 100%;height: 100%;overflow: hidden}
.admin-login-background {width:360px;opacity: 0.8;
background-color: #00b7ee;height:300px;position:absolute;left:50%;top:40%;margin-left:-180px;margin-top:-100px;}
.logo-title {text-align:center;letter-spacing:2px;padding:14px 0;}
.logo-title h1 {color:#1E9FFF;font-size:25px;font-weight:bold;}
.login-form {background-color:#fff;border:1px solid #fff;border-radius:3px;padding:14px 20px;box-shadow:0 0 8px #eeeeee;}
.login-form .layui-form-item {position:relative;}
.login-form .layui-form-item label {position:absolute;left:1px;top:1px;width:38px;line-height:36px;text-align:center;color:#d2d2d2;}
.login-form .layui-form-item input {padding-left:36px;}
.captcha {width:60%;display:inline-block;}
.captcha-img {display:inline-block;width:34%;float:right;}
.captcha-img img {height:34px;border:1px solid #e6e6e6;height:36px;width:100%;}
body:after {
/* 利用伪元素:after为body元素添加一个覆盖在背景之上的元素用于实现背景模糊效果 */
content:'';
background-repeat:no-repeat;
background-size:cover;
/* 使用不同浏览器前缀的filter属性来设置模糊效果这里模糊半径为3px使背景图片呈现出模糊的视觉效果增加页面的层次感 */
-webkit-filter:blur(3px);
-moz-filter:blur(3px);
-o-filter:blur(3px);
-ms-filter:blur(3px);
filter:blur(3px);
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
z-index:-1;
}
.layui-container {
/* 设置该类名元素的宽度和高度都为100%,并且隐藏超出部分的内容,通常作为页面主要容器,方便对内部元素进行布局管理 */
width: 100%;
height: 100%;
overflow: hidden
}
.admin-login-background {
/* 设置登录背景框的宽度为360px透明度为0.8,使其呈现出半透明效果,背景颜色为特定的蓝色(#00b7ee */
width:360px;
opacity: 0.8;
background-color: #00b7ee;
/* 设置登录背景框的高度为300px并通过绝对定位使其在页面中居中显示水平和垂直方向上分别根据自身宽度和高度的一半进行偏移 */
height:300px;
position:absolute;
left:50%;
top:40%;
margin-left:-180px;
margin-top:-100px;
}
.logo-title {
/* 用于设置包含标题的元素内部文本居中对齐并且设置字母间距为2px同时添加上下内边距为14px用于美化标题的显示效果 */
text-align:center;
letter-spacing:2px;
padding:14px 0;
}
.logo-title h1 {
/* 设置标题文字的颜色为特定的浅蓝色(#1E9FFF字体大小为25px字体加粗用于突出显示页面的标题内容 */
color:#1E9FFF;
font-size:25px;
font-weight:bold;
}
.login-form {
/* 设置登录表单的背景颜色为白色(#fff添加1px的白色实线边框边框圆角为3px使其外观更加圆润同时添加内边距以及阴影效果增强表单的视觉层次感和立体感 */
background-color:#fff;
border:1px solid #fff;
border-radius:3px;
padding:14px 20px;
box-shadow:0 0 8px #eeeeee;
}
.login-form.layui-form-item {
/* 为登录表单内的每个表单项设置相对定位,方便后续在表单项内部对一些元素(如图标等)进行绝对定位布局 */
position:relative;
}
.login-form.layui-form-item label {
/* 将表单项的标签设置为绝对定位位于表单项的左上角宽度为38px垂直方向上的行高为36px文本居中对齐颜色为浅灰色#d2d2d2用于显示图标等提示信息 */
position:absolute;
left:1px;
top:1px;
width:38px;
line-height:36px;
text-align:center;
color:#d2d2d2;
}
.login-form.layui-form-item input {
/* 为表单项的输入框设置左内边距为36px使其文本输入区域避开左侧的图标等提示元素保证输入内容有足够的空间显示 */
padding-left:36px;
}
.captcha {
/* 设置验证码输入框所在元素的宽度占父元素的60%,并使其以行内块级元素显示,方便与验证码图片元素在同一行内进行布局排列 */
width:60%;
display:inline-block;
}
.captcha-img {
/* 设置验证码图片所在元素的宽度占父元素的34%,并使其向右浮动,与验证码输入框在同一行内分别位于左右两侧,实现常见的验证码输入与展示的布局效果 */
display:inline-block;
width:34%;
float:right;
}
.captcha-img img {
/* 设置验证码图片的高度为34px添加1px的浅灰色#e6e6e6边框宽度为100%,使其能自适应所在元素的宽度,完整显示验证码图片 */
height:34px;
border:1px solid #e6e6e6;
height:36px;
width:100%;
}
a{
/* 设置页面中所有超链接元素的文本颜色为矢车菊蓝cornflowerblue字体大小为16px统一超链接的样式风格 */
color: cornflowerblue;
font-size: 16px;
}
@ -51,24 +143,30 @@
<h1>酒店后台管理登录</h1>
</div>
<div class="layui-form-item">
<!-- 使用layui的图标作为用户名输入框的前置图标通过layui-icon类名和特定的图标类名layui-icon-username来显示用户名图标同时设置输入框的相关属性如name、id、验证规则lay-verify、占位符placeholder、自动完成关闭autocomplete="off")以及默认值等 -->
<label class="layui-icon layui-icon-username" for="username"></label>
<input type="text" name="username" id="username" lay-verify="required|account" placeholder="用户名或者邮箱" autocomplete="off" class="layui-input" value="xyp">
</div>
<div class="layui-form-item">
<!-- 与用户名输入框类似这里使用layui的密码图标layui-icon-password作为密码输入框的前置图标设置密码输入框的相关属性包括name、id、验证规则、占位符、自动完成关闭以及默认值等 -->
<label class="layui-icon layui-icon-password" for="password"></label>
<input type="password" name="password" id="password" lay-verify="required|password" placeholder="密码" autocomplete="off" class="layui-input" value="123">
</div>
<div class="layui-form-item">
<!-- 使用layui的验证码图标layui-icon-vercode作为图形验证码输入框的前置图标设置输入框的相关属性同时该输入框还有特定的验证规则captcha用于验证用户输入的验证码是否正确 -->
<label class="layui-icon layui-icon-vercode"></label>
<input type="text" name="code" lay-verify="required|captcha" placeholder="图形验证码" autocomplete="off" class="layui-input verification captcha" value="xSzG">
<div class="captcha-img">
<!-- 显示图形验证码图片图片的src属性通过表达式获取指向项目特定位置下的验证码图片文件通常该图片会动态更新以保证验证码的有效性 -->
<img id="captchaPic" src="${pageContext.request.contextPath}/static/layui/images/captcha.jpg">
</div>
</div>
<div class="layui-form-item">
<!-- 一个超链接元素,链接到注册页面,用户点击可跳转到注册页面进行账号注册操作,路径通过表达式获取 -->
<a href="${pageContext.request.contextPath}/admin/register.html">注册</a>
</div>
<div class="layui-form-item">
<!-- 登录按钮使用layui的按钮样式类layui-btn、layui-btn-normal、layui-btn-fluid来设置按钮的外观风格使其具有默认的蓝色背景、圆角等样式同时设置按钮的提交属性lay-submit以及提交的过滤规则lay-filter="login"),用于触发登录相关的表单验证和提交操作 -->
<button class="layui-btn layui-btn layui-btn-normal layui-btn-fluid" lay-submit="" lay-filter="login">登 入</button>
</div>
</form>
@ -86,16 +184,16 @@
$=layui.jquery;
// 登录过期的时候跳出ifram框架
if (top.location != self.location) top.location = self.location;
if (top.location!= self.location) top.location = self.location;
// 进行登录操作
// 进行登录操作通过form.on监听表单提交事件当点击登录按钮且表单验证通过时触发该回调函数这里的'submit(login)'表示监听lay-filter="login"的表单提交事件
form.on('submit(login)', function (data) {
//可以获取到表单中所有数据 data = data.field;
//发送登录请求
// 可以获取到表单中所有数据data.field是一个包含表单所有输入字段值的对象例如用户名、密码、验证码等信息都可以通过它获取到
// 发送登录请求,使用$.post方法向服务器端发送POST请求请求的URL是通过表达式获取的登录接口${pageContext.request.contextPath}/employee/login将表单数据data.field作为请求参数发送给服务器服务器返回的数据格式为JSON
$.post("${pageContext.request.contextPath}/employee/login",data.field,function (result) {
if(result.success){//如果登录成功跳转到后台页面
if(result.success){// 如果登录成功跳转到后台页面通过location.href设置页面跳转的路径跳转到后台管理系统的首页${pageContext.request.contextPath}/admin/home.html
location.href="${pageContext.request.contextPath}/admin/home.html";
} else{//登录失败 提示用户
} else{// 登录失败提示用户通过layer.msg方法弹出提示框显示服务器返回的错误信息result.msg告知用户登录失败的原因
layer.msg(result.msg);
}
},"json");

@ -3,44 +3,132 @@
User: ASUS
Date: 2022/4/15
Time: 13:18
To change this template use File | Settings | File Templates.
这是一段JSP页面的代码模板注释说明了该文件创建的相关信息如创建工具、用户、创建时间等同时也指出了如何去修改这个模板通过指定的文件菜单操作
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面字符编码为UTF-8确保页面能正确显示各种字符 -->
<meta charset="UTF-8">
<!-- 页面标题,显示在浏览器标签栏,明确此页面为后台管理系统的注册页面 -->
<title>后台管理-注册</title>
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器用于解决浏览器兼容性方面的问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置允许跨域访问,此处允许任意来源的跨域请求,一般在开发环境或者特定需要跨域的场景下会这样配置,生产环境中需谨慎设置 -->
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<!-- 设置页面视口相关属性使页面能够在不同设备如手机、平板、电脑上自适应显示初始缩放比例为1最大缩放比例也为1 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 设置苹果移动设备上Web应用的状态栏样式为黑色以优化在苹果设备上的显示效果 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- 声明页面在苹果移动设备上可作为Web应用运行具备类似原生应用的一些特性 -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- 禁止页面自动识别电话号码等格式,防止一些号码被误识别为可点击的链接 -->
<meta name="format-detection" content="telephone=no">
<!-- 引入layui框架的核心CSS文件该文件包含了layui框架提供的各种UI组件的默认样式用于构建页面整体的样式布局 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<style>
/* 设置html和body元素的宽度和高度都为100%,并且隐藏超出部分的内容,让页面可以充满整个浏览器窗口 */
html, body {width: 100%;height: 100%;overflow: hidden}
body { background-image: url(${pageContext.request.contextPath}/static/layui/images/bgt.jpg);}
body:after {content:'';background-repeat:no-repeat;background-size:cover;-webkit-filter:blur(3px);-moz-filter:blur(3px);-o-filter:blur(3px);-ms-filter:blur(3px);filter:blur(3px);position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;}
.layui-container {width: 100%;height: 100%;overflow: hidden}
.admin-login-background {
body {
/* 设置页面的背景图片,图片路径通过表达式获取,指向项目特定位置下的图片文件,背景图片会根据页面大小自动进行适配显示 */
background-image: url(${pageContext.request.contextPath}/static/layui/images/bgt.jpg);
}
body:after {
/* 利用伪元素:after为body元素添加一个覆盖在背景之上的元素用于实现背景模糊的效果 */
content:'';
background-repeat:no-repeat;
background-size:cover;
/* 使用不同浏览器前缀的filter属性来设置模糊效果这里模糊半径为3px使得背景图片呈现出模糊的视觉感受增强页面的层次感和美观度 */
-webkit-filter:blur(3px);
-moz-filter:blur(3px);
-o-filter:blur(3px);
-ms-filter:blur(3px);
filter:blur(3px);
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
z-index:-1;
}
.layui-container {
/* 设置该类名元素的宽度和高度都为100%,并且隐藏超出部分的内容,通常作为页面的主要容器,方便对内部元素进行整体的布局管理 */
width: 100%;
height: 100%;
overflow: hidden
}
.admin-login-background {
/* 设置登录背景框的宽度为360px高度为300px并通过绝对定位使其在页面中居中显示通过计算自身宽度和高度的一半来进行水平和垂直方向上的偏移调整 */
width:360px;
height:300px;position:absolute;
left:50%;top:40%;margin-left:-180px;
height:300px;
position:absolute;
left:50%;
top:40%;
margin-left:-180px;
margin-top:-100px;
/* 设置背景框的透明度为0.8,使其呈现出半透明的效果,背景颜色为特定的蓝色(#00b7ee增加页面的视觉效果和美观度 */
opacity: 0.8;
background-color: #00b7ee;
}
.logo-title {text-align:center;letter-spacing:2px;padding:14px 0;}
.logo-title h1 {color:#1E9FFF;font-size:25px;font-weight:bold;}
.login-form {background-color:#fff;border:1px solid #fff;border-radius:3px;padding:14px 20px;box-shadow:0 0 8px #eeeeee;}
.login-form .layui-form-item {position:relative;}
.login-form .layui-form-item label {position:absolute;left:1px;top:1px;width:38px;line-height:36px;text-align:center;color:#d2d2d2;}
.login-form .layui-form-item input {padding-left:36px;}
.captcha {width:60%;display:inline-block;}
.captcha-img {display:inline-block;width:34%;float:right;}
.captcha-img img {height:34px;border:1px solid #e6e6e6;height:36px;width:100%;}
.logo-title {
/* 使包含标题的元素内部文本居中对齐设置字母间距为2px同时添加上下内边距为14px用于优化标题的显示样式使其看起来更加美观、整齐 */
text-align:center;
letter-spacing:2px;
padding:14px 0;
}
.logo-title h1 {
/* 设置标题文字的颜色为特定的浅蓝色(#1E9FFF字体大小为25px字体加粗突出显示页面的标题内容让用户能清晰地知晓这是注册页面 */
color:#1E9FFF;
font-size:25px;
font-weight:bold;
}
.login-form {
/* 设置登录表单的背景颜色为白色(#fff添加1px的白色实线边框边框圆角为3px使其外观更加圆润、美观同时设置内边距并添加阴影效果增强表单在页面中的层次感和立体感 */
background-color:#fff;
border:1px solid #fff;
border-radius:3px;
padding:14px 20px;
box-shadow:0 0 8px #eeeeee;
}
.login-form.layui-form-item {
/* 为登录表单内的每个表单项设置相对定位,方便后续在表单项内部对一些元素(例如图标等)进行绝对定位布局操作 */
position:relative;
}
.login-form.layui-form-item label {
/* 将表单项的标签设置为绝对定位位于表单项的左上角宽度为38px垂直方向上的行高为36px文本居中对齐颜色为浅灰色#d2d2d2主要用于显示图标等提示性信息 */
position:absolute;
left:1px;
top:1px;
width:38px;
line-height:36px;
text-align:center;
color:#d2d2d2;
}
.login-form.layui-form-item input {
/* 为表单项的输入框设置左内边距为36px使其文本输入区域能够避开左侧的图标等提示元素确保输入的内容有足够的空间进行正常显示 */
padding-left:36px;
}
.captcha {
/* 设置验证码输入框所在元素的宽度占父元素的60%,并使其以行内块级元素的形式显示,方便与验证码图片元素在同一行内进行布局排列 */
width:60%;
display:inline-block;
}
.captcha-img {
/* 设置验证码图片所在元素的宽度占父元素的34%,并使其向右浮动,与验证码输入框在同一行内分别位于左右两侧,实现常见的验证码输入与展示的布局样式 */
display:inline-block;
width:34%;
float:right;
}
.captcha-img img {
/* 设置验证码图片的高度为34px添加1px的浅灰色#e6e6e6边框高度重新设置为36px可能是修正前面设置的高度值或者确保在不同浏览器下显示效果一致宽度为100%,使其能自适应所在元素的宽度,完整地显示验证码图片 */
height:34px;
border:1px solid #e6e6e6;
height:36px;
width:100%;
}
a{
/* 设置页面中所有超链接元素的文本颜色为红色,统一超链接在页面中的样式风格,使其更加醒目,便于用户识别和操作 -->
color: red;
}
</style>
@ -54,29 +142,36 @@
<h1>酒店后台管理注册</h1>
</div>
<div class="layui-form-item">
<!-- 使用layui的图标作为用户名输入框的前置图标通过layui-icon类名和特定的图标类名layui-icon-username来显示用户名图标同时设置输入框的相关属性如name、id、验证规则lay-verify、占位符placeholder、自动完成关闭autocomplete="off")以及默认值等 -->
<label class="layui-icon layui-icon-username" for="username"></label>
<input type="text" name="username" id="username" lay-verify="required|account" placeholder="用户名或者邮箱" autocomplete="off" class="layui-input" value="">
</div>
<div class="layui-form-item">
<!-- 同样使用layui的图标作为密码输入框的前置图标不过此处图标类名重复使用了layui-icon-username可能是笔误按常理应为layui-icon-password设置密码输入框的相关属性包括name、验证规则、占位符、自动完成关闭以及默认值等 -->
<label class="layui-icon layui-icon-password" for="username"></label>
<input type="password" name="password" lay-verify="required|password" placeholder="密码" autocomplete="off" class="layui-input" value="">
</div>
<div class="layui-form-item">
<!-- 使用layui的图标作为姓名输入框的前置图标此处图标类名使用layui-icon-password不太准确可能需要根据实际图标语义进行调整设置姓名输入框的相关属性如name、验证规则、占位符、自动完成关闭以及默认值等 -->
<label class="layui-icon layui-icon-password" ></label>
<input type="text" name="names" lay-verify="required|account" placeholder="姓名" autocomplete="off" class="layui-input" value="">
</div>
<div class="layui-form-item">
<!-- 性别输入框设置输入框的相关属性如name、最大输入长度maxlength、验证规则、占位符、自动完成关闭以及默认值等这里性别输入框可能期望用户输入单个字符来表示性别比如等用一个字表示的情况 -->
<input type="text" name="sex" maxlength="1" lay-verify="required|account" placeholder="性别" autocomplete="off" class="layui-input" value="">
</div>
<div class="layui-form-item">
<!-- 使用layui的图标作为部门编号输入框的前置图标图标类名可根据实际语义准确设置设置部门编号输入框的相关属性包括name、id、验证规则、占位符、自动完成关闭以及默认值等 -->
<label class="layui-icon layui-icon-password" ></label>
<input type="text" name="depId" id="depId" lay-verify="required|account" placeholder="部门编号" autocomplete="off" class="layui-input" value="">
</div>
<div class="layui-form-item">
<a href="${pageContext.request.contextPath}/admin/login.html">已有账号?返回登录</a>
<!-- 一个超链接元素,链接到登录页面,用户点击可跳转到登录页面进行登录操作,路径通过表达式获取,文本提示用户已有账号时可返回登录 -->
<a href="${pageContext.request.contextPath}/admin/login.html">已有账号?返回登录</a>
</div>
<div class="layui-form-item">
<!-- 注册按钮使用layui的按钮样式类layui-btn、layui-btn-normal、layui-btn-fluid来设置按钮的外观风格使其具有默认的蓝色背景、圆角等样式同时设置按钮的提交属性lay-submit以及提交的过滤规则lay-filter="login"),用于触发注册相关的表单验证和提交操作,这里按钮文本为“注册”,表明其功能是提交注册信息 -->
<button class="layui-btn layui-btn layui-btn-normal layui-btn-fluid" lay-submit="" lay-filter="login">注册</button>
</div>
</form>
@ -90,20 +185,20 @@
layui.use(['form','layer','jquery'], function () {
var form = layui.form,
layer = layui.layer,
$=layui.jquery;
$=layui.jquery;
// 登录过期的时候跳出ifram框架
if (top.location != self.location) top.location = self.location;
// 登录过期的时候跳出ifram框架这里判断如果当前页面的顶层窗口top.location与自身窗口self.location不一致就将顶层窗口的地址重定向到自身窗口地址确保页面处于正确的显示环境
if (top.location!= self.location) top.location = self.location;
// 进行登录操作
// 进行注册操作通过form.on监听表单提交事件当点击注册按钮且表单验证通过时触发该回调函数这里的'submit(login)'表示监听lay-filter="login"的表单提交事件按钮上设置了此lay-filter属性
form.on('submit(login)', function (data) {
//可以获取到表单中所有数据 data = data.field;
//发送登录请求
// 可以获取到表单中所有数据data.field是一个包含表单所有输入字段值的对象例如用户名、密码、姓名、性别、部门编号等信息都可以通过它获取到方便后续将这些数据发送给服务器进行注册处理
// 发送注册请求,使用$.post方法向服务器端发送POST请求请求的URL是通过表达式获取的注册接口${pageContext.request.contextPath}/employee/register将表单数据data.field作为请求参数发送给服务器服务器返回的数据格式为JSON
$.post("${pageContext.request.contextPath}/employee/register",data.field,function (result) {
console.log(result);
if(result.success){//如果登录成功跳转到后台页面
if(result.success){// 如果注册成功跳转到登录页面通过location.href设置页面跳转的路径跳转到后台管理系统的登录页面${pageContext.request.contextPath}/admin/login.html
location.href="${pageContext.request.contextPath}/admin/login.html";
} else{//登录失败 提示用户
} else{// 注册失败提示用户通过layer.msg方法弹出提示框显示服务器返回的错误信息result.msg告知用户注册失败的原因
layer.msg(result.msg);
}
},"json");

@ -2,15 +2,23 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面字符编码为UTF-8确保页面能够正确显示各种字符 -->
<meta charset="utf-8">
<!-- 页面标题,显示在浏览器标签栏,明确此页面的功能是用于修改密码 -->
<title>修改密码</title>
<!-- 指定页面渲染使用WebKit内核以保障页面在浏览器中能更好地呈现尤其是对于一些CSS样式和HTML5特性的支持 -->
<meta name="renderer" content="webkit">
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器解决可能出现的浏览器兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置页面视口相关属性使页面可以在不同设备如手机、平板、电脑上自适应显示初始缩放比例为1最大缩放比例为1 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入layui框架的核心CSS文件该文件包含了layui框架提供的各种UI组件的默认样式用于构建页面的整体样式布局 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入项目自定义的公共样式文件public.css可能用于对layui框架样式进行补充或覆盖实现项目特定的样式需求 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
<style>
.layui-form-item .layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
/* 自定义了一个名为layui-input-company的类样式应用到具有该类名的元素上设置其宽度为自动根据内容自适应宽度右侧内边距为10px行高为38px可能用于特定输入框等元素的样式定制 */
.layui-form-item.layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
</style>
</head>
<body>
@ -21,32 +29,52 @@
<div class="layui-form-item">
<label class="layui-form-label required">用户编号:</label>
<div class="layui-input-block">
<!-- 创建一个文本输入框,用于显示用户编号,设置其属性如下:
- name属性为"id",用于在表单提交时标识该字段。
- maxlength属性为"0"不过通常此处可能是设置一个具体的最大长度数值如果为0可能不太符合常规意义也许是有特殊业务逻辑需求或者后续会修改
- disabled="disabled"表示该输入框为禁用状态,用户不能编辑,仅用于展示用户编号信息。
- value属性通过表达式从会话作用域${sessionScope.user.id})获取用户编号的值并显示出来。
- lay-verify="required"表示该字段在表单提交时是必填项(这里虽然是禁用状态,但从验证规则角度设置了必填要求,可能更多是从数据完整性角度考虑)。
- autocomplete="off"关闭输入框的自动完成功能。
- class="layui-input"应用layui框架的默认输入框样式。
-->
<input type="text" name="id" maxlength="0" disabled="disabled" value="${sessionScope.user.id}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">旧的密码</label>
<div class="layui-input-block">
<!-- 创建一个密码输入框,用于用户输入旧密码,属性设置如下:
- name属性为"password",用于表单提交时标识该字段。
- lay-verify="required"表示该字段为必填项通过lay-reqtext="旧的密码不能为空"设置了必填提示文本,当用户未输入时会显示相应提示信息。
- placeholder="请输入旧的密码"设置了输入框的占位符文本,提示用户应输入的内容。
- value属性为空等待用户输入旧密码。
- class="layui-input"应用layui框架的默认输入框样式。
-->
<input type="password" name="password" lay-verify="required" lay-reqtext="旧的密码不能为空" placeholder="请输入旧的密码" value="" class="layui-input">
<tip>填写自己账号的旧的密码。</tip>
<!-- 这里的<tip>标签看起来不太符合标准HTML规范可能是自定义的用于显示提示信息的元素不过通常更建议使用如<span>等标准标签来实现类似功能以便更好地兼容不同浏览器和遵循HTML标准 -->
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">新的密码</label>
<div class="layui-input-block">
<!-- 创建一个密码输入框用于用户输入新密码其属性与旧密码输入框类似name属性为"new_password"设置了必填验证规则以及相应的必填提示文本placeholder提示用户输入新密码value为空等待用户输入 -->
<input type="password" name="new_password" lay-verify="required" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码" value="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">新的密码</label>
<div class="layui-input-block">
<!-- 这里再次出现了用于输入新密码的密码输入框,可能是代码重复或者有特殊业务逻辑需求(比如用于再次确认新密码输入是否一致等情况),同样设置了必填验证规则等相关属性 -->
<input type="password" name="again_password" lay-verify="required" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码" value="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 创建一个按钮应用layui框架的按钮样式类layui-btn、layui-btn-normal使其具有默认的蓝色背景等样式效果设置了lay-submit属性表示该按钮用于提交表单lay-filter="saveBtn"用于为表单提交事件添加一个特定的过滤器名称方便后续通过JavaScript监听并处理该按钮的提交事件 -->
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
</div>
</div>
@ -60,19 +88,20 @@
var $ = layui.jquery,
form = layui.form;
//监听表单提交事件
// 监听表单提交事件通过form.on方法监听lay-filter为"saveBtn"的表单提交事件与页面中按钮设置的lay-filter属性对应当用户点击“确认保存”按钮且表单验证通过时会触发该回调函数
form.on("submit(saveBtn)",function (data) {
// 使用$.post方法向服务器端发送POST请求请求的URL是通过表达式获取的修改密码接口${pageContext.request.contextPath}/employee/updatePassword将表单数据data.field包含用户输入的旧密码、新密码等信息作为请求参数发送给服务器服务器返回的数据格式为JSON
$.post("${pageContext.request.contextPath}/employee/updatePassword",data.field,function(result){
if(result.success){
//关闭窗口
// 如果服务器返回的结果中success属性为true表示修改密码成功通过layer.msg方法弹出提示框显示服务器返回的提示信息result.msg告知用户修改密码成功
layer.msg(result.msg);
} else {
//提示信息
// 如果success属性为false表示修改密码失败同样通过layer.msg方法弹出提示框,显示服务器返回的错误信息result.error这里假设服务器返回的错误信息字段名为error告知用户修改密码失败的原因
layer.msg(result.error);
}
},"json");
//禁止页面刷新
// 返回false可以阻止表单默认的提交行为避免页面刷新因为这里是通过Ajax异步请求的方式向服务器提交数据不需要页面进行常规的刷新操作
return false;
});

@ -2,15 +2,23 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面的字符编码为UTF-8确保能够正确显示各种字符避免出现乱码问题 -->
<meta charset="utf-8">
<!-- 设置页面标题,在浏览器的标签栏中显示此标题,这里明确表示页面功能是用于展示和修改用户的基本资料 -->
<title>基本资料</title>
<!-- 指定页面渲染使用WebKit内核这有助于在浏览器中更好地呈现页面效果特别是针对一些CSS样式以及HTML5的特性能提供更好的支持 -->
<meta name="renderer" content="webkit">
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器以此来解决可能出现的浏览器兼容性方面的问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置页面视口相关属性使得页面能够在不同类型的设备例如手机、平板、电脑等上自适应地进行显示初始缩放比例和最大缩放比例都设置为1 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入layui框架的核心CSS文件该文件包含了layui框架所提供的各种UI组件的默认样式用于构建页面整体的样式布局 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入项目自定义的公共样式文件public.css其作用可能是对layui框架的默认样式进行补充或者覆盖以满足项目特定的样式需求 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
<style>
.layui-form-item .layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
/* 自定义了一个名为.layui-form-item.layui-input-company的类选择器样式应用到符合此选择器规则的元素上将其宽度设置为自动也就是根据内容自适应宽度右侧内边距设置为10px行高设置为38px通常用于对特定输入框等元素进行样式的定制化处理 */
.layui-form-item.layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
</style>
</head>
<body>
@ -22,12 +30,22 @@
<div class="layui-form-item">
<label class="layui-form-label required">用户编号:</label>
<div class="layui-input-block">
<!-- 创建一个文本输入框用于显示用户编号,相关属性设置如下:
- type属性为"text",表示这是一个文本输入框类型。
- name属性设置为"id",在表单提交时用于标识该字段,方便服务器端识别和处理对应的数据。
- maxlength属性设置为"2"限定了该输入框最多可输入的字符长度为2个字符。
- value属性通过表达式从会话作用域${sessionScope.user.id})获取用户编号的值,并将其显示在输入框中,实现已有数据的展示功能。
- lay-verify="required"表示该输入框在表单提交时是必填项,若用户未输入内容,会触发相应的验证提示信息。
- autocomplete="off"关闭了输入框的自动完成功能,避免浏览器自动填充一些可能不符合需求的内容。
- class="layui-input"应用了layui框架的默认输入框样式使其在外观上与框架整体风格保持一致。
-->
<input type="text" name="id" maxlength="2" value="${sessionScope.user.id}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">用户名</label>
<div class="layui-input-block">
<!-- 与用户编号输入框类似这是一个用于显示用户名的文本输入框其name属性为"username"通过表达式从会话作用域获取已有用户名的值进行展示同样设置了必填验证规则关闭自动完成功能并应用layui框架的默认输入框样式 -->
<input type="text" name="username" value="${sessionScope.user.username}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
@ -35,24 +53,28 @@
<div class="layui-form-item">
<label class="layui-form-label required">姓名</label>
<div class="layui-input-block">
<!-- 姓名输入框name属性为"name",从会话作用域获取并展示已有姓名值,设置必填验证规则、关闭自动完成功能以及应用默认样式,用于用户可编辑姓名信息(如果需要修改的话) -->
<input type="text" name="name" value="${sessionScope.user.name}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">性别</label>
<div class="layui-input-block">
<!-- 性别输入框name属性为"sex",展示已有性别值,设置必填验证规则等,不过这里可能根据实际业务情况,性别输入框后续可以考虑采用更合适的输入方式,比如单选按钮等形式来确保输入数据的规范性 -->
<input type="text" name="sex" value="${sessionScope.user.sex}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">部门编号</label>
<div class="layui-input-block">
<!-- 部门编号输入框name属性为"deptId",展示已有部门编号值,设置必填验证规则、关闭自动完成功能并应用默认样式,方便用户在需要时修改部门编号信息 -->
<input type="text" name="deptId" value="${sessionScope.user.deptId}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 创建一个按钮应用layui框架的按钮样式类layui-btn、layui-btn-normal使其具有默认的蓝色背景等样式效果设置了lay-submit属性表示该按钮用于提交表单lay-filter="saveBtn"用于为表单提交事件添加一个特定的过滤器名称方便后续通过JavaScript代码监听并处理该按钮的提交事件 -->
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
</div>
</div>
@ -67,22 +89,27 @@
var $ = layui.jquery,
form = layui.form;
//监听表单提交事件
// 监听表单提交事件通过form.on方法监听lay-filter为"saveBtn"的表单提交事件与页面中按钮设置的lay-filter属性相对应当用户点击“确认保存”按钮且表单验证通过时会触发此回调函数
form.on("submit(saveBtn)",function (data) {
// 使用$.post方法向服务器端发送POST请求请求的URL是通过表达式获取的更新用户信息接口${pageContext.request.contextPath}/employee/updateUser将表单数据data.field包含用户在各个输入框中输入或修改后的数据如用户名、姓名、性别、部门编号等信息作为请求参数发送给服务器服务器返回的数据格式为JSON
$.post("${pageContext.request.contextPath}/employee/updateUser",data.field,function(result){
if(result.success){
//关闭窗口
// 如果服务器返回的结果中success属性为true表示更新用户基本资料成功通过layer.msg方法弹出提示框显示服务器返回的提示信息result.msg告知用户更新操作成功
layer.msg(result.msg);
} else {
//提示信息
// 如果success属性为false表示更新用户基本资料失败同样通过layer.msg方法弹出提示框,显示服务器返回的错误信息result.error这里假设服务器返回的错误信息字段名为error告知用户更新失败的原因
layer.msg(result.error);
}
},"json");
//禁止页面刷新
// 返回false可以阻止表单默认的提交行为避免页面刷新因为这里是通过Ajax异步请求的方式向服务器提交数据不需要页面进行常规的刷新操作
return false;
});
/*//监听提交
/*
// 以下是一段被注释掉的代码从代码逻辑上看也是用于监听表单提交事件与上面监听的是同一个lay-filter为"saveBtn"的事件),不过其实现的功能有所不同。
// 当点击提交按钮触发该事件时会先弹出一个确认框提示用户“确定修改这些信息吗标题为“个人信息修改”当用户点击确认框的确认按钮后会关闭该确认框通过layer.close(index)并且调用miniTab.deleteCurrentByIframe()函数这里miniTab看起来是自定义的一个用于操作页面标签页相关功能的对象具体功能需看其对应代码实现可能用于关闭当前所在的页面标签页等操作。
// 由于这段代码被注释掉了,所以目前在页面运行时不会执行此逻辑,若后续有需求,可以根据实际情况决定是否取消注释启用这段代码逻辑。
form.on('submit(saveBtn)', function (data) {
var index = layer.alert("确定修改这些信息吗?", {
title: '个人信息修改'
@ -93,7 +120,7 @@
});
return false;
});
*/
*/
});
</script>
</body>

@ -2,77 +2,100 @@
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!--1.启动spring容器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--如果我们有多个.xml 文件 我们只需要要 classpath:applicationContext_*.xml即可-->
<!--比如我们有两个文件分别是applicationContext_dao.xml,applicationContext_service.xml-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--spring的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--2.配置spring-mvc的前端控制器 拦截所有请求-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--3.乱码过滤器 一定要放在所有的过滤器之前-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--请求强制转换-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--响应强制转换-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 设置此 Web 应用在服务器管理界面等显示的名称,这里是一个由框架创建时的默认名称,实际应用中可根据项目情况修改为更有意义的名称 -->
<display-name>Archetype Created Web Application</display-name>
<!--使用过滤器实现登陆控制-->
<!--filter标签用于声明过滤器对象-->
<filter>
<!--过滤器名称-->
<filter-name>LoginFilter</filter-name>
<!--过滤器完整类名-->
<filter-class>comxyp.filter.LoginFilter</filter-class>
</filter>
<!--filter-mapping用于创建过滤器的映射指定Web应用中哪些URL应用哪一个过滤器进行处理-->
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<!--url-pattern用于指定过滤器应用的URL-->
<!--过滤的页面(自定义),这里对登录界面就不要过滤了-->
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
<!-- 1.启动 spring 容器相关配置 -->
<context-param>
<!-- 参数名称,用于标识下面配置的参数值所对应的具体用途,这里的 contextConfigLocation 用于指定 Spring 容器配置文件的位置 -->
<param-name>contextConfigLocation</param-name>
<!-- 参数值,此处配置表示 Spring 容器的配置文件路径为 classpath 下的 applicationContext.xml 文件。
如果有多个.xml 文件用于配置 Spring 容器(例如按不同模块划分,像有 applicationContext_dao.xml、applicationContext_service.xml 等),
可以使用通配符的方式配置,如 classpath:applicationContext_*.xml这样 Spring 容器启动时会加载匹配的多个配置文件。
-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--首先进入默认页面-->
<welcome-file-list>
<welcome-file>/fronts/home.jsp</welcome-file>
</welcome-file-list>
<!-- <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>-->
</web-app>
<!-- spring 的监听器配置,用于监听 Web 应用的启动等相关事件,触发 Spring 容器的初始化等操作 -->
<listener>
<!-- 指定监听器的具体实现类,这里使用的是 Spring 框架提供的 ContextLoaderListener它负责在 Web 应用启动时加载 Spring 容器 -->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 2.配置 spring-mvc 的前端控制器相关配置,它会拦截所有请求并进行处理 -->
<servlet>
<!-- 为前端控制器指定一个名称,方便后续在其他配置(如 servlet-mapping中引用 -->
<servlet-name>DispatcherServlet</servlet-name>
<!-- 指定前端控制器对应的具体类,这是 Spring MVC 框架中核心的 DispatcherServlet 类,用于处理请求的分发、视图解析等操作 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 初始化参数名称,同样这里的 contextConfigLocation 用于指定 Spring MVC 相关配置文件的位置 -->
<param-name>contextConfigLocation</param-name>
<!-- 参数值,指定 Spring MVC 的配置文件路径为 classpath 下的 springMvc.xml 文件,该文件包含了 Spring MVC 模块的各种配置,如视图解析器配置、处理器映射等 -->
<param-value>classpath:springMvc.xml</param-value>
</init-param>
<!-- 设置此 servlet前端控制器在 Web 应用启动时的加载顺序,值为 1 表示会较早地被加载启动,一般将重要的、需要先初始化的 servlet 设置较小的加载顺序值 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 关联前面定义的 servlet通过 servlet-name 对应),表示下面配置的 URL 模式由名为 DispatcherServlet 的前端控制器来处理 -->
<servlet-name>DispatcherServlet</servlet-name>
<!-- URL 模式配置,“/”表示此前端控制器会拦截所有请求(除去已经被其他更精确匹配的 servlet 或过滤器处理的请求),将请求引导到 Spring MVC 框架进行处理 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 3.乱码过滤器配置,用于解决请求和响应过程中的字符编码问题,一定要放在所有的过滤器之前,确保在其他过滤器处理请求之前就对字符编码进行统一设置 -->
<filter>
<!-- 过滤器名称,用于唯一标识这个过滤器,方便在后续的过滤器映射配置中引用 -->
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 指定过滤器的具体实现类,这里使用的是 Spring 框架提供的 CharacterEncodingFilter用于处理字符编码相关的转换和设置 -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 参数名称,用于指定要设置的字符编码名称 -->
<param-name>encoding</param-name>
<!-- 参数值,设置请求和响应的字符编码为 UTF-8确保应用能正确处理各种包含不同字符的请求和响应内容避免乱码问题 -->
<param-value>UTF-8</param-value>
</init-param>
<!-- 请求强制转换相关配置,设置为 true 表示强制将所有请求的字符编码转换为上面配置的 encoding 值UTF-8确保进入应用的请求数据编码统一 -->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 响应强制转换相关配置,设置为 true 表示强制将所有响应的字符编码转换为上面配置的 encoding 值UTF-8确保从应用发出的响应数据编码统一 -->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 关联前面定义的过滤器(通过 filter-name 对应),表示下面配置的 URL 模式会应用此 CharacterEncodingFilter 过滤器进行字符编码处理 -->
<filter-name>CharacterEncodingFilter</filter-name>
<!-- URL 模式配置,“/*”表示此过滤器会应用到所有的请求路径上,对整个 Web 应用的请求和响应进行字符编码的处理 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 使用过滤器实现登陆控制相关配置 -->
<!-- filter 标签用于声明过滤器对象 -->
<filter>
<!-- 过滤器名称,用于唯一标识这个登录控制相关的过滤器,方便后续配置其应用的 URL 等信息 -->
<filter-name>LoginFilter</filter-name>
<!-- 过滤器完整类名,指定了自定义的过滤器类所在的位置,这里是 comxyp.filter.LoginFilter该类中应该包含了具体的登录验证等相关逻辑 -->
<filter-class>comxyp.filter.LoginFilter</filter-class>
</filter>
<!-- filter-mapping 用于创建过滤器的映射,指定 Web 应用中,哪些 URL 应用哪一个过滤器进行处理 -->
<filter-mapping>
<!-- 关联前面定义的过滤器(通过 filter-name 对应),表示下面配置的 URL 模式会应用此 LoginFilter 过滤器进行登录相关的处理 -->
<filter-name>LoginFilter</filter-name>
<!-- url-pattern 用于指定过滤器应用的 URL这里“/jsp/*”表示此过滤器会对以“/jsp/”开头的所有 URL 路径进行过滤处理,不过这里对登录界面就不要过滤了(具体的排除登录界面过滤逻辑可能在 LoginFilter 类中实现) -->
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
<!-- 配置首先进入的默认页面,当用户访问此 Web 应用的根路径时,服务器会查找并返回这里配置的页面 -->
<welcome-file-list>
<welcome-file>/fronts/home.jsp</welcome-file>
</welcome-file-list>
<!-- 以下是一段被注释掉的欢迎页面配置,原本也可以配置多个欢迎页面,服务器会按照顺序查找并返回第一个存在的页面作为默认页面,这里注释掉表示当前只使用上面配置的 /fronts/home.jsp 作为默认页面 -->
<!-- <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>-->
</web-app>

File diff suppressed because it is too large Load Diff

@ -3,116 +3,143 @@
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
<!-- 设置页面的HTTP响应头部的Content-Type指定字符编码为UTF-8确保页面能正确显示各种字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 声明页面使用webkit作为渲染引擎有助于在不同浏览器中实现更一致的页面显示效果 -->
<meta name="renderer" content="webkit">
<!-- 配置页面在IE浏览器中的兼容性模式使其以最新的IE版本或使用Chrome Frame渲染来渲染页面 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置页面视口相关属性让页面宽度自适应设备宽度初始缩放比例和最大缩放比例都设为1便于移动端适配 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的CSS样式文件路径通过EL表达式结合项目上下文路径动态获取用于页面的样式布局 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
<!-- 引入自定义的全局CSS样式文件用于定义一些通用的页面样式设置了字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个自定义的全局CSS样式文件可能用于不同场景或版本的样式调整同样设置了字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
<!-- 引入专门针对商店页面可能本页面是酒店管理系统中与商店相关部分的CSS样式文件字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
<!-- 设置页面的图标favicon图标文件路径通过EL表达式结合项目上下文路径动态获取 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面的标题,显示在浏览器标签页上 -->
<title>首页-酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<ul class="layui-nav" id="layui-nav-userinfo">
<c:if test="${sessionScope.users!=null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li>
</c:if>
<c:if test="${sessionScope.users==null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
<!-- 页面顶部区域开始的标记,用于方便识别和样式设置等 -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<!-- 页面的logo图片链接点击可跳转到index.html页面用于展示品牌标识等 -->
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<ul class="layui-nav" id="layui-nav-userinfo">
<!-- 使用JSTL的条件判断标签根据sessionScope中users对象是否为空来决定显示不同的导航菜单项 -->
<c:if test="${sessionScope.users!=null}">
<!-- 导航菜单项代表“首页”设置了特定的数据ID、隐藏在小屏幕的xs尺寸下以及添加了“当前选中”的样式类 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<!-- 链接到对应的前台首页JSP页面添加了自定义的样式类和数据类型属性用于导航和样式效果 -->
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航菜单项代表“房间”同样隐藏在小屏幕的xs尺寸下此处链接为JavaScript:void(0); 表示点击暂时无实际跳转动作 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<!-- 导航菜单项代表“后台管理”隐藏在小屏幕的xs尺寸下点击可跳转到管理员登录页面 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
<!-- 导航菜单项代表“退出”隐藏在小屏幕的xs尺寸下点击会触发用户退出的相关操作具体由后端的/user/logout路径处理 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li>
</c:if>
<c:if test="${sessionScope.users==null}">
<!-- 导航菜单项代表“首页”设置了特定的数据ID、隐藏在小屏幕的xs尺寸下以及添加了“当前选中”的样式类点击跳转到前台首页JSP页面 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航菜单项代表“房间”隐藏在小屏幕的xs尺寸下点击跳转到房间列表的JSP页面 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<!-- 导航菜单项代表“登入”隐藏在小屏幕的xs尺寸下点击跳转到登录页面 -->
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<!-- 导航菜单项代表“注册”隐藏在小屏幕的xs尺寸下点击跳转到注册页面 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<!-- 用于显示导航栏菜单项选中效果的样式元素当前设置了初始的位置、宽度和透明度等样式属性可能后续通过JavaScript等动态改变样式来体现选中状态 -->
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
</div>
<!-- 顶部end -->
<!-- 页面顶部区域结束的标记 -->
<!-- 中间区域开始 -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<form class="layui-form layuimini-form">
<div class="input-search">
<div id="searchRoom">
<input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688">
<i class="layui-icon layui-icon-search"></i>
</button>
<!-- 中间区域开始的标记 -->
<div class="shop-nav shop-index">
<!-- 搜索区域开始的标记 -->
<div id="LAY-topbar" style="height: auto;">
<form class="layui-form layuimini-form">
<div class="input-search">
<div id="searchRoom">
<!-- 输入框用于用户输入搜索房间的关键词设置了占位提示文本、名称、ID属性关闭了自动完成功能初始值为空 -->
<input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮应用了Layui的按钮样式类点击时会触发表单提交操作并且绑定了名为searchHotelRoom的筛选条件按钮背景色设置为特定颜色 -->
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688">
<i class="layui-icon layui-icon-search"></i>
</button>
</div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo">
<img src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
</div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo">
<img src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
</div>
</form>
</div>
<!--搜索 end-->
<div class="shop-banner">
<!-- 左侧导航开始 -->
<div class="layui-container layui-hide-xs">
<div class="product-list">
<dl id="getIndexRoomType">
<dt style="background-color: #009688"><a href="lists.html" target="_blank">房间分类</a></dt>
<c:forEach items="${roomTypeList}" var="tp">
<dd data-id="${tp.id}">
<a class="fly-case-active" href="${pageContext.request.contextPath}/fronts/hotelList.jsp" data-type="">
${tp.roomname}
</a>
</dd>
</c:forEach>
</form>
</div>
<!-- 搜索区域结束的标记 -->
<div class="shop-banner">
<!-- 左侧导航开始的标记 -->
<div class="layui-container layui-hide-xs">
<div class="product-list">
<dl id="getIndexRoomType">
<!-- 左侧导航的标题项设置了背景颜色链接到lists.html页面可能是展示房间分类列表的页面在新标签页打开 -->
<dt style="background-color: #009688"><a href="lists.html" target="_blank">房间分类</a></dt>
<!-- 使用JSTL的forEach循环遍历roomTypeList集合可能是从后端传递过来的房间类型数据列表 -->
<c:forEach items="${roomTypeList}" var="tp">
<!-- 每个房间类型对应的导航菜单项设置了对应的数据ID点击可跳转到酒店房间列表的JSP页面展示具体的房间类型名称 -->
<dd data-id="${tp.id}">
<a class="fly-case-active" href="${pageContext.request.contextPath}/fronts/hotelList.jsp" data-type="">
${tp.roomname}
</a>
</dd>
</c:forEach>
</dl>
</dl>
</div>
</div>
</div>
<!-- 左侧导航结束 -->
<!-- 左侧导航结束的标记 -->
<!-- 轮播图开始 -->
<div class="layui-carousel" lay-filter="LAY-store-banner" id="LAY-store-banner" lay-anim lay-indicator="inside" >
<div carousel-item>
<div class="layui-this">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/1.jpg" alt="酒店系统"></a>
<!-- 轮播图开始的标记 -->
<div class="layui-carousel" lay-filter="LAY-store-banner" id="LAY-store-banner" lay-anim lay-indicator="inside" >
<div carousel-item>
<div class="layui-this">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/1.jpg" alt="酒店系统"></a>
</div>
</div>
</div>
<div class="">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/2.jpg" alt="酒店系统"></a>
<div class="">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/2.jpg" alt="酒店系统"></a>
</div>
</div>
</div>
<div class="">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/3.jpg" alt="酒店系统"> </a>
<div class="">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/3.jpg" alt="酒店系统"> </a>
</div>
</div>
</div>
<div class="">
<div class="layui-container"><a href="javascript:;" target="_blank">
<img src="${pageContext.request.contextPath}/static/front/images/4.jpg" alt="酒店系统"> </a>
@ -131,9 +158,12 @@
</div>
<!-- 轮播图的指示器部分用于展示轮播图当前所处的位置以及总共有多少张图片这里假设有6张对应6个li -->
<div class="layui-carousel-ind">
<ul>
<!-- 当前选中的指示点添加了layui-this样式类用于展示当前显示的是哪一张轮播图这里第一个li默认被选中 -->
<li class="layui-this"></li>
<!-- 其他未选中的指示点后续通过JavaScript等逻辑可根据轮播图切换来动态改变此样式类的添加 -->
<li class=""></li>
<li class=""></li>
<li class=""></li>
@ -141,193 +171,227 @@
<li class=""></li>
</ul>
</div>
<!-- 轮播图的上一张按钮使用layui-icon样式类来应用特定的图标样式lay-type属性设置为"sub"表示其功能是切换到上一张轮播图 -->
<button class="layui-icon layui-carousel-arrow" lay-type="sub"></button>
<!-- 轮播图的下一张按钮同样使用layui-icon样式类lay-type属性为"add",用于切换到下一张轮播图 -->
<button class="layui-icon layui-carousel-arrow" lay-type="add"></button>
</div>
<!-- 轮播图结束 -->
</div>
<!-- 轮播图结束的标记 -->
<!-- 酒店楼层开始 -->
<div class="shop-temp" id="getIndexFloor">
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店1楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d1.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d2.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d3.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
<!-- 酒店楼层开始的标记,这部分主要用于展示酒店各楼层不同房间的相关信息 -->
<div class="shop-temp" id="getIndexFloor">
<!-- 酒店1楼房间信息展示区域开始使用layui-container来进行布局包裹 -->
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店1楼<span></span></p>
<div class="layui-row layui-col-space20">
<!-- 每个div代表一个房间的展示区域data-id属性可能用于唯一标识每个房间此处使用${room.id}来获取具体的房间ID应该是从后端传来的数据 -->
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<!-- 这是一个整体的房间展示链接点击可跳转到房间详情页面fronts/detail.jsp并传递了一个名为toRoomInfo的数据类型参数可能用于在详情页做相应的业务逻辑处理 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<!-- 展示房间对应的图片设置了相应的图片路径以及store-list-cover样式类用于控制图片在页面中的显示样式 -->
<img src="${pageContext.request.contextPath}/static/images/d1.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类可能用于实现文字超出部分以省略号显示等文本排版效果 -->
<h2 class="layui-elip">单人间</h2>
<!-- 展示房间价格和房号信息price样式类用于对整体价格和房号区域进行布局样式控制 -->
<p class="price">
<!-- 展示房间金额信息通过title属性添加了额外的提示文本"金额" -->
<span title="金额"> ¥100.00 </span>
<!-- 展示房号信息设置了背景色、内边距、文本居中对齐、边框以及字体大小等样式通过title属性添加了提示文本"房号" -->
<span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span>
</p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d2.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d3.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<p class="price"> <span title="金额"> ¥100.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
</div>
</div>
<!-- 酒店1楼房间信息展示区域结束 -->
</div>
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店2楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s1.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s2.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b3.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
</div>
</div>
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店3楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b1.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b2.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b3.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店2楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s1.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s2.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b3.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<p class="price"> <span title="金额"> ¥120.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
</div>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店3楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b1.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b2.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b3.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<p class="price"> <span title="金额"> ¥180.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店4楼<span></span></p>
<div class="layui-row layui-col-space20">
<div class="layui-container">
<p class="temp-title-cn"><span></span>酒店4楼<span></span></p>
<div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t1.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t2.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t3.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<!-- 这是一个用于展示酒店4楼其中一个房间总统套房信息的div容器通过data-id属性绑定具体房间的唯一标识${room.id}应是从后端获取的房间ID使用了layui的栅格系统类layui-col-xs6和layui-col-md3来控制在不同屏幕尺寸下的布局占比 -->
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<!-- 这是一个链接a标签点击后会跳转到房间详情页面fronts/detail.jsp同时传递了一个名为toRoomInfo的数据类型参数可能用于在详情页做对应业务逻辑区分添加了一些样式类用于样式控制和交互效果 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t1.png" class="store-list-cover">
<!-- 展示该房间对应的图片设置了对应的图片路径以及样式类store-list-cover用于页面中图片显示样式的定制比如大小、对齐等 -->
<img src="${pageContext.request.contextPath}/static/images/t4.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“总统套房” -->
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span></p>
<!-- 展示房间价格和房号信息的区域使用了price样式类来整体控制其在页面中的布局样式 -->
<p class="price">
<!-- 展示房间的金额信息通过title属性添加了额外提示文本“金额”此处价格为¥888.00 -->
<span title="金额"> ¥888.00 </span>
<!-- 展示房号信息设置了一系列样式如文字颜色、背景色、内边距、文本居中对齐、边框以及字体大小等通过title属性添加提示文本“房号”这里房号是NO.4 -->
<span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span>
</p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t2.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t3.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.3 </span></p>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t4.png" class="store-list-cover">
<h2 class="layui-elip">总统套房</h2>
<p class="price"> <span title="金额"> ¥888.00 </span> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.4 </span></p>
</a>
</div>
</div>
</div>
</div>
</div>
<!-- 酒店楼层结束 -->
</div>
</div>
<!-- 中间区域结束 -->
<!-- 酒店楼层结束的注释标记,意味着酒店各楼层房间信息展示部分到此结束 -->
<!-- 底部 -->
<div class="fly-footer">
<p><a href="#">酒店系统</a> 20222 © <a href="#">xyp.cn</a></p>
<p>
友情链接
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a> </p>
<!-- 中间区域结束的注释标记,说明页面中间主要内容展示区域已完结 -->
</div>
</div>
</div>
<!-- 底部区域开始,用于展示页面底部相关信息,比如版权声明、友情链接等 -->
<div class="fly-footer">
<!-- 展示版权相关信息及链接到首页的文字链接,文本内容包含了“酒店系统”以及版权年份、所属网站域名等信息 -->
<p><a href="#">酒店系统</a> 20222 © <a href="#">xyp.cn</a></p>
<p>
<!-- 友情链接标题文本 -->
友情链接
<!-- 以下是一系列友情链接点击可跳转到对应的外部网站target="_blank"表示在新标签页中打开链接 -->
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a>
</p>
</div>
<!-- 脚本开始的注释标记意味着下面开始引入和编写JavaScript相关代码 -->
<!-- 引入Layui框架的核心JavaScript文件文件路径通过EL表达式结合项目上下文路径动态获取这是使用Layui框架各种功能的基础 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
// 使用Layui框架的use方法来加载模块这里加载了"form"、"element"、"carousel"三个模块,并在回调函数中使用它们
layui.use(["form","element","carousel"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
$ = layui.$;
<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
layui.use(["form","element","carousel"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
$ = layui.$;
// 使用carousel模块的render方法来渲染轮播图配置相关参数
// elem属性指定轮播图对应的DOM元素的ID这里是'LAY-store-banner'
// width属性设置轮播图容器的宽度为100%,使其自适应父容器宽度
// height属性设置轮播图容器的高度为460像素
// arrow属性设置为'always',表示始终显示轮播图的切换箭头,方便用户操作切换图片
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
});
</script>
<!-- 脚本结束的注释标记表示JavaScript代码部分结束 -->
//渲染轮播图
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
});
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>
<!-- 这是一个用于实现页面固定栏可能是回到顶部等功能按钮所在栏相关样式和交互效果的无序列表使用了layui-fixbar样式类 -->
<ul class="layui-fixbar">
<!-- 列表中的一个元素代表回到顶部按钮使用了layui-icon样式类来应用特定图标样式lay-type属性设置为"top"表示其功能是回到页面顶部通过style属性设置了一些额外的样式 -->
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<!-- 这是一个用于实现页面某些元素可能是弹窗等可拖动效果的空div使用了layui-layer-move样式类 -->
<div class="layui-layer-move"></div>
</body>
</html>
</body>
</html>

@ -3,256 +3,335 @@
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
<!-- 设置页面的字符编码为UTF-8 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 指定页面使用webkit内核进行渲染 -->
<meta name="renderer" content="webkit">
<!-- 声明页面以IE的最高版本或Chrome的模式来渲染以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置页面的视口使其宽度等于设备宽度初始缩放比例为1最大缩放比例也为1实现页面在移动端的自适应显示 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的CSS文件路径通过EL表达式结合项目上下文路径动态获取用于设置页面的样式框架 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
<!-- 引入自定义的全局样式文件用于补充和覆盖Layui框架样式以及设置项目通用的样式规则字符编码指定为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
<!-- 引入特定于当前页面可能是商店、酒店相关页面的样式文件用于定制该页面独有的样式字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
<!-- 设置页面的图标指定图标文件的路径通过EL表达式结合项目上下文路径获取 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 页面的标题,显示在浏览器标签页上 -->
<title>首页-酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<ul class="layui-nav" id="layui-nav-userinfo">
<c:if test="${sessionScope.users!=null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li>
</c:if>
<c:if test="${sessionScope.users==null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
<!-- 顶部区域开始的标记通常用于放置网站的导航栏、logo等元素 -->
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<!-- 网站的logo图片链接点击可跳转到首页index.html通过img标签展示logo图片图片路径通过EL表达式结合项目上下文路径获取 -->
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<!-- 这可能是一个用于放置表单相关组件比如搜索框、登录表单等的div通过lay-filter属性设置了一个过滤器标识可能用于后续的Layui表单相关操作 -->
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<!-- 这是一个无序列表用于构建页面顶部的导航栏通过id属性设置了一个唯一标识方便后续进行样式设置和JavaScript操作 -->
<ul class="layui-nav" id="layui-nav-userinfo">
<!-- 使用JSTL的<c:if>标签进行条件判断判断会话session中是否存在名为"users"的属性且不为null -->
<c:if test="${sessionScope.users!=null}">
<!-- 导航栏中的一个菜单项,表示首页,设置了相关的数据-id属性、样式类通过a标签设置链接地址点击跳转到fronts/home.jsp以及添加了用于交互效果的自定义属性和样式类 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中表示“房间”的菜单项链接地址暂时设置为JavaScript:void(0);可能后续通过JavaScript来动态设置实际跳转地址 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<!-- 导航栏中表示“后台管理”的菜单项点击跳转到admin/login.html可能用于管理员登录进入后台管理系统 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
<!-- 导航栏中表示“退出”的菜单项,点击可能触发退出登录的操作,具体的退出逻辑应该在对应的后端接口(${pageContext.request.contextPath}/user/logout中实现 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li>
</c:if>
<!-- 另一个<c:if>条件判断,判断会话中"users"属性是否为null -->
<c:if test="${sessionScope.users==null}">
<!-- 导航栏中的首页菜单项与上面类似点击跳转到fronts/home.jsp -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中“房间”菜单项点击跳转到fronts/hotelList.jsp用于未登录用户查看房间列表等操作 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<!-- 导航栏中“登入”菜单项点击跳转到fronts/login.jsp引导用户进行登录操作 -->
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<!-- 导航栏中“注册”菜单项点击跳转到fronts/register.jsp方便新用户进行注册账号操作 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<!-- 这是一个用于显示导航栏菜单项选中效果的元素比如底部的横线等通过style属性设置了其初始的位置、宽度、透明度等样式 -->
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
</div>
<!-- 顶部end -->
<!-- 顶部区域结束的标记 -->
<!-- 顶部end -->
<!-- 中间区域开始 -->
<!-- 搜索框start -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<form class="layui-form layuimini-form">
<div class="input-search">
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i
class="layui-icon layui-icon-search"></i></button>
<!-- 中间区域开始的标记,通常放置页面主要内容,如搜索框、筛选条件、房间列表等 -->
<!-- 中间区域开始 -->
<!-- 搜索框start -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<!-- 这是一个Layui框架的表单通过layuimini-form样式类可能应用了一些自定义的表单样式 -->
<form class="layui-form layuimini-form">
<!-- 这是一个用于放置搜索输入框和搜索按钮的div -->
<div class="input-search">
<!-- 搜索输入框设置了相关的属性如placeholder用于显示提示文本name用于设置表单提交时的参数名id用于唯一标识该输入框autocomplete设置为off表示关闭自动完成功能value属性可用于设置初始值 -->
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn以及自定义的样式类layui-btn-shop通过lay-submit和lay-filter属性设置了按钮的提交和过滤功能可能用于触发搜索操作并验证表单数据按钮的背景色设置为#009688内部使用了Layui的图标搜索图标 -->
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i
class="layui-icon layui-icon-search"></i></button>
</div>
<!-- 在大屏幕非xs尺寸下显示的一个div内部包含一个链接和logo图片可能用于在页面顶部显示品牌logo等信息 -->
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
src="${pageContext.request.contextPath}/statics/front/images/logo-1.png" alt="layui"> </a></div>
</div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
src="${pageContext.request.contextPath}/statics/front/images/logo-1.png" alt="layui"> </a></div>
</div>
</form>
</form>
</div>
<!--搜索 end-->
</div>
<!--搜索 end-->
<!-- 搜索框end -->
<!-- 筛选条件start -->
<div class="shoplist-filter">
<div class="layui-container">
<div class="layui-card">
<!-- 卡片头部区域包含一个面包屑导航用于显示当前页面在网站中的位置路径通过设置style属性让其可见 -->
<div class="layui-card-header"> <span class="layui-breadcrumb" style="visibility: visible;"> <a href="${pageContext.request.contextPath}/fronts/home.jsp">酒店首页</a><span lay-separator="">/</span> <a href="../hotel/lists.html">类别</a><span lay-separator="">/</span> <a><cite>全部</cite></a>
</span> </div>
<!-- 卡片主体内容区域 -->
<div class="layui-card-body">
<!-- 用于筛选房间类别的区域,通过一个列表展示不同的类别选项 -->
<div class="store-cat-item"> <span><i class="layui-icon layui-icon-shop-fenlei"></i>类别:</span>
<ul id="getAllRoomType">
<!-- 使用JSTL的<c:if>标签进行条件判断判断房型IDtypeId是否为空为空则表示当前点击的是“全部”这个超链接此时给对应的li元素添加active样式类用于样式上的选中效果展示 -->
<li data-id="0" <c:if test="${typeId == null}">class="active"</c:if>> <a class="fly-case-active" href="#" data-type="toRoomTypeListByLists">全部</a></li>
</ul>
</div>
<!-- 用于筛选楼层的区域,同样通过一个列表展示不同的楼层选项 -->
<div class="store-cat-item colorFilt"> <span><i class="layui-icon layui-icon-shop-color"></i>楼层:</span>
<ul id="getAllFloor">
<!-- 表示“全部”楼层的选项设置了背景色、标题属性等链接地址暂时设置为JavaScript:void(0);点击操作可能通过JavaScript来动态处理内部使用了图片和图标来展示选中效果等 -->
<li style="background: #F2F2F2" title="全部"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <img src="images/all_bg.jpg"><i class="layui-icon layui-icon-ok"></i></a></li>
<!-- 表示酒店1楼的楼层选项设置了对应的数据-id属性、标题属性以及样式类用于区分不同楼层的样式链接同样暂时设置为JavaScript:void(0);点击操作待后续JavaScript实现 -->
<li data-id="1" title="酒店1楼" class="bg1">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</div>
<!-- 搜索框end -->
<!-- 筛选条件start -->
<div class="shoplist-filter">
<div class="layui-container">
<div class="layui-card">
<div class="layui-card-header"> <span class="layui-breadcrumb" style="visibility: visible;"> <a href="${pageContext.request.contextPath}/fronts/home.jsp">酒店首页</a><span lay-separator="">/</span> <a href="../hotel/lists.html">类别</a><span lay-separator="">/</span> <a><cite>全部</cite></a>
</span> </div>
<div class="layui-card-body">
<div class="store-cat-item"> <span><i class="layui-icon layui-icon-shop-fenlei"></i>类别:</span>
<ul id="getAllRoomType">
<%-- 判断typeId房型ID值是否为空为空表示当前点击的是全部这个超链接 --%>
<li data-id="0" <c:if test="${typeId == null}">class="active"</c:if>> <a class="fly-case-active" href="#" data-type="toRoomTypeListByLists">全部</a></li>
</ul>
</div>
<div class="store-cat-item colorFilt"> <span><i class="layui-icon layui-icon-shop-color"></i>楼层:</span>
<ul id="getAllFloor"><li style="background: #F2F2F2" title="全部"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <img src="images/all_bg.jpg"><i class="layui-icon layui-icon-ok"></i></a></li><li data-id="1" title="酒店1楼" class="bg1">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="2" title="酒店2楼" class="bg2">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="2" title="酒店2楼" class="bg2">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="3" title="酒店3楼" class="bg3">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="3" title="酒店3楼" class="bg3">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="4" title="酒店4楼" class="bg4">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="4" title="酒店4楼" class="bg4">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="5" title="酒店5楼" class="bg5">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="5" title="酒店5楼" class="bg5">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="6" title="酒店6楼" class="bg6">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
<li data-id="6" title="酒店6楼" class="bg6">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a>
</li>
</ul>
</a>
</li>
</ul>
</div>
<!-- 显示筛选结果数量的文本通过id为filtTotal的元素展示筛选出的房间数量数量值通过EL表达式${roomList.size()}从后端获取并动态显示 -->
<p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p>
</div>
<p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p>
</div>
</div>
</div>
</div>
<!-- 筛选条件end -->
<!-- 筛选条件end -->
<!-- 房间列表start -->
<div class="shop-temp shoplist">
<div class="temp-normal">
<div class="layui-container">
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
<!-- 房间列表start -->
<div class="shop-temp shoplist">
<div class="temp-normal">
<div class="layui-container">
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<!-- 用于展示单个房间信息的div容器通过data-id属性绑定房间的唯一标识${room.id}从后端获取使用了Layui的栅格系统类来控制在不同屏幕尺寸下的布局占比 -->
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<!-- 这是一个整体的房间展示链接点击可跳转到房间详情页面fronts/detail.jsp并传递了名为toRoomInfo的数据类型参数用于在详情页做相应业务逻辑处理添加了多个样式类用于样式控制和交互效果 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<!-- 展示房间对应的图片设置了相应的图片路径以及store-list-cover样式类用于控制图片在页面中的显示样式比如大小、对齐等 -->
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“标准间” -->
<h2 class="layui-elip">标准间</h2>
<div>
<!-- 展示房间价格标签使用了Layui的徽章样式类layui-badge-rim以及自定义的样式类store-list-pay显示价格为¥120 -->
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<!-- 这是一个用于展示房间其他属性如房号、房间类型、楼层等的div通过多个span元素展示不同属性每个span设置了相应的样式如边框颜色、文字颜色、背景色等来区分不同属性 -->
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</a>
</div>
<!-- 以下每个div都是用于展示单个房间信息的容器通过data-id属性绑定房间的唯一标识${room.id}应是从后端获取的具体房间ID
同时使用了Layui的栅格系统类layui-col-xs12、layui-col-sm6、layui-col-md4、layui-col-lg3来控制在不同屏幕尺寸超小屏xs、小屏sm、中屏md、大屏lg下的布局占比 -->
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<!-- 这是一个整体的房间展示链接点击后会跳转到房间详情页面fronts/detail.jsp同时传递了一个名为toRoomInfo的数据类型参数
可能用于在详情页做对应业务逻辑区分添加了一些样式类template、store-list-box、fly-case-active用于样式控制和交互效果 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<!-- 展示该房间对应的图片设置了对应的图片路径以及样式类store-list-cover用于页面中图片显示样式的定制比如大小、对齐等 -->
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“单人间” -->
<h2 class="layui-elip">单人间</h2>
<div>
<!-- 展示房间价格标签使用了Layui的徽章样式类layui-badge-rim以及自定义的样式类store-list-pay显示价格为¥100 -->
<label class="layui-badge-rim store-list-pay"> ¥100 </label>
<!-- 这是一个用于展示房间其他属性如房号、房间类型、楼层等的div通过多个span元素展示不同属性每个span设置了相应的样式
如边框颜色、文字颜色、背景色等来区分不同属性 -->
<div class="store-list-colorbar">
<!-- 展示房号信息的span元素设置了相对位置、边框颜色、文字颜色、边框宽度、边框样式、背景色以及文本居中对齐等样式这里房号是NO.1 -->
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<!-- 展示房间类型信息的span元素设置了边框颜色、文字颜色等样式这里房间类型是“单人间” -->
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<!-- 展示楼层信息的span元素设置了边框颜色、文字颜色等样式这里楼层是“1楼” -->
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</div>
</a>
</div>
</div>
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<!-- 以下又是一组房间信息展示的div结构与上面类似用于展示更多房间的信息 -->
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
</a>
</div>
</div>
</div>
<!-- 这是一组用于展示多个房间信息的div结构通过layui-row和layui-col-space20样式类应用了Layui框架的行布局以及列间距设置id为roomList可用于后续通过JavaScript等方式对房间列表进行操作 -->
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<!-- 以下每个div都是用于展示单个房间信息的容器通过data-id属性绑定房间的唯一标识${room.id}应是从后端获取的具体房间ID
同时使用了Layui的栅格系统类layui-col-xs12、layui-col-sm6、layui-col-md4、layui-col-lg3来控制在不同屏幕尺寸超小屏xs、小屏sm、中屏md、大屏lg下的布局占比 -->
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<!-- 这是一个整体的房间展示链接点击后会跳转到房间详情页面fronts/detail.jsp同时传递了一个名为toRoomInfo的数据类型参数
可能用于在详情页做对应业务逻辑区分添加了一些样式类template、store-list-box、fly-case-active用于样式控制和交互效果 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<!-- 展示该房间对应的图片设置了对应的图片路径以及样式类store-list-cover用于页面中图片显示样式的定制比如大小、对齐等 -->
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“双人间” -->
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div>
<!-- 展示房间价格标签使用了Layui的徽章样式类layui-badge-rim以及自定义的样式类store-list-pay显示价格为¥120 -->
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<!-- 这是一个用于展示房间其他属性如房号、房间类型、楼层等的div通过多个span元素展示不同属性每个span设置了相应的样式
如边框颜色、文字颜色、背景色等来区分不同属性 -->
<div class="store-list-colorbar">
<!-- 展示房号信息的span元素设置了相对位置、边框颜色、文字颜色、边框宽度、边框样式、背景色以及文本居中对齐等样式这里房号是NO.1 -->
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<!-- 展示房间类型信息的span元素设置了边框颜色、文字颜色等样式这里房间类型是“双人间” -->
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<!-- 展示楼层信息的span元素设置了边框颜色、文字颜色等样式这里楼层是“2楼” -->
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
@ -262,7 +341,8 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
@ -275,7 +355,8 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div>
<label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
@ -288,7 +369,8 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
@ -298,216 +380,79 @@
</a>
</div>
</div>
<!-- 以下是多组重复的房间信息展示结构,与上面一组的功能和结构类似,都是展示不同房间的信息,方便在页面上呈现多个房间供用户查看 -->
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示div一致 -->
...
</div>
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示div一致 -->
...
</div>
<div class="layui-row layui-col-space20 shoplist" id="roomList">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/t4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥888 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">总统套房</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">1楼</span>
</div>
</div>
</a>
</div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar">
<span class="store-color-bar" style="position:relative;bottom:3px;border-color: #009688;color: #009688;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">NO.1</span>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
<span class="store-color-bar" style="border-color: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</span>
</div>
</div>
</a>
</div>
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示div一致 -->
...
</div>
<!-- 一个空的div通过设置样式来添加页面的上下边距以及文本居中对齐等样式效果可能用于页面布局中的空白间隔或者视觉上的分隔 -->
<div style="margin: 50px 0 80px; text-align: center;"> </div>
</div>
</div>
</div>
<!-- 房间列表end -->
<!-- 中间区域结束 -->
</div>
</div>
</div>
<!-- 房间列表结束的标记,表示房间列表展示部分到此结束 -->
<!-- 中间区域结束的标记,意味着页面中间主要内容展示区域已完结 -->
<!-- 中间区域结束 -->
<!-- 底部 -->
<!-- 底部 -->
<div class="fly-footer">
<p><a href="#">酒店系统</a> 2022 © <a href="#">xyp.cn</a></p>
<p>
友情链接
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a> </p>
<!-- 底部区域开始,用于展示页面底部相关信息,比如版权声明、友情链接等 -->
<!-- 底部 -->
<div class="fly-footer">
<!-- 展示版权相关信息及链接到首页的文字链接,文本内容包含了“酒店系统”以及版权年份、所属网站域名等信息 -->
<p><a href="#">酒店系统</a> 2022 © <a href="#">xyp.cn</a></p>
<p>
<!-- 友情链接标题文本 -->
友情链接
<!-- 以下是一系列友情链接点击可跳转到对应的外部网站target="_blank"表示在新标签页中打开链接 -->
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a>
</p>
</div>
</div>
<!-- 脚本开始的标记意味着下面开始引入和编写JavaScript相关代码 -->
<!-- 引入Layui框架的核心JavaScript文件文件路径通过EL表达式结合项目上下文路径动态获取这是使用Layui框架各种功能的基础 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
// 使用Layui框架的use方法来加载模块这里加载了"form"、"element"、"carousel"三个模块,并在回调函数中使用它们
layui.use(["form","element","carousel"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
$ = layui.$;
<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
layui.use(["form","element","carousel"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
$ = layui.$;
// 使用carousel模块的render方法来渲染轮播图配置相关参数
// elem属性指定轮播图对应的DOM元素的ID这里是'LAY-store-banner'
// width属性设置轮播图容器的宽度为100%,使其自适应父容器宽度
// height属性设置轮播图容器的高度为460像素
// arrow属性设置为'always',表示始终显示轮播图的切换箭头,方便用户操作切换图片
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
});
</script>
<!-- 脚本结束的标记表示JavaScript代码部分结束 -->
//渲染轮播图
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
});
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>
<!-- 这是一个用于实现页面固定栏可能是回到顶部等功能按钮所在栏相关样式和交互效果的无序列表使用了layui-fixbar样式类 -->
<ul class="layui-fixbar">
<!-- 列表中的一个元素代表回到顶部按钮使用了layui-icon样式类来应用特定图标样式lay-type属性设置为"top"表示其功能是回到页面顶部通过style属性设置了一些额外的样式 -->
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<!-- 这是一个用于实现页面某些元素可能是弹窗等可拖动效果的空div使用了layui-layer-move样式类 -->
<div class="layui-layer-move"></div>
</body>
</html>
</body>
</html>

@ -1,13 +1,22 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 这是一个JSPJavaServer Pages指令。
contentType属性指定此页面返回给客户端如浏览器的内容类型是HTML格式text/html并且设置字符编码为UTF-8
这样能保证页面中的中文及其他特殊字符可以被正确显示和传输。
language属性表明该页面中使用的脚本语言是Java意味着可以在页面中嵌入Java代码片段虽然此示例后续没有更多体现方便和后端Java代码交互实现动态功能等 -->
<html>
<head>
<!-- <head>标签用于存放页面的元信息,像页面标题、引入的样式表、外部脚本等,这些信息不会直接显示在页面可视区域,但对页面呈现和功能很重要 -->
<title>Title</title>
<!-- <title>标签定义了页面的标题此标题会显示在浏览器的标签栏上这里简单设置为“Title”实际应用中可根据具体需求改成更有意义的名称 -->
</head>
<body>
<script>
location.href="/index.html";
</script>
<!-- <body>标签内包含的是页面实际展示给用户看到的内容,例如文本、图片、按钮等各种可视化元素 -->
<script>
// 以下是一段JavaScript代码。
// 在JavaScript中location是一个表示当前页面地址相关信息的内置对象href是它的一个属性用于获取或者设置当前页面的完整URL地址。
// 此处通过给location.href赋值为“/index.html”其作用是让浏览器自动跳转到“/index.html”这个页面。
// 当浏览器加载包含这段代码的页面时,就会立即执行这个脚本,进而实现页面的重定向操作。
location.href = "/index.html";
</script>
</body>
</html>
</html>

@ -3,125 +3,210 @@
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
<!-- 设置页面的HTTP响应头中的Content-Type属性指定页面内容类型为HTML格式text/html并且使用UTF-8编码
这样能保证页面中的各种字符特别是中文等非ASCII字符能正确显示和解析 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 告诉浏览器使用webkit内核来渲染页面webkit内核在处理一些HTML5特性和样式渲染方面有较好的表现
有助于提高页面在不同浏览器上的兼容性和显示效果 -->
<meta name="renderer" content="webkit">
<!-- 指示浏览器以IE浏览器的最高版本模式或者Chrome浏览器模式来渲染页面解决不同浏览器间可能出现的兼容性问题
确保页面的样式和功能在多数主流浏览器中表现一致 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口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">
<!-- 引入Layui框架的CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取
Layui.css文件中包含了框架预定义的各种样式类用于构建页面布局、样式效果等 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
<!-- 引入自定义的全局样式文件,用于覆盖、扩展或自定义一些页面通用的样式规则,
这里明确指定了字符编码为UTF-8确保样式文件中的特殊字符能正确读取 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个可能是对全局样式进一步补充或修改的自定义CSS文件同样指定了字符编码为UTF-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
<!-- 引入特定用于当前页面比如与酒店相关业务展示页面的CSS样式文件用于定制该页面独有的样式效果
也是使用UTF-8编码 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
<!-- 设置页面的图标favicon图标文件的路径通过EL表达式结合项目上下文路径来获取
这个图标会显示在浏览器的标签栏、书签栏等位置,用于标识该网站 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面在浏览器标题栏显示的标题内容,这里设置为“酒店管理系统”,用户在浏览器标签上能看到这个标题 -->
<title>酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<ul class="layui-nav" id="layui-nav-userinfo">
<c:if test="${sessionScope.users!=null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
</c:if>
<c:if test="${sessionScope.users==null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
<!-- 页面顶部区域开始的标记通常用于放置如网站logo、导航菜单等元素 -->
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<!-- 定义一个链接a标签作为网站的logo点击该链接可跳转到首页index.html
通过img标签展示对应的logo图片其路径也是通过EL表达式结合项目上下文路径获取
alt属性用于在图片无法正常显示时提供替代文本描述 -->
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<!-- 一个用于放置表单相关组件比如搜索框、登录表单等或者其他可交互组件的div元素
通过lay-filter属性设置了一个特定的过滤器标识"LAY-site-header-component"
方便后续通过Layui框架进行相关操作例如表单验证、数据提交等 -->
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<!-- 构建一个无序列表ul用于创建页面顶部的导航栏通过id属性赋予其一个唯一标识"layui-nav-userinfo"
便于后续进行样式设置、事件绑定等操作 -->
<ul class="layui-nav" id="layui-nav-userinfo">
<!-- 使用JSTLJavaServer Pages Standard Tag Library的<c:if>标签进行条件判断,
此处判断会话session范围中名为"users"的属性是否不为null也就是判断用户是否已经登录 -->
<c:if test="${sessionScope.users!=null}">
<!-- 导航栏中的一个菜单项li标签用于表示首页设置了一些属性和样式类。
data-id属性可用于标识该菜单项可能在JavaScript操作中用到
layui-nav-item用于应用Layui框架的导航栏项样式layui-hide-xs表示在超小屏幕xs尺寸下隐藏该菜单项
layui-this表示当前选中状态可能用于突出显示当前所在页面对应的菜单项
内部的a标签定义了点击该菜单项时跳转到的链接地址${pageContext.request.contextPath}/fronts/home.jsp
同时添加了自定义的样式类和属性("fly-case-active"、"data-type"),可能用于实现一些交互效果或业务逻辑区分 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中表示“房间”的菜单项,结构和属性设置与首页菜单项类似,
点击后跳转到${pageContext.request.contextPath}/fronts/hotelList.jsp页面用于已登录用户查看房间列表等相关操作 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<!-- 导航栏中表示“后台管理”的菜单项,点击可跳转到${pageContext.request.contextPath}/admin/login.html页面
通常用于管理员等有权限的用户登录进入后台管理系统 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
</c:if>
<!-- 另一个<c:if>条件判断,判断会话中"users"属性是否为null即判断用户是否未登录 -->
<c:if test="${sessionScope.users==null}">
<!-- 导航栏中的首页菜单项,与已登录状态下的首页菜单项类似,点击跳转到${pageContext.request.contextPath}/fronts/home.jsp页面 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中“房间”菜单项链接地址暂时设置为JavaScript:void(0);
这可能意味着后续需要通过JavaScript代码动态地设置实际的跳转地址
比如根据用户权限或其他条件来决定具体跳转到哪个房间相关页面 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<!-- 导航栏中“登入”菜单项,点击跳转到${pageContext.request.contextPath}/fronts/login.jsp页面
用于引导未登录用户进入登录页面进行登录操作 -->
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<!-- 导航栏中“注册”菜单项,点击跳转到${pageContext.request.contextPath}/fronts/register.jsp页面
方便新用户进行账号注册操作 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<!-- 这是一个用于显示导航栏菜单项选中效果的元素(比如底部的横线等),
通过style属性设置了其初始的位置left、top、宽度width和透明度opacity等样式属性
初始宽度为0px且透明度为0表示隐藏或未显示选中效果 -->
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
</div>
<!-- 顶部end -->
<!-- 页面顶部区域结束的标记 -->
<!-- 顶部end -->
<!-- 中间区域开始 -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<form class="layui-form layuimini-form">
<div class="input-search">
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i
class="layui-icon layui-icon-search"></i></button>
<!-- 中间区域开始的标记,这里一般放置页面的主要内容,如搜索功能、核心业务展示等,当前代码中先展示了搜索部分 -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<!-- 定义一个Layui框架的表单通过layuimini-form样式类可能应用了一些自定义的表单外观样式 -->
<form class="layui-form layuimini-form">
<!-- 这是一个用于包裹搜索输入框和搜索按钮的div元素起到布局和分组的作用 -->
<div class="input-search">
<!-- 搜索输入框所在的div设置了id属性用于唯一标识"searchRoom"方便后续通过JavaScript等方式进行操作 -->
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn以及自定义的样式类layui-btn-shop
通过lay-submit和lay-filter属性设置了按钮的提交和过滤功能"searchHotelRoom"
点击该按钮可触发表单提交操作,并根据设置的过滤器进行相应的数据验证和处理,
按钮的背景颜色通过style属性设置为#009688内部使用了Layui的图标搜索图标layui-icon-search来增强视觉提示效果 -->
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i
class="layui-icon layui-icon-search"></i></button>
</div>
<!-- 在大屏幕非xs尺寸layui-hide-xs样式类控制隐藏显示下显示的一个div元素
内部包含一个链接a标签和一个logo图片img标签
可能用于在页面顶部展示品牌logo等信息此处图片路径直接写为相对路径"images/logo-1.png"
需确保该路径在实际项目中的正确性 -->
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
src="images/logo-1.png" alt="layui"> </a></div>
</div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
src="images/logo-1.png" alt="layui"> </a></div>
</div>
</form>
</form>
</div>
<!--搜索 end-->
</div>
<!--搜索 end-->
</div>
<!-- 中间区域结束 -->
<!-- 中间区域结束的标记,当前中间区域只展示了搜索相关的代码部分,后续可能还需要添加更多如房间列表展示、筛选功能等内容 -->
<!-- 中间区域结束 -->
<!-- 登录start -->
<div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<!-- 登录区域开始的标记,用于呈现用户登录相关的表单和界面元素 -->
<!-- 登录start -->
<div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<div class=" login-content">
<!--登录 start-->
<div class="login-bg">
<div class="login-cont w1200">
<div class="form-box">
<form class="layui-form" action="">
<legend>前台用户登录</legend>
<div class="layui-form-item">
<div class="layui-inline iphone">
<div class="layui-input-inline">
<i class="layui-icon layui-icon-user iphone-icon"></i>
<input type="text" name="username" id="phone" lay-verify="required" lay-reqText="请输入登录用户名" placeholder="请输入登录用户名" autocomplete="off" class="layui-input">
<div class=" login-content">
<!--登录 start-->
<div class="login-bg">
<div class="login-cont w1200">
<div class="form-box">
<!-- 定义一个Layui框架的表单用于用户登录操作action属性为空表示表单提交的目标地址后续可能通过JavaScript等方式动态指定 -->
<form class="layui-form" action="">
<!-- 表单的标题legend标签显示为“前台用户登录”用于提示用户当前表单的用途 -->
<legend>前台用户登录</legend>
<!-- 这是一个表单行元素div.layui-form-item用于组织和布局表单内的输入项这里放置用户名输入相关的内容 -->
<div class="layui-form-item">
<div class="layui-inline iphone">
<div class="layui-input-inline">
<!-- 使用Layui框架提供的图标样式类layui-icon-user展示一个用户图标起到提示用户此处应输入用户名的作用 -->
<i class="layui-icon layui-icon-user iphone-icon"></i>
<!-- 用户名输入框设置了多个属性。name属性指定了表单提交时该输入框对应的数据参数名"username"
id属性用于唯一标识该输入框"phone"lay-verify="required"表示该输入框为必填项,
lay-reqText用于设置当用户未填写时显示的提示文本“请输入登录用户名”
placeholder属性设置输入框的占位提示文本同样是“请输入登录用户名”
autocomplete="off"关闭浏览器自动完成功能class="layui-input"应用Layui框架的输入框样式类 -->
<input type="text" name="username" id="phone" lay-verify="required" lay-reqText="请输入登录用户名" placeholder="请输入登录用户名" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-inline iphone">
<div class="layui-input-inline">
<i class="layui-icon layui-icon-password iphone-icon"></i>
<input id="pnum" type="password" name="password" lay-verify="required" lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off" class="layui-input">
<!-- 这是另一个在同一表单行内的元素,用于放置密码输入框相关内容,结构与用户名输入框部分类似 -->
<div class="layui-inline iphone">
<div class="layui-input-inline">
<!-- 使用Layui框架的图标样式类layui-icon-password展示一个密码图标提示用户此处应输入密码 -->
<i class="layui-icon layui-icon-password iphone-icon"></i>
<!-- 密码输入框name属性为“password”id为“pnum”同样设置了必填验证lay-verify="required"以及相应的必填提示文本lay-reqText
占位提示文本placeholder、关闭自动完成功能autocomplete="off"等属性并应用了Layui框架的输入框样式类 -->
<input id="pnum" type="password" name="password" lay-verify="required" lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off" class="layui-input">
</div>
</div>
</div>
</div>
<div class="layui-form-item login-btn">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="logins" style="background-color: #009688">登录</button>
<!-- 这是一个用于放置登录按钮的表单行元素 -->
<div class="layui-form-item login-btn">
<div class="layui-input-block">
<!-- 登录按钮使用了Layui框架的按钮样式类layui-btn通过lay-submit和lay-filter属性设置了按钮的提交和过滤功能"logins"
点击该按钮会触发表单提交操作并根据此过滤器进行相应的业务逻辑处理按钮的背景颜色通过style属性设置为#009688 -->
<button class="layui-btn" lay-submit="" lay-filter="logins" style="background-color: #009688">登录</button>
</div>
</div>
</div>
</form>
</form>
</div>
</div>
</div>
</div>
<!--登录 end-->
<!--登录 end-->
</div>
</div>
</div>
<!-- 登录区域结束的标记 -->
<!-- 登录end -->
</div>
<!-- 登录end -->
<!-- 底部 -->
<div class="fly-footer">
<p><a href="#">酒店系统</a> 20222 © <a href="#">xyp.cn</a></p>
<p>
友情链接
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<!-- 页面底部区域开始,通常用于展示版权声明、友情链接等信息 -->
<div class="fly-footer">
<!-- 版权声明相关的段落元素p标签包含一个链接到首页虽然链接文本为“酒店系统”可能需要根据实际情况调整更合适的链接文本以及版权年份此处为2022需确认是否正确和所属网站域名xyp.cn的信息 -->
<p><a href="#">酒店系统</a> 2022 © <a href="#">xyp.cn</a></p>
<p>
<!-- 友情链接标题文本 -->
友情链接
<!-- 一系列友情链接通过a标签定义点击可跳转到对应的外部网站target="_blank"属性表示在新的浏览器标签页中打开链接 -->
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
@ -130,38 +215,56 @@
</div>
<!-- 脚本开始 -->
<!-- 脚本开始的标记意味着下面的代码部分主要是通过JavaScript来实现页面的交互功能等首先引入Layui框架的核心JavaScript文件 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
// 使用Layui框架的use方法来加载指定的模块这里加载了"form"(用于表单相关操作)、"element"(用于操作页面元素等)、"carousel"(用于轮播图相关功能)、"jquery"(虽然这里重复定义了$可能是代码冗余一般只需加载一次即可获取到jQuery对象后续可检查下是否需要优化这几个模块加载完成后会执行回调函数
layui.use(["form","element","carousel","jquery"], function () {
// 获取Layui框架中form模块的实例后续可以通过这个form变量来调用form模块提供的各种方法比如表单验证、监听表单提交事件等
var form = layui.form,
// 获取Layui框架中layer模块的实例layer模块常用于弹出提示框、加载层等各种页面消息提示和交互效果的展示
layer = layui.layer,
// 获取Layui框架中通过jQuery封装后的$对象用于进行DOM操作、发送Ajax请求等常见的前端操作等同于使用原生的jQuery库前提是Layui正确引入了jQuery相关依赖
$ = layui.jquery,
// 获取Layui框架中carousel模块的实例用于操作轮播图相关功能比如渲染轮播图、设置轮播图参数等
carousel = layui.carousel,
// 这里重复定义了$可考虑去除避免可能出现的混淆或不必要的代码重复正常前面已经获取到了Layui封装的$对象
$ = layui.$;
//渲染轮播图
// 以下是使用carousel模块的render方法来渲染轮播图配置相关的参数
// elem属性指定了轮播图对应的DOM元素的ID通过这个IDcarousel模块能够找到页面中要渲染轮播图的位置这里对应的ID是'LAY-store-banner'需要确保页面中有这个ID的HTML元素存在否则轮播图无法正确渲染
// width属性设置轮播图容器的宽度为'100%',意味着轮播图会自适应其所在父元素的宽度,能在不同屏幕尺寸下较好地展示
// height属性设置轮播图容器的高度为'460'像素,固定了轮播图的高度,可根据实际设计需求调整合适的数值
// arrow属性设置为'always',表示始终显示轮播图的切换箭头,方便用户手动点击切换图片,若设置为其他值(比如'hide'等)可以控制箭头的显示隐藏逻辑
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
// 进行注册操作
// 监听名为'logins'的表单提交事件这个事件是和页面中某个表单上设置了lay-filter="logins"属性相关联的,通常就是登录表单的提交按钮触发的事件
form.on('submit(logins)', function (data) {
//可以获取到表单中所有数据 data = data.field;
//发送登录请求
$.post("${pageContext.request.contextPath}/user/login",data.field,function (result) {
console.log(data.field)
if(result.success){//如果登录成功跳转到后台页面
// 通过data.field可以获取到表单中所有用户输入的数据它是一个对象包含了表单各个输入项对应的键值对例如用户名、密码等字段的数据
// 发送登录请求,使用$.post方法这里的$是前面获取到的Layui封装的jQuery对象来向服务器端发送POST请求请求的URL地址是'${pageContext.request.contextPath}/user/login'这个地址通过EL表达式结合项目上下文路径来动态生成确保指向正确的后端登录接口。同时将表单数据data.field作为请求参数传递给后端
$.post("${pageContext.request.contextPath}/user/login", data.field, function (result) {
console.log(data.field);
// 判断登录请求返回的结果对象中的success属性如果为true表示登录成功
if (result.success) {
// 使用Layui的layer.msg方法弹出提示信息显示的内容是从服务器返回结果中的msg属性获取的一般是提示登录成功之类的友好消息
layer.msg(result.msg);
location.href="${pageContext.request.contextPath}/fronts/home.jsp";
} else{//登录失败 提示用户
// 登录成功后通过修改浏览器的location.href属性将页面重定向到'${pageContext.request.contextPath}/fronts/home.jsp'页面同样这个路径也是通过EL表达式结合项目上下文路径动态生成的跳转到对应的首页或者后台首页等页面根据业务逻辑确定
location.href = "${pageContext.request.contextPath}/fronts/home.jsp";
} else {
// 如果登录失败也就是result.success为false同样使用layer.msg方法弹出提示信息将服务器返回的错误提示消息result.msg展示给用户告知登录失败的原因等情况
layer.msg(result.msg);
}
},"json");
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
// 以下这段代码被注释掉了,从代码结构看,原本也是用于监听一个名为'login'的表单提交事件,功能和上面的'logins'监听类似,可能是之前旧的逻辑或者备用的逻辑,如有需要可以根据实际情况决定是否取消注释启用它
/* form.on("submit(login)",function (data) {
$.post("/user/login",data.field,function(result){
if(result.success){
@ -176,10 +279,13 @@
*/
});
</script>
<!-- 脚本结束 -->
<!-- 脚本结束的标记表示JavaScript代码部分结束 -->
<!-- 以下是一个无序列表ul应用了layui-fixbar样式类可能是Layui框架用于实现页面固定栏比如侧边栏、快捷导航栏等的相关样式结构 -->
<ul class="layui-fixbar">
<!-- 列表项li应用了layui-icon样式类用于显示Layui框架的图标layui-fixbar-top样式类可能用于定位或样式设置比如固定在顶部之类的效果lay-type="top"属性可能是用于标识该元素的类型或者功能这里推测和回到顶部相关内部的文本是一个特殊字符可能是Layui图标对应的字符编码显示为一个特定图标样式 -->
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<!-- 这是一个空的div元素应用了layui-layer-move样式类从类名推测可能是和Layui框架的弹出层layer的可移动功能相关的占位元素或者辅助元素但具体功能需要结合Layui框架相关的实现逻辑来确定 -->
<div class="layui-layer-move"></div>
</body>

@ -3,68 +3,128 @@
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
<!-- 这行代码用于设置页面的HTTP响应头中的Content-Type字段指定页面内容类型为text/html即HTML文档
同时设定字符编码为UTF-8确保页面中包含的各种字符如中文等特殊字符都能被浏览器正确解析和显示 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 告诉浏览器使用webkit内核来渲染页面webkit内核在处理一些HTML5特性、CSS样式以及页面渲染效果等方面有较好的表现
有助于提升页面在不同浏览器上的兼容性和展示效果 -->
<meta name="renderer" content="webkit">
<!-- 指示浏览器以IE浏览器的最高版本模式或者Chrome浏览器模式来渲染页面目的是解决不同浏览器之间可能出现的兼容性问题
让页面的样式和功能在多数主流浏览器中都能正常呈现 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口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">
<!-- 引入Layui框架的CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取
Layui框架的CSS文件layui.css包含了众多预定义的样式类可用于构建页面的布局以及各种美观的样式效果 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
<!-- 引入自定义的全局样式文件,用于对页面的通用样式进行覆盖、扩展或者自定义调整,
这里特别指定了字符编码为UTF-8以保证样式文件中的特殊字符能被正确读取 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个可能是对全局样式进一步补充或修改的自定义CSS文件同样明确指定了字符编码为UTF-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
<!-- 引入专门针对当前页面例如与酒店管理系统中特定页面相关如酒店房间展示等页面的CSS样式文件
用于定制该页面独有的样式效果同样采用UTF-8编码 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
<!-- 设置页面的图标favicon图标文件的路径通过EL表达式结合项目上下文路径来确定
这个图标会显示在浏览器的标签栏、书签栏等位置,作为网站的一个标识元素 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面在浏览器标题栏显示的标题内容,此处设置为“酒店管理系统”,方便用户识别当前页面所属的系统或功能 -->
<title>酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<ul class="layui-nav" id="layui-nav-userinfo">
<c:if test="${sessionScope.users!=null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
</c:if>
<c:if test="${sessionScope.users==null}">
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
<!-- 页面顶部区域开始的标记通常在这里放置网站的一些重要元素比如logo、导航菜单等 -->
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container">
<!-- 定义一个链接a标签作为网站的logo点击这个链接可以跳转到首页index.html
通过img标签展示对应的logo图片图片的路径是通过EL表达式结合项目上下文路径来获取的
alt属性用于在图片无法正常显示时提供一段替代的文本描述信息 -->
<a class="logo" href="index.html">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
</a>
<!-- 这是一个用于放置表单相关组件例如搜索框、登录表单等或者其他具有交互功能组件的div元素
通过lay-filter属性设置了一个特定的过滤器标识"LAY-site-header-component"
后续可以借助Layui框架依据这个标识来进行相关的操作比如表单验证、数据提交等操作 -->
<div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<!-- 创建一个无序列表ul用于构建页面顶部的导航栏通过id属性赋予它一个唯一的标识"layui-nav-userinfo"
方便后续通过JavaScript或者CSS等方式对导航栏进行样式设置、事件绑定等各种操作 -->
<ul class="layui-nav" id="layui-nav-userinfo">
<!-- 使用JSTLJavaServer Pages Standard Tag Library的<c:if>标签来进行条件判断,
此处判断会话session范围中名为"users"的属性是否不为null也就是判断当前用户是否已经登录 -->
<c:if test="${sessionScope.users!=null}">
<!-- 导航栏中的一个菜单项li标签用于表示首页设置了一些属性和样式类来控制其显示和样式效果。
data-id属性可以用来唯一标识这个菜单项在后续的JavaScript操作中可能会用到这个标识
layui-nav-item是Layui框架中用于应用导航栏项样式的类layui-hide-xs表示在超小屏幕xs尺寸下隐藏该菜单项
layui-this用于表示当前选中的状态可以突出显示当前所在页面对应的菜单项
内部的a标签定义了点击该菜单项时要跳转到的链接地址${pageContext.request.contextPath}/fronts/home.jsp
同时添加了自定义的样式类("fly-case-active")和属性("data-type"),这些可能用于实现一些特定的交互效果或者业务逻辑区分 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中表示“房间”的菜单项,其结构和属性设置与首页菜单项类似,
点击后会跳转到${pageContext.request.contextPath}/fronts/hotelList.jsp页面方便已登录用户查看房间列表等相关操作 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
<!-- 导航栏中表示“后台管理”的菜单项,点击该菜单项可跳转到${pageContext.request.contextPath}/admin/login.html页面
通常是提供给具有管理员等特定权限的用户登录进入后台管理系统的入口 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
</c:if>
<!-- 另一个<c:if>条件判断,用于判断会话中"users"属性是否为null即判断当前用户是否未登录 -->
<c:if test="${sessionScope.users==null}">
<!-- 导航栏中的首页菜单项,和已登录状态下的首页菜单项结构类似,点击同样跳转到${pageContext.request.contextPath}/fronts/home.jsp页面 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li>
<!-- 导航栏中“房间”菜单项其链接地址暂时设置为JavaScript:void(0);
这意味着后续可能需要通过JavaScript代码根据不同的情况比如用户权限、业务逻辑等动态地设置实际的跳转地址 -->
<li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li>
<!-- 导航栏中“登入”菜单项,点击该菜单项会跳转到${pageContext.request.contextPath}/fronts/login.jsp页面
主要用于引导未登录的用户进入登录页面进行登录操作 -->
<li data-id="login" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</li>
<!-- 导航栏中“注册”菜单项,点击可跳转到${pageContext.request.contextPath}/fronts/register.jsp页面
方便新用户进行账号注册操作 -->
<li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a>
</li>
</c:if>
<!-- 这是一个用于显示导航栏菜单项选中效果的元素(比如显示为底部的一条横线等),
通过style属性设置了它的初始位置left、top坐标、宽度width以及透明度opacity等样式属性
这里初始宽度设置为0px且透明度为0表示它初始是隐藏的没有显示出选中效果 -->
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
</div>
<!-- 顶部end -->
<!-- 中间区域开始 -->
<!-- 页面顶部区域结束的标记 -->
<!-- 顶部end -->
<!-- 中间区域开始的标记,该区域通常用于放置页面核心内容相关的元素,比如搜索功能、主要业务展示等 -->
<div class="shop-nav shop-index">
<!--搜索 start-->
<div id="LAY-topbar" style="height: auto;">
<!-- 定义一个Layui框架的表单使用了layuimini-form样式类可能是自定义的表单样式用于呈现特定的外观效果 -->
<form class="layui-form layuimini-form">
<!-- 这是一个用于包裹搜索输入框和搜索按钮等相关元素的div起到对搜索部分内容进行布局和分组的作用 -->
<div class="input-search">
<!-- 这个div用于定位和标识搜索输入框相关的部分设置了id属性为'searchRoom'方便后续通过JavaScript等方式对其进行操作和引用 -->
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn以及自定义的样式类layui-btn-shop来设置按钮的外观样式。
通过lay-submit和lay-filter="searchHotelRoom"属性,将按钮与表单提交行为以及特定的表单验证过滤器关联起来,
点击该按钮会触发表单提交操作,并按照设置的'searchHotelRoom'过滤器规则进行数据验证等处理。
按钮的背景颜色通过style属性设置为#009688内部使用了Layui的图标layui-icon-search即搜索图标来增强视觉提示效果让用户更直观地知道这是搜索按钮 -->
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i
class="layui-icon layui-icon-search"></i></button>
</div>
<!-- 这个div在大屏幕非xs尺寸通过layui-hide-xs样式类控制其在小屏幕下隐藏显示下显示里面包含一个链接a标签和一个logo图片img标签
可能用于在页面顶部合适位置展示品牌logo等信息不过此处图片路径直接写为相对路径"images/logo-1.png"),需要确保该路径在实际项目中的正确性 -->
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
src="images/logo-1.png" alt="layui"> </a></div>
</div>
@ -72,8 +132,10 @@
</div>
<!--搜索 end-->
</div>
<!-- 中间区域结束的标记,意味着这部分中间区域代码暂时只展示了搜索相关的内容,后续可以根据需求添加如房间列表展示、筛选功能等更多元素 -->
<!-- 中间区域结束 -->
<!-- 注册区域开始的标记,下面的代码用于呈现用户注册相关的表单和界面元素 -->
<!-- 注册start -->
<div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
@ -83,33 +145,52 @@
<div class="login-bg">
<div class="login-cont w1200">
<div class="form-box">
<!-- 定义一个Layui框架的表单用于用户注册操作action属性为空表示表单提交的目标地址后续可能通过JavaScript等方式动态指定比如根据不同的业务逻辑将注册数据发送到不同的后端接口 -->
<form class="layui-form" action="">
<!-- 表单的标题legend标签显示为“用户注册”用于清晰地提示用户当前表单的用途让用户明白填写这些信息是用于注册新账号 -->
<legend>用户注册</legend>
<!-- 这是一个表单行元素div.layui-form-item用于组织和布局表单内的输入项在这里放置了多个输入项相关的内容使表单结构更清晰 -->
<div class="layui-form-item">
<!-- 这是一个内联元素的容器div.layui-inline用于对输入框及其相关图标等元素进行布局使其在一行内排列这里是针对昵称输入框的布局 -->
<div class="layui-inline iphone">
<div class="layui-input-inline">
<!-- 使用Layui框架提供的图标样式类layui-icon-user展示一个用户图标起到提示用户此处应输入昵称的作用提升用户交互的友好性 -->
<i class="layui-icon layui-icon-user iphone-icon"></i>
<!-- 昵称输入框设置了多个属性来规范输入框的行为和样式。name属性指定了表单提交时该输入框对应的数据参数名"username"
id属性用于唯一标识该输入框"mNickname"lay-verify="required"表示该输入框为必填项,
lay-reqText用于设置当用户未填写时显示的提示文本“请输入昵称”
placeholder属性设置输入框的占位提示文本同样是“请输入昵称”
autocomplete="off"关闭浏览器自动完成功能class="layui-input"应用Layui框架的输入框样式类 -->
<input type="text" name="username" id="mNickname" lay-verify="required" lay-reqText="请输入昵称" placeholder="请输入昵称" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素的容器div.layui-inline用于放置手机号输入框相关内容结构和上面昵称输入框部分类似都是为了在一行内合理布局输入框及图标等元素 -->
<div class="layui-inline iphone">
<div class="layui-input-inline">
<!-- 使用Layui框架的图标样式类layui-icon-cellphone展示一个手机图标提示用户此处应输入手机号 -->
<i class="layui-icon layui-icon-cellphone iphone-icon"></i>
<!-- 手机号输入框name属性为“phone”id为“phone”设置了必填验证lay-verify="required|phone"表示既要必填又要符合手机号格式验证以及相应的必填提示文本lay-reqText
占位提示文本placeholder、关闭自动完成功能autocomplete="off"等属性并应用了Layui框架的输入框样式类 -->
<input type="tel" name="phone" id="phone" lay-verify="required|phone" lay-reqText="请输入手机号" placeholder="请输入手机号" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 又一个内联元素的容器div.layui-inline用于放置密码输入框相关内容同样起到布局作用结构与前面的输入框部分类似 -->
<div class="layui-inline iphone">
<div class="layui-input-inline">
<!-- 使用Layui框架的图标样式类layui-icon-password展示一个密码图标提示用户此处应输入密码 -->
<i class="layui-icon layui-icon-password iphone-icon"></i>
<!-- 密码输入框name属性为“password”id为“pnum”同样设置了必填验证lay-verify="required"以及相应的必填提示文本lay-reqText
占位提示文本placeholder、关闭自动完成功能autocomplete="off"等属性并应用了Layui框架的输入框样式类 -->
<input id="pnum" type="password" name="password" lay-verify="required" lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<!-- 这是一个用于放置提交按钮的表单行元素,用于将按钮放置在合适的位置并应用相应的样式 -->
<div class="layui-form-item login-btn">
<div class="layui-input-block">
<!-- 提交按钮使用了Layui框架的按钮样式类layui-btn通过lay-submit和lay-filter="register"属性设置了按钮的提交和过滤功能,
点击该按钮会触发表单提交操作并根据此“register”过滤器进行相应的业务逻辑处理比如进行前端验证、发送注册数据到后端等操作
按钮的背景颜色通过style属性设置为#009688 -->
<button class="layui-btn" style="background-color: #009688" lay-submit="" lay-filter="register">提交</button>
</div>
</div>
@ -121,88 +202,117 @@
</div>
</div>
</div>
<!-- 登注册end -->
<!-- 底部 -->
<div class="fly-footer">
<!-- 这是页面底部的一个区域,通常用于展示版权声明、友情链接等相关信息 -->
<p><a href="#">酒店系统</a> 20222 © <a href="#">xyp.cn</a></p>
<!-- 另一个段落元素p标签用于展示友情链接相关内容 -->
<p>
<!-- 友情链接的标题文本 -->
友情链接
<!-- 以下是一系列友情链接通过a标签定义点击相应链接可跳转到对应的外部网站
target="_blank"属性表示在新的浏览器标签页中打开链接 -->
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
<a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">源码下载平台</a>
<a href="https://gitee.com/xie_yingpeng" target="_blank">源码市场</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">简历制作</a>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a> </p>
<a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a>
</p>
</div>
<!-- 脚本开始 -->
<!-- 脚本开始的标记意味着下面的代码部分主要是通过JavaScript来实现页面的交互功能等 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
// 使用Layui框架的use方法来加载指定的模块这里加载了"form"(用于表单相关操作)、"element"(用于操作页面元素等)、"carousel"(用于轮播图相关功能)、"jquery"(虽然这里重复定义了$可能是代码冗余一般只需加载一次即可获取到jQuery对象后续可检查下是否需要优化这几个模块加载完成后会执行回调函数
layui.use(["form","element","carousel","jquery"], function () {
// 获取Layui框架中form模块的实例后续可以通过这个form变量来调用form模块提供的各种方法比如表单验证、监听表单提交事件等
var form = layui.form,
// 获取Layui框架中layer模块的实例layer模块常用于弹出提示框、加载层等各种页面消息提示和交互效果的展示
layer = layui.layer,
// 获取Layui框架中element模块的实例用于操作页面元素相关功能比如动态更新页面元素的显示隐藏、样式切换等不过此处代码后续好像没有用到它的相关功能可根据实际需求确认是否需要保留
element = layui.element,
// 获取Layui框架中carousel模块的实例用于操作轮播图相关功能比如渲染轮播图、设置轮播图参数等
carousel = layui.carousel,
$=layui.jquery,
// 获取Layui框架中通过jQuery封装后的$对象用于进行DOM操作、发送Ajax请求等常见的前端操作等同于使用原生的jQuery库前提是Layui正确引入了jQuery相关依赖这里重复定义了$,建议只保留一个即可,避免混淆
$ = layui.jquery,
$ = layui.$;
//渲染轮播图
// 以下是使用carousel模块的render方法来渲染轮播图配置相关的参数
// elem属性指定了轮播图对应的DOM元素的ID通过这个IDcarousel模块能够找到页面中要渲染轮播图的位置这里对应的ID是'LAY-store-banner'需要确保页面中有这个ID的HTML元素存在否则轮播图无法正确渲染
// width属性设置轮播图容器的宽度为'100%',意味着轮播图会自适应其所在父元素的宽度,能在不同屏幕尺寸下较好地展示
// height属性设置轮播图容器的高度为'460'像素,固定了轮播图的高度,可根据实际设计需求调整合适的数值
// arrow属性设置为'always',表示始终显示轮播图的切换箭头,方便用户手动点击切换图片,若设置为其他值(比如'hide'等)可以控制箭头的显示隐藏逻辑
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
var flag = false;//定义变量,标识是否存在
// 定义一个布尔类型的变量flag初始值为false用于标识某个状态从后续代码看可能是用于标识用户名是否已存在的状态
var flag = false;
/* //当用户名输入框失去焦点事件触发验证
// 以下这段代码被注释掉了从代码结构看原本是用于监听用户名输入框id为'mNickname')失去焦点事件,当该事件触发时进行用户名是否已存在的验证操作
/* //当用户名输入框失去焦点事件触发验证
$("#mNickname").blur(function () {
//获取用户名
//获取用户名通过jQuery选择器获取到输入框元素后使用val()方法获取输入框中的值再使用trim()方法去除前后空格
var loginName = $("#mNickname").val().trim();
//判断用户名是否为空,不为空则发送请求验证
if(loginName.length>0){
//判断用户名是否为空,不为空则发送请求验证如果输入框中输入的用户名长度大于0就发起一个GET请求到后端接口'/user/checkName',同时传递用户名参数({"loginName":loginName})给后端进行验证
if(loginName.length > 0) {
$.get("/user/checkName",{"loginName":loginName},function(result){
if(result.exist){
// 根据后端返回的结果result中的exist属性判断用户名是否已存在如果exist为true表示用户名已存在
if(result.exist) {
// 使用Layui的layer.alert方法弹出提示框显示的内容是从服务器返回结果中的message属性获取的一般是提示用户名已存在之类的消息同时设置提示框的图标为5通常表示警告图标
layer.alert(result.message,{icon:5});
//修改状态为true表示已存在
// 将flag状态修改为true表示用户名已存在
flag = true;
}else{
flag = false;//不存在
} else {
// 如果用户名不存在将flag设置为false
flag = false;
}
},"json");
}
});*/
// 进行注册操作
// 监听名为'register'的表单提交事件这个事件是和页面中某个表单上设置了lay-filter="register"属性相关联的,通常就是注册表单的提交按钮触发的事件
form.on('submit(register)', function (data) {
//可以获取到表单中所有数据 data = data.field;
//发送登录请求
$.post("${pageContext.request.contextPath}/user/existPhone",data.field,function (result) {
if(result.success){//如果登录成功跳转到后台页面
// 通过data.field可以获取到表单中所有用户输入的数据它是一个对象包含了表单各个输入项对应的键值对例如昵称、手机号、密码等字段的数据
// 发送注册相关的请求,使用$.post方法这里的$是前面获取到的Layui封装的jQuery对象来向服务器端发送POST请求请求的URL地址是'${pageContext.request.contextPath}/user/existPhone'这个地址通过EL表达式结合项目上下文路径来动态生成确保指向正确的后端接口同时将表单数据data.field作为请求参数传递给后端
$.post("${pageContext.request.contextPath}/user/existPhone", data.field, function (result) {
// 判断请求返回的结果对象中的success属性如果为true表示相关操作从代码逻辑推测可能是验证手机号是否已存在之类的操作成功
if (result.success) {
// 使用Layui的layer.msg方法弹出提示信息显示的内容是从服务器返回结果中的msg属性获取的一般是提示相关操作成功之类的友好消息
layer.msg(result.msg);
location.href="${pageContext.request.contextPath}/fronts/login.jsp";
} else{//登录失败 提示用户
// 如果操作成功(这里根据现有代码逻辑推测可能不太准确,也许需要根据实际业务逻辑调整),将页面重定向到'${pageContext.request.contextPath}/fronts/login.jsp'页面同样这个路径也是通过EL表达式结合项目上下文路径动态生成的跳转到对应的登录页面可能是让用户进行登录或者继续其他操作
location.href = "${pageContext.request.contextPath}/fronts/login.jsp";
} else {
// 如果操作失败也就是result.success为false同样使用layer.msg方法弹出提示信息将服务器返回的错误提示消息result.msg展示给用户告知操作失败的原因等情况
layer.msg(result.msg);
}
},"json");
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
// 以下这段代码也被注释掉了,从代码结构看,原本也是用于监听'register'表单提交事件功能和上面未注释的监听类似但多了根据flag状态判断用户名是否已存在的逻辑可能是之前旧的逻辑或者备用的逻辑如有需要可以根据实际情况决定是否取消注释启用它
/* //表单提交事件
form.on("submit(register)",function (data) {
//判断是否存在
if(flag){
//判断是否存在通过前面定义的flag变量来判断用户名是否已存在如果flag为true表示用户名已存在
if(flag) {
// 使用Layui的layer.alert方法弹出提示框提示用户用户名已被使用让用户重新输入同时设置提示框的图标为5表示警告图标
layer.alert("用户名已被使用,请重新输入!",{icon:5})
}else{
//发送请求
} else {
// 如果用户名不存在,发送注册请求,使用$.post方法向'/user/register'接口这里是假设的后端注册接口需确保实际存在且正确配置发送POST请求将表单数据data.field传递给后端进行注册操作
$.post("/user/register",data.field,function(result){
if(result.success){
// 根据后端返回的结果result中的success属性判断注册是否成功如果success为true表示注册成功
if(result.success) {
// 使用Layui的layer.alert方法弹出提示框显示注册成功的消息从result.message获取同时设置提示框的图标为6通常表示成功图标
layer.alert(result.message,{icon:6});
}else{
} else {
// 如果注册失败使用layer.alert方法弹出提示框显示注册失败的消息从result.message获取图标设置为5表示警告图标
layer.alert(result.message,{icon:5});
}
},"json");
@ -213,10 +323,14 @@
});
</script>
<!-- 脚本结束 -->
<!-- 脚本结束的标记表示JavaScript代码部分结束 -->
<!-- 以下是一个无序列表ul应用了layui-fixbar样式类可能是Layui框架用于实现页面固定栏比如侧边栏、快捷导航栏等的相关样式结构 -->
<ul class="layui-fixbar">
<!-- 列表项li应用了layui-icon样式类用于显示Layui框架的图标layui-fixbar-top样式类可能用于定位或样式设置比如固定在顶部之类的效果lay-type="top"属性可能是用于标识该元素的类型或者功能这里推测和回到顶部相关内部的文本是一个特殊字符可能是Layui图标对应的字符编码显示为一个特定图标样式 -->
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<!-- 这是一个空的div元素应用了layui-layer-move样式类从类名推测可能是和Layui框架的弹出层layer的可移动功能相关的占位元素或者辅助元素但具体功能需要结合Layui框架相关的实现逻辑来确定 -->
<div class="layui-layer-move"></div>
</body>

@ -9,83 +9,125 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面的字符编码为UTF-8确保页面中的中文等各种字符能正确显示 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题内容为“layui”用于标识该页面 -->
<title>layui</title>
<!-- 告诉浏览器使用webkit内核来渲染页面webkit内核在处理一些HTML5特性、CSS样式以及页面渲染效果等方面有较好的表现 -->
<meta name="renderer" content="webkit">
<!-- 指示浏览器以IE浏览器的最高版本模式或者Chrome浏览器模式来渲染页面解决不同浏览器间可能出现的兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口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">
<!-- 引入Layui框架的CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取
这里引入的是Layui版本为v2.6.3的CSS文件其中包含了框架预定义的各种样式类用于构建页面布局和样式效果 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件public.css用于覆盖、扩展或自定义一些页面通用的样式规则 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/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="username" autocomplete="off" class="layui-input">
<!-- 这是一个自定义的容器类layuimini-container的div元素可能是基于Layui框架构建的页面主体容器用于包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 这里可能是页面主要内容展示区域使用了layuimini-main样式类具体样式效果由对应的CSS定义 -->
<div class="layuimini-main">
<%--搜索--%>
<!-- 定义一个fieldset元素用于对一组相关的表单元素进行分组这里用于包裹搜索相关的内容设置了标题为“搜索信息” -->
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<!-- 内部设置了一定的内边距margin这里设置了上下左右均为10px的内边距 -->
<div style="margin: 10px 10px 10px 10px">
<!-- 定义一个Layui框架的表单使用了layui-form和layui-form-pane样式类可能应用了一些特定的表单外观样式 -->
<form class="layui-form layui-form-pane" action="">
<!-- 这是一个表单行元素layui-form-item用于组织和布局表单内的输入项 -->
<div class="layui-form-item">
<!-- 这是一个内联元素的容器layui-inline用于对部门名称相关的标签和输入框进行布局使其在一行内排列 -->
<div class="layui-inline">
<!-- 标签元素layui-form-label用于显示“部门名称”的文本提示 -->
<label class="layui-form-label">部门名称</label>
<!-- 这是一个内联的输入框容器layui-input-inline用于放置部门名称的输入框 -->
<div class="layui-input-inline">
<!-- 部门名称输入框设置了name属性用于表单提交时传递参数名autocomplete="off"关闭浏览器自动完成功能应用了Layui框架的输入框样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素的容器layui-inline用于放置搜索和重置按钮 -->
<div class="layui-inline">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn通过lay-filter属性设置了按钮的过滤标识"data-search-btn"方便后续通过Layui框架监听按钮点击事件等操作内部使用了Layui的图标搜索图标layui-icon-search来增强视觉提示效果 -->
<button type="button" class="layui-btn" lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<!-- 重置按钮同样使用了Layui框架的按钮样式类设置了layui-btn-warm样式类可能应用了不同的按钮颜色比如暖色调表示重置等含义内部使用了刷新图标layui-icon-refresh-3 -->
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</div>
</div>
<div class="layui-inline">
<button type="button" class="layui-btn" 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-3"></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"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</form>
</div>
</fieldset>
<%--添加按钮--%>
<!-- 定义一个script标签其type属性设置为"text/html"这里的内容通常是作为模板使用id属性为"toolbarDemo"方便后续通过JavaScript等方式引用该模板 -->
<script type="text/html" id="toolbarDemo">
<!-- 这是一个用于放置按钮的div元素应用了layui-btn-container样式类可能用于对按钮进行布局 -->
<div class="layui-btn-container">
<!-- 添加按钮使用了Layui框架的按钮样式类layui-btn并添加了不同的样式修饰类layui-btn-normal表示正常样式、layui-btn-sm表示小尺寸按钮通过lay-event属性设置了按钮的事件标识"add"方便后续监听按钮点击事件并执行相应业务逻辑内部使用了添加图标layui-icon-add-1 -->
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<!-- 定义一个表格table元素应用了layui-hide样式类表示初始隐藏该表格通过id属性设置了唯一标识"currentTableId"并通过lay-filter属性设置了一个过滤器标识"currentTableFilter"方便后续通过Layui框架对表格进行各种操作比如数据渲染、事件监听等不过当前代码中表格内部还没有具体的列定义等内容 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal 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>
</table>
<%--操作按钮--%>
<!-- 又是一个script标签作为模板使用type属性为"text/html"id为"currentTableBar",用于定义表格中每行数据对应的操作按钮模板 -->
<script type="text/html" id="currentTableBar">
<!-- 编辑按钮使用了Layui框架的按钮样式类设置了不同的样式修饰layui-btn-normal表示正常样式、layui-btn-xs表示超小尺寸按钮通过lay-event属性设置了事件标识"edit"用于后续监听编辑按钮点击事件内部使用了编辑图标layui-icon-edit -->
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<!-- 删除按钮同样使用了Layui框架的按钮样式类设置了layui-btn-xs表示小尺寸以及layui-btn-danger表示危险通常用于表示删除等重要操作的警示颜色样式类通过lay-event属性设置了事件标识"delete"用于监听删除按钮点击事件内部使用了删除图标layui-icon-delete -->
<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元素初始设置为隐藏display: none内部有一定的内边距padding: 5px用于包裹添加和修改操作的表单内容通过id属性设置了唯一标识"addOrUpdateWindow")方便后续操作 -->
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<!-- 定义一个Layui框架的表单通过id属性设置了唯一标识"dataFrm"并通过lay-filter属性设置了过滤器标识"dataFrm"),方便后续进行表单验证、提交等相关操作 -->
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 这是一个表单行元素,用于组织部门名称相关的输入项 -->
<div class="layui-form-item">
<!-- 标签元素,用于显示“部门名称”的提示文本 -->
<label class="layui-form-label">部门名称</label>
<!-- 这是一个输入框的块级容器layui-input-block用于放置部门名称相关的输入框 -->
<div class="layui-input-block">
<%-- 隐藏域 --%>
<!-- 定义一个隐藏域input type="hidden"name属性为"id",通常用于在表单提交时传递一些不需要用户直接看到和修改的数据,比如记录的唯一标识等 -->
<input type="hidden" name="id">
<!-- 部门名称输入框设置了lay-verify="required"表示该输入框为必填项autocomplete="off"关闭自动完成功能placeholder属性设置了占位提示文本“请输入部门名称”并应用了Layui框架的输入框样式类 -->
<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">
<!-- 部门地址输入框同样设置了必填验证lay-verify="required"、关闭自动完成功能、占位提示文本“请输入部门地址”以及应用了Layui框架的输入框样式类 -->
<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应用了layui-textarea样式类通过name属性设置了提交参数名"remark"id属性为"content",用于用户输入部门相关的备注信息 -->
<textarea class="layui-textarea" name="remark" id="content"></textarea>
</div>
</div>
<!-- 这是一个用于放置提交和重置按钮的表单行元素同时应用了layui-row和layui-col-xs12样式类可能是基于Layui的栅格系统进行布局这里占满12列意味着占满一行 -->
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<!-- 提交按钮使用了Layui框架的按钮样式类通过lay-submit和lay-filter="doSubmit"属性设置了按钮的提交和过滤功能点击该按钮会触发表单提交操作并根据此过滤器进行相应的业务逻辑处理内部使用了添加图标layui-icon-add-1 -->
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<!-- 重置按钮使用了Layui框架的按钮样式类应用了layui-btn-warm样式类表示不同的按钮外观比如暖色调内部使用了刷新图标layui-icon-refresh-1 -->
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
@ -93,37 +135,55 @@
</div>
</form>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 使用Layui框架的use方法来加载指定的模块这里加载了'form'(用于表单相关操作)、'table'(用于操作表格相关功能)、'jquery'用于进行DOM操作、发送Ajax请求等常见前端操作这几个模块加载完成后会执行回调函数
layui.use(['form', 'table','jquery'], function () {
// 获取Layui框架中通过jQuery封装后的$对象等同于使用原生的jQuery库前提是Layui正确引入了jQuery相关依赖方便后续进行各种DOM操作和Ajax请求等
var $ = layui.jquery,
// 获取Layui框架中form模块的实例后续可以通过这个form变量来调用form模块提供的各种方法比如表单验证、监听表单提交事件等
form = layui.form,
// 获取Layui框架中table模块的实例用于操作表格相关功能比如表格数据渲染、表格事件监听等
table = layui.table;
var tableList =table.render({
// 使用table模块的render方法来渲染表格配置相关的参数并将渲染结果赋值给tableList变量后续可以通过这个变量对表格进行一些操作如重新加载数据等
var tableList = table.render({
// elem属性指定了表格对应的DOM元素的ID通过这个IDtable模块能够找到页面中要渲染表格的位置这里对应的ID是'currentTableId'需要确保页面中有这个ID的HTML元素存在前面HTML代码中已定义了该ID的空表格元素
elem: '#currentTableId',
// 设置表格数据的请求URL地址通过EL表达式结合项目上下文路径动态生成这里指向后端获取部门列表数据的接口'/dept/deptList'),用于获取要展示在表格中的部门数据
url: '${pageContext.request.contextPath}/dept/deptList',
// 指定表格头部工具栏的模板ID这里对应的是前面HTML代码中定义的id为'toolbarDemo'的模板内容,用于在表格头部添加一些操作按钮等元素
toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,这里包含了'filter'(可能用于数据筛选)、'exports'(可能用于数据导出)、'print'(用于打印表格数据)以及一个自定义的提示按钮,通过配置相关属性来定义按钮的标题、图标以及对应的事件标识等
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列信息,是一个二维数组,每一个子数组表示一行的列配置
cols: [[
{field: 'id', width: 120, title: '部门编号', sort: true,align: "center"},
{field: 'deptName', width: 150, title: '部门名称',align: "center"},
{field: 'address', width: 150, title: '部门地址',align: "center"},
{field: 'remark', title: '备注', minWidth: 150,align: "center"},
// 第一列配置field属性指定了对应数据字段名'id'width设置列宽为120像素title是列标题显示为'部门编号'sort属性设置为true表示该列可排序align属性设置文本在单元格内居中显示
{field: 'id', width: 120, title: '部门编号', sort: true, align: "center"},
// 第二列配置,类似第一列,对应'部门名称'字段列宽150像素文本居中
{field: 'deptName', width: 150, title: '部门名称', align: "center"},
// 第三列配置,对应'部门地址'字段列宽150像素文本居中
{field: 'address', width: 150, title: '部门地址', align: "center"},
// 第四列配置,对应'备注'字段没有设置固定列宽但设置了最小列宽为150像素文本居中
{field: 'remark', title: '备注', minWidth: 150, align: "center"},
// 第五列配置用于显示操作按钮设置了最小列宽150像素通过toolbar属性指定操作按钮的模板ID'currentTableBar'对应前面HTML代码中定义的操作按钮模板文本居中
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]],
// 设置表格支持分页功能,会自动根据后端返回的数据进行分页展示
page: true,
// done回调函数会在表格数据渲染完成后执行可用于进行一些后续的数据处理或页面操作
done: function (res, curr, count) {
//判断当前页码是否是大于1并且当前页的数据量为0
// 判断当前页码curr是否大于1并且当前页res.data的数据量为0,如果满足这个条件,说明可能出现了最后一页数据被删除等情况,导致当前页码对应的页面没有数据了
if (curr > 1 && res.data.length == 0) {
// 计算要跳转到的页码将当前页码减1即回到上一页
var pageValue = curr - 1;
//刷新数据表格的数据
// 重新加载表格数据通过调用tableList变量的reload方法传入要更新的页码参数实现回退到上一页并刷新数据的效果
tableIns.reload({
page: {curr: pageValue}
});
@ -132,116 +192,137 @@
});
// 监听搜索操作
// 监听名为'data-search-btn'的表单提交事件这个事件是和页面中搜索表单上设置了lay-filter="data-search-btn"属性相关联的,通常就是搜索按钮触发的事件
form.on('submit(data-search-btn)', function (data) {
// 重新加载表格数据通过调用tableList变量的reload方法传入搜索表单中的数据data.field作为查询条件同时将页码重置为第1页实现根据搜索条件重新查询并展示数据的功能
tableList.reload({
where:data.field,
where: data.field,
page: {
curr: 1
}
});
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
// 监听表格头部工具栏的事件,这里通过指定'toolbar(currentTableFilter)'来监听lay-filter属性为'currentTableFilter'的表格(对应前面渲染的表格)的头部工具栏事件
table.on("toolbar(currentTableFilter)", function (obj) {
// 根据触发事件的标识obj.event进行不同的操作这里使用了switch语句来判断
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
// 调用openAddWindow函数用于打开添加部门的窗口展示添加部门的表单等相关内容
openAddWindow();
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
var url; // 定义一个变量url用于存储后续表单提交的目标地址初始值为空会根据不同的操作添加或修改在相应函数中赋值
var mainIndex; // 定义一个变量mainIndex用于存储弹出层layer打开窗口的索引方便后续对打开的窗口进行操作如关闭窗口等
/**
* 打开添加窗口
* 打开添加窗口的函数,用于弹出添加部门的窗口,展示相关表单等内容
*/
function openAddWindow() {
// 使用Layui的layer模块的open方法打开一个弹出层窗口配置相关的参数
mainIndex = layer.open({
type: 1,//打开类型
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
// 设置打开类型为1表示以内容填充的方式打开窗口通常用于自定义内容的弹出窗口
type: 1,
// 设置窗口的标题为"添加部门",用于提示用户当前窗口的用途
title: "添加部门",
// 设置窗口的宽和高,这里宽为'800px',高为'400px',可根据实际需求调整尺寸
area: ["800px", "400px"],
// 设置窗口的内容,通过选择器('#addOrUpdateWindow'获取前面HTML代码中定义的包含添加部门表单的DOM元素将其作为弹出窗口的内容展示
content: $("#addOrUpdateWindow"),
success: function () {
//清空表单数据
// 在窗口打开成功后的回调函数中,清空表单数据,通过获取表单元素('#dataFrm'并调用其reset方法来清除表单中已有的输入内容方便用户重新填写新的部门信息
$("#dataFrm")[0].reset();
//添加的提交请求
// 设置添加操作的提交请求地址通过EL表达式结合项目上下文路径动态生成指向后端添加部门的接口'/dept/addDept'),后续在表单提交时会向这个地址发送数据
url = "${pageContext.request.contextPath}/dept/addDept";
}
});
}
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
// 监听表格行工具栏的事件,同样通过指定'toolbar(currentTableFilter)'来监听lay-filter属性为'currentTableFilter'的表格的行工具栏事件(对应表格每行数据后面的操作按钮事件)
table.on("tool(currentTableFilter)", function (obj) {
// 根据触发事件的标识obj.event进行不同的操作使用switch语句判断
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
// 调用openUpdateWindow函数并传入当前行的数据obj.data用于打开修改部门的窗口并将当前行的数据回显到表单中方便用户修改
openUpdateWindow(obj.data);
break;
case "delete"://删除按钮
// 调用deleteById函数并传入当前行的数据obj.data用于执行删除当前行对应部门的相关操作比如先判断是否能删除再发送删除请求等
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口
* @param data 当前行的数据
* 打开修改窗口的函数,用于弹出修改部门的窗口,展示相关表单并将对应部门的数据回显到表单中
* @param data 当前行的数据,包含了要修改的部门的各项信息,用于回显到表单中方便用户修改
*/
function openUpdateWindow(data) {
// 使用Layui的layer模块的open方法打开一个弹出层窗口配置相关参数与打开添加窗口类似但有部分不同功能
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
type: 1,
title: "修改部门",
area: ["800px", "400px"],
content: $("#addOrUpdateWindow"),
success: function () {
//表单数据
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
// 使用form模块的val方法将当前行的数据data回显到lay-filter属性为'dataFrm'的表单中对应前面HTML代码中的表单),实现将部门原数据显示在表单中方便用户修改的功能
form.val("dataFrm", data);
// 设置修改操作的提交请求地址通过EL表达式结合项目上下文路径动态生成指向后端修改部门的接口'/dept/updateDept'),后续在表单提交时会向这个地址发送修改后的数据
url = "${pageContext.request.contextPath}/dept/updateDept";
}
});
}
/**
* 删除部门
* @param data 当前行数据
* 删除部门的函数,用于执行删除指定部门的相关操作,包括判断是否能删除、发送删除请求以及处理删除后的相关提示和页面更新等
* @param data 当前行数据,包含了要删除的部门的相关信息,比如部门编号等,用于发送删除请求时传递给后端
*/
function deleteById(data) {
//判断当前部门下是否存在员工
$.get("${pageContext.request.contextPath}/dept/checkDeptHasEmployee",{"id":data.id},function(result){
if(result.exist){
//提示用户无法删除
// 发送GET请求到后端接口'/dept/checkDeptHasEmployee'传递当前部门的编号data.id作为参数用于判断当前部门下是否存在员工根据后端返回结果决定是否能删除该部门
$.get("${pageContext.request.contextPath}/dept/checkDeptHasEmployee", {"id": data.id}, function (result) {
// 根据后端返回结果中的'exist'属性判断当前部门下是否存在员工如果存在result.exist为true
if (result.exist) {
// 使用Layui的layer.msg方法弹出提示信息显示的内容是从服务器返回结果中的'msg'属性获取的,一般是提示用户无法删除该部门的原因等消息,告知用户不能进行删除操作
layer.msg(result.msg);
}else{
//提示用户是否删除该部门
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("${pageContext.request.contextPath}/dept/deleteById",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
} else {
// 如果当前部门下不存在员工可以进行删除操作使用Layui的layer.confirm方法弹出确认框提示用户是否确定要删除该部门配置相关的参数如图标icon: 3、标题title: '提示')等
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端删除接口'/dept/deleteById'传递当前部门的编号data.id作为参数用于执行实际的删除操作
$.post("${pageContext.request.contextPath}/dept/deleteById", {"id": data.id}, function (result) {
// 根据后端返回结果中的'success'属性判断删除操作是否成功如果成功result.success为true
if (result.success) {
// 重新加载表格数据通过调用tableList变量的reload方法实现删除部门后刷新表格展示最新的部门列表数据
tableList.reload();
}
//提示
// 使用Layui的layer.msg方法弹出提示信息,显示的内容是从服务器返回结果中的'msg'属性获取的,告知用户删除操作的结果情况(成功或失败的提示消息)
layer.msg(result.msg);
},"json");
// 关闭确认框通过传入确认框的索引index来关闭对应的弹出层
layer.close(index);
});
}
},"json");
}
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
// 监听lay-filter属性为'doSubmit'的表单提交事件这个事件是和前面HTML代码中表单上设置了lay-filter="doSubmit"属性相关联的,通常就是提交按钮触发的事件
form.on("submit(doSubmit)", function (data) {
// 发送POST请求使用$.post方法将表单数据data.field发送到前面根据不同操作添加或修改设置好的目标地址url将数据传递给后端进行相应的添加或修改操作
$.post(url, data.field, function (result) {
// 根据后端返回结果中的'success'属性判断操作是否成功如果成功result.success为true
if (result.success) {
// 重新加载表格数据通过调用tableList变量的reload方法实现添加或修改部门数据后刷新表格展示最新的部门列表数据
tableList.reload();
//关闭窗口
// 关闭弹出窗口通过传入存储的窗口索引mainIndex来关闭对应的弹出层窗口
layer.close(mainIndex);
}
//提示信息
// 使用Layui的layer.msg方法弹出提示信息,显示的内容是从服务器返回结果中的'msg'属性获取的,告知用户操作的结果情况(成功或失败的提示消息)
layer.msg(result.msg);
},"json");
//禁止页面刷新
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
});

@ -4,121 +4,171 @@
User: ASUS
Date: 2022/4/16
Time: 14:05
部门管理
部门管理(这里备注似乎不太准确,从代码整体看更像是员工管理相关功能,可能是创建时的备注有误或者后续功能有调整)
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面的字符编码为UTF-8确保页面中的中文等各种字符能正确显示 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题内容为“layui”用于标识该页面 -->
<title>layui</title>
<!-- 告诉浏览器使用webkit内核来渲染页面webkit内核在处理一些HTML5特性、CSS样式以及页面渲染效果等方面有较好的表现 -->
<meta name="renderer" content="webkit">
<!-- 指示浏览器以IE浏览器的最高版本模式或者Chrome浏览器模式来渲染页面解决不同浏览器间可能出现的兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口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">
<!-- 引入Layui框架的CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取
这里引入的是Layui版本为v2.6.3的CSS文件其中包含了框架预定义的各种样式类用于构建页面布局和样式效果 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件public.css用于覆盖、扩展或自定义一些页面通用的样式规则 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/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="username" autocomplete="off" class="layui-input">
<!-- 这是一个自定义的容器类layuimini-container的div元素可能是基于Layui框架构建的页面主体容器用于包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 这里可能是页面主要内容展示区域使用了layuimini-main样式类具体样式效果由对应的CSS定义 -->
<div class="layuimini-main">
<%--搜索--%>
<!-- 定义一个fieldset元素用于对一组相关的表单元素进行分组这里用于包裹搜索相关的内容设置了标题为“搜索信息” -->
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<!-- 内部设置了一定的内边距margin这里设置了上下左右均为10px的内边距 -->
<div style="margin: 10px 10px 10px 10px">
<!-- 定义一个Layui框架的表单使用了layui-form和layui-form-pane样式类可能应用了一些特定的表单外观样式 -->
<form class="layui-form layui-form-pane" action="">
<!-- 这是一个表单行元素layui-form-item用于组织和布局表单内的输入项 -->
<div class="layui-form-item">
<!-- 这是一个内联元素的容器layui-inline用于对员工姓名相关的标签和输入框进行布局使其在一行内排列 -->
<div class="layui-inline">
<!-- 标签元素layui-form-label用于显示“员工姓名”的文本提示 -->
<label class="layui-form-label">员工姓名</label>
<!-- 这是一个内联的输入框容器layui-input-inline用于放置员工姓名的输入框 -->
<div class="layui-input-inline">
<!-- 员工姓名输入框设置了name属性用于表单提交时传递参数名autocomplete="off"关闭浏览器自动完成功能应用了Layui框架的输入框样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素的容器layui-inline用于放置搜索和重置按钮 -->
<div class="layui-inline">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn通过lay-submit和lay-filter="data-search-btn"属性设置了按钮的提交和过滤标识点击该按钮会触发表单提交操作并按照此过滤器进行相应的业务逻辑处理内部使用了Layui的图标搜索图标layui-icon-search来增强视觉提示效果 -->
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<!-- 重置按钮同样使用了Layui框架的按钮样式类设置了layui-btn-warm样式类可能应用了不同的按钮颜色比如暖色调表示重置等含义内部使用了刷新图标layui-icon-refresh-3 -->
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</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-3"></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"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</form>
</div>
</fieldset>
<%--添加按钮--%>
<!-- 定义一个script标签其type属性设置为"text/html"这里的内容通常是作为模板使用id属性为"toolbarDemo"方便后续通过JavaScript等方式引用该模板 -->
<script type="text/html" id="toolbarDemo">
<!-- 这是一个用于放置按钮的div元素应用了layui-btn-container样式类可能用于对按钮进行布局 -->
<div class="layui-btn-container">
<!-- 添加按钮使用了Layui框架的按钮样式类layui-btn并添加了不同的样式修饰类layui-btn-normal表示正常样式、layui-btn-sm表示小尺寸按钮通过lay-event属性设置了按钮的事件标识"add"方便后续监听按钮点击事件并执行相应业务逻辑内部使用了添加图标layui-icon-add-1 -->
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<!-- 定义一个表格table元素应用了layui-hide样式类表示初始隐藏该表格通过id属性设置了唯一标识"currentTableId"并通过lay-filter属性设置了一个过滤器标识"currentTableFilter"方便后续通过Layui框架对表格进行各种操作比如数据渲染、事件监听等不过当前代码中表格内部还没有具体的列定义等内容 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal 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>
</table>
<%--操作按钮--%>
<!-- 又是一个script标签作为模板使用type属性为"text/html"id为"currentTableBar",用于定义表格中每行数据对应的操作按钮模板 -->
<script type="text/html" id="currentTableBar">
<!-- 编辑按钮使用了Layui框架的按钮样式类设置了不同的样式修饰layui-btn-normal表示正常样式、layui-btn-xs表示超小尺寸按钮通过lay-event属性设置了事件标识"edit"用于后续监听编辑按钮点击事件内部使用了编辑图标layui-icon-edit -->
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<!-- 删除按钮同样使用了Layui框架的按钮样式类设置了layui-btn-xs表示小尺寸以及layui-btn-danger表示危险通常用于表示删除等重要操作的警示颜色样式类通过lay-event属性设置了事件标识"delete"用于监听删除按钮点击事件内部使用了删除图标layui-icon-delete -->
<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元素初始设置为隐藏display: none内部有一定的内边距padding: 5px用于包裹添加和修改操作的表单内容通过id属性设置了唯一标识"addOrUpdateWindow")方便后续操作 -->
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<!-- 定义一个Layui框架的表单通过id属性设置了唯一标识"dataFrm"并通过lay-filter属性设置了过滤器标识"dataFrm"),方便后续进行表单验证、提交等相关操作 -->
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 这是一个表单行元素,用于组织员工编号相关的输入项 -->
<div class="layui-form-item">
<!-- 标签元素,用于显示“员工编号”的提示文本 -->
<label class="layui-form-label">员工编号</label>
<!-- 这是一个输入框的块级容器layui-input-block用于放置员工编号相关的输入框 -->
<div class="layui-input-block">
<!-- 员工编号输入框设置了lay-verify="required"表示该输入框为必填项autocomplete="off"关闭自动完成功能placeholder属性设置了占位提示文本“请输入员工编号”并应用了Layui框架的输入框样式类 -->
<input type="text" name="id" 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">
<!-- 员工姓名输入框同样设置了必填验证lay-verify="required"、关闭自动完成功能、占位提示文本“请输入姓名”以及应用了Layui框架的输入框样式类 -->
<input type="text" name="empname" lay-verify="required" autocomplete="off"
placeholder="请输入姓名" class="layui-input">
</div>
</div>
<!-- 表单行元素,用于组织员工性别相关的单选按钮输入项 -->
<div class="layui-form-item">
<div class="layui-input-block">
<!-- 男性单选按钮设置了name属性用于分组与下面的女性单选按钮同属'sex'组lay-verify="required"表示必填autocomplete="off"关闭自动完成功能value属性设置按钮的值为“男”并应用了Layui框架的输入框样式类后面跟着显示的文本“男” -->
<input type="radio" name="sex" lay-verify="required" autocomplete="off" value="男" class="layui-input">男
<!-- 女性单选按钮与男性单选按钮类似value属性设置为“女”用于区分不同的选择值 -->
<input type="radio" name="sex" lay-verify="required" autocomplete="off" value="女" class="layui-input">女
</div>
</div>
<!-- 表单行元素,用于组织所属部门相关的下拉选择框输入项 -->
<div class="layui-form-item">
<label class="layui-form-label">所属部门</label>
<div class="layui-input-block">
<!-- 定义一个下拉选择框select元素name属性用于表单提交时传递所选部门的参数名 -->
<select name="deptname">
<!-- 下拉框中的默认选项显示文本为“请选择部门”value值为“volvo”这里可能不太准确也许应该设置一个更合适的默认值或者空值等根据实际业务需求调整 -->
<option value="volvo" >请选择部门</option>
<%--从监听器中获取到部门名称的数据--%>
<!-- 使用JSTL的<c:forEach>标签循环遍历名为"types"的applicationScope属性中的数据推测是部门相关的数据集合元素类型可能是包含deptName等属性的对象具体要根据后端传递的数据结构确定并将每个部门名称作为下拉框的选项展示 -->
<c:forEach items="${applicationScope.types}" var="tp">
<option value="${tp.deptName}" name="deptname">${tp.deptName}</option>
</c:forEach>
</select>
</div>
</div>
<!-- 表单行元素,用于组织家庭地址相关的输入项 -->
<div class="layui-form-item">
<label class="layui-form-label">家庭地址</label>
<div class="layui-input-block">
<!-- 家庭地址输入框设置了必填验证lay-verify="required"、关闭自动完成功能、占位提示文本“请输入家庭地址”以及应用了Layui框架的输入框样式类 -->
<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">
<!-- 入职年份输入框,同样设置了必填验证、关闭自动完成功能、占位提示文本以及应用了输入框样式类 -->
<input type="text" name="hireDate" lay-verify="required" autocomplete="off" placeholder="请输入 入职年份"
class="layui-input">
</div>
</div>
</2>
<!-- 表单行元素,用于组织备注相关的文本域输入项 -->
<div class="layui-form-item">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<!-- 定义一个文本域textarea应用了layui-textarea样式类通过name属性设置了提交参数名"remark"id属性为"content",用于用户输入员工相关的备注信息 -->
<textarea class="layui-textarea" name="remark" id="content"></textarea>
</div>
</div>
<!-- 这是一个用于放置提交和重置按钮的表单行元素同时应用了layui-row和layui-col-xs12样式类可能是基于Layui的栅格系统进行布局这里占满12列意味着占满一行 -->
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<!-- 提交按钮使用了Layui框架的按钮样式类通过lay-submit和lay-filter="doSubmit"属性设置了按钮的提交和过滤功能点击该按钮会触发表单提交操作并根据此过滤器进行相应的业务逻辑处理内部使用了添加图标layui-icon-add-1 -->
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<!-- 重置按钮使用了Layui框架的按钮样式类应用了layui-btn-warm样式类表示不同的按钮外观比如暖色调内部使用了刷新图标layui-icon-refresh-1 -->
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
@ -126,135 +176,173 @@
</div>
</form>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 使用Layui框架的use方法来加载指定的模块这里加载了'form'(用于表单相关操作)、'table'(用于操作表格相关功能)、'jquery'用于进行DOM操作、发送Ajax请求等常见前端操作这几个模块加载完成后会执行回调函数
layui.use(['form', 'table','jquery'], function () {
// 获取Layui框架中通过jQuery封装后的$对象等同于使用原生的jQuery库前提是Layui正确引入了jQuery相关依赖方便后续进行各种DOM操作和Ajax请求等
var $ = layui.jquery,
// 获取Layui框架中form模块的实例后续可以通过这个form变量来调用form模块提供的各种方法比如表单验证、监听表单提交事件等
form = layui.form,
// 获取Layui框架中table模块的实例用于操作表格相关功能比如表格数据渲染、表格事件监听等
table = layui.table;
var tableList =table.render({
// 使用table模块的render方法来渲染表格配置相关的参数并将渲染结果赋值给tableList变量后续可以通过这个变量对表格进行一些操作如重新加载数据等
var tableList = table.render({
// elem属性指定了表格对应的DOM元素的ID通过这个IDtable模块能够找到页面中要渲染表格的位置这里对应的ID是'currentTableId'需要确保页面中有这个ID的HTML元素存在前面HTML代码中已定义了该ID的空表格元素
elem: '#currentTableId',
// 设置表格数据的请求URL地址通过EL表达式结合项目上下文路径动态生成这里指向后端获取员工列表数据的接口'/employee/employeeList'),用于获取要展示在表格中的员工数据
url: '${pageContext.request.contextPath}/employee/employeeList',
// 指定表格头部工具栏的模板ID这里对应的是前面HTML代码中定义的id为'toolbarDemo'的模板内容,用于在表格头部添加一些操作按钮等元素
toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,这里包含了'filter'(可能用于数据筛选)、'exports'(可能用于数据导出)、'print'(用于打印表格数据)以及一个自定义的提示按钮,通过配置相关属性来定义按钮的标题、图标以及对应的事件标识等
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列信息,是一个二维数组,每一个子数组表示一行的列配置
cols: [[
{field: 'id', width: 120, title: '员工编号', sort: true,align: "center"},
{field: 'empname', width: 120, title: '员工姓名',align: "center"},
{field: 'sex', width: 60, title: '性别',align: "center"},
{field: 'deptname', width: 100, title: '所属部门',align: "center"},
{field: 'address', width: 100, title: '家庭地址',align: "center"},
{field: 'hireDate', width: 100, title: '入职年份',align: "center"},
{field: 'remark', title: '备注', minWidth: 150,align: "center"},
// 第一列配置field属性指定了对应数据字段名'id'width设置列宽为120像素title是列标题显示为'员工编号'sort属性设置为true表示该列可排序align属性设置文本在单元格内居中显示
{field: 'id', width: 120, title: '员工编号', sort: true, align: "center"},
// 第二列配置,对应'员工姓名'字段列宽120像素文本居中
{field: 'empname', width: 120, title: '员工姓名', align: "center"},
// 第三列配置,对应'性别'字段列宽60像素文本居中
{field: 'sex', width: 60, title: '性别', align: "center"},
// 第四列配置,对应'所属部门'字段列宽100像素文本居中
{field: 'deptname', width: 100, title: '所属部门', align: "center"},
// 第五列配置,对应'家庭地址'字段列宽100像素文本居中
{field: 'address', width: 100, title: '家庭地址', align: "center"},
// 第六列配置,对应'入职年份'字段列宽100像素文本居中
{field: 'hireDate', width: 100, title: '入职年份', align: "center"},
// 第七列配置,对应'备注'字段没有设置固定列宽但设置了最小列宽为150像素文本居中
{field: 'remark', title: '备注', minWidth: 150, align: "center"},
// 第八列配置用于显示操作按钮设置了最小列宽150像素通过toolbar属性指定操作按钮的模板ID'currentTableBar'对应前面HTML代码中定义的操作按钮模板文本居中
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作
// 监听名为'data-search-btn'的表单提交事件这个事件是和页面中搜索表单上设置了lay-filter="data-search-btn"属性相关联的,通常就是搜索按钮触发的事件
form.on('submit(data-search-btn)', function (data) {
// 重新加载表格数据通过调用tableList变量的reload方法传入搜索表单中的数据data.field作为查询条件实现根据搜索条件重新查询并展示数据的功能
tableList.reload({
data:data.field,
data: data.field,
});
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
// 监听表格头部工具栏的事件,这里通过指定'toolbar(currentTableFilter)'来监听lay-filter属性为'currentTableFilter'的表格(对应前面渲染的表格)的头部工具栏事件
table.on("toolbar(currentTableFilter)", function (obj) {
// 根据触发事件的标识obj.event进行不同的操作这里使用了switch语句来判断
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
// 调用openAddWindow函数用于打开添加员工的窗口展示添加员工的表单等相关内容
openAddWindow();
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
var url; // 定义一个变量url用于存储后续表单提交的目标地址初始值为空会根据不同的操作添加或修改在相应函数中赋值
var mainIndex; // 定义一个变量mainIndex用于存储弹出层layer打开窗口的索引方便后续对打开的窗口进行操作如关闭窗口等
/**
* 打开添加窗口
* 打开添加窗口的函数,用于弹出添加员工的窗口,展示相关表单等内容
*/
function openAddWindow() {
// 使用Layui的layer模块的open方法打开一个弹出层窗口配置相关的参数
mainIndex = layer.open({
type: 1,//打开类型
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
// 设置打开类型为1表示以内容填充的方式打开窗口通常用于自定义内容的弹出窗口
type: 1,
// 设置窗口的标题为"添加部门"(这里可能有个小错误,从功能上看应该是"添加员工",可根据实际需求调整标题文本),用于提示用户当前窗口的用途
title: "添加部门",
// 设置窗口的宽和高,这里宽为'800px',高为'400px',可根据实际需求调整尺寸
area: ["800px", "400px"],
// 设置窗口的内容,通过选择器('#addOrUpdateWindow'获取前面HTML代码中定义的包含添加员工表单的DOM元素将其作为弹出窗口的内容展示
content: $("#addOrUpdateWindow"),
success: function () {
//清空表单数据
// 在窗口打开成功后的回调函数中,清空表单数据,通过获取表单元素('#dataFrm'并调用其reset方法来清除表单中已有的输入内容方便用户重新填写新的员工信息
$("#dataFrm")[0].reset();
//添加的提交请求
// 设置添加操作的提交请求地址通过EL表达式结合项目上下文路径动态生成指向后端添加员工的接口'/employee/addEmployee'),后续在表单提交时会向这个地址发送数据
url = "${pageContext.request.contextPath}/employee/addEmployee";
}
});
}
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
// 监听表格行工具栏的事件,同样通过指定'toolbar(currentTableFilter)'来监听lay-filter属性为'currentTableFilter'的表格的行工具栏事件(对应表格每行数据后面的操作按钮事件)
table.on("tool(currentTableFilter)", function (obj) {
// 根据触发事件的标识obj.event进行不同的操作使用switch语句判断
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
// 调用openUpdateWindow函数并传入当前行的数据obj.data用于打开修改员工的窗口并将当前行的数据回显到表单中方便用户修改
openUpdateWindow(obj.data);
break;
case "delete"://删除按钮
// 调用deleteById函数并传入当前行的数据obj.data用于执行删除当前行对应员工的相关操作比如发送删除请求等
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口
* @param data 当前行的数据
* 打开修改窗口的函数,用于弹出修改员工的窗口,展示相关表单并将对应员工的数据回显到表单中
* @param data 当前行的数据,包含了要修改的员工的各项信息,用于回显到表单中方便用户修改
*/
function openUpdateWindow(data) {
// 使用Layui的layer模块的open方法打开一个弹出层窗口配置相关参数与打开添加窗口类似但有部分不同功能
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
type: 1,
title: "修改部门"(这里同样可能存在错误,应改为"修改员工"更符合功能逻辑),
area: ["800px", "400px"],
content: $("#addOrUpdateWindow"),
success: function () {
//表单数据
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
// 使用form模块的val方法将当前行的数据data回显到lay-filter属性为'dataFrm'的表单中对应前面HTML代码中的表单),实现将员工原数据显示在表单中方便用户修改的功能
form.val("dataFrm", data);
// 设置修改操作的提交请求地址通过EL表达式结合项目上下文路径动态生成指向后端修改员工的接口'/employee/updateEmployee'),后续在表单提交时会向这个地址发送修改后的数据
url = "${pageContext.request.contextPath}/employee/updateEmployee";
}
});
}
/**
* 删除部门
* @param data 当前行数据
* 删除部门的函数,用于执行删除指定员工的相关操作,包括发送删除请求以及处理删除后的相关提示和页面更新等
* @param data 当前行数据,包含了要删除的员工的相关信息,比如员工编号等,用于发送删除请求时传递给后端
*/
function deleteById(data) {
//提示管理员是否删除该部员工
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("${pageContext.request.contextPath}/employee/deleteEmployee",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
// 使用Layui的layer.confirm方法弹出确认框提示用户是否确定要删除该员工配置相关的参数如图标icon: 3、标题title: '提示')等
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端删除接口'/employee/deleteEmployee'传递当前员工的编号data.id作为参数用于执行实际的删除操作
$.post("${pageContext.request.contextPath}/employee/deleteEmployee", {"id": data.id}, function (result) {
// 根据后端返回结果中的'success'属性判断删除操作是否成功如果成功result.success为true
if (result.success) {
// 重新加载表格数据通过调用tableList变量的reload方法实现删除员工后刷新表格展示最新的员工列表数据
tableList.reload();
}
//提示
// 使用Layui的layer.msg方法弹出提示信息,显示的内容是从服务器返回结果中的'msg'属性获取的,告知用户删除操作的结果情况(成功或失败的提示消息)
layer.msg(result.msg);
},"json");
// 关闭确认框通过传入确认框的索引index来关闭对应的弹出层
layer.close(index);
});
}
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
// 监听lay-filter属性为'doSubmit'的表单提交事件这个事件是和前面HTML代码中表单上设置了lay-filter="doSubmit"属性相关联的,通常就是提交按钮触发的事件
form.on("submit(doSubmit)", function (data) {
// 发送POST请求使用$.post方法将表单数据data.field发送到前面根据不同操作添加或修改设置好的目标地址url将数据传递给后端进行相应的添加或修改操作
$.post(url, data.field, function (result) {
// 根据后端返回结果中的'success'属性判断操作是否成功如果成功result.success为true
if (result.success) {
// 重新加载表格数据通过调用tableList变量的reload方法实现添加或修改员工数据后刷新表格展示最新的员工列表数据
tableList.reload();
//关闭窗口
// 关闭弹出窗口通过传入存储的窗口索引mainIndex来关闭对应的弹出层窗口
layer.close(mainIndex);
}
//提示信息
// 使用Layui的layer.msg方法弹出提示信息,显示的内容是从服务器返回结果中的'msg'属性获取的,告知用户操作的结果情况(成功或失败的提示消息)
layer.msg(result.msg);
},"json");
//禁止页面刷新
// 返回false可以阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单进行默认的页面刷新提交避免页面不必要的跳转或刷新
return false;
});
});

@ -4,89 +4,128 @@
User: ASUS
Date: 2022/4/16
Time: 14:05
部门管理
这里备注是“部门管理”,但从代码内容来看似乎更像是“楼层管理”相关的页面结构,可能存在备注不准确的情况
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<!-- 设置页面的字符编码为UTF-8确保页面中的各种字符如中文等能正确显示 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题内容为“layui”用于标识该页面 -->
<title>layui</title>
<!-- 告诉浏览器使用webkit内核来渲染页面webkit内核在处理一些HTML5特性、CSS样式以及页面渲染效果等方面表现较好 -->
<meta name="renderer" content="webkit">
<!-- 指示浏览器以IE浏览器的最高版本模式或者Chrome浏览器模式来渲染页面有助于解决不同浏览器间可能出现的兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口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">
<!-- 引入Layui框架的CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取
此处引入的是Layui版本为v2.6.3的CSS文件其中包含了框架预定义的各种样式类可用于构建页面布局和实现样式效果 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件public.css用于覆盖、扩展或自定义一些页面通用的样式规则 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/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="username" autocomplete="off" class="layui-input">
<!-- 这是一个自定义的容器类layuimini-container的div元素通常作为基于Layui框架构建的页面主体容器用来包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 这里可能是页面主要内容展示区域使用了layuimini-main样式类其具体的样式效果由对应的CSS样式规则来定义 -->
<div class="layuimini-main">
<%--搜索--%>
<!-- 定义一个fieldset元素它的作用是对一组相关的表单元素进行分组在这里用于包裹与搜索相关的内容并设置了标题为“搜索信息” -->
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<!-- 内部设置了一定的内边距margin这里将上下左右的内边距都设置为10px使内部元素与边界有一定间隔 -->
<div style="margin: 10px 10px 10px 10px">
<!-- 定义一个Layui框架的表单应用了layui-form和layui-form-pane样式类可能会赋予表单一些特定的外观样式 -->
<form class="layui-form layui-form-pane" action="">
<!-- 这是一个表单行元素layui-form-item用于组织和布局表单内的各个输入项使表单结构更清晰 -->
<div class="layui-form-item">
<!-- 这是一个内联元素的容器layui-inline用于对楼层名称相关的标签和输入框进行布局使其能在一行内排列显示 -->
<div class="layui-inline">
<!-- 标签元素layui-form-label用于显示“楼层名称”的文本提示告知用户此处输入框对应的含义 -->
<label class="layui-form-label">楼层名称</label>
<!-- 这是一个内联的输入框容器layui-input-inline用于放置楼层名称的输入框 -->
<div class="layui-input-inline">
<!-- 楼层名称输入框设置了name属性用于在表单提交时传递对应的参数名autocomplete="off"关闭浏览器自动完成功能并且应用了Layui框架的输入框样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素的容器layui-inline用于放置搜索和重置按钮 -->
<div class="layui-inline">
<!-- 搜索按钮使用了Layui框架的按钮样式类layui-btn通过lay-submit和lay-filter="data-search-btn"属性设置了按钮的提交和过滤标识点击该按钮会触发表单提交操作并按照此过滤器对应的逻辑进行处理内部还使用了Layui的图标搜索图标layui-icon-search来增强视觉提示效果让用户更直观地知道这是搜索按钮 -->
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<!-- 重置按钮同样使用了Layui框架的按钮样式类设置了layui-btn-warm样式类可能使其呈现出暖色调等不同外观效果用于表示重置操作内部使用了刷新图标layui-icon-refresh-3 -->
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</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-3"></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"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</form>
</div>
</fieldset>
<%--添加按钮--%>
<!-- 定义一个script标签其type属性设置为"text/html"这种类型的script内容通常是作为模板使用通过设置id属性为"toolbarDemo"方便后续通过JavaScript等方式引用该模板 -->
<script type="text/html" id="toolbarDemo">
<!-- 这是一个用于放置按钮的div元素应用了layui-btn-container样式类可能用于对按钮进行布局比如控制按钮的排列方式、间距等 -->
<div class="layui-btn-container">
<!-- 添加按钮使用了Layui框架的按钮样式类layui-btn并添加了不同的样式修饰类layui-btn-normal表示正常样式、layui-btn-sm表示小尺寸按钮通过lay-event属性设置了按钮的事件标识"add"方便后续在JavaScript中监听按钮点击事件并执行相应的业务逻辑内部使用了添加图标layui-icon-add-1来增强按钮的表意性 -->
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<!-- 定义一个表格table元素应用了layui-hide样式类表示初始时隐藏该表格通过id属性设置了唯一标识"currentTableId"并通过lay-filter属性设置了一个过滤器标识"currentTableFilter"方便后续通过Layui框架对表格进行各种操作例如数据渲染、事件监听等但当前代码中表格内部还没有具体定义列等相关内容 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal 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>
</table>
<%--操作按钮--%>
<!-- 又是一个script标签作为模板使用type属性为"text/html"id为"currentTableBar",用于定义表格中每行数据对应的操作按钮模板 -->
<script type="text/html" id="currentTableBar">
<!-- 编辑按钮使用了Layui框架的按钮样式类设置了不同的样式修饰layui-btn-normal表示正常样式、layui-btn-xs表示超小尺寸按钮通过lay-event属性设置了事件标识"edit"用于后续监听编辑按钮点击事件内部使用了编辑图标layui-icon-edit -->
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<!-- 删除按钮同样使用了Layui框架的按钮样式类设置了layui-btn-xs表示小尺寸以及layui-btn-danger表示危险通常用于表示删除等重要操作的警示颜色样式类通过lay-event属性设置了事件标识"delete"用于监听删除按钮点击事件内部使用了删除图标layui-icon-delete -->
<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元素初始设置为隐藏display: none内部有一定的内边距padding: 5px用于包裹添加和修改操作的表单内容通过id属性设置了唯一标识"addOrUpdateWindow"方便后续在JavaScript中对其进行操作比如显示、隐藏以及获取表单数据等 -->
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<!-- 定义一个Layui框架的表单通过id属性设置了唯一标识"dataFrm"并通过lay-filter属性设置了过滤器标识"dataFrm"方便后续利用Layui框架进行表单验证、提交等相关操作 -->
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 这是一个表单行元素,用于组织楼层编号相关的输入项 -->
<div class="layui-form-item">
<!-- 标签元素,用于显示“楼层编号”的提示文本,让用户明白此处输入框应输入的内容 -->
<label class="layui-form-label">楼层编号</label>
<!-- 这是一个输入框的块级容器layui-input-block用于放置楼层编号相关的输入框 -->
<div class="layui-input-block">
<!-- 楼层编号输入框设置了lay-verify="required"表示该输入框为必填项autocomplete="off"关闭自动完成功能placeholder属性设置了占位提示文本“请输入楼层编号”并应用了Layui框架的输入框样式类 -->
<input type="text" name="id" 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">
<!-- 楼层名称输入框同样设置了必填验证lay-verify="required"、关闭自动完成功能、占位提示文本“请输入楼层名称”以及应用了Layui框架的输入框样式类 -->
<input type="text" name="name" 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应用了layui-textarea样式类通过name属性设置了提交参数名"remark"id属性为"content",用于用户输入楼层相关的备注信息 -->
<textarea class="layui-textarea" name="remark" id="content"></textarea>
</div>
</div>
<!-- 这是一个用于放置提交和重置按钮的表单行元素同时应用了layui-row和layui-col-xs12样式类可能是基于Layui的栅格系统进行布局这里占满12列意味着占满一行 -->
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<!-- 提交按钮使用了Layui框架的按钮样式类通过lay-submit和lay-filter="doSubmit"属性设置了按钮的提交和过滤功能点击该按钮会触发表单提交操作并根据此过滤器进行相应的业务逻辑处理内部使用了添加图标layui-icon-add-1 -->
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<!-- 重置按钮使用了Layui框架的按钮样式类应用了layui-btn-warm样式类表示不同的按钮外观比如暖色调内部使用了刷新图标layui-icon-refresh-1 -->
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
@ -94,131 +133,165 @@
</div>
</form>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 使用Layui框架的use方法来加载指定的模块这里加载了'form'(用于表单相关操作)、'table'(用于操作表格相关功能)、'jquery'用于进行DOM操作、发送Ajax请求等常见前端操作这几个模块当这些模块加载完毕后会执行传入的回调函数
layui.use(['form', 'table','jquery'], function () {
// 获取Layui框架中经过封装后的jQuery对象赋值给变量$,后续可以使用这个$来进行各种基于jQuery的DOM操作以及Ajax请求等其功能和原生的jQuery库使用方式类似前提是Layui正确引入了jQuery相关依赖
var $ = layui.jquery,
// 获取Layui框架中form模块的实例之后可以通过这个form变量来调用form模块所提供的各类方法比如实现表单验证、监听表单提交事件等操作
form = layui.form,
// 获取Layui框架中table模块的实例以便后续利用该实例来操作表格相关功能像表格的数据渲染、对表格各种事件进行监听等都是通过这个实例来完成的
table = layui.table;
var tableList =table.render({
// 使用table模块的render方法来渲染一个表格同时配置一系列相关参数并将渲染后得到的表格实例赋值给tableList变量后续可借助这个变量对表格执行如重新加载数据等操作
var tableList = table.render({
// 通过elem属性指定表格对应的DOM元素的ID这样table模块就能依据此ID在页面中准确找到要渲染表格的位置此处对应的ID为'currentTableId'要确保HTML页面中存在具有该ID的相应元素前面HTML代码中已定义了这个空表格元素
elem: '#currentTableId',
// 设置获取表格数据的请求URL地址这里通过EL表达式结合项目上下文路径动态生成了具体的地址指向后端用于获取楼层列表数据的接口'/floor/floorList'),目的是从后端获取要展示在表格中的楼层相关数据
url: '${pageContext.request.contextPath}/floor/floorList',
// 利用toolbar属性指定表格头部工具栏所对应的模板ID该ID'toolbarDemo'对应的是前面HTML代码中定义好的一个模板内容借助这个模板可以在表格头部添加一些操作按钮之类的元素
toolbar: '#toolbarDemo',
// 配置默认的工具栏按钮,这里包含了'filter'(可能用于实现对表格数据的筛选功能)、'exports'(也许用于将表格数据导出)、'print'(可用于打印表格数据)以及一个自定义的提示按钮,通过设置相关属性详细定义了每个按钮的标题、对应的事件标识以及图标等内容
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列信息,以二维数组形式呈现,其中每一个子数组代表表格中的一行的列配置情况
cols: [[
{field: 'id', width: 120, title: '楼层编号', sort: true,align: "center"},
{field: 'name', title: '楼层名称', minWidth: 150,align: "center"},
{field: 'remark', title: '备注', minWidth: 150,align: "center"},
// 第一列配置通过field属性明确对应的数据字段名为'id'width属性将列宽设定为120像素title属性设置列标题显示为'楼层编号'sort属性设置为true表示该列支持排序功能align属性指定文本在单元格内居中显示
{field: 'id', width: 120, title: '楼层编号', sort: true, align: "center"},
// 第二列配置,对应的数据字段名为'name',列标题显示为'楼层名称'此处没有设置固定列宽而是设置了最小列宽为150像素文本同样在单元格内居中显示
{field: 'name', title: '楼层名称', minWidth: 150, align: "center"},
// 第三列配置,对应'备注'字段同样设置了最小列宽为150像素文本在单元格内居中用于展示楼层相关的备注信息
{field: 'remark', title: '备注', minWidth: 150, align: "center"},
// 第四列配置用于显示操作按钮设置了最小列宽为150像素通过toolbar属性指定操作按钮所对应的模板ID'currentTableBar'此ID对应前面HTML代码中定义的操作按钮模板并且文本在单元格内居中显示
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作
// 监听名为'data-search-btn'的表单提交事件这个事件与页面中搜索表单上设置的lay-filter="data-search-btn"属性相关联,通常就是点击搜索按钮时触发的事件
form.on('submit(data-search-btn)', function (data) {
// 重新加载表格数据调用tableList变量的reload方法将搜索表单中用户输入的数据data.field作为查询条件传入以此实现根据用户输入的搜索条件重新向服务器请求数据并展示在表格中的功能
tableList.reload({
data:data.field,
data: data.field,
});
// 返回false用于阻止表单的默认提交行为因为这里是通过Ajax异步请求的方式向服务器提交数据不需要表单执行默认的页面刷新提交操作避免造成页面不必要的跳转或刷新情况
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
// 监听表格头部工具栏的事件,通过指定'toolbar(currentTableFilter)'来专门监听lay-filter属性为'currentTableFilter'的表格(也就前面渲染出来的那个表格)的头部工具栏事件
table.on("toolbar(currentTableFilter)", function (obj) {
// 根据触发事件的具体标识obj.event来执行不同的操作逻辑这里使用了switch语句进行判断区分不同的事件类型
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
// 当点击添加按钮时调用openAddWindow函数该函数的作用是打开用于添加楼层的窗口展示出添加楼层所需要填写信息的相关表单等内容
openAddWindow();
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
var url; // 声明一个变量url用于存储后续表单提交时的目标地址初始时先不赋值会根据后续具体是添加还是修改等不同操作在相应的函数中为其赋予正确的地址值
var mainIndex; // 声明变量mainIndex用于存储弹出层layer打开窗口的索引方便后续在需要的时候对打开的窗口进行相关操作比如关闭窗口等操作
/**
* 打开添加窗口
* 打开添加窗口的函数,用于弹出添加楼层的窗口,在窗口中展示出添加楼层对应的表单等相关内容
*/
function openAddWindow() {
// 使用Layui框架的layer模块的open方法来打开一个弹出层窗口并配置一系列相关参数
mainIndex = layer.open({
type: 1,//打开类型
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
// 设置打开类型为1表示以内容填充的方式来打开窗口这种方式常用于展示自定义内容的弹出窗口比如这里填充的就是添加楼层的表单内容
type: 1,
// 设置窗口的标题为"添加部门"(这里可能存在一个小错误,从功能逻辑上看应该是"添加楼层"更为合理,可根据实际需求进行标题文本的修正),用于提示用户当前窗口的主要用途是什么
title: "添加部门",
// 设置窗口的宽度和高度,这里分别设置为'800px'和'400px',你可以根据实际页面布局以及显示效果的需求对其尺寸进行适当调整
area: ["800px", "400px"],
// 通过选择器('#addOrUpdateWindow'获取前面HTML代码中定义好的包含添加楼层表单的DOM元素将其作为弹出窗口的内容进行展示这样用户就能在弹出窗口中看到并填写添加楼层的相关信息了
content: $("#addOrUpdateWindow"),
success: function () {
//清空表单数据
// 在窗口成功打开后的回调函数中,执行清空表单数据的操作,通过获取表单元素('#dataFrm'并调用其reset方法将表单中之前可能存在的输入内容清除掉方便用户重新填写新的楼层信息
$("#dataFrm")[0].reset();
//添加的提交请求
// 设置添加操作对应的提交请求地址通过EL表达式结合项目上下文路径动态生成具体地址指向后端用于添加楼层的接口'/floor/addFloor'),后续当用户点击提交按钮时,表单数据就会发送到这个地址对应的后端接口进行处理
url = "${pageContext.request.contextPath}/floor/addFloor";
}
});
}
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
// 监听表格行工具栏的事件,同样是通过指定'toolbar(currentTableFilter)'来监听lay-filter属性为'currentTableFilter'的表格的行工具栏事件(也就是对应表格中每行数据后面所配置的操作按钮触发的相关事件)
table.on("tool(currentTableFilter)", function (obj) {
// 根据触发事件的标识obj.event来判断执行不同的操作逻辑使用switch语句进行区分不同的按钮点击事件
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
// 当点击编辑按钮时调用openUpdateWindow函数并将当前行的数据obj.data作为参数传入该函数的作用是打开修改楼层的窗口并把当前行对应的楼层数据回显到表单中方便用户基于原数据进行修改操作
openUpdateWindow(obj.data);
break;
case "delete"://删除按钮
// 点击删除按钮时调用deleteById函数并传入当前行的数据obj.data此函数用于执行删除当前行对应楼层的相关操作比如向服务器发送删除请求等一系列后续处理
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口
* @param data 当前行的数据
* 打开修改窗口的函数,用于弹出修改楼层的窗口,展示相关表单并将对应楼层的数据回显到表单中,方便用户进行修改操作
* @param data 当前行的数据,包含了要修改的楼层的各项详细信息,这些信息会回显到表单相应的输入框等位置,便于用户直观地进行修改调整
*/
function openUpdateWindow(data) {
// 使用Layui框架的layer模块的open方法打开一个弹出层窗口并配置相应的参数与打开添加窗口的操作类似但在部分功能细节上有所不同
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
type: 1,
title: "修改部门"(此处同样可能存在错误,按照功能逻辑应改为"修改楼层"更合适),
area: ["800px", "400px"],
content: $("#addOrUpdateWindow"),
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
// 使用form模块的val方法将当前行的数据data回显到lay-filter属性为'dataFrm'的表单中也就是前面HTML代码中定义的那个表单实现把楼层原有的数据展示在表单相应位置上方便用户进行修改的功能
form.val("dataFrm", data);
// 设置修改操作对应的提交请求地址通过EL表达式结合项目上下文路径动态生成指向后端用于修改楼层的接口'/floor/updateFloor'),当用户在修改完数据点击提交按钮后,数据会发送到这个地址对应的后端接口进行相应的修改处理
url = "${pageContext.request.contextPath}/floor/updateFloor";
}
});
}
/**
* 删除部门
* @param data 当前行数据
* 删除部门的函数,用于执行删除指定楼层的相关操作,包括向服务器发送删除请求、根据服务器返回结果处理相关提示信息以及刷新页面表格等操作
* @param data 当前行数据,包含了要删除的楼层的相关关键信息,例如楼层编号等,会将这些信息作为参数传递给后端接口,以便后端准确识别要删除的楼层记录
*/
function deleteById(data) {
//提示管理员是否删除该部员工
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("${pageContext.request.contextPath}/floor/deteleFloor",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
// 使用Layui框架的layer.confirm方法弹出一个确认框提示用户是否确定要删除该楼层同时可以配置一些相关参数如设置图标icon: 3、标题title: '提示')等来让确认框显示更明确的提示信息
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端的删除接口'/floor/deteleFloor',这里可能存在拼写错误,正确的应该是'/floor/deleteFloor'需确保后端接口地址正确无误传递当前楼层的编号data.id作为参数以此向服务器发起实际的删除楼层的请求操作
$.post("${pageContext.request.contextPath}/floor/deteleFloor", {"id": data.id}, function (result) {
// 根据后端返回结果中的'success'属性来判断删除操作是否成功如果该属性值为true表示删除成功
if (result.success) {
// 若删除成功重新加载表格数据通过调用tableList变量的reload方法实现将删除楼层后的最新楼层列表数据从后端获取并重新展示在表格中让页面数据保持最新状态
tableList.reload();
}
//提示
// 使用Layui框架的layer.msg方法弹出提示信息,提示内容从服务器返回结果中的'msg'属性获取,用于告知用户删除操作最终的结果情况,是成功还是失败以及相关的原因等信息
layer.msg(result.msg);
},"json");
// 关闭确认框通过传入确认框的索引index来关闭对应的弹出层使得页面显示恢复正常避免确认框一直显示影响用户后续操作
layer.close(index);
});
}
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
// 监听lay-filter属性为'doSubmit'的表单提交事件这个事件和前面HTML代码中表单上设置的lay-filter="doSubmit"属性相关联,通常就是点击表单提交按钮时触发的事件
form.on("submit(doSubmit)", function (data) {
// 发送POST请求利用$.post方法将表单数据data.field发送到前面根据不同操作添加或修改已经设置好的目标地址url把用户在表单中填写或修改的数据传递给后端相应接口进行处理实现添加或修改楼层信息的功能
$.post(url, data.field, function (result) {
// 根据后端返回结果中的'success'属性判断操作是否成功如果该属性值为true表示操作成功
if (result.success) {
// 若操作成功重新加载表格数据调用tableList变量的reload方法使表格展示出最新的楼层列表数据以反映出添加或修改楼层后的最新情况
tableList.reload();
//关闭窗口
// 关闭弹出窗口通过传入存储的窗口索引mainIndex来关闭对应的弹出层窗口完成一次添加或修改操作后将窗口关闭保持页面整洁
layer.close(mainIndex);
}
//提示信息
// 使用Layui框架的layer.msg方法弹出提示信息,提示内容从服务器返回结果中的'msg'属性获取,告知用户操作最终的结果情况,比如成功添加、修改的提示或者失败原因等信息
layer.msg(result.msg);
},"json");
//禁止页面刷新
// 返回false用于阻止表单的默认提交行为因为是通过Ajax异步请求与后端交互不需要表单进行默认的页面刷新提交防止页面出现不必要的跳转或刷新情况
return false;
});
});

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
这段注释说明了该JSP页面的一些基本信息包括是由IntelliJ IDEA创建创建用户是“ASUS”创建时间是2022年4月16日14:05不过备注写的“部门管理”与代码实际体现的“房间管理”功能不太相符可能是最初备注有误。
Created by IntelliJ IDEA.
User: ASUS
Date: 2022/4/16
@ -10,105 +11,149 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置HTML页面的字符编码为UTF-8确保页面能正确显示各种字符包括中文等特殊字符 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题文本这里设置为“layui” -->
<title>layui</title>
<!-- 指示浏览器使用webkit内核来渲染页面webkit内核对HTML5特性、CSS样式渲染等方面表现较好 -->
<meta name="renderer" content="webkit">
<!-- 让浏览器以IE的最高版本模式或者Chrome模式来渲染页面有助于解决不同浏览器间的兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口viewport属性使页面宽度自适应设备宽度初始缩放比例和最大缩放比例都设为1方便页面在移动端适配展示 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的核心CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取此文件包含框架定义的各种样式类用于构建页面外观 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件,可用于覆盖或扩展一些通用的样式规则 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/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="typename" autocomplete="off" class="layui-input">
<!-- 这是一个自定义的、基于Layui框架风格的容器div用于包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 页面主要内容展示区域使用特定样式类layuimini-main样式效果由对应的CSS定义 -->
<div class="layuimini-main">
<%--搜索--%>
<!-- 定义一个fieldset元素用于对一组表单元素进行分组这里是将与房间信息搜索相关的元素归为一组并设置标题为“搜索信息”便于用户知晓功能 -->
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<!-- 设置内部元素的外边距使搜索区域在页面中有合适间距此处上下左右均设为10px -->
<div style="margin: 10px 10px 10px 10px">
<!-- 定义一个Layui框架的表单应用特定样式类layui-form-pane样式类可能影响表单的布局和外观风格 -->
<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">
<!-- 房间名称输入框设置name属性为“typename”用于表单提交时传递参数关闭自动完成功能并应用Layui输入框样式 -->
<input type="text" name="typename" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素容器,用于放置搜索和重置按钮,使其并排显示 -->
<div class="layui-inline">
<!-- 搜索按钮使用Layui按钮样式类通过lay-submit和lay-filter属性设置提交和过滤器标识点击触发对应逻辑用搜索图标增强表意性 -->
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<!-- 重置按钮使用Layui按钮样式类设置layui-btn-warm样式以区分外观用刷新图标表示重置功能 -->
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</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-3"></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"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</form>
</div>
</fieldset>
<%--添加按钮--%>
<!-- 定义一个script标签作为HTML模板类型为“text/html”通过id属性“toolbarDemo”方便后续引用生成按钮相关内容 -->
<script type="text/html" id="toolbarDemo">
<!-- 按钮容器div应用样式类控制按钮布局如排列方式和间距等 -->
<div class="layui-btn-container">
<!-- 添加按钮使用Layui按钮样式类并添加不同修饰类控制外观通过lay-event属性设置事件标识“add”方便后续监听点击事件执行添加逻辑用添加图标表意 -->
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<!-- 定义一个表格元素应用layui-hide样式类初始隐藏表格通过id和lay-filter属性分别设置唯一标识和过滤器标识方便后续用Layui框架操作表格目前表格内容为空后续用JavaScript渲染 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal 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>
</table>
<%--操作按钮--%>
<!-- 同样是script类型为“text/html”的模板id为“currentTableBar”用于定义表格每行数据对应的操作按钮模板 -->
<script type="text/html" id="currentTableBar">
<!-- 编辑按钮使用Layui按钮样式类并设置不同修饰类控制外观通过lay-event属性设置事件标识“edit”用于监听编辑点击事件用编辑图标表意 -->
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<!-- 删除按钮使用Layui按钮样式类并设置相应修饰类lay-event属性设为“delete”用于监听删除点击事件用删除图标表意危险样式类提示重要操作 -->
<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元素初始隐藏display: none并有一定内边距用于包裹添加和修改房间信息的表单通过id属性方便后续JavaScript操作 -->
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<!-- 定义一个Layui框架的表单设置id和lay-filter属性方便后续验证、提交等操作 -->
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 隐藏域,用于存储房间编号等信息,在表单提交时可传递给服务器,用户不可见 -->
<input type="hidden" name="id">
<!-- 表单行元素,用于组织房间编号输入项的布局 -->
<div class="layui-form-item">
<!-- 标签元素,显示“房间编号”提示文本 -->
<label class="layui-form-label">房间编号</label>
<!-- 输入框块级容器,放置房间编号输入框 -->
<div class="layui-input-block">
<!-- 房间编号输入框设为必填项关闭自动完成功能有占位提示文本应用Layui输入框样式 -->
<input type="text" name="roomid" 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">
<select name="typename">
<!-- 下拉选择框默认选项,提示用户选择房间类型,值可按需调整 -->
<option value="volvo" >请选择房间类型</option>
<%--从监听器中获取到部门名称的数据--%>
<%--使用JSTL的forEach标签循环遍历从applicationScope作用域获取的roomTypeList数据生成下拉选项选项值和显示文本设为房间类型名称 -->
<c:forEach items="${applicationScope.roomTypeList}" var="tp">
<option value="${tp.roomname}" name="roomname">${tp.roomname}</option>
</c:forEach>
</select>
</div>
</div>
<!-- 表单行元素,用于组织所属楼层下拉选择框相关内容 -->
<div class="layui-form-item">
<label class="layui-form-label">所属楼层</label>
<div class="layui-input-block">
<select name="floorname">
<!-- 所属楼层下拉选择框默认选项,提示用户选择所属楼层 -->
<option value="volvo" >请选择所属楼层</option>
<%--从监听器中获取到部门名称的数据--%>
<%--同样通过JSTL循环从applicationScope获取floorList数据生成楼层选项 -->
<c:forEach items="${applicationScope.floorList}" var="tp">
<option value="${tp.name}" name="name">${tp.name}</option>
</c:forEach>
</select>
</div>
</div>
</2>
<!-- 表单行元素,用于组织房型状态下拉选择框相关内容,且设为必填项 -->
<div class="layui-form-item">
<label class="layui-form-label">房型状态</label>
<div class="layui-input-block">
<select name="status" id="status" lay-verify="required">
<!-- 下拉选择框默认选项,提示用户选择房型状态 -->
<option value="">请选择房型状态</option>
<!-- 可预订状态选项 -->
<option value="1">可预订</option>
<!-- 有人入住中状态选项 -->
<option value="2">有人入住中</option>
<!-- 房间已满状态选项 -->
<option value="3">房间已满</option>
</select>
</div>
</div>
<!-- 表单行元素基于Layui栅格系统布局用于放置提交和重置按钮使其水平居中显示 -->
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<!-- 提交按钮使用Layui按钮样式类设置提交和过滤器属性点击触发表单提交用添加图标表意 -->
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<!-- 重置按钮使用Layui按钮样式类用刷新图标表意 -->
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
@ -116,135 +161,166 @@
</div>
</form>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table','jquery'], function () {
// 使用layui.use方法加载Layui框架的模块这里加载了'form'(表单相关操作模块)、'table'(表格相关操作模块)和'jquery'对jQuery进行了封装方便操作DOM等
layui.use(['form', 'table', 'jquery'], function () {
// 获取Layui封装后的jQuery对象后续可以使用它进行DOM操作、发起Ajax请求等遵循Layui的使用规范将其赋值给变量$
var $ = layui.jquery,
// 获取form模块实例用于后续进行表单验证、监听表单提交等各种表单相关的操作
form = layui.form,
// 获取table模块实例用于操作表格比如渲染表格、监听表格事件等
table = layui.table;
var tableList =table.render({
// 使用table模块的render方法渲染一个表格将渲染结果赋值给tableList变量方便后续对表格进行重新加载等操作
var tableList = table.render({
// 指定表格对应的DOM元素的ID通过这个IDLayui框架能找到页面中要渲染表格的位置
elem: '#currentTableId',
// 设置表格数据的请求URL这里通过EL表达式结合项目上下文路径动态指向获取房间列表数据的后端接口地址
url: '${pageContext.request.contextPath}/rooms/roomsList',
// 指定表格头部工具栏所使用的模板ID关联前面在HTML中定义的名为'toolbarDemo'的模板,该模板定义了添加按钮等头部操作按钮
toolbar: '#toolbarDemo',
// 配置默认的工具栏按钮,包含了一些常见的表格操作功能按钮,如筛选('filter')、导出('exports')、打印('print'),还自定义了一个提示按钮,设置了标题、事件标识以及图标等属性
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列信息,是一个二维数组结构,每一个子数组代表表格的一行列配置
cols: [[
{field: 'id', width: 100, title: '编号', sort: true,align: "center"},
{field: 'roomid', width: 100, title: '房间编号', sort: true,align: "center"},
{field: 'typename', width: 120, title: '房间类型',align: "center"},
{field: 'floorname', width: 100, title: '所属楼层',align: "center"},
{field: 'status', width: 100, title: '房间状态',align: "center",templet:function (d) {
return d.status == 1?"可预订":d.status==2?"<font color='red'>有人入住中</font>":"<font color='red'>房间已满</font>"
// 定义编号列设置了列宽为100像素标题为'编号'开启排序功能sort: true并且让列内容在单元格中居中显示align: "center"
{field: 'id', width: 100, title: '编号', sort: true, align: "center"},
// 房间编号列,类似编号列的配置,设置列宽、标题、排序功能以及文本居中显示
{field: 'roomid', width: 100, title: '房间编号', sort: true, align: "center"},
// 房间类型列设置列宽为120像素标题为'房间类型',文本居中显示
{field: 'typename', width: 120, title: '房间类型', align: "center"},
// 所属楼层列,设置列宽、标题以及文本居中显示
{field: 'floorname', width: 100, title: '所属楼层', align: "center"},
// 房间状态列设置列宽、标题、文本居中显示通过templet函数自定义了单元格内容的显示逻辑根据不同的状态值1、2、3显示不同的文本及样式比如状态为2或3时显示红色字体的提示信息
{field: 'status', width: 100, title: '房间状态', align: "center", templet: function (d) {
return d.status == 1? "可预订" : d.status == 2? "<font color='red'>有人入住中</font>" : "<font color='red'>房间已满</font>";
}},
// 操作列设置最小列宽为150像素关联前面定义的名为'currentTableBar'的操作按钮模板,用于生成每行数据对应的操作按钮(编辑、删除等),文本在单元格中居中显示
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作
// 监听名为'data-search-btn'的表单提交事件该事件对应前面HTML中搜索按钮点击后触发表单提交的操作
form.on('submit(data-search-btn)', function (data) {
// 当搜索按钮被点击触发提交事件后调用表格的reload方法重新加载表格数据传入搜索表单中用户输入的字段数据data.field作为查询条件实现根据用户输入进行搜索并更新表格显示内容的功能
tableList.reload({
data:data.field,
data: data.field,
});
// 返回false阻止表单的默认提交行为因为这里是通过Ajax异步请求数据来更新表格不需要页面进行刷新操作
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
// 监听表格头部工具栏的事件,其中'toolbar(currentTableFilter)'表示监听的是id为'currentTableId'且lay-filter属性为'currentTableFilter'的表格的头部工具栏事件
table.on("toolbar(currentTableFilter)", function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
// 当点击头部工具栏中的添加按钮根据前面定义的lay-event="add"判断调用openAddWindow函数打开添加房间的窗口
openAddWindow();
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
// 声明两个变量url用于存储后续表单提交的请求地址会根据不同操作添加、修改等动态赋值mainIndex用于记录打开窗口的索引方便后续关闭窗口操作
var url;
var mainIndex;
/**
* 打开添加窗口
* 打开添加窗口的函数通过Layui的layer模块弹出一个添加房间的窗口并进行相关的初始化操作
*/
function openAddWindow() {
mainIndex = layer.open({
type: 1,//打开类型
title: "添加房间",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
// 设置窗口的打开类型为1表示以内容填充的方式打开一个普通的弹出层窗口
type: 1,
// 设置窗口的标题为"添加房间",显示在窗口顶部,让用户知道当前窗口的功能
title: "添加房间",
// 设置窗口的宽高这里宽为800px高为400px以合适的尺寸展示添加房间的表单内容
area: ["800px", "400px"],
// 将前面HTML中定义的id为'addOrUpdateWindow'的添加和修改窗口内容填充到弹出的窗口中,作为窗口的主体内容
content: $("#addOrUpdateWindow"),
success: function () {
//清空表单数据
// 在窗口打开成功后调用表单的reset方法清空表单数据,方便用户输入新的房间信息
$("#dataFrm")[0].reset();
//添加的提交请求
// 设置添加操作的提交请求地址通过EL表达式结合项目上下文路径指向后端添加房间的接口地址
url = "${pageContext.request.contextPath}/rooms/addRoom";
}
});
}
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
// 监听表格行工具栏的事件用于处理每行数据对应的操作按钮编辑、删除等点击事件同样基于表格的lay-filter属性为'currentTableFilter'来监听
table.on("tool(currentTableFilter)", function (obj) {
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
// 当点击行工具栏中的编辑按钮根据lay-event="edit"判断调用openUpdateWindow函数并传入当前行的数据obj.data用于打开修改房间的窗口并回显当前行的数据到表单中
openUpdateWindow(obj.data);
break;
case "delete"://删除按钮
// 当点击行工具栏中的删除按钮根据lay-event="delete"判断调用deleteById函数并传入当前行的数据obj.data执行删除当前行对应房间数据的操作
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口
* @param data 当前行的数据
* 打开修改窗口的函数通过Layui的layer模块弹出一个修改房间的窗口并根据传入的当前行数据进行表单回显以及设置修改操作的提交请求地址等操作
* @param data 当前行的数据,包含了要修改的房间各项信息,如房间编号、类型、所属楼层、状态等
*/
function openUpdateWindow(data) {
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
type: 1,
// 这里窗口标题设置为"修改部门",可能存在错误,按照功能逻辑应该是"修改房间",用于显示在窗口顶部,提示用户当前窗口是用于修改房间信息的
title: "修改部门",
area: ["800px", "400px"],
content: $("#addOrUpdateWindow"),
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
// 使用form模块的val方法将传入的当前行数据data回显到id为'dataFrm'且lay-filter属性为'dataFrm'的表单中,实现将已有房间信息显示在表单中方便用户修改的功能
form.val("dataFrm", data);
// 设置修改操作的提交请求地址通过EL表达式结合项目上下文路径指向后端修改房间的接口地址
url = "${pageContext.request.contextPath}/rooms/updateRoom";
}
});
}
/**
* 删除部门
* @param data 当前行数据
* 删除部门此处名称不太准确按照整体功能逻辑应该是“删除房间”的函数用于向用户确认是否删除当前行对应房间数据并根据用户确认结果发送Ajax请求到后端执行删除操作同时处理删除成功后的相关提示以及表格刷新等操作
* @param data 当前行数据,包含了要删除的房间的唯一标识等信息,通过其中的'id'属性来确定要删除的具体房间记录
*/
function deleteById(data) {
//提示管理员是否删除该部员工
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("${pageContext.request.contextPath}/rooms/deleteRoom",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
// 使用Layui的layer模块弹出一个确认框向管理员提示是否确定要删除该房间数据设置了提示框的图标icon: 3为一个询问图标标题为'提示',用户点击确认或取消按钮后会执行对应的回调函数
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 当用户在确认框中点击确认按钮后使用jQuery的$.post方法发送一个Ajax POST请求到后端删除房间的接口传递当前房间的唯一标识data.id作为参数请求成功后会执行回调函数处理返回结果
$.post("${pageContext.request.contextPath}/rooms/deleteRoom", {"id": data.id}, function (result) {
if (result.success) {
// 如果后端返回的结果中success属性为true表示删除操作成功调用表格的reload方法重新加载表格数据刷新页面上显示的房间列表信息
tableList.reload();
}
//提示
// 使用Layui的layer模块弹出一个提示显示后端返回的提示信息result.msg告知用户操作结果如删除成功或失败的原因等
layer.msg(result.msg);
},"json");
}, "json");
// 关闭前面弹出的确认框传入确认框的索引index确保操作完成后界面显示整洁
layer.close(index);
});
}
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
// 监听表单提交事件该事件对应前面HTML中添加或修改窗口里的提交按钮点击后触发表单提交的操作
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果后端返回的结果中success属性为true表示提交操作添加或修改房间信息成功调用表格的reload方法重新加载表格数据刷新页面上显示的房间列表信息
tableList.reload();
//关闭窗口
// 使用Layui的layer模块关闭之前打开的添加或修改窗口传入窗口的索引mainIndex确保操作完成后界面显示整洁
layer.close(mainIndex);
}
//提示信息
// 使用Layui的layer模块弹出一个提示框显示后端返回的提示信息result.msg告知用户操作结果如添加或修改成功或失败的原因等
layer.msg(result.msg);
},"json");
//禁止页面刷新
}, "json");
// 返回false阻止表单的默认提交行为因为这里是通过Ajax异步请求数据来更新表格和处理业务逻辑不需要页面进行刷新操作
return false;
});
});

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
这段注释说明了该JSP页面的一些基本信息比如是由IntelliJ IDEA创建创建用户是“ASUS”创建时间是2022年4月16日14:05不过备注写的“部门管理”与代码实际体现的“房型管理”功能不太相符可能最初备注有误。
Created by IntelliJ IDEA.
User: ASUS
Date: 2022/4/16
@ -10,99 +11,155 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置HTML页面的字符编码为UTF-8确保页面能正确显示各种字符例如中文等特殊字符 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题文本这里设置为“layui” -->
<title>layui</title>
<!-- 指示浏览器使用webkit内核来渲染页面webkit内核对HTML5特性、CSS样式渲染等方面表现较好 -->
<meta name="renderer" content="webkit">
<!-- 让浏览器以IE的最高版本模式或者Chrome模式来渲染页面有助于解决不同浏览器间的兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口viewport属性使页面宽度自适应设备宽度初始缩放比例和最大缩放比例都设为1方便页面在移动端适配展示 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的核心CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取此文件包含框架定义的各种样式类用于构建页面外观 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件,可用于覆盖或扩展一些通用的样式规则 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/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="username" autocomplete="off" class="layui-input">
<!-- 这是一个自定义的、基于Layui框架风格的容器div用于包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 页面主要内容展示区域使用特定样式类layuimini-main样式效果由对应的CSS定义 -->
<div class="layuimini-main">
<%--搜索--%>
<!-- 定义一个fieldset元素用于对一组表单元素进行分组这里是将与房型信息搜索相关的元素归为一组并设置标题为“搜索信息”便于用户知晓功能 -->
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<!-- 设置内部元素的外边距使搜索区域在页面中有合适间距此处上下左右均设为10px -->
<div style="margin: 10px 10px 10px 10px">
<!-- 定义一个Layui框架的表单应用特定样式类layui-form-pane样式类可能影响表单的布局和外观风格 -->
<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">
<!-- 房型名称输入框设置name属性为“username”这里可能命名不太准确按功能逻辑应该是“roomtypename”之类更合适不过以当前代码为准进行注释用于表单提交时传递参数关闭自动完成功能并应用Layui输入框样式 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 另一个内联元素容器,用于放置搜索和重置按钮,使其并排显示 -->
<div class="layui-inline">
<!-- 搜索按钮使用Layui按钮样式类通过lay-submit和lay-filter属性设置提交和过滤器标识点击触发对应逻辑用搜索图标增强表意性 -->
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<!-- 重置按钮使用Layui按钮样式类设置layui-btn-warm样式以区分外观用刷新图标表示重置功能 -->
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</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-3"></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"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</form>
</div>
</fieldset>
<%--添加按钮--%>
<!-- 定义一个script标签作为HTML模板类型为“text/html”通过id属性“toolbarDemo”方便后续引用生成按钮相关内容 -->
<script type="text/html" id="toolbarDemo">
<!-- 按钮容器div应用样式类控制按钮布局如排列方式和间距等 -->
<div class="layui-btn-container">
<!-- 添加按钮使用Layui按钮样式类并添加不同修饰类控制外观通过lay-event属性设置事件标识“add”方便后续监听点击事件执行添加逻辑用添加图标表意 -->
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
</div>
</script>
<%--表格内容显示区域--%>
<!-- 定义一个表格元素应用layui-hide样式类初始隐藏表格通过id和lay-filter属性分别设置唯一标识和过滤器标识方便后续用Layui框架操作表格目前表格内容为空后续用JavaScript代码来进行渲染 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal 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>
</table>
<%--操作按钮--%>
<!-- 同样是script类型为“text/html”的模板id为“currentTableBar”用于定义表格每行数据对应的操作按钮模板 -->
<script type="text/html" id="currentTableBar">
<!-- 编辑按钮使用Layui按钮样式类并设置不同修饰类控制外观通过lay-event属性设置事件标识“edit”用于监听编辑点击事件用编辑图标表意 -->
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<!-- 删除按钮使用Layui按钮样式类并设置相应修饰类lay-event属性设为“delete”用于监听删除点击事件用删除图标表意危险样式类提示重要操作 -->
<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元素初始隐藏display: none并有一定内边距用于包裹添加和修改房型信息的表单通过id属性方便后续JavaScript操作 -->
<div style="display: none;padding: 5px" id="addOrUpdateWindow">
<!-- 定义一个Layui框架的表单设置id和lay-filter属性方便后续验证、提交等操作 -->
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 隐藏域,保存房型id -->
<!-- 隐藏域,用于存储房型的唯一标识id在表单提交时可传递给服务器用户不可见常用于后续修改等操作中确定具体要操作的房型记录 -->
<input type="hidden" name="id">
<!-- 使用Layui的栅格系统相关样式类这里设置为占12列layui-col-md12 layui-col-xs12表示在不同屏幕尺寸下都占满一行用于整体布局 -->
<div class="layui-col-md12 layui-col-xs12">
<!-- 创建一个行元素并设置元素之间的间距为10pxlayui-row layui-col-space10用于对内部表单元素进行更细致的布局排列 -->
<div class="layui-row layui-col-space10">
<!-- 定义一个占9列在中等屏幕尺寸下或7列在小屏幕尺寸下的列容器用于放置房型名称等相关表单元素 -->
<div class="layui-col-md9 layui-col-xs7">
<!-- 这是一个表单行元素设置了一定的上边距通过自定义样式类magt3实现此处设置上边距为8px可能是为了与其他元素拉开距离使布局更美观用于组织房型名称输入项的布局 -->
<div class="layui-form-item magt3" style="margin-top: 8px;">
<!-- 标签元素,显示“房型名称”提示文本 -->
<label class="layui-form-label">房型名称</label>
<!-- 输入框块级容器,放置房型名称输入框 -->
<div class="layui-input-block">
<!-- 房型名称输入框设置为必填项lay-verify="required"应用Layui输入框样式设置了占位提示文本方便用户知道此处应输入房型名称 -->
<input type="text" class="layui-input" name="roomname" lay-verify="required" placeholder="请输入房型名称">
</div>
</div>
<!-- 这是一个表单行元素设置了底部外边距为0magb0可能是为了控制与下方元素的间距用于组织参考价格、可住人数、床位数、房间数等多个输入项在一行内的布局 -->
<div class="layui-form-item magb0">
<!-- 内联元素容器,用于放置参考价格相关的标签和输入框,使其在一行内显示 -->
<div class="layui-inline">
<!-- 标签元素,显示“参考价格”提示文本,告知用户对应输入框用途 -->
<label class="layui-form-label">参考价格</label>
<!-- 内联输入框容器,实际放置参考价格输入框 -->
<div class="layui-input-inline">
<!-- 参考价格输入框设置为必填项且必须输入数字lay-verify="required|number"应用Layui输入框样式设置了占位提示文本提示用户输入参考价格信息 -->
<input type="text" class="layui-input" name="price" lay-verify="required|number"
placeholder="请输入参考价格">
</div>
</div>
<!-- 内联元素容器,用于放置可住人数相关的标签和输入框 -->
<div class="layui-inline">
<!-- 标签元素,显示“可住人数”提示文本 -->
<label class="layui-form-label">可住人数</label>
<!-- 内联输入框容器,放置可住人数输入框 -->
<div class="layui-input-inline">
<!-- 可住人数输入框同样设置为必填项且必须输入数字应用Layui输入框样式并设置占位提示文本 -->
<input type="text" class="layui-input" name="livenum" lay-verify="required|number"
placeholder="请输入可住人数">
</div>
</div>
<!-- 内联元素容器,用于放置床位数相关的标签和输入框 -->
<div class="layui-inline">
<!-- 标签元素,显示“床位数”提示文本 -->
<label class="layui-form-label">床位数</label>
<!-- 内联输入框容器,放置床位数输入框 -->
<div class="layui-input-inline">
<!-- 床位数输入框,设置必填且必须为数字,应用样式并设置占位提示 -->
<input type="text" class="layui-input" name="bednum" lay-verify="required|number" placeholder="请输入床位数">
</div>
</div>
<!-- 内联元素容器,用于放置房间数相关的标签和输入框 -->
<div class="layui-inline">
<!-- 标签元素,显示“房间数”提示文本 -->
<label class="layui-form-label">房间数</label>
<!-- 内联输入框容器,放置房间数输入框 -->
<div class="layui-input-inline">
<!-- 房间数输入框,设置必填且必须为数字,应用样式并设置占位提示 -->
<input type="text" class="layui-input" name="roomnum" lay-verify="required|number"
placeholder="请输入房间数">
</div>
</div>
</div>
<!-- 这是一个表单行元素,用于组织房型状态下拉选择框相关内容 -->
<div class="layui-form-item">
<!-- 标签元素,显示“房型状态”提示文本 -->
<label class="layui-form-label">房型状态</label>
<!-- 输入框块级容器,放置房型状态下拉选择框 -->
<div class="layui-input-block">
<!-- 房型状态下拉选择框设置为必填项lay-verify="required"),通过<option>标签定义了可选的状态值及对应的显示文本,初始有一个空选项提示用户选择房型状态,后续有“可预订”“房型已满”等具体状态选项 -->
<select name="status" id="status" lay-verify="required">
<option value="">请选择房型状态</option>
<option value="1">可预订</option>
@ -110,19 +167,26 @@
</select>
</div>
</div>
<!-- 这是一个表单行元素,用于组织房型备注的文本域相关内容 -->
<div class="layui-form-item">
<!-- 标签元素,显示“房型备注”提示文本 -->
<label class="layui-form-label">房型备注</label>
<!-- 输入框块级容器,放置房型备注的文本域 -->
<div class="layui-input-block">
<!-- 定义一个文本域textarea应用Layui的文本域样式类layui-textarea通过name属性设置传递给服务器端的参数名用户可在此处输入关于房型的备注信息 -->
<textarea class="layui-textarea" name="remark" id="remark"></textarea>
</div>
</div>
</div>
</div>
<!-- 这是一个表单行元素,用于放置提交和重置按钮,并设置文本在块内居中显示,使按钮在页面上能水平居中展示 -->
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;">
<!-- 提交按钮使用Layui按钮样式类通过lay-submit和lay-filter属性设置提交和过滤器功能此处过滤器为"doSubmit"对应后续JavaScript中监听此按钮提交事件的标识点击触发表单提交用添加图标表意同时设置了id属性不过在同一页面中id最好保持唯一性此处可能存在重复风险可根据实际情况调整 -->
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit" id="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<!-- 重置按钮使用Layui按钮样式类用刷新图标表意 -->
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
@ -131,163 +195,228 @@
</div>
</form>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table', 'laydate', 'jquery', 'layer','upload'], function () {
// 使用Layui框架的use方法来加载多个模块这些模块将在后续的回调函数中被使用以实现各种页面交互功能。
// 这里加载了'form'(用于表单操作与验证)、'table'(用于表格渲染与交互)、'laydate'(用于日期选择相关功能,虽然此处可能暂未体现具体使用场景,但预留了该功能模块)、
// 'jquery'Layui对jQuery进行了封装方便进行DOM操作、发送Ajax请求等、'layer'(用于弹出层展示,如提示框、确认框、模态窗口等)、'upload'(用于文件上传相关操作)模块。
layui.use(['form', 'table', 'laydate', 'jquery', 'layer', 'upload'], function () {
// 获取经过Layui封装后的jQuery对象后续可以通过这个对象使用jQuery的各种方法例如选择DOM元素、操作元素属性、绑定事件等遵循Layui框架中使用jQuery的规范方式。
var $ = layui.jquery,
// 获取Layui框架中的form模块实例有了这个实例就能方便地进行表单相关的操作比如设置表单验证规则、监听表单的提交、重置等事件实现表单数据的有效处理和验证。
form = layui.form,
// 获取Layui框架中的laydate模块实例虽然在当前展示的代码片段中暂时没有看到对其具体的使用但它可以用于在页面中创建日期选择器方便用户选择日期类型的数据为后续扩展功能提供了可能。
laydate = layui.laydate,
// 获取Layui框架中的upload模块实例这个实例将用于配置文件上传的相关参数比如指定上传的文件类型、上传的目标地址、处理上传成功或失败后的回调逻辑等实现文件上传功能。
upload = layui.upload,
// 获取Layui框架中的layer模块实例借助这个实例可以在页面上弹出各种提示框、确认框以及模态窗口等用于向用户展示信息、获取用户的操作反馈增强页面的交互性。
layer = layui.layer,
// 获取Layui框架中的table模块实例通过这个实例能够方便地进行表格的渲染以及对表格各种事件的监听例如表格头部工具栏事件、行操作按钮事件等从而实现表格数据的展示以及与用户的交互操作。
table = layui.table;
var tableList =table.render({
// 使用table模块的render方法来渲染一个表格该方法接收一个配置对象作为参数用于定义表格的各种属性和样式渲染后的表格对象被赋值给变量tableList方便后续对这个表格进行其他操作比如重新加载数据等。
var tableList = table.render({
// 通过elem属性指定表格对应的DOM元素的IDLayui框架会根据这个ID去页面中查找对应的HTML元素通常是一个<table>标签),然后在找到的元素位置上进行表格的渲染操作,将数据展示在表格中。
elem: '#currentTableId',
// 设置表格数据的请求URL地址这里使用了EL表达式Expression Language结合项目的上下文路径动态地指向了获取房型列表数据的后端接口地址意味着表格会从后端这个接口获取数据并展示在页面的表格中。
url: '${pageContext.request.contextPath}/roomtype/roomTypeList',
// 通过toolbar属性指定表格头部工具栏所使用的模板ID这个ID关联着在HTML页面中定义的名为'toolbarDemo'的script模板通常是一个<script type="text/html">标签内定义的内容该模板中定义了如添加按钮等头部操作按钮的HTML结构用于在表格头部展示相应的操作按钮。
toolbar: '#toolbarDemo',
// 配置默认的工具栏按钮它是一个数组形式其中包含了一些Layui框架内置的常见表格操作功能按钮例如'filter'(用于实现表格数据的筛选功能)、'exports'用于将表格数据导出比如导出为Excel文件等、'print'(用于打印表格内容)。
// 同时还自定义了一个提示按钮通过一个对象的形式配置了该按钮的相关属性包括设置标题title为'提示'定义其触发的事件标识layEvent为'LAYTABLE_TIPS'以及对应的图标icon为'layui-icon-tips',这样在表格工具栏上就可以提供更多的交互功能和提示信息了。
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列信息,采用的是二维数组的结构形式。外层数组中的每一个子数组代表表格的一行列配置,而每个子数组内部的对象则用于详细定义每一列的各种属性,例如列对应的字段名称、列的宽度、列的标题、是否可排序以及列内容在单元格中的对齐方式等。
cols: [[
{field: 'id', width: 60, title: '房型编号', sort: true,align: "center"},
{field: 'roomname', width: 120, title: '房型名称',align: "center"},
{field: 'price', width: 100, title: '参考价格',align: "center"},
{field: 'livenum', width: 100, title: '可入住人数',align: "center"},
{field: 'bednum', width: 100, title: '床位数',align: "center"},
{field: 'roomnum', width: 100, title: '房间数量',align: "center"},
{field: 'reservednum', width: 100, title: '已预订数量',align: "center"},
{field: 'avilablenum', width: 100, title: '可住房间数',align: "center"},
{field: 'livednum', width: 100, title: '已入住数量',align: "center"},
{field: 'status', width: 100, title: '房间状态',align: "center",templet:function (d) {
return d.status == 1?"可预订":"<font color='red'>房间已满</font>"
// 定义房型编号列,以下是对该列各项属性的详细说明:
// - field属性指定了该列对应的数据字段名称为'id',表示从后端获取的数据中,这个字段的值将会填充到该列进行显示,方便将数据与表格列进行对应展示。
// - width属性将列宽设置为60像素用于控制该列在整个表格中的显示宽度使表格布局更加合理美观。
// - title属性设置列标题为'房型编号',这个标题会显示在表头位置,让用户清楚地知道这一列数据所代表的含义,便于查看和理解表格内容。
// - sort属性设置为true表示开启该列的排序功能用户可以通过点击表头来对这一列的数据按照一定规则比如升序或降序进行排序操作方便查看和查找特定顺序的数据。
// - align属性设置为"center",使该列的内容在单元格中居中显示,增强表格整体的美观性和可读性,让数据展示更加整齐规范。
{field: 'id', width: 60, title: '房型编号', sort: true, align: "center"},
// 房型名称列,按照表格列配置的规范要求,设置了合适的列宽、标题以及文本居中显示的属性,用于清晰地展示各房型的名称信息,让用户在查看表格时能够直观地获取到每个房型的具体名称。
{field: 'roomname', width: 120, title: '房型名称', align: "center"},
// 参考价格列,同样设置了列宽、标题以及文本居中显示等属性,用于展示各房型对应的参考价格情况,方便用户在对比不同房型时能够快速了解它们的价格差异。
{field: 'price', width: 100, title: '参考价格', align: "center"},
// 可入住人数列,配置了列宽、标题以及文本居中显示的属性,其作用是展示各房型能够容纳的入住人数信息,让用户知晓每个房型可以入住多少人,为选择房型提供参考依据。
{field: 'livenum', width: 100, title: '可入住人数', align: "center"},
// 床位数列,通过设置列宽、标题以及文本居中显示的属性,用于在表格中展示各房型所包含的床位数信息,进一步完善房型相关数据在表格中的展示内容。
{field: 'bednum', width: 100, title: '床位数', align: "center"},
// 房间数量列,设置了相应的列宽、标题以及文本居中显示属性,用于呈现各房型对应的房间数量情况,使用户可以了解每个房型所涵盖的房间数量规模。
{field: 'roomnum', width: 100, title: '房间数量', align: "center"},
// 已预订数量列,同样设置了合适的属性,用于展示各房型已经被预订的房间数量情况,方便用户在查看表格时能够快速知晓每个房型目前的预订状态和预订数量。
{field: 'reservednum', width: 100, title: '已预订数量', align: "center"},
// 可住房间数列,配置了相应的属性,其目的是展示各房型当前还能够入住的房间数量信息,反映出每个房型在当前时刻剩余的可利用房间资源情况,辅助用户做出相关决策。
{field: 'avilablenum', width: 100, title: '可住房间数', align: "center"},
// 已入住数量列,设置了相应的属性来展示各房型已经入住的房间数量情况,使用户可以直观地了解每个房型目前的实际使用状态,即有多少房间已经被客人入住了。
{field: 'livednum', width: 100, title: '已入住数量', align: "center"},
// 房间状态列除了常规的设置列宽、标题、文本居中显示这些属性外还通过templet函数来自定义了单元格内容的显示逻辑。
// 具体来说根据从后端获取的数据中该房型的状态值通过参数d获取当前行的数据对象如果状态值等于1就返回"可预订"文本;否则返回带有红色字体的"<font color='red'>房间已满</font>"文本,这样可以非常直观地向用户展示房型不同的状态信息,方便用户快速判断房型是否可预订等情况。
{field: 'status', width: 100, title: '房间状态', align: "center", templet: function (d) {
return d.status == 1? "可预订" : "<font color='red'>房间已满</font>";
}},
{field: 'remark', title: '备注', minWidth: 50,align: "center"},
// 备注列,设置了标题、最小列宽以及文本居中显示的属性,用于展示各房型的一些补充说明信息,例如特殊的房型规定、设施情况等备注内容,让用户可以获取到更多关于房型的详细信息。
{field: 'remark', title: '备注', minWidth: 50, align: "center"},
// 操作列设置了最小列宽为150像素通过toolbar属性关联前面定义的名为'currentTableBar'的操作按钮模板通常也是在HTML页面中通过<script type="text/html">标签定义的内容里面包含了编辑、删除等操作按钮的HTML结构用于根据每行数据生成对应的操作按钮比如编辑按钮、删除按钮等并且让这些操作按钮在单元格中居中显示方便用户对每一行的数据进行相应的操作增强表格的交互性。
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
tableList.reload({
data:data.field,
});
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
// 以下是后续可能继续添加的其他功能相关代码,比如监听表单提交、表格工具栏事件、行操作事件等,目前代码只展示到了表格渲染部分,但整体结构应该是围绕这个表格展开更多交互功能实现的,后续部分可以继续按需求完善注释内容哦。
/**
* 打开添加窗口
*/
function openAddWindow() {
mainIndex = layer.open({
type: 1,//打开类型
title: "添加房型",//窗口标题
area: ["800px", "500px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/roomtype/addRoomType";
}
});
}
//监听行工具栏事件
table.on("tool(currentTableFilter)",function (obj) {
switch (obj.event) {
case "edit"://编辑按钮
openUpdateWindow(obj.data);//打开修改窗口
break;
case "delete"://删除按钮
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口
* @param data 当前行的数据
*/
function openUpdateWindow(data) {
mainIndex = layer.open({
type: 1,//打开类型
title: "修改部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/roomtype/updateRoomType";
}
});
}
/**
* 删除部门
* @param data 当前行数据
*/
function deleteById(data) {
//提示管理员是否删除该部员工
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){
//发送ajax请求进行删除
$.post("${pageContext.request.contextPath}/roomtype/deleteRoomType",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
tableList.reload();
}
//提示
layer.msg(result.msg);
},"json");
layer.close(index);
});
}
//渲染文件上传区域
upload.render({
elem:".thumbImg",//绑定元素
url: '${pageContext.request.contextPath}/roomtype/uploadFile',//文件上传地址
acceptMime: 'image/*',//规定打开文件选择框时,筛选出的文件类型
field: 'file',//文件上传的字段值等同于input标签的name属性值该值必须与控制器中的方法参数名一致
method: "post",//提交方式
//文件上传成功后的回调函数
done: function (res, index, upload) {
//设置图片回显路径
$(".thumbImg").attr("src",res.data.src);
$('.thumbBox').css("background", "#fff");
//给图片隐藏域赋值
$("#photo").val(res.imagePath);
}
});
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function(result){
if(result.success){
//刷新数据表格
tableList.reload();
//关闭窗口
layer.close(mainIndex);
}
//提示信息
layer.msg(result.msg);
},"json");
//禁止页面刷新
return false;
});
});
</script>
})
<!-- 在Layui框架加载完指定模块后执行的回调函数内部 -->
<script>
// 监听名为'data-search-btn'的表单提交事件这个事件通常与HTML页面中某个带有lay-submit和lay-filter="data-search-btn"属性的表单提交操作相关联。
// 例如,可能是页面上的搜索表单,当用户点击搜索按钮触发表单提交时,就会触发这个监听事件。
form.on('submit(data-search-btn)', function (data) {
// 当搜索表单提交被触发后调用之前通过table.render方法渲染得到的表格对象tableList的reload方法用于重新加载表格数据。
// 这里将搜索表单中用户输入的字段数据通过data.field获取它包含了用户在表单各个输入框中填写的值作为查询条件传递给后端接口实现根据用户输入的搜索条件进行数据查询并更新表格显示内容的功能使得表格展示的内容符合用户的搜索要求。
tableList.reload({
data: data.field,
});
// 返回false目的是阻止表单的默认提交行为因为这里是通过Ajax异步请求数据来更新表格内容不需要页面进行刷新操作如果不阻止默认提交行为页面可能会出现不必要的刷新影响用户体验。
return false;
});
// 监听表格头部工具栏的事件,其中'toolbar(currentTableFilter)'表示监听的是id为'currentTableId'且lay-filter属性为'currentTableFilter'的表格的头部工具栏事件。
// 当用户在表格头部工具栏中点击按钮等操作发生时就会触发这个监听事件执行对应的回调函数并传入相关的事件对象obj事件对象中包含了如点击的按钮对应的事件标识等详细信息用于判断具体执行何种逻辑。
table.on("toolbar(currentTableFilter)", function (obj) {
switch (obj.event) {
case "add"://添加按钮
// 当点击头部工具栏中的添加按钮时根据按钮设置的lay-event="add"属性来判断点击的是添加按钮该属性通常在HTML中定义按钮时添加调用openAddWindow函数该函数的作用是打开添加房型的窗口以便用户输入新房型的相关信息进行添加操作。
openAddWindow();
break;
}
});
// 声明两个变量url变量用于存储后续表单提交的请求地址它会根据不同的操作如添加、修改等操作动态地进行赋值指向对应的后端接口地址确保表单数据能准确提交到相应的业务处理接口实现不同功能对应的后端数据交互。
// mainIndex变量用于记录打开窗口的索引在Layui框架中通过layer模块打开的弹出层窗口等都有对应的索引值通过记录这个索引方便后续对打开的窗口进行关闭等操作实现窗口的有效管理避免窗口残留等问题影响页面显示和用户操作。
var url;
var mainIndex;
/**
* 打开添加窗口的函数通过Layui框架的layer模块弹出一个添加房型的窗口并在窗口打开后进行一些相关的初始化操作比如清空表单数据、设置提交请求地址等为用户添加新房型信息做好准备。
*/
function openAddWindow() {
mainIndex = layer.open({
// 设置窗口的打开类型为1表示以内容填充的方式打开一个普通的弹出层窗口也就是将指定的HTML内容填充到弹出的窗口内进行展示常用于展示表单、详情信息等内容此处就是将添加房型的表单内容填充进去供用户操作。
type: 1,
// 设置窗口的标题为"添加房型",这个标题会显示在弹出窗口的顶部,清晰地告知用户当前窗口的功能是用于添加房型信息,方便用户操作和理解,使用户明确知晓当前操作目的。
title: "添加房型",
// 设置窗口的宽高这里指定宽为800px高为500px以合适的尺寸展示添加房型的表单内容既不会使窗口过大占据过多屏幕空间导致显示不协调也不会过小使得表单元素显示拥挤难以查看和填写方便用户查看和填写表单信息。
area: ["800px", "500px"],
// 将前面HTML中定义的id为'addOrUpdateWindow'的添加和修改窗口内容填充到弹出的窗口中作为窗口的主体内容这个HTML内容包含了添加房型所需的各种表单元素如房型名称、参考价格、可入住人数等输入框和选择框等构成完整的添加房型信息表单。
content: $("#addOrUpdateWindow"),
success: function () {
// 在窗口打开成功后,调用表单(通过选择器'#dataFrm'获取到的表单对象对应前面HTML中定义的添加和修改房型信息的表单的reset方法清空表单数据这样每次打开添加窗口时表单都是空白的方便用户输入新的房型信息避免上次填写的数据残留影响本次操作保证每次添加操作都是基于全新的初始状态。
$("#dataFrm")[0].reset();
// 设置添加操作的提交请求地址通过EL表达式结合项目上下文路径指向后端添加房型的接口地址确保用户在填写完房型信息并点击提交按钮后表单数据能准确发送到后端相应的接口进行处理实现添加房型的业务逻辑与后端进行正确的数据交互。
url = "${pageContext.request.contextPath}/roomtype/addRoomType";
}
});
}
// 监听表格行工具栏的事件用于处理每行数据对应的操作按钮编辑、删除等点击事件同样是基于表格的lay-filter属性为'currentTableFilter'来监听相应的操作按钮点击情况,当点击行内的操作按钮时,就会触发这个监听事件并执行对应的回调函数,以执行不同的操作逻辑。
table.on("tool(currentTableFilter)", function (obj) {
switch (obj.event) {
case "edit"://编辑按钮
// 当点击行工具栏中的编辑按钮时根据按钮设置的lay-event="edit"属性来判断调用openUpdateWindow函数并传入当前行的数据obj.data包含了当前行对应房型的所有信息例如房型编号、名称、各种数量及状态等用于打开修改房型的窗口并将当前房型的信息回显到表单中方便用户基于已有信息进行修改操作减少用户手动输入已有信息的工作量提高操作效率和准确性。
openUpdateWindow(obj.data);
break;
case "delete"://删除按钮
// 当点击行工具栏中的删除按钮时根据lay-event="delete"属性来判断调用deleteById函数并传入当前行的数据obj.data该函数的作用是执行删除当前行对应房型数据的操作会向用户确认是否删除并根据确认结果发送Ajax请求到后端执行实际的删除逻辑完成从数据库等后端存储中移除对应房型记录的操作。
deleteById(obj.data);
break;
}
});
/**
* 打开修改窗口的函数通过Layui的layer模块弹出一个修改房型的窗口并根据传入的当前行数据进行表单回显以及设置修改操作的提交请求地址等操作以便用户能方便地修改房型信息并提交到后端进行更新确保数据的准确性和业务流程的完整性。
* @param data 当前行的数据,它是一个包含了要修改的房型各项信息的对象,例如房型编号、名称、价格、可入住人数等属性,通过这个数据对象可以将已有房型信息准确地回显到表单中供用户修改,方便用户快速定位和修改需要变动的内容。
*/
function openUpdateWindow(data) {
mainIndex = layer.open({
type: 1,
// 这里窗口标题设置为"修改部门",可能存在错误,按照整体功能逻辑应该是"修改房型",该标题会显示在窗口顶部,用于提示用户当前窗口是用于修改房型信息的,不过此处的文本错误可能会对用户理解造成一定干扰,后续可以进行修正,使其表意更准确,符合实际操作功能。
title: "修改部门",
area: ["800px", "400px"],
content: $("#addOrUpdateWindow"),
success: function () {
// 使用form模块的val方法将传入的当前行数据data回显到id为'dataFrm'且lay-filter属性为'dataFrm'的表单中该方法会根据数据对象中的属性名和表单元素的name属性进行匹配将对应的值填充到表单元素中实现将已有房型信息准确显示在表单里方便用户修改相应的内容例如将房型编号显示在对应的输入框中用户只需修改想要变动的部分即可。
form.val("dataFrm", data);
// 设置修改操作的提交请求地址通过EL表达式结合项目上下文路径指向后端修改房型的接口地址保证用户修改完房型信息点击提交后数据能发送到正确的后端接口进行数据更新处理完成修改房型的业务流程使后端能正确接收并处理修改后的数据。
url = "${pageContext.request.contextPath}/roomtype/updateRoomType";
}
});
}
/**
* 删除部门此处名称不太准确按照整体功能逻辑应该是“删除房型”的函数用于向用户确认是否删除当前行对应房型数据并根据用户确认结果发送Ajax请求到后端执行删除操作同时处理删除成功后的相关提示以及表格刷新等操作保证页面数据的一致性以及及时向用户反馈操作结果。
* @param data 当前行数据,它是一个包含了要删除的房型的唯一标识等信息的对象,通过其中的'id'属性来确定要删除的具体房型记录,确保删除操作能精准地针对指定房型进行,避免误删其他数据。
*/
function deleteById(data) {
// 使用Layui的layer模块弹出一个确认框向管理员提示是否确定要删除该房型数据设置了提示框的图标icon: 3为一个询问图标给用户一种询问确认的视觉提示标题为'提示',明确告知用户这是一个操作确认提示框,用户点击确认或取消按钮后会分别执行对应的回调函数,以根据用户选择进行相应操作。
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 当用户在确认框中点击确认按钮后使用jQuery的$.post方法发送一个Ajax POST请求到后端删除房型的接口传递当前房型的唯一标识data.id从传入的当前行数据对象中获取房型的唯一标识作为参数确保后端能准确知道要删除哪条房型记录实现精准删除操作请求成功后会执行回调函数处理返回结果以根据后端反馈进行后续操作。
$.post("${pageContext.request.contextPath}/roomtype/deleteRoomType", {"id": data.id}, function (result) {
if (result.success) {
// 如果后端返回的结果中success属性为true表示删除操作成功调用表格之前渲染的tableList表格对象的reload方法重新加载表格数据这样页面上显示的房型列表信息会实时刷新移除已删除的房型记录保持数据的准确性和及时性让用户看到最新的数据状态。
tableList.reload();
}
// 使用Layui的layer模块弹出一个提示框显示后端返回的提示信息result.msg告知用户操作结果如删除成功或失败的原因等让用户清楚了解本次删除操作的执行情况提供良好的用户反馈增强用户对操作结果的知晓度。
layer.msg(result.msg);
}, "json");
// 关闭前面弹出的确认框传入确认框的索引index确保在完成删除操作相关的逻辑处理后关闭确认框使页面显示整洁避免多余的提示框残留影响页面美观和后续操作。
layer.close(index);
});
}
// 渲染文件上传区域通过upload模块的render方法来配置文件上传相关的各种参数和操作逻辑实现文件上传功能例如选择文件、上传到指定服务器地址以及处理上传成功后的页面展示等相关操作。
upload.render({
// 指定绑定的DOM元素的类名用于确定页面中哪个元素触发文件上传操作通常是一个<input type="file">元素或者具有类似功能的自定义元素,这里表示具有类名'thumbImg'的元素是文件上传的触发点,用户点击该元素可选择要上传的文件。
elem: ".thumbImg",
// 设置文件上传的目标URL地址通过EL表达式结合项目上下文路径指向后端处理文件上传的接口确保文件能正确上传到服务器指定位置与后端相应的文件接收和处理逻辑进行对接实现文件的上传保存等操作。
url: '${pageContext.request.contextPath}/roomtype/uploadFile',
// 规定打开文件选择框时筛选出的文件类型这里设置为只允许选择图片类型文件image/*表示所有常见的图片格式),限制用户选择的文件范围,确保上传的文件符合业务需求和系统预期,避免上传不相关类型的文件。
acceptMime: 'image/*',
// 设置文件上传的字段值,等同于<input>标签的name属性值该值必须与后端控制器中接收文件上传的方法参数名一致确保数据传递的准确性使得后端能够正确识别和接收上传的文件数据进行后续处理。
field: 'file',
// 设置文件上传的提交方式为POST符合常见的文件上传请求方式要求保证数据能正确发送到后端大多数服务器端在处理文件上传时也是按照POST方式来接收和处理请求数据的。
method: "post",
// 文件上传成功后的回调函数,用于处理后端返回的结果,例如设置图片回显路径、更新页面样式以及给隐藏域赋值等操作,实现文件上传后的相关页面交互逻辑,让用户能够看到上传结果以及方便后续对上传文件相关信息的使用。
done: function (res, index, upload) {
// 设置图片回显路径将上传成功后返回的图片路径res.data.src设置到具有类名'thumbImg'的元素的src属性上实现图片在页面上的显示让用户能够直观看到上传的图片效果确认上传是否成功。
$(".thumbImg").attr("src", res.data.src);
// 修改具有类名'thumbBox'的元素的背景颜色为白色(#fff可能用于在图片显示区域提供合适的背景样式增强视觉效果使图片展示更加美观清晰优化用户的视觉体验。
$('.thumbBox').css("background", "#fff");
// 给id为'photo'的隐藏域元素赋值将上传成功后的图片路径res.imagePath赋给它方便后续表单提交时将图片相关信息一并发送到后端保存相关数据例如在保存房型信息时可能需要同时保存房型对应的图片信息通过这个隐藏域传递到后端进行存储。
$("#photo").val(res.imagePath);
}
});
</body>
</html>
// 监听表单提交事件此事件对应HTML中添加或修改窗口里的提交按钮点击后触发表单提交的操作处理表单提交后的逻辑比如根据后端返回结果刷新表格、关闭打开的窗口、显示提示信息等以完成相应的业务流程并向用户反馈操作结果。
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果后端返回的结果中success属性为true表示表单提交操作添加或修改房型信息成功调用表格之前渲染的tableList表格对象的reload方法重新加载表格数据刷新页面显示的房型列表信息展示最新的数据状态让用户看到操作后的最新结果保持数据的实时性和准确性。
tableList.reload();
// 使用Layui的layer模块关闭之前打开的添加或修改窗口传入窗口的索引mainIndex确保操作完成后界面整洁避免多余窗口残留影响页面美观和后续操作提升用户的操作体验。
layer.close(mainIndex);
}
// 使用Layui的layer模块弹出一个提示框显示后端返回的提示信息result.msg告知用户表单提交操作的结果情况如添加或修改成功或失败的原因等让用户清楚了解本次操作的执行情况提供良好的用户反馈便于用户知晓下一步操作方向。
layer.msg(result.msg);
}, "json");
// 返回false阻止表单的默认提交行为因为这里是通过Ajax异步请求数据来更新表格和处理业务逻辑不需要页面进行刷新操作如果不阻止默认提交行为页面可能会出现不必要的刷新影响用户体验确保页面操作的流畅性和稳定性。
return false;
});
</script>
</body>
</html>

@ -2,106 +2,161 @@
<!DOCTYPE html>
<html>
<head>
<!-- 设置HTML页面的字符编码为UTF-8确保页面能正确显示各种字符比如中文等特殊字符 -->
<meta charset="utf-8">
<!-- 设置页面在浏览器标题栏显示的标题文本,此处设置为“系统设置”,表明该页面的主要功能用途 -->
<title>系统设置</title>
<!-- 指示浏览器使用webkit内核来渲染页面webkit内核对HTML5特性、CSS样式渲染等方面表现较好有助于页面在不同浏览器中更一致地展示 -->
<meta name="renderer" content="webkit">
<!-- 让浏览器以IE的最高版本模式或者Chrome模式来渲染页面有助于解决不同浏览器间的兼容性问题使页面呈现效果更符合预期 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置视口viewport属性使页面宽度自适应设备宽度初始缩放比例和最大缩放比例都设为1方便页面在移动端适配展示保证页面布局在不同尺寸屏幕上的合理性 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的核心CSS样式文件文件路径通过EL表达式结合项目上下文路径动态获取此文件包含框架定义的各种样式类用于构建页面外观 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共样式文件,可用于覆盖或扩展一些通用的样式规则,满足项目特定的样式需求 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
<!-- 定义内部样式这里针对类名为layui-form-item下的类名为layui-input-company的元素设置样式将宽度设为自动width: auto右侧内边距设为10pxpadding-right: 10px行高设为38pxline-height: 38px用于调整页面中特定输入框等元素的显示样式 -->
<style>
.layui-form-item .layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
.layui-form-item.layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<!-- 这是一个自定义的、基于Layui框架风格的容器div用于包裹页面主要内容 -->
<div class="layuimini-container">
<!-- 页面主要内容展示区域使用特定样式类layuimini-main样式效果由对应的CSS定义 -->
<div class="layuimini-main">
<div class="layui-form layuimini-form">
<div class="layui-form-item">
<label class="layui-form-label required">系统名称</label>
<div class="layui-input-block">
<input type="text" name="sitename" lay-verify="required" disabled="disabled" lay-reqtext="网站域名不能为空" placeholder="请输入系统名称" value="酒店管理系统" class="layui-input">
<tip>填写自己系统的名称。</tip>
<!-- 定义一个Layui框架的表单应用特定样式类layuimini-form后续在这个表单内放置各种系统设置相关的输入项和操作按钮等元素 -->
<div class="layui-form layuimini-form">
<!-- 一个表单行元素,用于组织表单内的各输入项,使布局更清晰,这里用于放置系统名称相关的标签和输入框 -->
<div class="layui-form-item">
<!-- 标签元素显示“系统名称”提示文本通过required类表示该输入项为必填项告知用户对应输入框用途及必填要求 -->
<label class="layui-form-label required">系统名称</label>
<!-- 输入框块级容器,实际放置系统名称输入框 -->
<div class="layui-input-block">
<!-- 系统名称输入框设置name属性为“sitename”用于表单提交时传递参数设置lay-verify="required"表示启用Layui框架的验证机制要求该输入框必填disabled="disabled"属性使其不可编辑可能是此处系统名称已固定或不允许随意更改lay-reqtext属性定义了必填项未填时的提示文本placeholder属性设置了占位提示文本方便用户知道此处应输入系统名称value属性预设了默认值“酒店管理系统”并应用Layui输入框样式 -->
<input type="text" name="sitename" lay-verify="required" disabled="disabled" lay-reqtext="网站域名不能为空" placeholder="请输入系统名称" value="酒店管理系统" class="layui-input">
<!-- 这里的<tip>标签不太符合HTML规范可能是自定义用于添加额外提示信息的元素此处提示用户填写自己系统的名称但建议使用符合标准的HTML注释或者合适的提示框等方式来展示这类提示内容 -->
<tip>填写自己系统的名称。</tip>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">项目地址</label>
<div class="layui-input-block">
<input type="text" name="domain" lay-verify="required" disabled="disabled" lay-reqtext="项目不能为空" placeholder="请输入网站域名" value="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" class="layui-input">
<!-- 另一个表单行元素,用于放置项目地址相关的标签和输入框 -->
<div class="layui-form-item">
<!-- 标签元素显示“项目地址”提示文本同样通过required类表示必填告知用户对应输入框用途及必填要求 -->
<label class="layui-form-label required">项目地址</label>
<!-- 输入框块级容器,放置项目地址输入框 -->
<div class="layui-input-block">
<!-- 项目地址输入框设置为必填项不可编辑disabled设置了必填提示文本、占位提示文本预设了默认值这里是一个Git仓库地址示例应用Layui输入框样式用于展示项目相关的地址信息可能也是固定展示不允许随意修改的情况 -->
<input type="text" name="domain" lay-verify="required" disabled="disabled" lay-reqtext="项目不能为空" placeholder="请输入网站域名" value="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">缓存时间</label>
<div class="layui-input-inline" style="width: 80px;">
<input type="text" name="cache" lay-verify="number" value="0" class="layui-input">
<!-- 表单行元素,用于组织缓存时间相关的输入项,包括输入框和单位提示等内容 -->
<div class="layui-form-item">
<!-- 标签元素,显示“缓存时间”提示文本,告知用户对应输入框用途 -->
<label class="layui-form-label">缓存时间</label>
<!-- 内联输入框容器设置宽度为80px用于放置缓存时间输入框使其在一行内按指定宽度展示 -->
<div class="layui-input-inline" style="width: 80px;">
<!-- 缓存时间输入框设置lay-verify="number"表示启用Layui框架的验证机制要求输入内容必须为数字设置了默认值为0应用Layui输入框样式用于用户输入缓存时间相关数值单位可能在后续元素中体现 -->
<input type="text" name="cache" lay-verify="number" value="0" class="layui-input">
</div>
<!-- 内联元素应用自定义样式类layui-input-company前面在<head>内的<style>中定义了样式),用于显示缓存时间的单位“分钟”,使其与前面的输入框在一行内合理展示 -->
<div class="layui-input-inline layui-input-company">分钟</div>
<!-- 辅助说明文字元素应用Layui的样式类layui-form-mid和layui-word-aux用于显示额外的提示信息告知用户本地开发和线上环境下缓存时间的推荐设置值辅助用户理解此处设置的含义和合理取值范围 -->
<div class="layui-form-mid layui-word-aux">本地开发一般推荐设置为 0线上环境建议设置为 10。</div>
</div>
<div class="layui-input-inline layui-input-company">分钟</div>
<div class="layui-form-mid layui-word-aux">本地开发一般推荐设置为 0线上环境建议设置为 10。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最大文件上传</label>
<div class="layui-input-inline" style="width: 80px;">
<input type="text" name="cache" lay-verify="number" value="2048" class="layui-input">
<!-- 表单行元素,用于组织最大文件上传相关的输入项,类似缓存时间的布局,包含输入框、单位提示等 -->
<div class="layui-form-item">
<!-- 标签元素,显示“最大文件上传”提示文本,告知用户对应输入框用途 -->
<label class="layui-form-label">最大文件上传</label>
<!-- 内联输入框容器设置宽度为80px放置最大文件上传大小的输入框 -->
<div class="layui-input-inline" style="width: 80px;">
<!-- 最大文件上传大小输入框设置为必须输入数字设置了默认值为2048应用Layui输入框样式用于用户输入允许上传的最大文件大小数值单位在后续元素体现 -->
<input type="text" name="cache" lay-verify="number" value="2048" class="layui-input">
</div>
<!-- 内联元素显示单位“KB”告知用户输入的最大文件上传大小的单位情况与前面输入框配合展示完整信息 -->
<div class="layui-input-inline layui-input-company">KB</div>
<!-- 辅助说明文字元素提示用户文件大小单位换算关系1 M = 1024 KB帮助用户更好地理解和设置合适的最大文件上传大小数值 -->
<div class="layui-form-mid layui-word-aux">提示1 M = 1024 KB</div>
</div>
<div class="layui-input-inline layui-input-company">KB</div>
<div class="layui-form-mid layui-word-aux">提示1 M = 1024 KB</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">上传文件类型</label>
<div class="layui-input-block">
<input type="text" name="cache" value="png|gif|jpg|jpeg|zip|rar" class="layui-input">
<!-- 表单行元素,用于放置上传文件类型相关的输入框 -->
<div class="layui-form-item">
<!-- 标签元素,显示“上传文件类型”提示文本,告知用户对应输入框用途 -->
<label class="layui-form-label">上传文件类型</label>
<!-- 输入框块级容器,放置上传文件类型输入框,此处输入框没有设置验证等属性,用户可自行输入允许上传的文件类型(可能格式有一定要求,比如用特定符号分割等) -->
<div class="layui-input-block">
<input type="text" name="cache" value="png|gif|jpg|jpeg|zip|rar" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label required">首页标题</label>
<div class="layui-input-block">
<textarea name="title" disabled="disabled" class="layui-textarea">酒店管理后台管理</textarea>
<!-- 表单行元素,用于组织首页标题相关的文本域输入项,设置为多行文本输入形式 -->
<div class="layui-form-item layui-form-text">
<!-- 标签元素显示“首页标题”提示文本通过required类表示必填告知用户对应文本域用途及必填要求 -->
<label class="layui-form-label required">首页标题</label>
<!-- 输入框块级容器,放置首页标题文本域 -->
<div class="layui-input-block">
<!-- 首页标题文本域设置为不可编辑disabled应用Layui的文本域样式类layui-textarea预设了默认文本内容“酒店管理后台管理”用于展示首页标题相关信息可能此处也是固定展示不允许随意修改的情况 -->
<textarea name="title" disabled="disabled" class="layui-textarea">酒店管理后台管理</textarea>
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">META关键词</label>
<div class="layui-input-block">
<textarea name="keywords" class="layui-textarea" placeholder="多个关键词用英文状态 , 号分割"></textarea>
<!-- 表单行元素用于放置META关键词相关的文本域输入项 -->
<div class="layui-form-item layui-form-text">
<!-- 标签元素显示“META关键词”提示文本告知用户对应文本域用途 -->
<label class="layui-form-label">META关键词</label>
<!-- 输入框块级容器放置META关键词文本域此处文本域设置了placeholder属性提示用户多个关键词的输入格式要求用英文状态的逗号分割 -->
<div class="layui-input-block">
<textarea name="keywords" class="layui-textarea" placeholder="多个关键词用英文状态, 号分割"></textarea>
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">META描述</label>
<div class="layui-input-block">
<textarea name="descript" class="layui-textarea">管理员工 酒店功能</textarea>
<!-- 表单行元素用于放置META描述相关的文本域输入项 -->
<div class="layui-form-item layui-form-text">
<!-- 标签元素显示“META描述”提示文本告知用户对应文本域用途 -->
<label class="layui-form-label">META描述</label>
<!-- 输入框块级容器放置META描述文本域用户可在此输入关于页面的描述信息用于搜索引擎优化等相关用途 -->
<div class="layui-input-block">
<textarea name="descript" class="layui-textarea">管理员工 酒店功能</textarea>
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label required">版权信息</label>
<div class="layui-input-block">
<textarea name="copyright" disabled="disabled" class="layui-textarea">© 2022 XIEYINGPENG</textarea>
<!-- 表单行元素,用于组织版权信息相关的文本域输入项 -->
<div class="layui-form-item layui-form-text">
<!-- 标签元素显示“版权信息”提示文本通过required类表示必填告知用户对应文本域用途及必填要求 -->
<label class="layui-form-label required">版权信息</label>
<!-- 输入框块级容器放置版权信息文本域设置为不可编辑disabled应用Layui文本域样式类预设了默认的版权信息内容“© 2022 XIEYINGPENG”用于展示版权相关固定信息 -->
<div class="layui-input-block">
<textarea name="copyright" disabled="disabled" class="layui-textarea">© 2022 XIEYINGPENG</textarea>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="setting">确认保存</button>
<!-- 表单行元素,用于放置确认保存按钮 -->
<div class="layui-form-item">
<!-- 输入框块级容器,用于放置按钮元素,使其在页面中按块级元素的布局方式展示 -->
<div class="layui-input-block">
<!-- 确认保存按钮使用Layui按钮样式类并添加不同修饰类控制外观通过lay-submit和lay-filter="setting"属性设置提交和过滤器标识,点击触发对应逻辑,用于用户确认保存系统设置相关信息 -->
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="setting">确认保存</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form'], function () {
var form = layui.form
, layer = layui.layer;
<!-- 引入Layui框架的核心JavaScript文件设置字符编码为UTF-8确保脚本能正确解析和运行 -->
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 使用layui.use方法加载Layui框架的'form'模块,当模块加载完成后,执行回调函数,在回调函数内部可以使用'form'模块提供的功能来处理表单相关操作同时获取layer模块实例用于弹出提示框等交互操作虽然此处只用到了form模块的部分功能但一起加载方便后续扩展功能
layui.use(['form'], function () {
var form = layui.form
, layer = layui.layer;
//监听提交
form.on('submit(setting)', function (data) {
parent.layer.alert(JSON.stringify(data.field), {
title: '最终的提交信息'
// 监听名为'setting'的表单提交事件这个事件与前面HTML中确认保存按钮点击后触发表单提交的操作相对应当用户点击确认保存按钮表单就会触发提交行为进而触发这个监听事件执行对应的回调函数。
form.on('submit(setting)', function (data) {
// 使用parent.layer.alert弹出一个提示框显示最终要提交的表单数据通过JSON.stringify将表单数据对象转换为字符串格式展示设置提示框的标题为'最终的提交信息',方便在调试或者需要查看提交数据时,直观地看到用户输入或页面预设的要提交到后端的系统设置相关信息。
parent.layer.alert(JSON.stringify(data.field), {
title: '最终的提交信息'
});
// 返回false目的是阻止表单的默认提交行为因为这里可能只是先展示提交信息实际的提交到后端等完整业务逻辑还未实现或者需要进一步处理比如验证、与后端接口对接等避免页面不必要的刷新或者数据意外提交先查看提交信息后再决定后续操作。
return false;
});
return false;
});
});
</script>
});
</script>
</body>
</html>

@ -1,70 +1,106 @@
/* 页面主体body样式 */
body {
/* 设置页面主体四周的外边距均为15px用于在页面边缘预留一定空白空间避免内容紧贴浏览器边框使页面看起来更加美观、舒适 */
margin: 15px 15px 15px 15px;
/* 设置页面的背景颜色为浅灰色(#f2f2f2为整个页面营造出一种柔和的底色效果通常作为基础背景后续页面内的元素可在此基础上展现各自的颜色和样式 */
background: #f2f2f2;
}
/* layuimini-container类名对应的元素样式 */
.layuimini-container {
/* 为元素添加1px宽的边框边框颜色与页面背景色相同#f2f2f2使元素在视觉上有一定的边界感同时又能与整体背景相融合不过显得过于突兀 */
border: 1px solid #f2f2f2;
/* 将元素的四个角设置为圆角圆角半径为5px使元素外观更加圆润、柔和提升视觉美感和用户体验 */
border-radius: 5px;
background-color: #ffffff
/* 设置元素的背景颜色为白色(#ffffff使其在页面背景上更加突出方便在内部放置各种内容形成清晰的视觉层次 */
background-color: #ffffff;
}
/* layuimini-main类名对应的元素样式 */
.layuimini-main {
/* 设置元素四周的外边距均为10px在.layuimini-container容器内部再次预留一定空白空间用于区分容器边界与内部主要内容使内容排版更加合理、美观 */
margin: 10px 10px 10px 10px;
}
/**必填红点 */
.layuimini-form > .layui-form-item > .required:after {
/* 必填红点样式(用于在表单中标记必填项) */
.layuimini-form >.layui-form-item >.required:after {
/* 使用content属性添加一个星号*)作为内容,用于在页面上显示必填标识 */
content: '*';
/* 设置星号的颜色为红色,使其醒目,突出必填项的重要性,引起用户注意 */
color: red;
/* 将元素设置为绝对定位,方便根据需要精确调整其在页面中的位置,相对于其最近的已定位的祖先元素进行定位 */
position: absolute;
/* 设置星号在水平方向上相对于左侧元素有4px的外边距使其与对应表单标签等元素有适当间隔避免过于拥挤 */
margin-left: 4px;
/* 设置字体加粗,进一步增强必填标识的视觉效果,使其更加突出显眼 */
font-weight: bold;
/* 设置行高为1.8em,用于控制星号在垂直方向上的位置和布局,使其与表单元素在垂直方向上对齐更加美观 */
line-height: 1.8em;
/* 设置星号在垂直方向上距离顶部6px的位置精确调整其在表单项中的垂直位置达到合适的显示效果 */
top: 6px;
/* 设置星号在水平方向上距离右侧5px的位置使其位于表单标签或输入框等元素的合适位置起到提示必填的作用 */
right: 5px;
}
.layuimini-form > .layui-form-item > .layui-form-label {
width: 120px !important;
/* layuimini-form下的layui-form-item下的layui-form-label样式 */
.layuimini-form >.layui-form-item >.layui-form-label {
/* 强制设置元素的宽度为120px用于统一表单中标签部分的宽度方便进行表单布局使各表单项在水平方向上排列更加整齐、规范 */
width: 120px!important;
}
.layuimini-form > .layui-form-item > .layui-input-block {
margin-left: 100px !important;
/* layuimini-form下的layui-form-item下的layui-input-block样式 */
.layuimini-form >.layui-form-item >.layui-input-block {
/* 强制设置元素的左侧外边距为100px结合前面设置的标签宽度120px使输入框等内容区域与标签区域有合适的间隔实现表单内不同部分的合理布局 */
margin-left: 100px!important;
}
.layuimini-form > .layui-form-item > .layui-input-block > tip {
/* layuimini-form下的layui-form-item下的layui-input-block内的tip样式可能用于显示额外提示信息的元素 */
.layuimini-form >.layui-form-item >.layui-input-block > tip {
/* 将元素设置为行内块级元素,使其既能在一行内与其他元素(如输入框等)并排显示,又能像块级元素一样设置内外边距、高度等样式属性 */
display: inline-block;
/* 设置元素顶部外边距为10px使其与上方的输入框等元素有一定间隔避免提示信息过于紧贴输入框影响视觉效果和可读性 */
margin-top: 10px;
/* 设置元素的行高为10px用于控制提示信息文本在垂直方向上的布局高度使其显示更加紧凑、整齐 */
line-height: 10px;
/* 设置元素的字体大小为10px使提示信息以较小的字号显示通常作为辅助说明文字相对输入框等主要内容在视觉上更弱化一些 */
font-size: 10px;
/* 设置元素的文本颜色为深灰色(#a29c9c使其与主要内容颜色区分开来体现出提示信息的辅助性质同时又能保证一定的清晰度便于用户查看 */
color: #a29c9c;
}
/**搜索框*/
.layuimini-container .table-search-fieldset {
/* 搜索框相关样式应用于类名为layuimini-container下的.table-search-fieldset元素 */
.layuimini-container.table-search-fieldset {
/* 将元素的上下外边距设置为0去除默认可能存在的外边距使其能紧密贴合周围元素或者按照期望的布局方式进行排列 */
margin: 0;
/* 为元素添加1px宽的边框边框颜色为浅灰色#e6e6e6用于区分搜索框区域与其他内容使其在页面中有一定的视觉边界感 */
border: 1px solid #e6e6e6;
/* 设置元素内部的上下内边距分别为10px和5px左右内边距均为20px用于在搜索框区域内部预留空白空间方便放置搜索相关的输入框、按钮等元素并且使它们有合适的间距布局更加合理美观 */
padding: 10px 20px 5px 20px;
/* 设置元素的文本颜色为深灰色(#6b6b6b用于统一搜索框区域内文字如输入框的提示文字、按钮文字等的颜色风格使其与整体页面的颜色搭配协调一致 */
color: #6b6b6b;
}
/**自定义滚动条样式 */
/* 自定义WebKit浏览器下的滚动条样式适用于支持WebKit内核的浏览器如Chrome、Safari等 */
::-webkit-scrollbar {
/* 设置滚动条的宽度和高度均为6px调整滚动条的整体尺寸大小使其在页面中显示的比例更加合适符合页面的视觉设计风格 */
width: 6px;
height: 6px
height: 6px;
}
::-webkit-scrollbar-track {
/* 设置滚动条轨道(即滚动条背景部分)的背景颜色为透明,使滚动条轨道与页面背景更好地融合,减少对页面整体视觉效果的干扰 */
background-color: transparent;
/* 将滚动条轨道的四个角设置为圆角圆角半径为2em相对单位根据元素字体大小等因素动态计算实际尺寸使滚动条外观更加圆润、美观 */
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
::-webkit-scrollbar-thumb {
/* 设置滚动条滑块(即用于拖动滚动的部分)的背景颜色为深灰色(#9c9da0使其在滚动条轨道上能够清晰可见方便用户操作滚动条进行页面滚动 */
background-color: #9c9da0;
/* 将滚动条滑块的四个角设置为圆角圆角半径为2em与滚动条轨道的圆角风格保持一致使整个滚动条外观更加统一、美观 */
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em
}
border-radius: 2em;
}

@ -1,95 +1,114 @@
/*头部右侧背景色 headerRightBg */
.layui-layout-admin .layui-header {
background-color: #ffffff !important;
/* 头部右侧背景色 headerRightBg */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素设置其背景颜色为白色#ffffff并且使用!important来提高此样式规则的优先级确保它能覆盖可能存在的其他同名或冲突的背景色设置用于明确指定头部右侧区域的背景颜色 */
.layui-layout-admin.layui-header {
background-color: #ffffff!important;
}
/*头部右侧选中背景色 headerRightBgThis */
.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {
background-color: #e4e4e4 !important;
/* 头部右侧选中背景色 headerRightBgThis */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素内部满足特定结构层次关系.layuimini-header-content > ul >.layui-nav-item.layui-this表示在相应的HTML结构中处于被选中状态的导航菜单项以及.layuimini-tool i:hover表示工具图标在鼠标悬停时的状态的元素设置它们的背景颜色为浅灰色#e4e4e4同样使用!important提高优先级用于突出显示头部右侧区域中被选中的菜单项或鼠标悬停的工具图标时的背景效果 */
.layui-layout-admin.layui-header.layuimini-header-content > ul >.layui-nav-item.layui-this,.layuimini-tool i:hover {
background-color: #e4e4e4!important;
}
/*头部右侧字体颜色 headerRightColor */
.layui-layout-admin .layui-header .layui-nav .layui-nav-item a {
/* 头部右侧字体颜色 headerRightColor */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-item的菜单项里的链接a标签元素设置其文本颜色为带有一定透明度的深灰色rgba(107, 107, 107, 0.7)),用于统一头部右侧导航菜单文字的默认颜色风格,使其呈现出相对柔和、不太刺眼的视觉效果 */
.layui-layout-admin.layui-header.layui-nav.layui-nav-item a {
color: rgba(107, 107, 107, 0.7);
}
/**头部右侧下拉字体颜色 headerRightChildColor */
.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a {
color: rgba(107, 107, 107, 0.7) !important;
/** 头部右侧下拉字体颜色 headerRightChildColor */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-item的菜单项的下拉子菜单.layui-nav-child里的链接a标签元素设置其文本颜色为带有一定透明度的深灰色rgba(107, 107, 107, 0.7)),并使用!important确保该颜色设置优先应用用于统一头部右侧导航菜单下拉子菜单中文字的颜色风格使其与上级菜单文字颜色保持一致 */
.layui-layout-admin.layui-header.layui-nav.layui-nav-item.layui-nav-child a {
color: rgba(107, 107, 107, 0.7)!important;
}
/*头部右侧鼠标选中 headerRightColorThis */
.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a {
color: #565656 !important;
/* 头部右侧鼠标选中 headerRightColorThis */
/* 针对类名为layui-header的元素内部满足特定结构的导航菜单中.layuimini-menu-header-pc.layui-nav表示在PC端特定菜单结构中的导航菜单以及.layuimini-header-menu.layuimini-pc-show.layui-nav表示在PC端显示的特定头部菜单结构中的导航菜单当鼠标悬停在菜单项的链接a标签元素上a:hover或者菜单项处于选中状态layui-this a设置其文本颜色为深灰色#565656并使用!important提高优先级用于突出显示鼠标悬停或选中状态下菜单项文字的颜色变化增强交互时的视觉反馈效果 */
.layui-header.layuimini-menu-header-pc.layui-nav.layui-nav-item a:hover,.layui-header.layuimini-header-menu.layuimini-pc-show.layui-nav.layui-this a {
color: #565656!important;
}
/*头部右侧更多下拉颜色 headerRightNavMore */
.layui-header .layui-nav .layui-nav-more {
border-top-color: rgba(160, 160, 160, 0.7) !important;
/* 头部右侧更多下拉颜色 headerRightNavMore */
/* 针对类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-more的元素通常用于表示展开更多下拉菜单的图标等相关元素设置其边框顶部颜色为带有一定透明度的灰色rgba(160, 160, 160, 0.7)),并使用!important确保该边框颜色设置优先应用用于定义头部右侧导航菜单中展开更多下拉菜单相关元素的边框颜色风格使其具有特定的视觉标识 */
.layui-header.layui-nav.layui-nav-more {
border-top-color: rgba(160, 160, 160, 0.7)!important;
}
/*头部右侧更多下拉颜色 headerRightNavMore */
.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more {
border-color: transparent transparent rgba(160, 160, 160, 0.7) !important;
/* 头部右侧更多下拉颜色 headerRightNavMore */
/* 针对类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-mored的元素可能表示下拉菜单已展开等相关状态的样式元素以及类名为layui-nav-itemed表示菜单项已展开通常对应有子菜单展开的情况的元素内部的链接a标签里的类名为layui-nav-more的元素设置它们的边框颜色为透明transparent、透明、带有一定透明度的灰色rgba(160, 160, 160, 0.7)),并使用!important确保该边框颜色设置优先应用用于进一步细化头部右侧导航菜单中不同展开状态下相关元素的边框颜色样式使其在不同状态下呈现出特定的视觉效果 */
.layui-header.layui-nav.layui-nav-mored,.layui-header.layui-nav-itemed > a.layui-nav-more {
border-color: transparent transparent rgba(160, 160, 160, 0.7)!important;
}
/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */
.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a {
background-color: #1E9FFF !important;
color: #ffffff !important;
/** 头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */
/* 针对类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的下拉子菜单.layui-nav-child里处于选中状态layui-this的dd元素通常在下拉菜单中代表具体的菜单项及其内部的链接a标签还有类名为layui-layout-admin且包含类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-item的菜单项的下拉子菜单.layui-nav-child里处于选中状态layui-this的链接a标签设置它们的背景颜色为蓝色#1E9FFF文本颜色为白色#ffffff并都使用!important提高优先级用于突出显示头部右侧导航菜单下拉子菜单中被选中菜单项的背景和文字颜色变化使其在视觉上更加醒目与未选中状态区分开来 */
.layui-header.layui-nav.layui-nav-child dd.layui-this a,.layui-header.layui-nav-child dd.layui-this,.layui-layout-admin.layui-header.layui-nav.layui-nav-item.layui-nav-child.layui-this a {
background-color: #1E9FFF!important;
color: #ffffff!important;
}
/*头部缩放按钮样式 headerRightToolColor */
.layui-layout-admin .layui-header .layuimini-tool i {
/* 头部缩放按钮样式 headerRightToolColor */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素内部位于类名为layuimini-tool的元素里的i标签通常用于图标等元素设置其颜色为深灰色#565656用于定义头部区域中缩放按钮等工具图标元素的默认颜色风格使其与整体头部的颜色搭配协调一致 */
.layui-layout-admin.layui-header.layuimini-tool i {
color: #565656;
}
/*logo背景颜色 headerLogoBg */
.layui-layout-admin .layuimini-logo {
background-color: #192027 !important;
/* logo背景颜色 headerLogoBg */
/* 针对类名为layui-layout-admin且包含类名为layuimini-logo的元素设置其背景颜色为深灰色#192027并使用!important提高优先级用于明确指定页面中logo区域的背景颜色使其具有独特的视觉标识与其他区域区分开来 */
.layui-layout-admin.layuimini-logo {
background-color: #192027!important;
}
/*logo字体颜色 headerLogoColor */
.layui-layout-admin .layuimini-logo h1 {
/* logo字体颜色 headerLogoColor */
/* 针对类名为layui-layout-admin且包含类名为layuimini-logo的元素内部的h1标签通常用于显示logo的文字部分设置其文本颜色为浅灰色rgb(191, 187, 187)用于定义logo文字的颜色风格使其在背景颜色基础上呈现出清晰、协调的视觉效果 */
.layui-layout-admin.layuimini-logo h1 {
color: rgb(191, 187, 187);
}
/*左侧菜单更多下拉样式 leftMenuNavMore */
.layuimini-menu-left .layui-nav .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-more {
/* 左侧菜单更多下拉样式 leftMenuNavMore */
/* 针对类名为layuimini-menu-left的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-more的元素用于表示展开更多下拉菜单的图标等相关元素以及类名为layuimini-menu-left-zoom可能表示左侧菜单处于某种缩放或特定状态下且内部包含类名为layui-nav的导航菜单中的类名为layui-nav-more的元素设置它们的边框顶部颜色为浅灰色rgb(191, 187, 187)),用于定义左侧菜单中展开更多下拉菜单相关元素的边框顶部颜色风格,使其具有与右侧头部菜单不同的视觉标识 */
.layuimini-menu-left.layui-nav.layui-nav-more,.layuimini-menu-left-zoom.layui-nav.layui-nav-more {
border-top-color: rgb(191, 187, 187);
}
/*左侧菜单更多下拉样式 leftMenuNavMore */
.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more {
border-color: transparent transparent rgb(191, 187, 187) !important;
/* 左侧菜单更多下拉样式 leftMenuNavMore */
/* 针对类名为layuimini-menu-left的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-mored的元素表示下拉菜单已展开等相关状态的样式元素、类名为layui-nav-itemed表示菜单项已展开通常对应有子菜单展开的情况的元素内部的链接a标签里的类名为layui-nav-more的元素以及类名为layuimini-menu-left-zoom特定状态下的左侧菜单且内部包含类名为layui-nav的导航菜单中的相应元素设置它们的边框颜色为透明transparent、透明、浅灰色rgb(191, 187, 187)),并使用!important确保该边框颜色设置优先应用用于进一步细化左侧菜单中不同展开状态下相关元素的边框颜色样式使其在不同状态下呈现出特定的视觉效果 */
.layuimini-menu-left.layui-nav.layui-nav-mored,.layuimini-menu-left.layui-nav-itemed > a.layui-nav-more,.layuimini-menu-left-zoom.layui-nav.layui-nav-mored,.layuimini-menu-left-zoom.layui-nav-itemed > a.layui-nav-more {
border-color: transparent transparent rgb(191, 187, 187)!important;
}
/*左侧菜单背景 leftMenuBg */
.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul {
background-color: #28333E !important;
/* 左侧菜单背景 leftMenuBg */
/* 针对类名为layui-side且背景色为黑色layui-bg-black的元素以及该元素内部包含类名为layuimini-menu-left的元素及其内部的ul元素还有类名为layuimini-menu-left-zoom的元素内部的ul元素设置它们的背景颜色为深灰色#28333E并使用!important提高优先级用于明确指定左侧菜单区域的整体背景颜色使其具有统一的视觉风格与页面其他区域区分开来 */
.layui-side.layui-bg-black,.layui-side.layui-bg-black >.layuimini-menu-left > ul,.layuimini-menu-left-zoom > ul {
background-color: #28333E!important;
}
/*左侧菜单选中背景 leftMenuBgThis */
.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a {
background-color: #1E9FFF !important
/* 左侧菜单选中背景 leftMenuBgThis */
/* 针对类名为layuimini-menu-left的元素内部位于类名为layui-nav-tree的导航树结构中的处于选中状态layui-this的元素、处于选中状态的元素内部的链接a标签、下拉子菜单.layui-nav-child里处于选中状态的dd元素及其内部的链接a标签以及类名为layuimini-menu-left-zoom特定状态下的左侧菜单且内部包含类名为layui-nav-tree的导航树结构中的相应选中状态元素设置它们的背景颜色为蓝色#1E9FFF并使用!important提高优先级用于突出显示左侧菜单中被选中菜单项的背景颜色变化使其在视觉上更加醒目便于用户识别当前选中的菜单选项 */
.layuimini-menu-left.layui-nav-tree.layui-this,.layuimini-menu-left.layui-nav-tree.layui-this > a,.layuimini-menu-left.layui-nav-tree.layui-nav-child dd.layui-this,.layuimini-menu-left.layui-nav-tree.layui-nav-child dd.layui-this a,.layuimini-menu-left-zoom.layui-nav-tree.layui-this,.layuimini-menu-left-zoom.layui-nav-tree.layui-this > a,.layuimini-menu-left-zoom.layui-nav-tree.layui-nav-child dd.layui-this,.layuimini-menu-left-zoom.layui-nav-tree.layui-nav-child dd.layui-this a {
background-color: #1E9FFF!important;
}
/*左侧菜单子菜单背景 leftMenuChildBg */
.layuimini-menu-left .layui-nav-itemed > .layui-nav-child {
background-color: #0c0f13 !important;
/* 左侧菜单子菜单背景 leftMenuChildBg */
/* 针对类名为layuimini-menu-left的元素内部处于展开状态layui-nav-itemed的菜单项的下拉子菜单.layui-nav-child元素设置其背景颜色为深黑色#0c0f13并使用!important提高优先级用于定义左侧菜单中展开的子菜单的背景颜色风格使其与上级菜单和其他区域在视觉上有所区分呈现出层次感 */
.layuimini-menu-left.layui-nav-itemed >.layui-nav-child {
background-color: #0c0f13!important;
}
/*左侧菜单字体颜色 leftMenuColor */
.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a {
color: rgb(191, 187, 187) !important;
/* 左侧菜单字体颜色 leftMenuColor */
/* 针对类名为layuimini-menu-left的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-item的菜单项里的链接a标签元素以及类名为layuimini-menu-left-zoom特定状态下的左侧菜单且内部包含类名为layui-nav的导航菜单中的相应菜单项链接元素设置它们的文本颜色为浅灰色rgb(191, 187, 187)),并使用!important确保该文本颜色设置优先应用用于统一左侧菜单文字的默认颜色风格使其与整体左侧菜单的背景颜色搭配协调一致 */
.layuimini-menu-left.layui-nav.layui-nav-item a,.layuimini-menu-left-zoom.layui-nav.layui-nav-item a {
color: rgb(191, 187, 187)!important;
}
/*左侧菜单选中字体颜色 leftMenuColorThis */
.layuimini-menu-left .layui-nav .layui-nav-item a:hover, .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a:hover, .layuimini-menu-left-zoom.layui-nav .layui-this a {
color: #ffffff !important;
/* 左侧菜单选中字体颜色 leftMenuColorThis */
/* 针对类名为layuimini-menu-left的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-item的菜单项里的链接a标签元素当鼠标悬停a:hover或者处于选中状态layui-this a以及类名为layuimini-menu-left-zoom特定状态下的左侧菜单且内部包含类名为layui-nav的导航菜单中的相应元素设置它们的文本颜色为白色#ffffff并使用!important提高优先级用于突出显示左侧菜单中鼠标悬停或选中状态下菜单项文字的颜色变化增强交互时的视觉反馈效果使其在视觉上更加醒目便于用户识别当前操作的菜单选项 */
.layuimini-menu-left.layui-nav.layui-nav-item a:hover,.layuimini-menu-left.layui-nav.layui-this a,.layuimini-menu-left-zoom.layui-nav.layui-nav-item a:hover,.layuimini-menu-left-zoom.layui-nav.layui-this a {
color: #ffffff!important;
}
/**tab选项卡选中颜色 tabActiveColor */
.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active {
/** tab选项卡选中颜色 tabActiveColor */
/* 针对类名为layuimini-tab的元素内部位于类名为layui-tab-title的标题栏中处于选中状态layui-this的元素内部的类名为layuimini-tab-active的元素可能用于特定的选中效果标识设置其背景颜色为蓝色#1e9fff用于突出显示选中的tab选项卡使其在视觉上与未选中的选项卡区分开来方便用户识别当前处于激活状态的tab */
.layuimini-tab.layui-tab-title.layui-this.layuimini-tab-active {
background-color: #1e9fff;
}
}

@ -1,79 +1,133 @@
/* 定义类名为.lay-step 的元素的样式 */
.lay-step {
/* 将字体大小设置为0通常用于去除元素内文本默认的字体大小带来的间距等影响后续可以在子元素中重新设置具体字体大小便于更精准地控制布局 */
font-size: 0;
/* 设置元素的宽度为400px这是一个固定宽度的设定但同时又通过max-width: 100%限制了最大宽度不能超过其所在父元素宽度的100%,使得元素在不同宽度的父容器中能自适应一定程度的缩放,保证布局合理性 */
width: 400px;
/* 使元素在其所在父容器中水平居中通过设置上下外边距为0左右外边距自动计算来实现水平居中效果 */
margin: 0 auto;
/* 设置最大宽度为100%,参考前面宽度设置的注释,保证元素宽度不会超出父容器宽度,具有良好的响应式布局特性 */
max-width: 100%;
/* 在元素左侧添加内边距值为200px用于在元素内部预留一定的空白空间方便后续放置其他子元素等内容 */
padding-left: 200px;
}
/* 定义类名为.step-item 的元素的样式,这类元素通常是.lay-step 元素的子元素,用于构建步骤相关的展示模块 */
.step-item {
/* 将元素设置为行内块级元素,使其既具有块级元素可以设置宽高、内外边距等特性,又能像行内元素一样在一行内排列,方便多个此类元素横向排列展示,比如用于展示多个步骤 */
display: inline-block;
/* 设置行高为26px用于控制元素内部文本等内容在垂直方向上的布局高度使文本等显示更加整齐美观 */
line-height: 26px;
/* 设置元素为相对定位,相对定位的元素相对于其自身原本的位置进行偏移等定位操作,常用于在不影响其他元素布局的情况下,微调当前元素的位置 */
position: relative;
/* 设置字体大小为14px重新定义了元素内文本的字体大小覆盖了外层.lay-step 元素中设置的font-size: 0使文本能正常显示合适的大小 */
font-size: 14px;
}
/* 定义类名为.step-item-tail 的元素的样式,从命名推测可能是用于展示步骤之间的连接线等尾部样式相关元素 */
.step-item-tail {
/* 设置元素宽度为100%,使其能根据父元素(通常是.step-item 元素)的宽度自动撑开,填满整个父元素的宽度范围 */
width: 100%;
/* 在元素的左右两侧添加内边距值为10px用于在元素内部预留一定的空白空间避免内容紧贴边界 */
padding: 0 10px;
/* 将元素设置为绝对定位绝对定位的元素会相对于最近的已定位的祖先元素非static定位进行定位如果没有已定位的祖先元素则相对于html元素定位常用于精确控制元素在页面中的位置 */
position: absolute;
/* 设置元素的左侧位置为0使其左边框与父元素通常是.step-item 元素)的左边框对齐 */
left: 0;
/* 设置元素的顶部位置为13px使其在垂直方向上距离父元素顶部有一定的偏移距离实现特定的布局效果比如将连接线等元素放置在合适的垂直位置上 */
top: 13px;
}
/* 定义类名为.step-item-tail i 的元素的样式这里i元素可能是用于实际绘制步骤之间连接线等样式的元素比如通过背景色来模拟线条 */
.step-item-tail i {
/* 将元素设置为行内块级元素,使其既能在一行内排列,又可以设置宽高属性,方便用于绘制类似线条这种需要一定宽度和高度的样式元素 */
display: inline-block;
/* 设置元素宽度为100%,使其能根据父元素(即.step-item-tail 元素)的宽度自动撑开,填满整个父元素宽度范围,用于绘制横跨整个父元素宽度的线条等样式 */
width: 100%;
/* 设置元素高度为1px用于控制连接线等样式元素的粗细程度使其呈现出类似线条的效果 */
height: 1px;
/* 设置元素垂直方向上顶部对齐,保证多个此类元素在垂直方向上顶部对齐排列,使样式更加整齐 */
vertical-align: top;
/* 设置元素的背景色为#c2c2c2这是一种灰色系颜色用于作为步骤之间连接线等的默认颜色体现未完成或常规状态下的样式 */
background: #c2c2c2;
/* 设置元素为相对定位,相对定位的元素相对于其自身原本的位置进行偏移等定位操作,可能后续会基于这个相对定位进行一些微调等操作,比如覆盖部分背景来体现不同状态 */
position: relative;
}
.step-item-tail .step-item-tail-done {
/* 定义类名为.step-item-tail.step-item-tail-done 的元素的样式,从命名推测是用于表示步骤已完成时,对应连接线等尾部元素的特定样式 */
.step-item-tail.step-item-tail-done {
/* 将元素的背景色设置为#009688这是一种特定的主题色可能是绿色系常用于表示成功、完成等积极状态的颜色用于覆盖默认的灰色背景色体现步骤已完成时连接线的样式变化 */
background: #009688;
}
/* 定义类名为.step-item-head 的元素的样式,从命名推测可能是用于展示步骤中的头部元素,比如序号圆圈等样式相关元素 */
.step-item-head {
/* 设置元素为相对定位,方便基于自身原本位置进行一些位置微调等操作,实现特定的布局效果 */
position: relative;
/* 将元素设置为行内块级元素,使其能在一行内与其他元素(如步骤的文字说明等)合理排列,同时又能设置宽高属性来控制其自身大小和外观形状 */
display: inline-block;
/* 设置元素的高度为26px用于控制头部元素可能是圆形等形状在垂直方向上的大小尺寸 */
height: 26px;
/* 设置元素的宽度为26px用于控制头部元素在水平方向上的大小尺寸使其呈现出较为规整的形状比如圆形等 */
width: 26px;
/* 设置元素内部文本的水平对齐方式为居中对齐,使元素内如果有数字、文字等内容能在水平方向上位于正中间位置,看起来更加整齐美观 */
text-align: center;
/* 设置元素垂直方向上顶部对齐,保证多个此类元素在垂直方向上顶部对齐排列,使样式更加整齐统一 */
vertical-align: top;
/* 设置元素的文本颜色为#009688这是一种特定的主题色用于给头部元素内的文本比如步骤序号数字等设置颜色使其与整体样式主题相匹配 */
color: #009688;
/* 设置元素的边框样式边框宽度为1px边框颜色为#009688边框样式为实线用于绘制头部元素可能是圆形等形状的边框使其外观更加清晰明显 */
border: 1px solid #009688;
/* 将元素的四个角设置为圆角圆角半径为50%,使得元素呈现出圆形的外观形状,常用于制作类似序号圆圈等样式元素 */
border-radius: 50%;
/* 设置元素的背景色为#ffffff即白色作为头部元素的默认背景颜色使其与文本颜色等搭配呈现出清晰的视觉效果 */
background: #ffffff;
}
/* 定义类名为.step-item-head.step-item-head-active 的元素的样式,从命名推测是用于表示步骤处于活动(当前正在进行等)状态时,头部元素的特定样式 */
.step-item-head.step-item-head-active {
/* 将元素的背景色设置为#009688覆盖默认的白色背景用于体现步骤处于活动状态时头部元素外观的变化使其在视觉上更加突出与其他非活动步骤区分开来 */
background: #009688;
/* 将元素的文本颜色设置为#ffffff即白色覆盖默认的主题色文本颜色使其在背景变为深色#009688文本依然能清晰可见保证良好的视觉效果和可读性 */
color: #ffffff;
}
/* 定义类名为.step-item-main 的元素的样式,从命名推测可能是用于展示步骤相关的主要内容部分,比如步骤的标题、描述等文字信息所在的元素 */
.step-item-main {
/* 将元素设置为块级元素,使其独占一行,方便对步骤的主要内容进行独立的布局排版,比如可以设置上下外边距等控制与其他元素的间距 */
display: block;
/* 设置元素为相对定位,便于基于自身原本位置进行一些位置微调等操作,实现与其他相关元素(如头部元素、尾部元素等)的合理布局配合 */
position: relative;
/* 设置元素的左侧外边距为-50%,这个负值外边距的设置通常是用于实现某种特殊的水平居中或对齐效果,可能与元素自身宽度以及相关父元素宽度等因素配合,将元素在水平方向上定位到特定位置 */
margin-left: -50%;
/* 设置元素的右侧外边距为50%,与左侧外边距配合,共同调整元素在水平方向上的位置,实现特定的布局目的 */
margin-right: 50%;
/* 在元素左侧添加内边距值为26px用于在元素内部预留一定的空白空间使主要内容与前面的头部元素等有一定的间距看起来布局更加合理美观 */
padding-left: 26px;
/* 设置元素内部文本的水平对齐方式为居中对齐,使步骤的标题、描述等文字信息能在水平方向上位于正中间位置,呈现出整齐美观的排版效果 */
text-align: center;
}
/* 定义类名为.step-item-main-title 的元素的样式,从命名推测是用于设置步骤主要内容中的标题部分的样式,比如字体加粗等效果 */
.step-item-main-title {
/* 将元素的字体加粗,使其在视觉上更加突出,用于强调步骤的标题内容,让用户更容易关注到每个步骤的重点信息 */
font-weight: bolder;
/* 设置元素的文本颜色为#555555这是一种深灰色系颜色用于作为步骤标题的文本颜色使其与整体页面风格相协调同时又能与其他文本内容如描述部分在颜色上有所区分增强层次感 */
color: #555555;
}
/* 定义类名为.step-item-main-desc 的元素的样式,从命名推测是用于设置步骤主要内容中的描述部分的样式,比如文本颜色等 */
.step-item-main-desc {
/* 设置元素的文本颜色为#aaaaaa这是一种浅灰色系颜色用于作为步骤描述的文本颜色使其在视觉上相对标题等内容更弱化一些体现出标题与描述的主次关系同时也使整体页面文字信息的呈现更加协调 */
color: #aaaaaa;
}
/* 选择类名为.lay-step 的元素后面紧邻的具有[carousel-item]属性的元素,在其之前(::before伪元素的内容设置为不显示可能是用于去除某些默认的伪元素生成的样式内容避免对布局或视觉效果产生不必要的影响 */
.lay-step + [carousel-item]:before {
display: none;
}
/* 选择类名为.lay-step 的元素后面紧邻的具有[carousel-item]属性的元素内部的所有子元素(*通配符),将它们的背景色设置为透明,可能是为了清除默认的背景颜色或者实现某种特定的透明背景效果,使其能更好地融入整体页面布局中,不影响其他元素的显示效果 */
.lay-step + [carousel-item] > * {
background-color: transparent;
}

@ -1,18 +1,27 @@
/* 定义类名为.treeTable-empty的元素的样式 */
.treeTable-empty {
/* 设置元素的宽度为20px用于控制该元素在页面中水平方向上占据一定的空间大小具体的用途可能根据页面布局和功能需求而定 */
width: 20px;
/* 将元素设置为行内块级元素,这样它既可以像行内元素一样在一行内与其他元素依次排列,又能像块级元素一样设置宽度、高度等尺寸属性以及内外边距等样式 */
display: inline-block;
}
/* 定义类名为.treeTable-icon的元素的样式 */
.treeTable-icon {
/* 当鼠标指针移动到该元素上时,将鼠标指针的样式变为手型指针(通常用于表示该元素是可点击、可交互的),增强用户交互的视觉提示效果 */
cursor: pointer;
}
.treeTable-icon .layui-icon-triangle-d:before {
/* 定义类名为.treeTable-icon下的类名为layui-icon-triangle-d:before的伪元素的样式 */
.treeTable-icon.layui-icon-triangle-d:before {
/* 使用content属性来设置伪元素的内容这里设置为"\e623"它可能对应着特定字体图标库比如Layui框架可能使用的图标字体中的一个图标编码用于显示特定的三角形图标从编码推测可能是闭合状态的三角形图标 */
content: "\e623";
}
.treeTable-icon.open .layui-icon-triangle-d:before {
/* 定义类名为.treeTable-icon且同时具有open类名的元素下的类名为layui-icon-triangle-d:before的伪元素的样式 */
.treeTable-icon.open.layui-icon-triangle-d:before {
/* 同样使用content属性来更改伪元素的内容设置为"\e625"推测是对应另一种三角形图标可能是展开状态的三角形图标用于在元素处于打开open状态时显示不同的图标来表示状态变化 */
content: "\e625";
/* 将伪元素的背景颜色设置为透明,避免出现不必要的背景色干扰图标显示或者与页面整体布局不协调的情况,确保图标能以期望的样式呈现出来 */
background-color: transparent;
}
}

@ -1,34 +1,45 @@
// Animated Icons
// --------------------------
/* 以下是针对带有特定类名(通过变量 @{fa-css-prefix} 拼接 -spin 形成的类名)的元素设置的样式,用于创建一个持续旋转的动画效果 */
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
/* 使用 -webkit- 前缀的动画属性,定义了一个名为 fa-spin 的动画动画时长为2秒循环播放无限次并且动画的时间函数为线性即匀速旋转。这个属性适用于基于WebKit内核的浏览器如Chrome、Safari等 */
-webkit-animation: fa-spin 2s infinite linear;
/* 使用标准的动画属性(无前缀),同样定义名为 fa-spin 的动画,参数与上面 -webkit- 前缀的属性一致用于在支持标准CSS动画的现代浏览器中实现相同的动画效果 */
animation: fa-spin 2s infinite linear;
}
/* 以下是针对带有特定类名(通过变量 @{fa-css-prefix} 拼接 -pulse 形成的类名)的元素设置的样式,用于创建一种脉冲式的旋转动画效果 */
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
/* 使用 -webkit- 前缀的动画属性,定义名为 fa-spin 的动画动画时长为1秒循环播放无限次动画的时间函数采用 steps(8)意味着动画将在1秒内分8个等距的步骤来完成呈现出一种类似脉冲跳动的效果适用于WebKit内核浏览器 */
-webkit-animation: fa-spin 1s infinite steps(8);
/* 使用标准的动画属性(无前缀),同样定义名为 fa-spin 的动画,参数与上面 -webkit- 前缀的属性一致用于在支持标准CSS动画的现代浏览器中实现相同的脉冲式旋转动画效果 */
animation: fa-spin 1s infinite steps(8);
}
/* 以下是使用 -webkit- 前缀定义的名为 fa-spin 的动画关键帧规则用于描述动画在不同阶段从开始到结束的样式变化情况主要针对基于WebKit内核的浏览器 */
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
/* 在动画开始0% 的阶段设置元素的旋转角度为0度即初始状态下元素不进行旋转 */
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
/* 在动画结束100% 的阶段设置元素的旋转角度为359度几乎旋转一圈实现一个完整的旋转动作使得元素呈现出持续旋转的视觉效果 */
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
/* 以下是定义的名为 fa-spin 的动画关键帧规则标准的无前缀版本用于描述动画在不同阶段的样式变化情况适用于支持标准CSS动画的现代浏览器其作用与上面 -webkit- 前缀的关键帧规则一致,都是实现元素的旋转动画效果 */
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

@ -1,25 +1,57 @@
// Bordered & Pulled
// -------------------------
/* 以下是针对带有特定类名(通过变量 @{fa-css-prefix} 拼接 -border 形成的类名)的元素设置的样式,用于创建带有边框的元素效果 */
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
/* 设置元素内部的上、右、下、左内边距分别为.2em、.25em、.15em、.25emem是相对单位根据元素的字体大小来计算实际尺寸用于在元素内部内容周围预留一定的空白空间避免内容紧贴边框 */
padding:.2em.25em.15em;
/* 为元素添加一个宽度为.08em的实心边框,边框颜色由变量 @fa-border-color 定义(在实际使用中,该变量应被替换为具体的颜色值),用于给元素添加一个具有明显边界的视觉效果 */
border: solid.08em @fa-border-color;
/* 将元素的四个角设置为圆角,圆角半径为.1em,使元素的边框看起来更加圆润,增强视觉美感 */
border-radius:.1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
/* 以下是针对带有特定类名(通过变量 @{fa-css-prefix} 拼接 -pull-left 形成的类名)的元素设置的样式,用于将元素向左浮动 */
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
.@{fa-css-prefix}-pull-left {
float: left;
}
/* 以下是针对带有特定类名(通过变量 @{fa-css-prefix} 拼接 -pull-right 形成的类名)的元素设置的样式,用于将元素向右浮动 */
.@{fa-css-prefix}-pull-right {
float: right;
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
/* 以下是针对同时带有 @{fa-css-prefix} 类名和 @{fa-css-prefix}-pull-left 类名的元素设置的样式,用于调整向左浮动元素的右侧外边距 */
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
&.@{fa-css-prefix}-pull-left {
margin-right:.3em;
}
/* 以下是针对同时带有 @{fa-css-prefix} 类名和 @{fa-css-prefix}-pull-right 类名的元素设置的样式,用于调整向右浮动元素的左侧外边距 */
&.@{fa-css-prefix}-pull-right {
margin-left:.3em;
}
}
/* 以下部分代码被标记为已废弃Deprecated as of 4.4.0意味着在版本4.4.0之后不建议使用这些样式类,但为了兼容旧代码可能仍然保留在这里 */
/* 定义类名为 pull-right 的元素的样式,用于将元素向右浮动,这是一种旧的、可能在早期版本中使用的类名,现在推荐使用 @{fa-css-prefix}-pull-right 类名来实现相同功能 */
.pull-right {
float: right;
}
/* 定义类名为 pull-left 的元素的样式,用于将元素向左浮动,同样是旧的类名,现在推荐使用 @{fa-css-prefix}-pull-left 类名来实现相同功能 */
.pull-left {
float: left;
}
/* 以下是针对同时带有 @{fa-css-prefix} 类名和 pull-left 类名的元素设置的样式,用于调整向左浮动元素的右侧外边距,这部分代码与上面使用新类名的设置类似,但由于使用了旧类名,可能在未来版本中被移除 */
.@{fa-css-prefix} {
&.pull-left {
margin-right:.3em;
}
/* 以下是针对同时带有 @{fa-css-prefix} 类名和 pull-right 类名的元素设置的样式,用于调整向右浮动元素的左侧外边距,同样是与旧类名相关的设置,未来可能被移除 */
&.pull-right {
margin-left:.3em;
}
}

@ -1,60 +1,90 @@
// Mixins
// --------------------------
/*
* Mixins混入部分的样式规则在CSS预处理器如Sass、Less等Mixins可以理解为可复用的代码片段能够被其他样式规则引入并复用其中的样式属性定义。
* 以下是名为.fa-icon的混入样式定义通常用于创建具有通用图标样式特点的元素样式设置方便后续在多个地方复用统一的图标显示相关的样式规则。
*/
.fa-icon() {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* 将元素设置为行内块级元素,使其既可以像行内元素一样在一行内与其他元素依次排列,又能像块级元素一样设置宽度、高度等尺寸属性以及内外边距等样式,这是图标元素常见的显示方式,方便布局和与其他内容结合显示 */
display: inline-block;
/* 定义元素的字体相关属性这里采用了一种缩写的字体声明方式设置了字体的粗细、样式、变体以及字体族等属性指定使用FontAwesome字体通常是用于显示图标字体的字体库同时字体大小基于变量 @fa-font-size-base 和 @fa-line-height-base 来设置(这两个变量在实际使用中应被替换为具体的数值,用于控制图标字体的基本尺寸和行高) */
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome;
/* 由于上面的字体声明中不能直接设置字体大小继承父元素的字体大小在某些预处理器语法限制下所以这里单独使用font-size: inherit来明确让元素的字体大小继承父元素的字体大小保证图标在不同环境下能自适应合适的大小 */
font-size: inherit;
/* 设置文本渲染方式为自动text-rendering: auto因为设置为optimizelegibility优化可读性可能会导致一些显示问题注释中提到的#1094问题可能是在特定浏览器或场景下出现的兼容性等问题保持默认的自动渲染方式能确保文本这里主要是图标字体对应的字符正常显示 */
text-rendering: auto;
/* 在基于WebKit内核的浏览器如Chrome、Safari等设置字体平滑效果为抗锯齿antialiased使图标字体显示更加清晰、平滑提升视觉质量 */
-webkit-font-smoothing: antialiased;
/* 在基于Mozilla的操作系统如Firefox浏览器在Mac等系统上设置字体平滑效果为灰度模式grayscale同样是为了让图标字体显示效果更好更贴合系统的视觉风格 */
-moz-osx-font-smoothing: grayscale;
}
/*
* 以下是名为.fa-icon-rotate的混入样式定义用于创建能够对元素进行旋转操作的样式规则可根据传入的参数来控制旋转的角度和方式可能在不同浏览器环境下的实现方式有所不同
*/
.fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
transform: rotate(@degrees);
/* 在旧版本的Internet Explorer浏览器使用-ms-filter属性来实现一些图形变换效果这里是旋转通过特定的滤镜语法"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})")来设置元素的旋转角度,其中@{rotation}是传入的参数,用于指定具体的旋转值(具体的取值规则和对应效果根据该滤镜的机制来定) */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
/* 在基于WebKit内核的浏览器中使用 -webkit-transform 属性来设置元素的旋转角度,@{degrees}是传入的参数,表示旋转的具体度数,实现元素的旋转效果 */
-webkit-transform: rotate(@degrees);
/* 在旧版本的Internet Explorer浏览器使用 -ms-transform 属性来实现图形变换,兼容其特定的渲染引擎)中,同样设置元素的旋转角度,与其他浏览器的旋转设置保持一致,确保在不同浏览器下元素都能按预期旋转 */
-ms-transform: rotate(@degrees);
/* 使用标准的CSS transform属性无前缀来设置元素的旋转角度适用于现代的支持标准CSS变换的浏览器使元素按照传入的角度参数进行旋转 */
transform: rotate(@degrees);
}
/*
* 以下是名为.fa-icon-flip的混入样式定义用于创建能够对元素进行翻转缩放操作来模拟翻转效果的样式规则根据传入的水平、垂直方向的参数以及旋转相关参数来控制翻转的具体样式。
*/
.fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
-webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
/* 在旧版本的Internet Explorer浏览器中通过特定的滤镜语法"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)")来设置元素的翻转和旋转相关效果,其中@{rotation}和其他参数用于控制具体的变换方式mirror=1表示进行镜像翻转操作具体的实现机制基于该浏览器滤镜的功能 */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
/* 在基于WebKit内核的浏览器中使用 -webkit-transform 属性来通过缩放操作scale函数传入水平和垂直方向的缩放参数 @horiz 和 @vert来模拟元素的翻转效果实现元素在水平和垂直方向上的拉伸或压缩从而呈现出翻转的视觉变化 */
-webkit-transform: scale(@horiz, @vert);
/* 在旧版本的Internet Explorer浏览器中同样使用 -ms-transform 属性并通过缩放操作来模拟元素的翻转效果,确保在该浏览器下也能实现类似的视觉变换 */
-ms-transform: scale(@horiz, @vert);
/* 使用标准的CSS transform属性无前缀来通过缩放操作模拟元素的翻转效果适用于现代浏览器使元素按照传入的水平和垂直方向参数进行相应的翻转视觉上的缩放变形操作 */
transform: scale(@horiz, @vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
/*
* 以下是名为.sr-only的混入样式定义用于创建一种隐藏元素内容但仍保留其在HTML结构中的样式规则主要是为了让屏幕阅读器辅助无障碍访问的工具帮助视力障碍等用户获取网页信息能够读取内容而在视觉上对普通用户隐藏该内容常用于一些辅助性的文本信息等场景。
*/
.sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
/* 将元素设置为绝对定位,方便将其移出可视区域,使其在页面上不显示出来,但仍占据一定的空间位置(通过后续的尺寸等设置来控制其实际占用空间极小) */
position: absolute;
/* 设置元素的宽度为1px使其在水平方向上几乎不占据可视空间但又能保证其存在于页面布局中让屏幕阅读器能够识别到 */
width: 1px;
/* 设置元素的高度为1px同理在垂直方向上也几乎不占据可视空间 */
height: 1px;
/* 将元素的内边距设置为0去除内部可能存在的空白空间进一步减小其在页面布局中的实际影响 */
padding: 0;
/* 设置元素的外边距为 -1px通过负外边距将其稍微移出正常的页面布局流确保其在视觉上完全不可见 */
margin: -1px;
/* 设置元素的溢出内容隐藏,避免内部可能存在的超出元素尺寸的内容显示出来,保持其极小的空间占用 */
overflow: hidden;
/* 使用 clip 属性结合rect函数来裁剪元素的可视区域将其设置为一个点坐标都为0进一步确保元素内容在视觉上不可见这是一种常见的用于隐藏元素同时保留可访问性的技术手段 */
clip: rect(0,0,0,0);
/* 将元素的边框设置为0去除可能存在的边框显示使其完全隐藏起来 */
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
/*
* 以下是名为.sr-only-focusable的混入样式定义通常需要与.sr-only混入样式一起使用用于创建一种当元素获得焦点如通过键盘Tab键聚焦等操作显示元素内容的样式规则常用于一些需要在特定交互情况下如获得焦点时提供额外提示信息等才显示隐藏内容的场景。
*/
.sr-only-focusable() {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}
&:active,
&:focus {
/* 当元素处于激活如鼠标点击按下等情况对于一些可交互元素或获得焦点状态时将元素的定位方式恢复为默认的静态定位static使其回到正常的页面布局流中与其他元素一样正常显示 */
position: static;
/* 将元素的宽度设置为自动auto让其根据内部内容自动撑开宽度显示出完整的内容宽度不再保持之前隐藏时的极小宽度状态 */
width: auto;
/* 同理,将元素的高度也设置为自动,根据内容自适应高度,完整显示内容 */
height: auto;
/* 将元素的外边距设置为0去除之前为了隐藏而设置的负外边距等使其在页面中正常布局与周围元素保持合适的间距关系 */
margin: 0;
/* 设置元素的溢出内容为可见,使内部所有内容都能正常显示出来,不再隐藏溢出部分 */
overflow: visible;
/* 将元素的裁剪属性设置为自动clip: auto取消之前用于隐藏的裁剪设置确保内容能完整呈现 */
clip: auto;
}
}

@ -1,34 +1,58 @@
// Spinning Icons
// --------------------------
// .#{$fa-css-prefix}-spin
// $fa-css-prefix CSSSassLess
.#{$fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
// WebKitChromeSafari使 -webkit-animationfa-spin
//
// - 22
// - infinite使
// - linear线
-webkit-animation: fa-spin 2s infinite linear;
// CSSfa-spin-webkit-animation
//
animation: fa-spin 2s infinite linear;
}
// .#{$fa-css-prefix}-pulse使
.#{$fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
// WebKit使 -webkit-animationfa-spin
// - 1使
// - infinite
// - steps(8)18
-webkit-animation: fa-spin 1s infinite steps(8);
// CSSfa-spin-webkit-animation
animation: fa-spin 1s infinite steps(8);
}
// 使 -webkit- fa-spinWebKit
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
// 0% -webkit-transformWebKitCSStransformCSS便0
//
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
// 100%359360
// 0%100%infinitefa-spinWebKit
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
// fa-spinCSS -webkit-
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

@ -1,25 +1,58 @@
// Bordered & Pulled
// -------------------------
// .#{$fa-css-prefix}-border使
// $fa-css-prefix CSSSassLess
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
// .2em.25em.15em.25emem使
padding:.2em.25em.15em;
// .08em $fa-border-color 使
border: solid.08em $fa-border-color;
// .1em使使
border-radius:.1em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
// .#{$fa-css-prefix}-pull-left使
.#{$fa-css-prefix}-pull-left {
float: left;
}
// .#{$fa-css-prefix}-pull-right
.#{$fa-css-prefix}-pull-right {
float: right;
}
// .#{$fa-css-prefix}.#{$fa-css-prefix}-pull-left使
.#{$fa-css-prefix} {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
&.#{$fa-css-prefix}-pull-left {
margin-right:.3em;
}
// .#{$fa-css-prefix}.#{$fa-css-prefix}-pull-right使
&.#{$fa-css-prefix}-pull-right {
margin-left:.3em;
}
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
// Deprecated as of 4.4.04.4.0使
// pull-right使使.#{$fa-css-prefix}-pull-right
.pull-right {
float: right;
}
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
// pull-left使.#{$fa-css-prefix}-pull-left
.pull-left {
float: left;
}
// .#{$fa-css-prefix}pull-left使使使
.#{$fa-css-prefix} {
&.pull-left {
margin-right:.3em;
}
// .#{$fa-css-prefix}pull-right使
&.pull-right {
margin-left:.3em;
}
}

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"

Loading…
Cancel
Save