branch_liu
LiuChang 3 months ago
parent affd83e652
commit cedccae9d5

@ -6,53 +6,136 @@
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--
设置该JSP页面的相关属性。
contentType属性指定了页面响应的内容类型为"text/html"即HTML格式同时将字符编码设置为UTF-8这样能保证页面中的中文等特殊字符可以正确显示避免出现乱码情况。
language属性表明该页面使用Java语言来编写服务器端的代码逻辑例如使用Java代码片段或者基于Java的标签库等
-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<!--
引入JSTLJavaServer Pages Standard Tag Library的核心标签库设置前缀为“c”。通过这个标签库我们可以在JSP页面中方便地使用如条件判断、循环遍历等功能实现更灵活的页面逻辑控制。
-->
<html>
<head>
<!--
设置页面的标题这个标题通常会显示在浏览器的标签页上用于标识当前页面的主题内容此处标题暂设置为“Title”实际应用中可根据具体需求修改为更有意义的标题内容。
-->
<title>Title</title>
<!--
引入Bootstrap框架的CSS样式文件通过EL表达式 "${pageContext.request.contextPath}/css/bootstrap.css" 来指定样式文件的路径。
"${pageContext.request.contextPath}" 会获取当前Web应用的上下文路径即项目部署后的根路径部分然后拼接上相对路径 "/css/bootstrap.css"这样就能准确地找到并应用Bootstrap框架提供的样式使页面具有相应的布局和外观效果。
-->
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css">
<!--
引入jQuery库的JavaScript文件路径同样通过EL表达式 "${pageContext.request.contextPath}/js/jquery-3.1.1.js" 来确定将其引入到页面中使得可以使用jQuery提供的各种强大的DOM操作、事件处理、AJAX等功能方便开发页面交互效果。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.1.1.js"></script>
<!--
引入Bootstrap框架配套的JavaScript文件通过 "${pageContext.request.contextPath}/js/bootstrap.js" 路径进行引入这个文件包含了Bootstrap框架中各种组件如模态框、下拉菜单等所依赖的JavaScript交互逻辑与前面引入的Bootstrap的CSS样式文件配合使用让页面能完整地展现出Bootstrap框架的功能和效果。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/bootstrap.js"></script>
<!--
引入layer弹出层插件的JavaScript文件其路径为 "${pageContext.request.contextPath}/layer/layer.js"layer插件常用于在页面中创建各种美观且交互友好的弹出层效果比如提示框、确认框、加载层等增强页面的用户交互体验。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/layer/layer.js"></script>
</head>
<body>
<br />
<form>
</head>
<body>
<!--
HTML中的换行标签在这里单纯起到在页面内容开始处添加一个空行的作用使页面布局看起来更加清晰避免内容过于紧凑在顶部主要是从视觉美观角度考虑的一个简单元素。
-->
<br />
<!--
创建一个HTML的表单form元素表单常用于收集用户输入的数据并提交到服务器端进行处理不过在当前代码中暂时未看到设置表单提交相关的属性如action属性指定提交的URL等可能后续根据具体需求还会完善这部分功能或者仅用于展示已有数据的布局结构。
-->
<form>
<!--
创建一个表格table元素并应用Bootstrap框架的 "table" 样式类,通过设置 "style="width: 100%;text-align: center;" 内联样式,将表格宽度设置为占满整个父容器(一般就是页面宽度),同时让表格内的文本内容在水平方向上居中显示,使表格呈现出整齐、美观的布局效果,用于展示宿舍相关信息。
-->
<table class="table" style="width: 100%;text-align: center;">
<tbody>
<tr>
<td style="text-align: center"><label>宿舍号</label></td>
<td colspan="3" style="text-align: center">${dorm.dorm_id}</td>
</tr>
<tr>
<td style="text-align: center"><label>宿舍简介</label></td>
<td colspan="3" style="text-align: center">${dorm.dorm_intro}</td>
</tr>
<tr>
<td style="text-align: center">
<label>宿舍奖惩</label>
</td>
<td colspan="3" style="text-align: center">${dorm.dorm_rps}</td>
</tr>
<tr>
<td style="text-align: center">
<label>宿舍长</label>
</td>
<td colspan="3" style="text-align: center">${dorm.dorm_leader}</td>
</tr>
<tr>
<td style="text-align: center"><label>育人导师</label></td>
<td colspan="3" style="text-align: center">${dorm.teacher}</td>
</tr>
<tbody>
<!--
创建表格中的一行tr元素用于放置宿舍号相关的信息单元格。
-->
<tr>
<!--
创建一个单元格td元素设置样式 "text-align: center" 使其内部文本在水平方向上居中显示,在这个单元格内放置一个<label>标签用于显示“宿舍号”的文本提示信息,告知用户该列对应的内容含义。
-->
<td style="text-align: center"><label>宿舍号</label></td>
<!--
创建一个跨3列的单元格通过设置 "colspan="3"" 属性用于显示宿舍号的具体值这里通过EL表达式 "${dorm.dorm_id}" 从服务器端传递过来的数据模型(名为 "dorm" 的对象)中获取宿舍号属性的值并展示在页面上,让用户可以看到具体的宿舍号信息。
-->
<td colspan="3" style="text-align: center">${dorm.dorm_id}</td>
</tr>
<!--
创建表格中的另一行tr元素用于放置宿舍简介相关的信息单元格。
-->
<tr>
<!--
创建一个单元格td元素设置样式使其内部文本居中放置一个<label>标签显示“宿舍简介”的提示文本,用于说明该列展示的内容是宿舍的简介信息。
-->
<td style="text-align: center"><label>宿舍简介</label></td>
<!--
创建一个跨3列的单元格通过EL表达式 "${dorm.dorm_intro}" 从服务器端数据模型中获取宿舍简介的内容并展示出来,让用户了解该宿舍的相关介绍信息,同样设置文本居中显示的样式。
-->
<td colspan="3" style="text-align: center">${dorm.dorm_intro}</td>
</tr>
<!--
创建表格中的又一行tr元素用于放置宿舍奖惩相关的信息单元格。
-->
<tr>
<!--
创建一个单元格td元素设置文本居中样式放置一个<label>标签显示“宿舍奖惩”的提示文本,表明该列展示的是宿舍在奖惩方面的情况。
-->
<td style="text-align: center">
<label>宿舍奖惩</label>
</td>
<!--
创建一个跨3列的单元格通过EL表达式 "${dorm.dorm_rps}" 从服务器端数据模型获取宿舍奖惩的相关内容并展示在页面上,方便用户知晓该宿舍在奖惩方面的记录情况,设置文本居中样式。
-->
<td colspan="3" style="text-align: center">${dorm.dorm_rps}</td>
</tr>
<!--
创建表格中的一行tr元素用于放置宿舍长相关的信息单元格。
-->
<tr>
<!--
创建一个单元格td元素设置文本居中样式放置一个<label>标签显示“宿舍长”的提示文本,用于提示该列展示的是宿舍长的相关信息。
-->
<td style="text-align: center">
<label>宿舍长</label>
</td>
<!--
创建一个跨3列的单元格通过EL表达式 "${dorm.dorm_leader}" 从服务器端数据模型获取宿舍长的相关信息(可能是姓名等具体内容)并展示出来,让用户知道该宿舍的宿舍长是谁,设置文本居中样式。
-->
<td colspan="3" style="text-align: center">${dorm.dorm_leader}</td>
</tr>
<!--
创建表格中的一行tr元素用于放置育人导师相关的信息单元格。
-->
<tr>
<!--
创建一个单元格td元素设置文本居中样式放置一个<label>标签显示“育人导师”的提示文本,表明该列展示的是育人导师的相关信息。
-->
<td style="text-align: center"><label>育人导师</label></td>
<!--
创建一个跨3列的单元格通过EL表达式 "${dorm.teacher}" 从服务器端数据模型获取育人导师的相关信息(比如姓名等)并展示出来,方便用户了解该宿舍对应的育人导师是谁,设置文本居中样式。
-->
<td colspan="3" style="text-align: center">${dorm.teacher}</td>
</tr>
<!--
使用JSTL的<if条件判断标签判断当前会话session范围中名为 "adminInfo" 的对象的 "power" 属性值是否等于1可能表示管理员具备某种特定权限如果满足条件则执行标签内部的代码展示一个“去修改”的按钮链接用于跳转到修改宿舍信息的页面。
-->
<c:if test="${sessionScope.adminInfo.power == 1}">
<tr>
<!--
创建一个跨4列的单元格通过设置 "colspan="4"" 属性在这个单元格内创建一个超链接a元素并应用Bootstrap框架的 "btn btn-warning" 样式类,使其显示为一个具有警告颜色(通常是黄色等醒目颜色)的按钮样式,
href属性通过EL表达式 "${pageContext.request.contextPath}/dorm/toUpdate?id=${dorm.id}" 设置链接的目标URL其中 "${pageContext.request.contextPath}/dorm/toUpdate" 指向用于进入修改宿舍信息页面的服务器端接口路径,"id=${dorm.id}" 表示将当前宿舍的ID作为参数传递过去方便服务器端根据这个ID获取对应的宿舍信息进行修改操作整体实现点击按钮跳转到修改页面的功能。
-->
<td colspan="4"><a class="btn btn-warning" href="${pageContext.request.contextPath}/dorm/toUpdate?id=${dorm.id}">去修改</a></td>
</tr>
</c:if>
</tbody>
</table>
</form>
</body>
</html>
</table>
</form>
</body>
</html>

@ -6,74 +6,191 @@
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--
设置该JSP页面的相关属性。
contentType属性指定了页面响应的内容类型为"text/html"即HTML格式同时将字符编码设置为UTF-8这样能保证页面中的中文等特殊字符可以正确显示避免出现乱码情况。
language属性表明该页面使用Java语言来编写服务器端的代码逻辑例如使用Java代码片段或者基于Java的标签库等
-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<!--
引入JSTLJavaServer Pages Standard Tag Library的核心标签库设置前缀为“c”。通过这个标签库我们可以在JSP页面中方便地使用如条件判断、循环遍历等功能实现更灵活的页面逻辑控制。
-->
<html>
<head>
<!--
设置页面的字符编码为UTF-8确保浏览器能正确解析并显示页面中的各种字符防止出现乱码现象虽然在上面的page指令中已经设置了字符编码但这里再次明确一下也是一种良好的习惯保证兼容性。
-->
<meta charset="UTF-8" />
<!--
设置页面渲染所使用的引擎为webkit让页面在支持webkit的浏览器中按照该引擎的规则进行渲染有助于呈现出期望的页面样式和交互效果针对移动端页面webkit引擎能提供较好的兼容性和性能表现。
-->
<meta name="renderer" content="webkit" />
<!--
设置页面的视口viewport属性用于控制页面在移动端设备上的显示效果。
width=device-width表示页面宽度跟随设备宽度自适应initial-scale=1.0设置初始缩放比例为1.0maximum-scale=1.0限制最大缩放比例为1.0user-scalable=0表示禁止用户手动缩放页面uc-fitscreen=yes用于适配UC浏览器的屏幕显示特定浏览器相关设置这些设置可以让页面在移动端有合适的展示效果适配不同屏幕尺寸的设备。
-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0,uc-fitscreen=yes" />
<!--
设置页面在iOS系统下的Web应用相关属性content="yes"表示该网页可以作为一个独立的Web应用在iOS设备的主屏幕上以全屏模式运行提供类似原生应用的体验。
-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!--
设置iOS系统下Web应用状态栏的样式为黑色用于统一页面在iOS设备上的显示风格使其更加美观和符合视觉习惯。
-->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<!--
设置禁止页面自动识别电话号码,避免页面中的数字被误识别为电话号码并添加点击拨号的链接等情况,保持页面内容的原始展示意图。
-->
<meta name="format-detection" content="telephone=no" />
<!--
设置页面的标题,这个标题通常会显示在浏览器的标签页上,用于标识当前页面的主题内容,此处标题设置为“来访登记”,清晰地表明了该页面的主要功能是进行来访登记操作。
-->
<title>来访登记</title>
<!-- miniMObile.css、js -->
<!--
引入miniMObile框架的CSS样式文件通过EL表达式 "${pageContext.request.contextPath}/css/miniMobile.css" 来指定样式文件的路径。
"${pageContext.request.contextPath}" 会获取当前Web应用的上下文路径即项目部署后的根路径部分然后拼接上相对路径 "/css/miniMobile.css"这样就能准确地找到并应用miniMObile框架提供的样式使页面具有相应的布局和外观效果。
-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/miniMobile.css"/>
<!--
引入jQuery库的JavaScript文件路径同样通过EL表达式 "${pageContext.request.contextPath}/js/jquery-3.1.1.js" 来确定将其引入到页面中使得可以使用jQuery提供的各种强大的DOM操作、事件处理、AJAX等功能方便开发页面交互效果。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.1.1.js"></script>
<!--
引入layer弹出层插件的JavaScript文件其路径为 "${pageContext.request.contextPath}/layer/layer.js"layer插件常用于在页面中创建各种美观且交互友好的弹出层效果比如提示框、确认框、加载层等增强页面的用户交互体验这里主要用于显示一些提示信息给用户。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/layer/layer.js"></script>
<!--
引入zepto.min.js文件zepto是一个轻量级的JavaScript库与jQuery类似提供了简洁易用的DOM操作、事件处理等功能常用于移动端页面开发它在文件大小上相对更轻量适合移动端对性能和资源占用有要求的场景这里引入可能是为了在页面中使用它的一些特性来实现交互功能。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/zepto.min.js"></script>
<!--
引入miniMobile.js文件这应该是与前面引入的miniMobile.css配套的JavaScript文件可能包含了miniMObile框架中各种组件或功能所依赖的交互逻辑用于实现页面中基于该框架的一些特定交互效果或业务逻辑。
-->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/miniMobile.js"></script>
<!-- mobileSelect -->
<!--
引入mobileSelect组件的CSS样式文件用于为页面中的下拉选择组件可能是自定义的具有更丰富功能的选择器提供样式使其在页面上呈现出特定的外观风格通过指定路径 "${pageContext.request.contextPath}/css/mobileSelect.css" 来准确引入该样式文件。
-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/mobileSelect.css">
<!--
引入mobileSelect组件的JavaScript文件该文件包含了mobileSelect组件实现下拉选择等交互功能的具体逻辑代码路径为 "${pageContext.request.contextPath}/js/mobileSelect.js",引入后可在页面中使用该组件来实现更友好的选择操作界面。
-->
<script src="${pageContext.request.contextPath}/js/mobileSelect.js" type="text/javascript"></script>
<!-- noUiSlider -->
<!--
引入noUiSlider组件的CSS样式文件noUiSlider通常用于在页面中创建滑块组件用于选择数值范围等交互操作这里引入其样式文件 "${pageContext.request.contextPath}/css/nouislider.css" 是为了给该组件应用相应的样式,使其在页面上正确显示外观。
-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/nouislider.css" />
<!-- switchery -->
<!--
引入switchery组件的CSS样式文件switchery一般用于创建开关样式的交互组件通过引入 "${pageContext.request.contextPath}/css/switchery.css" 样式文件,能让该组件在页面上呈现出对应的样式效果,方便用户进行开关操作等交互。
-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/switchery.css"/>
<!-- iconfont -->
<!--
引入iconfont.css文件这通常是用于引入自定义的图标字体文件通过字体文件来展示各种图标相比于传统的图片图标字体图标在缩放、修改颜色等方面更方便灵活且能减少页面加载的图片资源数量提高性能这里通过指定路径 "${pageContext.request.contextPath}/css/iconfont.css" 来引入对应的图标字体样式文件。
-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/iconfont.css" />
<!-- animate.css -->
<!--
引入animate.css文件这是一个非常流行的CSS动画库通过链接 "https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.css" 从CDN内容分发网络引入该文件它提供了大量预定义的CSS动画类可以方便地应用到页面元素上实现各种酷炫的动画效果增强页面的视觉吸引力。
-->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.css" />
</head>
<body class="pb12 fadeIn animated">
<header class="formheader w75 h8 f30 color6 bg-color-info" style="text-align: center;">
</head>
<body class="pb12 fadeIn animated">
<!--
创建一个页面头部header元素应用了多个样式类如 "formheader" 应该是自定义的用于头部样式的类,"w75" 可能表示宽度占父容器的75%(具体取决于样式定义),"h8" 可能表示高度相关的设置(同样依赖具体样式定义),"f30" 大概率是设置字体大小为30单位可能是像素等由样式决定"color6" 和 "bg-color-info" 分别用于设置文本颜色和背景颜色这些颜色类的具体颜色值由对应的CSS文件定义同时通过内联样式 "text-align: center;" 设置文本在头部元素内水平居中显示,该头部元素用于展示页面的主要标题“学生来访登记”。
-->
<header class="formheader w75 h8 f30 color6 bg-color-info" style="text-align: center;">
学生来访登记
</header>
<style>
</header>
<style>
.formheader {
line-height: 0.7rem;
line-height: 0.7rem;
/*
设置头部元素(.formheader类的行高为0.7rem行高用于控制文本行之间的垂直间距合理设置行高可以让文本在元素内看起来更加整齐、美观这里使用相对单位rem能更好地根据页面根元素的字体大小进行自适应调整。
*/
}
.formheader span {
display: inline-block;
display: inline-block;
/*
设置头部元素内的<span>子元素以行内块级元素inline-block方式显示这样既可以像行内元素一样在一行内排列又能像块级元素一样设置宽度、高度等样式属性方便对头部内的特定元素进行布局和样式调整。
*/
}
.formheader input {
border: none;
border: none;
/*
设置头部元素内的<input>输入框元素去除边框样式,使其外观更加简洁,可能是为了符合页面整体的设计风格,避免输入框的边框影响视觉效果。
*/
}
</style>
<div class="p3 f30 f30 w75">
</style>
<!--
创建一个包含内容的容器div元素应用了多个样式类"p3" 可能表示该元素具有一定的内边距padding设置具体数值由样式定义"f30" 大概率是设置字体大小为30"w75" 可能表示宽度占父容器的75%,用于在页面中划分出一块用于放置来访登记表单内容的区域,使其在页面上有合适的布局位置和大小。
-->
<div class="p3 f30 f30 w75">
<!--
创建一个HTML的表单form元素用于收集用户输入的来访登记相关信息并将这些信息提交到服务器端进行处理。
action属性通过EL表达式 "${pageContext.request.contextPath}/visitor/addLogin" 指定了表单提交的目标URL即当用户点击提交按钮后表单数据将被发送到该路径对应的服务器端接口进行处理这里应该是处理来访登记的业务逻辑接口
method属性设置为"post"表示使用POST方法提交表单数据相对GET方法POST更适合用于提交包含敏感信息或者大量数据的表单因为数据会放在请求体中而不是URL上更加安全且数据量限制相对较小。
name属性设置为"myform"用于在JavaScript等代码中可以通过这个名称来引用该表单元素方便进行一些表单相关的操作如提交表单等
-->
<form action="${pageContext.request.contextPath}/visitor/addLogin" method="post" name="myform">
<div class="pt2 pb2">
姓名:
<input type="text" class="w59 form-control" name="name" id="name" placeholder="输入姓名" maxlength="10" />
</div>
<div>
学号:
<input type="text" class="w59 form-control" name="sno" id="sno" min="5" max="20" placeholder="输入学号" />
</div>
<div class="pt2 pb2">
手机:
<input type="text" class="w59 form-control" name="phone" id="phone" placeholder="输入联系方式" />
</div>
<div class="pt2 pb2">
楼宇:
<!--
创建一个包含内容的容器div元素应用了 "pt2 pb2" 样式类(可能表示有顶部和底部的内边距设置,具体由样式定义),用于在表单内划分出一个区域来放置姓名相关的输入框和提示文本,使页面布局更加清晰、有条理。
-->
<div class="pt2 pb2">
姓名:
<!--
创建一个文本输入框input元素类型type设置为"text",表示这是一个普通的文本输入框,用户可以在里面输入文字信息。
class属性应用了 "w59 form-control" 样式类,"w59" 可能用于设置输入框的宽度(具体由样式定义),"form-control" 通常是一些框架如Bootstrap等类似框架风格中用于统一输入框样式的类使其具有一定的外观风格如边框、圆角等效果。
name属性设置为"name",这个名称会作为表单数据提交到服务器端时的参数名,服务器端可以通过这个参数名获取用户输入的姓名信息。
id属性设置为"name"用于在JavaScript代码中通过该ID来唯一标识这个输入框元素方便获取其输入的值或者进行其他操作如验证输入内容等
placeholder属性设置为"输入姓名",用于在输入框内显示一个提示性的文本,当输入框为空时,提示用户应该输入什么内容,提高用户体验。
maxlength属性设置为"10"用于限制用户输入的字符长度最多为10个字符避免用户输入过长的姓名导致数据不符合要求或者页面显示异常等情况。
-->
<input type="text" class="w59 form-control" name="name" id="name" placeholder="输入姓名" maxlength="10" />
</div>
<!--
创建一个包含内容的容器div元素用于在表单内划分出一个区域来放置学号相关的输入框和提示文本使页面布局清晰方便用户区分不同的输入项。
-->
<div>
学号:
<!--
创建一个文本输入框input元素类型为"text",表示用于输入文本内容。
应用 "w59 form-control" 样式类来设置输入框的外观样式和宽度等属性,使其与页面整体风格统一。
name属性设置为"sno",作为提交到服务器端的参数名,方便服务器获取用户输入的学号信息。
id属性设置为"sno"用于在JavaScript代码中通过该ID来操作这个输入框元素比如获取输入的值进行验证等操作。
min和max属性分别设置为"5"和"20"这里可能是用于限制学号的长度范围不过在HTML5中对于普通文本输入框这种限制的实际效果可能有限更多的是一种提示作用真正的验证通常还需要在JavaScript或者服务器端进一步处理表示学号的长度应该在5到20个字符之间。
placeholder属性设置为"输入学号",在输入框为空时显示提示文本,引导用户输入正确的内容。
-->
<input type="text" class="w59 form-control" name="sno" id="sno" min="5" max="20" placeholder="输入学号" />
</div>
<!--
创建一个包含内容的容器div元素应用 "pt2 pb2" 样式类,在表单内划分出一个区域来放置手机号码相关的输入框和提示文本,使页面布局更加合理,便于用户操作和查看。
-->
<div class="pt2 pb2">
手机:
<!--
创建一个文本输入框input元素类型为"text",用于输入手机号码信息。
应用 "w59 form-control" 样式类来设置输入框的样式和宽度等,使其符合页面整体的视觉风格。
name属性设置为"phone",作为提交到服务器端的参数名,以便服务器获取用户输入的手机号码内容。
id属性设置为"phone"方便在JavaScript代码中通过该ID对这个输入框进行操作比如获取输入的值进行合法性验证等操作。
placeholder属性设置为"输入联系方式",在输入框为空时显示提示文本,引导用户输入手机号码信息。
-->
<input type="text" class="w59 form-control" name="phone" id="phone" placeholder="输入联系方式" />
</div>
<!--
创建一个包含内容的容器div元素应用 "pt2 pb2" 样式类在表单内划分出一个区域来放置楼宇相关的下拉选择框select和提示文本使用下拉选择框可以提供预定义的选项供用户选择方便用户操作且能保证输入数据的规范性。
-->
<div class="pt2 pb2">
楼宇:
<!-- 显示“楼宇”字样作为提示文本,告知用户接下来的选择框对应的内容含义 -->
<select class="w59 form-control" id="place" name="place">
<!-- 创建一个下拉选择框select元素应用 "w59 form-control" 样式类来控制其宽度及样式外观使其符合页面整体风格id 设置为 "place" 用于在 JavaScript 中通过该 ID 来获取其选中的值name 同样为 "place",以便表单提交时以此作为参数名向服务器端传递用户选择的楼宇信息 -->
<option value="西六一楼">西六一楼</option>
<!-- 创建一个下拉选项option元素其 value 属性值为 "西六一楼",表示当用户选择该项时,实际传递给服务器端的值就是 "西六一楼",显示的文本内容为 "西六一楼",供用户直观看到可选择的具体楼宇名称 -->
<option value="西六二楼">西六二楼</option>
<option value="西六三楼">西六三楼</option>
<option value="西七一楼">西七一楼</option>
<option value="西七二楼" selected="selected">西七二楼</option>
<!-- 此选项设置了 "selected" 属性,表示该选项在页面加载时默认被选中,即初始状态下用户看到的已选中的楼宇是 "西七二楼" -->
<option value="西七三楼">西七三楼</option>
<option value="西十二一楼">西十二一楼</option>
<option value="西十二二楼">西十二二楼</option>
@ -84,34 +201,53 @@
</select>
</div>
<div class="mt4 mb4">
<!-- 创建一个带有类名 "mt4 mb4" 的 div 容器推测可能是设置了顶部mt4和底部mb4的外边距用于在页面中进一步划分布局区域此处用于放置“备注”相关的输入框 -->
备注:
<!-- 显示“备注”字样作为提示文本,提示用户接下来的输入框用于填写访问原因等备注信息 -->
<input class="w59 h20 form-control" value="公事" id="visit_result" name="visit_result" placeholder="访问原因" />
<!-- 创建一个文本输入框input元素应用 "w59 h20 form-control" 样式类来控制其宽度、高度及样式外观使其与页面整体风格统一初始值value设置为 "公事"id 设置为 "visit_result" 用于在 JavaScript 中通过该 ID 操作该输入框name 为 "visit_result" 以便表单提交时以此作为参数名向服务器端传递用户输入的备注信息placeholder 属性设置为 "访问原因",当输入框为空时显示此提示文本引导用户输入内容 -->
</div>
<div class="t-c mt5">
<!-- 创建一个带有类名 "t-c mt5" 的 div 容器,推测 "t-c" 可能表示文本居中text-align: center样式相关设置"mt5" 可能是设置了顶部外边距,用于在页面中定位放置提交按钮的位置,使其在页面上有合适的布局呈现 -->
<input type="button" onclick="toCheck()" id="sub-btn" class="btn f30 btn-primary radius10 p2 w50" value="提交登记" />
<!-- 创建一个按钮类型type 为 "button")的输入框元素,点击时会触发名为 "toCheck" 的 JavaScript 函数(通过 onclick 属性指定),设置了 id 为 "sub-btn" 方便在 JavaScript 或 CSS 中对该按钮进行样式控制或操作,应用 "btn f30 btn-primary radius10 p2 w50" 样式类来赋予其按钮外观样式(比如颜色、圆角、内边距、宽度等样式效果),按钮显示的文本内容为 "提交登记",告知用户点击该按钮的作用 -->
</div>
</form>
</div>
<script>
function toCheck() {
var name = $("#name").val().trim();
var sno = $("#sno").val().trim();
var phone = $("#phone").val().trim();
var place = $("#place").val().trim();
var visit_result = $("#visit_result").val().trim();
if (name == null || sno == null || phone == null || place == null || visit_result == null
|| name.length == 0 || sno.length == 0 || phone.length == 0 || place.length == 0 || visit_result.length == 0) {
layer.msg('不能为空,请输入信息...');
return false;
</div>
<script>
function toCheck() {
// 定义一个名为 toCheck 的 JavaScript 函数,用于在点击提交按钮时进行表单数据的验证以及提交操作
var name = $("#name").val().trim();
// 通过 jQuery 选择器($)选取 id 为 "name" 的元素即前面的姓名输入框获取其输入的值val 方法),并使用 trim 方法去除输入值前后可能存在的空白字符,将处理后的结果存储在变量 name 中
var sno = $("#sno").val().trim();
// 同理,获取 id 为 "sno" 的学号输入框的值,去除空白字符后存储在变量 sno 中
var phone = $("#phone").val().trim();
// 获取 id 为 "phone" 的手机号码输入框的值,去除空白字符后存储在变量 phone 中
var place = $("#place").val().trim();
// 获取 id 为 "place" 的楼宇选择框选中项的值(即用户选择的楼宇名称),去除空白字符后存储在变量 place 中
var visit_result = $("#visit_result").val().trim();
// 获取 id 为 "visit_result" 的备注输入框的值,去除空白字符后存储在变量 visit_result 中
if (name == null || sno == null || phone == null || place == null || visit_result == null
|| name.length == 0 || sno.length == 0 || phone.length == 0 || place.length == 0 || visit_result.length == 0) {
// 进行条件判断,如果获取到的任何一个输入框的值为 null可能是未获取到元素等情况或者长度为 0即用户未输入任何内容则执行以下代码块
layer.msg('不能为空,请输入信息...');
// 使用 layer 插件弹出一个提示框,显示提示信息 "不能为空,请输入信息...",告知用户需要填写完整表单信息
return false;
// 返回 false阻止表单的提交操作因为此时表单数据不完整不符合提交要求
}
document.myform.submit();
// 如果所有输入框都有值(通过前面的条件判断),则通过 JavaScript 的原生方式获取名为 "myform" 的表单元素(前面在 form 标签中设置了 name 属性为 "myform"),并调用其 submit 方法来提交表单数据到服务器端,触发服务器端对应的处理逻辑(由 form 表单的 action 属性指定的 URL 对应的接口来处理)
}
document.myform.submit();
}
if (${logout_msg != null && !(logout_msg.trim().equals(""))}) {
layer.msg(${logout_msg});
}
if (${error_msg != null && !("".trim().equals(error_msg))}) {
layer.msg(${error_msg});
}
</script>
</body>
</html>
if (${logout_msg!= null &&!(logout_msg.trim().equals(""))}) {
// 使用 JSP 表达式语言EL进行条件判断判断名为 logout_msg 的变量是否不为 null 并且去除两端空白字符后不为空字符串,如果满足该条件,则执行以下代码块,此处可能是用于处理注销相关的提示信息显示逻辑
layer.msg(${logout_msg});
// 使用 layer 插件弹出提示框,显示 logout_msg 变量对应的消息内容,向用户展示相关提示信息(例如注销成功或失败等提示)
}
if (${error_msg!= null &&!("".trim().equals(error_msg))}) {
// 同样使用 EL 表达式进行条件判断,判断名为 error_msg 的变量是否不为 null 并且去除两端空白字符后不为空字符串,如果满足条件,则执行以下代码块,此处可能是用于处理其他错误相关的提示信息显示逻辑
layer.msg(${error_msg});
// 使用 layer 插件弹出提示框,显示 error_msg 变量对应的消息内容,向用户展示相应的错误提示信息(例如表单提交失败等错误提示)
}
</script>
</body>
</html>

@ -1,53 +1,90 @@
function highlight(s,id) {
if(s.length == 0) {
function highlight(s, id) {
// 判断传入的字符串s的长度是否为0如果长度为0表示可能不需要进行高亮相关操作了执行以下代码块
if (s.length == 0) {
// 通过document.getElementById方法根据传入的id获取对应的DOM元素并将其赋值给变量obj后续会对这个元素的innerHTML内容进行处理
var obj = document.getElementById(id);
// 使用正则表达式替换obj元素innerHTML中的内容目的是去除已经存在的带有"highlight"类名的<span>标签,只保留其内部的文本内容,
// 正则表达式 /<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi 用于匹配包含"highlight"类名的<span>标签及其内部的非尖括号内容(通过 ([^<>]*) 捕获),并将匹配到的内容替换为捕获的内部文本内容(通过 $1 引用捕获组)
var t = obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi, "$1");
// 将处理后的文本内容重新赋值给obj元素的innerHTML属性实现去除已有高亮标签的效果
obj.innerHTML = t;
// 返回false表示在这种字符串长度为0的情况下没有进行实际的搜索和高亮操作
return false;
}
// 调用内部定义的encode函数对传入的字符串s进行编码处理主要是对一些特殊字符进行转义等操作从函数内部实现可以看到具体转义的字符并将结果重新赋值给s
s = encode(s);
// 通过document.getElementById方法根据传入的id获取对应的DOM元素赋值给变量obj后续会基于这个元素来查找匹配的文本并进行高亮显示操作
var obj = document.getElementById(id);
// 同样使用正则表达式替换obj元素innerHTML中的内容去除已有的带有"highlight"类名的<span>标签只保留其内部文本内容与前面长度为0时的处理类似目的是先清理之前可能存在的高亮标记准备进行新的高亮操作
var t = obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi, "$1");
// 将清理后的文本内容重新赋值给obj元素的innerHTML属性
obj.innerHTML = t;
// 调用内部定义的loopSearch函数传入经过编码处理的字符串s和获取到的DOM元素obj这个函数会递归地在DOM元素及其子元素中查找匹配的文本内容并返回匹配到的次数将返回的结果赋值给变量cnt
var cnt = loopSearch(s, obj);
t = obj.innerHTML
// 获取obj元素当前的innerHTML内容并赋值给变量t后续会基于这个内容再次进行处理添加高亮显示的标签
var t = obj.innerHTML
// 定义一个正则表达式r用于匹配之前在文本中标记好的需要高亮显示的位置通过 {searchHL} 和 {/searchHL} 包裹的内容),以便后续将其替换为带有"highlight"类名的<span>标签来实现可视化的高亮效果
var r = /{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g
// 使用正则表达式r对变量t即obj元素的innerHTML内容进行替换操作将匹配到的用 {searchHL} 和 {/searchHL} 包裹的内容替换为带有"highlight"类名的<span>标签包裹的内容实现文本的高亮显示效果然后将替换后的结果重新赋值给变量t
t = t.replace(r, "<span class='highlight'>$1</span>");
// 将添加了高亮显示标签后的文本内容重新赋值给obj元素的innerHTML属性使得页面上对应的DOM元素中的文本呈现出高亮显示的效果
obj.innerHTML = t;
// 定义一个名为encode的内部函数用于对传入的字符串进行编码处理主要是对一些在正则表达式中有特殊含义或者HTML中有特殊用途的字符进行转义防止出现意外的匹配或解析问题
function encode(s) {
// 使用字符串的replace方法通过正则表达式匹配并替换相应的特殊字符将 & 替换为 & HTML实体编码转义< 替换为 < 防止被解析为HTML标签开头> 替换为 > 同理防止被解析为HTML标签结尾
// 对于正则表达式中有特殊含义的字符(如 \、.、*、[、]、(、)、$、^ 等),在其前面添加 \ 进行转义,使其在后续作为正则表达式内容时能按字面意思进行匹配,最后将处理后的字符串返回
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/([\\\.\*\[\]\(\)\$\^])/g, "\\$1");
}
// 定义一个名为decode的内部函数与encode函数作用相反用于对经过编码的字符串进行解码还原操作将转义后的字符恢复为原来的字符形式
function decode(s) {
// 使用字符串的replace方法通过正则表达式匹配并替换相应的转义字符将前面添加了 \ 转义的字符(如 \[ 等)还原为原来的字符(去除前面的 \
// 然后将 > 替换为 > < 替换为 < & 替换为 & ,恢复字符串中这些特殊字符的原始形式,最后将处理后的字符串返回
return s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g, "$1").replace(/>/g, ">").replace(/</g, "<").replace(/&/g, "&");
}
// 定义一个名为loopSearch的内部函数它会递归地在给定的DOM元素及其子元素中查找与传入字符串s匹配的文本内容并统计匹配的次数返回统计的匹配次数
function loopSearch(s, obj) {
// 初始化一个变量cnt用于记录匹配到的次数初始值设为0
var cnt = 0;
if(obj.nodeType == 3) {
// 判断当前DOM元素obj的节点类型是否为3在DOM中节点类型3表示文本节点如果是文本节点则调用内部的replace函数在这个文本节点中查找并替换匹配的文本内容并将返回的匹配次数赋值给cnt然后直接返回cnt
if (obj.nodeType == 3) {
cnt = replace(s, obj);
return cnt;
}
for(var i = 0, c; c = obj.childNodes[i]; i++) {
if(!c.className || c.className != "highlight") {
// 如果当前DOM元素不是文本节点说明可能是包含子节点的元素节点如<div>等通过循环遍历它的子节点使用childNodes属性获取子节点列表
// 对于每个子节点c判断如果其不存在className属性或者className属性不等于"highlight"即不是已经处理过的高亮显示的节点则递归调用loopSearch函数在这个子节点中继续查找匹配内容并将返回的匹配次数累加到变量cnt中
for (var i = 0, c; c = obj.childNodes[i]; i++) {
if (!c.className || c.className!= "highlight") {
cnt += loopSearch(s, c);
}
}
// 循环结束后将统计好的匹配次数cnt返回这个cnt就是整个DOM元素及其所有子元素中匹配到传入字符串s的总次数
return cnt;
}
// 定义一个名为replace的内部函数它用于在给定的文本节点dest中查找与传入字符串s匹配的文本内容并进行替换操作将匹配的内容用特定标记包裹起来后续会进一步处理为高亮显示的标签同时返回匹配到的次数
function replace(s, dest) {
// 根据传入的字符串s创建一个正则表达式对象r设置全局匹配模式g标志用于在文本节点中查找所有匹配的内容
var r = new RegExp(s, "g");
// 初始化一个变量tm用于存储通过正则表达式匹配到的结果初始值设为null
var tm = null;
// 获取文本节点dest的nodeValue属性即文本节点中的文本内容赋值给变量t后续会基于这个文本内容进行查找和替换操作
var t = dest.nodeValue;
// 初始化一个变量cnt用于记录匹配到的次数初始值设为0
var cnt = 0;
if(tm = t.match(r)) {
// 使用match方法在文本t中查找所有与正则表达式r匹配的内容如果匹配到了即tm不为null则执行以下代码块
if (tm = t.match(r)) {
// 将匹配到的次数即tm数组的长度因为match方法返回的数组包含了所有匹配到的内容赋值给变量cnt记录匹配的次数
cnt = tm.length;
// 使用replace方法对文本t进行替换操作将匹配到的内容替换为用 {searchHL} 和 {/searchHL} 包裹起来并且内部通过decode函数对匹配的字符串s进行解码还原后的内容
// 这样就标记好了需要后续处理为高亮显示的文本位置然后将替换后的结果重新赋值给文本节点dest的nodeValue属性实现文本内容的初步替换标记
t = t.replace(r, "{searchHL}" + decode(s) + "{/searchHL}")
dest.nodeValue = t;
}
// 将记录的匹配次数cnt返回供外部调用的函数如loopSearch函数获取并进一步处理比如累加统计总的匹配次数等
return cnt;
}
}

@ -1,147 +1,242 @@
layui.define(['jquery', 'layer'], function (exports){
layui.define(['jquery', 'layer'], function (exports) {
// 获取layui框架中引入的jQuery模块并将其赋值给变量$方便后续使用jQuery的相关功能如DOM操作、AJAX请求等
var $ = layui.jquery;
// 创建一个空对象chekedArr用于存储一些被选中的数据相关信息从后续代码推测可能是记录过滤组件中被选中的选项等情况其结构和具体用途会在后续代码中逐渐清晰
var chekedArr = {};
// 创建一个名为layfilter的对象用于封装与查询过滤组件相关的一系列功能方法比如初始化组件、获取选中值、绑定事件等操作
var layfilter = {
render:function(options){
// 定义名为render的方法用于渲染查询过滤组件该方法接收一个名为options的参数参数中应该包含了组件渲染所需的各种配置信息如请求数据的URL、筛选条件等
render: function (options) {
// 从传入的options参数中获取名为url的属性值该值可能是用于获取过滤组件数据的接口地址后续根据这个地址来发起数据请求
var url = options.url;
// 定义一个布尔变量flag并初始化为true用于标记数据获取及组件渲染过程中的一些状态比如数据获取是否成功等情况后续会根据不同情况修改这个值来控制流程
var flag = true;
//传入了地址,则直接将此地址覆盖
if(url){
$.getJSON(url,options.where,function(res){
if(res.code == 0){
var data = res.data;
// 判断如果传入的url属性存在即有值则执行以下代码块意味着如果配置了数据请求地址就按照这个地址去获取数据来渲染组件
if (url) {
// 使用jQuery的$.getJSON方法发起一个GET类型的AJAX请求请求的URL就是前面获取到的url同时传入options.where作为请求参数可能是一些筛选条件等数据请求成功后的回调函数用于处理返回的数据
$.getJSON(url, options.where, function (res) {
// 判断返回数据中的code属性是否等于0如果等于0通常表示请求成功数据正常获取到了可以进行后续的组件渲染等操作
if (res.code == 0) {
// 从返回的数据中获取名为data的属性值这应该就是实际用于渲染组件的数据源例如包含了各种过滤选项的数据列表等内容
var data = res.data;
// 此处疑似拼写错误将flase应该是想写false赋值为true不过从逻辑上推测可能是想重置某个用于判断的标志位但这个变量名错误可能会导致意想不到的问题先按照正确的逻辑理解此处应该是设置一个表示数据获取成功等相关含义的标志为true
flase = true;
layfilter.init(options,data);
}else{
layer.msg(res.msg||'查询过滤组件数据异常',{icon:2});
// 调用layfilter对象自身的init方法传入options和获取到的data数据进行查询过滤组件的初始化操作将数据展示在页面上形成可交互的过滤组件
layfilter.init(options, data);
} else {
// 如果返回数据中的code属性不等于0表示请求出现异常比如服务器端返回错误等情况使用layer弹出提示框显示相应的错误信息优先显示res.msg中的内容如果res.msg不存在则显示默认的提示信息'查询过滤组件数据异常'同时设置提示框的图标为2通常表示错误图标
layer.msg(res.msg || '查询过滤组件数据异常', {icon: 2});
// 将flag标志位设置为false表示数据获取或处理出现问题后续可能根据这个标志来决定是否继续进行组件渲染等操作
flag = false
}
})
}
if(!flag){
// 判断如果flag为false即前面的数据获取或处理出现问题了则直接使用return语句结束当前函数的执行不再进行后续可能的组件渲染等操作
if (!flag) {
return;
}
},
init:function(options,dataSource){
// 定义名为init的方法用于初始化查询过滤组件接收两个参数options包含了组件的各种配置信息dataSource则是具体要展示在组件中的数据列表等数据源信息
init: function (options, dataSource) {
// 从options参数中获取名为elem的属性值该值可能是一个DOM元素的选择器或者DOM元素本身用于指定查询过滤组件在页面中要挂载的位置后续会将生成的组件内容添加到这个元素内
var elem = options.elem;
// 使用jQuery根据elem选择器或者传入的就是DOM元素本身获取对应的DOM元素并赋值给变量$dom方便后续对这个挂载元素进行操作比如添加子元素等
var $dom = $(elem);
// 从options参数中获取名为itemWidth的属性值从变量名推测可能是用于设置组件中每个选项元素的宽度相关信息后续会根据这个值来进行宽度的具体设置
var itemWidth = options.itemWidth
// 创建一个空对象arr同样从后续代码推测可能是用于临时存储一些与组件选项相关的数据结构具体用途会随着代码执行逐渐清晰
var arr = {};
// 使用jQuery创建一个<table>元素,并添加类名"filterTable",这个表格元素将用于构建查询过滤组件的可视化布局,后续会往里面添加行、列以及具体的选项内容
var $table = $('<table class="filterTable"></table>');
for(var i=0;i<dataSource.length;i++){
var $tr =$('<tr></tr>');
var $td1 = $('<td class="item-title">'+dataSource[i].title+':</td>');
// 开始循环遍历数据源dataSourcedataSource应该是一个数组里面每个元素代表一组过滤选项数据等相关内容循环是为了逐个处理并展示这些数据到组件中
for (var i = 0; i < dataSource.length; i++) {
// 使用jQuery创建一个<tr>元素,代表表格中的一行,用于放置一组过滤选项的相关标题和具体选项内容,后续会将这行添加到前面创建的表格$table中
var $tr = $('<tr></tr>');
// 使用jQuery创建一个<td>元素,作为表格的单元格,添加类名"item-title"并将当前数据源中对应元素的title属性值应该是这组过滤选项的标题名称添加到单元格内作为文本内容用于展示这组选项的标题
var $td1 = $('<td class="item-title">' + dataSource[i].title + ':</td>');
// 使用jQuery创建另一个<td>元素,添加类名"items",这个单元格将用于放置具体的过滤选项内容(如单选框、复选框等选项列表),后续会将构建好的选项列表添加到这个单元格内
var $td2 = $('<td class="items"></td>');
// 从当前数据源中对应元素获取名为type的属性值该值可能用于指定这组过滤选项的类型比如是单选、复选等类型后续会根据这个类型来构建不同样式和交互逻辑的选项元素
var type = dataSource[i].type;
if(!type){
console.warn('第'+(i+1)+'个元素的类型[type]为空设为默认值[radio]');
// 判断如果type属性不存在即为空则在控制台输出警告信息提示第几个元素的类型[type]为空,并将其默认设置为'radio'(单选类型),以保证组件能正常构建,避免因类型未定义出现错误
if (!type) {
console.warn('第' + (i + 1) + '个元素的类型[type]为空设为默认值[radio]');
type = 'radio';
}
var $ul = $('<ul class="layfilter-ul" type="'+type+'" name="'+dataSource[i].name+'"></ul>');
var width = itemWidth && itemWidth.length>0 ? (itemWidth.length>i ? itemWidth[i]:itemWidth[itemWidth.length-1]):80;
arr[dataSource[i].name]=[];
for(var j=0;j<dataSource[i].data.length;j++){
var item = dataSource[i].data;
// 使用jQuery创建一个<ul>元素,添加类名"layfilter-ul"并设置type和name属性type属性使用前面获取到的或者默认设置的选项类型值name属性则使用当前数据源中对应元素的name属性值可能用于唯一标识这组选项等用途这个<ul>元素将作为具体选项的容器,后续会往里面添加一个个具体的选项<li>元素
var $ul = $('<ul class="layfilter-ul" type="' + type + '" name="' + dataSource[i].name + '"></ul>');
// 根据前面获取到的itemWidth属性值来计算每个选项的宽度逻辑是如果itemWidth存在且长度大于0再判断其长度是否大于当前循环的索引i如果大于则使用itemWidth中对应索引位置的值作为宽度否则使用最后一个值作为宽度如果itemWidth不符合条件不存在或者长度为0则默认宽度设置为80像素这样可以灵活地配置每个选项的宽度
var width = itemWidth && itemWidth.length > 0? (itemWidth.length > i? itemWidth[i] : itemWidth[itemWidth.length - 1]) : 80;
// 在arr对象中以当前数据源中对应元素的name属性值为键创建一个空数组作为值从后续代码推测可能是用于存储这组选项中被选中的具体数据等情况方便后续获取和操作选中的数据
arr[dataSource[i].name] = [];
// 开始内层循环遍历当前数据源中对应元素的data属性应该是包含了这组选项的具体每个选项的数据列表用于逐个构建并添加具体的选项元素到前面创建的<ul>容器中
for (var j = 0; j < dataSource[i].data.length; j++) {
// 获取当前数据源中对应元素的data属性也就是这组选项的具体每个选项的数据列表不过此处变量名使用item可能不太准确容易和外层循环的含义混淆从逻辑上理解这里应该是获取具体的一个选项数据对象
var item = dataSource[i].data;
// 创建一个类名变量className并初始化为'layfilter-item',这个类名可能用于设置选项元素的基本样式等,后续会根据选项是否被选中等情况来动态修改这个类名,添加额外的样式类
var className = 'layfilter-item';
if(item[j].checked && item[j].checked=='true'){
// 判断当前选项数据对象中的checked属性是否存在且值为'true'如果满足这个条件表示这个选项是初始被选中的状态那么就修改className类名添加额外的'layfilter-item-checked'类名用于应用选中状态的样式比如改变背景色等样式效果同时将这个选项的相关数据name和value属性值添加到前面创建的arr对象中对应name的数组里用于记录被选中的选项信息
if (item[j].checked && item[j].checked == 'true') {
className = "layfilter-item layfilter-item-checked";
arr[dataSource[i].name].push({name:item[j].name,value:item[j].value});
arr[dataSource[i].name].push({name: item[j].name, value: item[j].value});
}
//判断是否禁用
if(item[j].disabled && item[j].disabled=='true'){
$ul.append('<li value="'+item[j].value+'" style="width:'+width+'px;height: 28px;line-height: 28px;" class="'+className+'"><a disabled="disabled" class="layui-disabled">'+item[j].name+'</a></li>');
}else{
$ul.append('<li value="'+item[j].value+'" style="width:'+width+'px;height: 28px;line-height: 28px;" class="'+className+'"><a>'+item[j].name+'</a></li>');
// 判断当前选项数据对象中的disabled属性是否存在且值为'true',如果满足这个条件,表示这个选项是被禁用的状态,那么在构建选项元素时,添加'disabled'属性,并应用'layui-disabled'类名可能是layui框架中用于表示禁用样式的类使得这个选项呈现出被禁用的视觉效果如灰色显示、不可点击等并添加到<ul>容器中
if (item[j].disabled && item[j].disabled == 'true') {
$ul.append('<li value="' + item[j].value + '" style="width:' + width + 'px;height: 28px;line-height: 28px;" class="' + className + '"><a disabled="disabled" class="layui-disabled">' + item[j].name + '</a></li>');
} else {
// 如果选项不是被禁用状态,则正常构建选项元素,添加到<ul>容器中设置相应的value属性、宽度、高度、行高等样式属性并应用前面定义的className类名选项内容显示为其name属性值即用户看到的选项文本
$ul.append('<li value="' + item[j].value + '" style="width:' + width + 'px;height: 28px;line-height: 28px;" class="' + className + '"><a>' + item[j].name + '</a></li>');
}
}
// 将构建好的包含具体选项的<ul>元素添加到前面创建的用于放置选项的<td>单元格($td2
$td2.append($ul);
// 将包含标题的<td>单元格($td1和包含选项的<td>单元格($td2添加到代表一行的<tr>元素($tr
$tr.append($td1).append($td2);
// 将构建好的这一行($tr添加到前面创建的表格元素$table这样逐行添加最终形成完整的查询过滤组件的可视化表格布局
$table.append($tr);
}
// 将构建好的包含所有过滤选项内容的表格元素($table添加到前面获取到的用于挂载组件的DOM元素$dom使得组件在页面上显示出来
$dom.append($table);
chekedArr=arr;
//注册点击事件
$('.filterTable tr td li a').bind('click',function(){
if($(this).attr('disabled')){
// 将记录选中选项信息的arr对象赋值给全局的chekedArr对象这样在其他方法中如获取选中值、处理点击事件等操作时可以访问和操作这些选中的数据信息
chekedArr = arr;
// 使用jQuery的bind方法为'.filterTable tr td li a'(也就是查询过滤组件中每个选项内的<a>链接元素,通常用于触发选项的选择操作等交互)绑定点击事件处理函数,当用户点击这些元素时,会执行以下的函数逻辑来处理选项的选中、取消选中等操作以及更新相关数据状态
$('.filterTable tr td li a').bind('click', function () {
// 判断当前点击的<a>元素是否有'disabled'属性即是否是被禁用的选项如果有则直接使用return语句结束当前函数执行不做后续的选中相关操作因为被禁用的选项不应该响应点击选择操作
if ($(this).attr('disabled')) {
return;
}
// 获取当前点击的<a>元素的父元素(<li>元素)的父元素(<ul>元素的type属性值也就是获取这个选项所属的那组选项的类型如单选、复选等类型用于后续根据不同类型来处理选项的选中逻辑
var itemType = $(this).parent().parent().attr('type');
var name = $(this).parent().parent().attr('name');
//取消选择
if($(this).parent().hasClass('layfilter-item-checked')){
// 获取当前点击的<a>元素的父元素(<li>元素)的父元素(<ul>元素的name属性值也就是获取这个选项所属的那组选项的唯一标识名称用于后续在记录选中数据的对象中查找和更新对应的数据
var name = $(this).parent().parent().attr('name');
// 判断当前点击的<a>元素的父元素(<li>元素)是否有'layfilter-item-checked'类名,即判断这个选项当前是否是被选中状态,如果是,则执行以下取消选中的相关操作逻辑
if ($(this).parent().hasClass('layfilter-item-checked')) {
// 如果选项当前是被选中状态使用removeClass方法移除'layfilter-item-checked'类名,使其视觉上呈现未选中的样式效果(比如取消背景色等选中样式)
$(this).parent().removeClass('layfilter-item-checked');
var obj = chekedArr[name]||[];
for(var i=0;i<obj.length;i++){
if(obj[i].value==$(this).parent().attr('value')){
// 获取chekedArr对象中以当前选项所属的name为键对应的数组可能包含了这组选项中已被选中的其他选项数据等情况如果不存在则创建一个空数组用于后续操作
var obj = chekedArr[name] || [];
// 循环遍历这个数组查找与当前点击的选项的value属性值相等的元素即找到当前要取消选中的那个选项在已记录选中数据中的位置找到后使用splice方法从数组中删除这个元素实现取消选中的操作并更新记录选中数据的对象
for (var i = 0; i < obj.length; i++) {
if (obj[i].value == $(this).parent().attr('value')) {
obj.splice(i, 1);
break;
}
}
// 将更新后的数组重新赋值给chekedArr对象中对应的name键完成取消选中操作后的数据更新
chekedArr[name] = obj;
}else{
if(itemType && ('checbox' == itemType || 'radio' == itemType)){
//判断类型
if('radio' == itemType){
} else {
// 如果当前点击的选项不是被选中状态,则执行以下选中相关的操作逻辑,首先判断选项所属的类型是否存在并且是'checbox'(应该是拼写错误,正确的是'checkbox',复选框类型)或者'radio'(单选框类型),如果满足这个条件,则根据不同类型来进行相应的选中操作处理
if (itemType && ('checbox' == itemType || 'radio' == itemType)) {
// 判断如果是单选类型('radio' == itemType则获取当前点击的<a>元素的父元素(<li>元素的所有兄弟元素也就是这组单选选项中的其他选项元素然后循环遍历这些兄弟元素使用removeClass方法移除它们的'layfilter-item-checked'类名,确保在单选模式下,只有当前点击的选项被选中,其他选项都变为未选中状态,实现单选的互斥效果
if ('radio' == itemType) {
var objs = $(this).parent().siblings();
chekedArr[name]=[];
for(var i=0;i<objs.length;i++){
chekedArr[name] = [];
for (var i = 0; i < objs.length; i++) {
objs.eq(i).removeClass('layfilter-item-checked');
}
}
var obj = chekedArr[name]||[];
obj.push({name:$(this).text(),value:$(this).parent().attr('value')});
chekedArr[name]=obj;
// 获取chekedArr对象中以当前选项所属的name为键对应的数组可能为空数组如果之前没有选中的选项用于后续操作
var obj = chekedArr[name] || [];
// 将当前点击的选项的相关数据name和value属性对应的文本和值通过$(this).text()和$(this).parent().attr('value')获取)封装成一个对象,添加到这个数组中,表示将这个选项标记为选中状态,并更新记录选中数据的对象
obj.push({name: $(this).text(), value: $(this).parent().attr('value')});
chekedArr[name] = obj;
// 为当前点击的选项的父元素(<li>元素)添加'layfilter-item-checked'类名,使其视觉上呈现选中的样式效果(比如添加背景色等选中样式)
$(this).parent().addClass('layfilter-item-checked');
}else{
} else {
// 如果选项所属的类型不是预期的复选或单选类型
console.error('复选或单选类型为空?');
}
}
});
},
// 定义名为getValue的方法它是layfilter对象的一个方法该方法接收一个名为callback的参数
// 其作用应该是用于获取过滤组件中当前被选中项的数据并通过传入的回调函数callback将数据传递出去
getValue:function(callback){
// 调用内部定义的getCheckData函数该函数的作用从名字推测是获取经过整理后的已选中数据
// 并将返回的结果赋值给变量obj这个obj应该是包含了符合特定格式的已选中数据信息的对象
var obj = getCheckData();
// 通过call方法调用传入的回调函数callback并将当前的this上下文以及获取到的已选中数据对象obj作为参数传递进去
// 这样在外部调用getValue方法并传入相应回调函数时外部就能在回调函数中拿到并处理这些选中数据了
callback.call(this,obj);
},
// 定义名为on的方法它也是layfilter对象的一个方法用于给特定的元素绑定指定的事件以及对应的回调函数
// 接收两个参数filter参数可能是一个包含事件和选择器等信息的字符串callback则是对应的事件触发时要执行的回调函数
on:function(filter,callback){
// 通过substring方法截取filter字符串中从开头到第一个'('字符之前的内容赋值给变量f
// 推测这里是获取事件名称部分,例如可能是'click'等事件类型
var f = filter.substring(0,filter.indexOf('('));
// 通过substring方法截取filter字符串中从第一个'('字符之后到倒数第二个字符(去掉最后的')'字符的内容赋值给变量e
// 推测这里是获取选择器相关的部分用于在后续代码中找到要绑定事件的具体DOM元素
var e = filter.substring(filter.indexOf('(')+1,filter.length-1);
// 使用typeof操作符判断传入的callback参数是否是一个函数类型
// 如果是函数类型,表示传入的回调函数是合法有效的,就执行后续的绑定事件逻辑,否则执行下面的错误提示逻辑
if(typeof callback === "function"){
// 使用jQuery的on方法给满足选择器条件通过$("[lay-filter='"+e+"']"构造选择器其中e就是前面截取出来的选择器相关部分的DOM元素绑定指定的事件f就是前面截取出来的事件名称部分
// 当绑定的事件触发时会执行传入的回调函数在回调函数内部先调用getCheckData函数获取已选中数据然后再通过call方法将当前上下文以及已选中数据传递给外部传入的callback函数进行相应处理
$("[lay-filter='"+e+"']").on(f,function(){
var obj = getCheckData();
callback.call(this,obj);
});
}else{
// 如果传入的callback参数不是一个函数类型就在控制台输出错误信息提示'传入的参数不是一个函数',方便开发调试时发现参数使用错误的问题
console.error('传入的参数不是一个函数');
}
}
}
// 使用layui框架提供的link方法加载名为'layfilter/layfilter.css'的CSS样式文件
// 从路径推测这个CSS文件应该是用于设置查询过滤组件的样式使得组件在页面上呈现出预期的外观效果
// 这里的layui.cache.base可能是layui框架中用于获取基础路径的一种方式拼接上后面的相对路径就能准确找到对应的CSS文件了
layui.link(layui.cache.base + 'layfilter/layfilter.css');
layui.link(layui.cache.base + 'layfilter/layfilter.css');
function getCheckData(){
// 定义一个名为getCheckData的函数从名字可以看出它主要用于获取并整理查询过滤组件中已选中项的数据
// 最终将这些数据整理成特定的格式并返回供其他方法如getValue、on方法等使用
function getCheckData(){
// 创建一个空对象valueJson从后续代码来看它用于存储已选中项的value值可能是选项对应的实际值等信息
// 以选项对应的名称比如选项所属的分组名称等作为键来存储对应的value值字符串多个值会用逗号拼接等方式整理
var valueJson = {};
// 创建一个空对象nameJson与valueJson类似不过它主要用于存储已选中项的name值可能是选项显示的文本名称等信息
// 同样以选项对应的名称作为键存储对应的name值字符串多个值用逗号拼接等方式整理
var nameJson = {};
// 使用for...in循环遍历chekedArr对象chekedArr前面在代码中应该是用于记录各个选项组中已选中项相关信息的对象
// 循环遍历它的目的是提取出每个选项组中已选中项的name和value值并整理到valueJson和nameJson对象中
for(var name in chekedArr){
// 获取chekedArr对象中以当前循环的name为键对应的数组前面代码中应该是将每个选项组的已选中项数据存为数组形式赋值给变量json
// 这个数组中的每个元素应该是包含了name和value等属性的对象代表了一个已选中的选项信息
var json = chekedArr[name];
// 创建一个空字符串values用于拼接当前选项组中已选中项的value值后续会通过循环遍历json数组将每个选中项的value值添加到这个字符串中
var values = '';
// 创建一个空字符串names用于拼接当前选项组中已选中项的name值同样会通过循环遍历json数组把每个选中项的name值添加进来
var names = '';
// 开始循环遍历当前选项组对应的已选中项数组json目的是逐个提取并拼接已选中项的name和value值到对应的字符串中
for(var i=0;i<json.length;i++){
// 判断如果当前索引i不是数组的最后一个元素即不是最后一个选中项则执行以下代码块
// 将当前选中项的value值添加到values字符串后面并添加一个逗号作为分隔符方便后续解析等操作name值同理添加到names字符串后面并添加逗号分隔
if(i!=json.length-1){
values+=json[i].value+",";
names +=json[i].name+",";
}else{
// 如果当前索引i是数组的最后一个元素即最后一个选中项则直接将当前选中项的value值添加到values字符串后面
// 不需要添加逗号分隔了name值也同样直接添加到names字符串后面完成整个选项组的已选中项name和value值的拼接
values+=json[i].value;
names +=json[i].name;
}
}
// 将拼接好的当前选项组的已选中项value值字符串以当前选项组的名称name作为键存储到valueJson对象中
// 这样valueJson对象就记录了各个选项组的已选中项的value值信息了
valueJson[name]=values;
// 将拼接好的当前选项组的已选中项name值字符串同样以当前选项组的名称name作为键存储到nameJson对象中
// 使得nameJson对象记录了各个选项组的已选中项的name值信息
nameJson[name]=names;
}
// 将整理好的包含已选中项的value值和name值信息的两个对象valueJson和nameJson封装成一个新的对象并返回
// 返回的对象结构方便外部方法根据需要获取和使用这些已选中的数据信息,例如可以方便地获取某个选项组的已选中项的名称和对应的值等内容
return {values:valueJson,names:nameJson};
}
// 使用layui框架提供的exports方法将名为layfilter的对象包含了前面定义的一系列查询过滤组件相关的方法和属性等内容导出
// 这样在其他使用layui框架的模块中就可以通过引入这个模块来使用layfilter对象提供的功能了
exports('layfilter', layfilter);
})
Loading…
Cancel
Save