Compare commits

..

125 Commits

Author SHA1 Message Date
Yu 625e0a1abd Add comments from Yu <1663391975@qq.com>
1 year ago
Yu 40fe41f842 Add comments from Yu <1663391975@qq.com>
1 year ago
shixinmeng 6734e58f1f Add comments from shixinmeng <1223103368@qq.com>
1 year ago
shixinmeng 1d34d91286 Merge branch 'main' into xhl
1 year ago
周明 a98fd6e040 Merge remote-tracking branch 'origin/main'
1 year ago
周明 7fb46c9ff5 pom.xml
1 year ago
Yu a168c37948 Add comments from Yu <1663391975@qq.com>
1 year ago
周明 c5bb446a2f target/ssm/static/dtree
1 year ago
周明 9fd78e5aa7 target/ssm/
1 year ago
周明 935c51466b target/ssm/static/front/font
1 year ago
周明 877e5185dd target/ssm/jsp
1 year ago
周明 40a3504c08 target/ssm/front
1 year ago
kilo d24108dd03 31
1 year ago
kilo 1675fc8788 30
1 year ago
kilo 54c4c5e52c 29
1 year ago
kilo ae2be8640a 29
1 year ago
kilo ba629c48c6 28
1 year ago
kilo 0282792336 28
1 year ago
kilo 80e593c38b 28
1 year ago
kilo ea1a9a2163 27
1 year ago
kilo ac7a02bada 26
1 year ago
kilo 38c3896962 25
1 year ago
kilo 5510d06765 24
1 year ago
kilo c246ce2aa7 24
1 year ago
kilo 8f5b4a42a9 23
1 year ago
kilo c4ff4210f5 23
1 year ago
kilo da0ce1a2b3 22
1 year ago
kilo a4b8ae6107 21
1 year ago
kilo 5967e81b4c 20
1 year ago
kilo 9fcabb5f90 19
1 year ago
kilo 3170bc7a88 18
1 year ago
kilo 2097a6bb30 17
1 year ago
kilo f10dda37e7 16
1 year ago
kilo e3af01edee 15
1 year ago
kilo 8b82bf14d6 15
1 year ago
kilo 93bad4d865 14
1 year ago
kilo d7fd97fac6 13
1 year ago
kilo 77f8c17055 12 commit
1 year ago
kilo dec7f6d916 11 commit
1 year ago
kilo 0e4c51bdca 11 commit
1 year ago
kilo ad12277f75 10 commit
1 year ago
kilo 1137d53219 9 commit
1 year ago
kilo cc25a197e3 8 commit
1 year ago
kilo edd8b43cfb 7 commit
1 year ago
周明 660fd1a2ce 帮xhl测试提交
1 year ago
kilo e7e8e3b8d5 6 commit
1 year ago
kilo 75d3199200 5 commit
1 year ago
kilo aa90d3a2f6 4 commit
1 year ago
周明 640515e759 src
1 year ago
kilo 0e2a0e281a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo b74f9df092 3commit
1 year ago
kilo 3f29bb0331 2commit
1 year ago
kilo 2ea0279a0d 2commit
1 year ago
kilo b0f606e009 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo ec09fa9fb0 2 commit
1 year ago
周明 930d5732a0 compiler.xml
1 year ago
周明 94202c9dd6 提交测试
1 year ago
周明 df7b56bf59 xx
1 year ago
kilo 55bc160767 2 commit
1 year ago
kilo 675d5351d7 first commit
1 year ago
kilo f50d3e8363 first commit
1 year ago
kilo 1eb3b9b94a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 7ddd809713 Merge
1 year ago
kilo 8b644e3b97 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo b6ab7a0dca Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 28dcb70cd0 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e5a8ce972a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 7a49612292 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo ec04fee1ea Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 7fdd1aaade Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo a03138b5a0 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 10688c2817 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo aedaab848a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 4753349e12 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 457d3dee96 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 02c4a7d010 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 647919f116 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 3bb9b313ff Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e83db99ef9 add comment
1 year ago
kilo ce3771c706 add comment
1 year ago
kilo 7d5cd96418 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 3362cf60f1 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 54cea1bceb Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 7aa804e9f4 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 7004052fba Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 1a48ee4859 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 9b95587f3c Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo acde84bab0 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 236c3509c7 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 283f4cd5fd Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 6a247527bf Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 0d39956246 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo db20905bc1 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 9fd0f56caa Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo db549bab58 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e1d8e3f368 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo c10b0fcaf0 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo c96a9f1a26 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo c79c929813 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 451e546b92 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 6d6e7a95d4 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 27e9438629 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e816af96cf Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 8b9869f0e4 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo cb7aeffeb7 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 6c9ccb1989 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 36f9a5ca7f Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo b7c9f941fc Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 491c8d4434 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo eefbdaa538 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo fe48624489 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 721a97a1b1 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 9803d1dc6a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 436fe77990 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 3306aea74b Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo a1d200669a Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e154d8700f Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo e8f288b1f7 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 5be7f0fa58 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo c7d7b66be4 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo d8b2d2f2a9 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 45ab855a1e Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
kilo 55cc1b2690 Merge remote-tracking branch 'origin/xhl' into xhl
1 year ago
shixinmeng c34ea1af47 first commit
1 year ago
shixinmeng 8d6ddf0843 first commit
1 year ago

@ -1,12 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- 这是XML文档的声明指定版本为1.0编码格式为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为CompilerConfiguration的组件 -->
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<!-- 开始注解处理相关配置 -->
<annotationProcessing> <annotationProcessing>
<!-- 定义一个名为Maven default annotation processors profile的配置文件启用状态为true -->
<profile name="Maven default annotation processors profile" enabled="true"> <profile name="Maven default annotation processors profile" enabled="true">
<!-- 指定源文件输出目录为target/generated-sources/annotations -->
<sourceOutputDir name="target/generated-sources/annotations" /> <sourceOutputDir name="target/generated-sources/annotations" />
<!-- 指定测试源文件输出目录为target/generated-test-sources/test-annotations -->
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<!-- 表示输出相对于内容根目录值为true -->
<outputRelativeToContentRoot value="true" /> <outputRelativeToContentRoot value="true" />
<!-- 定义一个模块名称为ssm-hotel -->
<module name="ssm-hotel" /> <module name="ssm-hotel" />
<!-- 定义另一个模块名称为ssm-shop -->
<module name="ssm-shop" /> <module name="ssm-shop" />
</profile> </profile>
</annotationProcessing> </annotationProcessing>

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML文档声明表明文档使用的XML版本是1.0字符编码为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为Encoding的组件可能用于处理文件编码相关配置 -->
<component name="Encoding"> <component name="Encoding">
<!-- 配置一个文件的相关信息url指定文件路径此处使用了变量$PROJECT_DIR$指代项目目录指向src/main/java目录charset指定字符编码为UTF-8 -->
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<!-- 同样是配置一个文件相关信息url指向src/main/resources目录字符编码也设置为UTF-8 -->
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component> </component>
</project> </project>

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML文档声明用于表明该XML文件遵循的版本是1.0采用的字符编码为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为GoogleJavaFormatSettings的组件推测可能是和Google Java格式化相关的设置 -->
<component name="GoogleJavaFormatSettings"> <component name="GoogleJavaFormatSettings">
<!-- 定义一个名为enabled的选项其值被设置为false可能意味着Google Java格式相关功能处于未启用状态 -->
<option name="enabled" value="false" /> <option name="enabled" value="false" />
</component> </component>
</project> </project>

@ -1,21 +1,39 @@
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<!-- 定义一个名为InspectionProjectProfileManager的组件通常用于管理项目相关的检查配置等内容 -->
<profile version="1.0"> <profile version="1.0">
<!-- 配置文件的版本号为1.0,用于标识该配置文件的格式版本 -->
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<!-- 定义一个名为myName的选项值为"Project Default",可能用于标识这个配置的名称,比如作为默认项目配置的一个名称标识 -->
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true"> <inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<!-- 定义一个检查工具相关的配置class属性值为"HtmlUnknownTag"可能表示这个检查工具是针对HTML中未知标签的检查。
enabled="true"表示该检查工具当前是启用状态level="WARNING"表示检查出问题时对应的警告级别,
enabled_by_default="true"说明该工具默认就是启用的 -->
<option name="myValues"> <option name="myValues">
<!-- 定义名为myValues的选项用于存放一些具体的值相关配置 -->
<!-- ceshi-->
<value> <value>
<!-- 具体的值配置包裹内容 -->
<list size="7"> <list size="7">
<!-- 定义一个包含7个元素的列表用于存放具体的字符串类型的值 -->
<item index="0" class="java.lang.String" itemvalue="nobr" /> <item index="0" class="java.lang.String" itemvalue="nobr" />
<!-- 第一个元素类型为java.lang.String值为"nobr"可能代表HTML中某个特定的标签或者配置相关的字符串标识 -->
<item index="1" class="java.lang.String" itemvalue="noembed" /> <item index="1" class="java.lang.String" itemvalue="noembed" />
<!-- 第二个元素类型为java.lang.String值为"noembed"同样可能与HTML相关配置或标签有关 -->
<item index="2" class="java.lang.String" itemvalue="comment" /> <item index="2" class="java.lang.String" itemvalue="comment" />
<!-- 第三个元素类型为java.lang.String值为"comment" -->
<item index="3" class="java.lang.String" itemvalue="noscript" /> <item index="3" class="java.lang.String" itemvalue="noscript" />
<!-- 第四个元素类型为java.lang.String值为"noscript" -->
<item index="4" class="java.lang.String" itemvalue="embed" /> <item index="4" class="java.lang.String" itemvalue="embed" />
<!-- 第五个元素类型为java.lang.String值为"embed" -->
<item index="5" class="java.lang.String" itemvalue="script" /> <item index="5" class="java.lang.String" itemvalue="script" />
<!-- 第六个元素类型为java.lang.String值为"script" -->
<item index="6" class="java.lang.String" itemvalue="c:" /> <item index="6" class="java.lang.String" itemvalue="c:" />
<!-- 第七个元素类型为java.lang.String值为"c:" -->
</list> </list>
</value> </value>
</option> </option>
<option name="myCustomValuesEnabled" value="true" /> <option name="myCustomValuesEnabled" value="true" />
<!-- 定义名为myCustomValuesEnabled的选项值为"true"可能用于控制自定义值是否启用结合前面的myValues来看也许允许用户自定义相关的值配置 -->
</inspection_tool> </inspection_tool>
</profile> </profile>
</component> </component>

@ -1,24 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML文档声明表明此XML文件使用的版本是1.0采用的字符编码为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为RemoteRepositoriesConfiguration的组件用于配置远程仓库相关信息 -->
<component name="RemoteRepositoriesConfiguration"> <component name="RemoteRepositoriesConfiguration">
<!-- 开始定义一个远程仓库的配置 -->
<remote-repository> <remote-repository>
<!-- 定义远程仓库的标识选项值为central通常用于唯一标识该仓库 -->
<option name="id" value="central" /> <option name="id" value="central" />
<!-- 定义远程仓库的名称选项值为Central Repository方便使用者识别该仓库 -->
<option name="name" value="Central Repository" /> <option name="name" value="Central Repository" />
<!-- 定义远程仓库的访问地址选项这里指向的是Maven官方的中央仓库地址 -->
<option name="url" value="https://repo.maven.apache.org/maven2" /> <option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository> </remote-repository>
<!-- 开始定义另一个远程仓库的配置 -->
<remote-repository> <remote-repository>
<!-- 同样定义远程仓库的标识这里也是值为central不过实际应用中可能需确保不同仓库标识的唯一性 -->
<option name="id" value="central" /> <option name="id" value="central" />
<!-- 定义该远程仓库的名称为Central Repository -->
<option name="name" value="Central Repository" /> <option name="name" value="Central Repository" />
<!-- 定义该远程仓库的访问地址此处是阿里云的Maven仓库地址用于加速依赖下载等情况 -->
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" /> <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository> </remote-repository>
<!-- 开始定义又一个远程仓库的配置 -->
<remote-repository> <remote-repository>
<!-- 定义远程仓库标识为central -->
<option name="id" value="central" /> <option name="id" value="central" />
<!-- 定义远程仓库名称为Maven Central repository -->
<option name="name" value="Maven Central repository" /> <option name="name" value="Maven Central repository" />
<!-- 定义远程仓库访问地址同样是Maven官方的另一个常见的中央仓库访问路径 -->
<option name="url" value="https://repo1.maven.org/maven2" /> <option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository> </remote-repository>
<!-- 开始定义再一个远程仓库的配置 -->
<remote-repository> <remote-repository>
<!-- 定义远程仓库标识为jboss.community -->
<option name="id" value="jboss.community" /> <option name="id" value="jboss.community" />
<!-- 定义远程仓库名称为JBoss Community repository表明该仓库和JBoss社区相关 -->
<option name="name" value="JBoss Community repository" /> <option name="name" value="JBoss Community repository" />
<!-- 定义远程仓库访问地址指向JBoss社区仓库的对应路径 -->
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository> </remote-repository>
</component> </component>

@ -1,20 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML 文档声明,指定 XML 版本为 1.0,字符编码为 UTF-8 -->
<project version="4"> <project version="4">
<!-- 外部存储配置管理器组件enabled="true" 表示启用该组件 -->
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<!-- 框架检测排除配置组件 -->
<component name="FrameworkDetectionExcludesConfiguration"> <component name="FrameworkDetectionExcludesConfiguration">
<!-- 定义一个文件类型为 web 的排除文件url 指向项目目录,可能用于排除项目目录下的 web 文件被框架检测机制处理 -->
<file type="web" url="file://$PROJECT_DIR$" /> <file type="web" url="file://$PROJECT_DIR$" />
</component> </component>
<!-- JavaScript 设置组件 -->
<component name="JavaScriptSettings">
<!-- 设置 JavaScript 语言级别为 ES6 -->
<option name="languageLevel" value="ES6" />
</component>
<!-- Maven 项目管理器组件 -->
<component name="MavenProjectsManager"> <component name="MavenProjectsManager">
<!-- 定义原始文件列表选项,这里包含项目目录下的 pom.xml 文件,可能用于 Maven 项目构建时的文件定位 -->
<option name="originalFiles"> <option name="originalFiles">
<list> <list>
<option value="$PROJECT_DIR$/pom.xml" /> <option value="$PROJECT_DIR$/pom.xml" />
</list> </list>
</option> </option>
</component> </component>
<!-- 项目根管理器组件version="2" 表示版本号languageLevel="JDK_1_8" 设定语言级别为 JDK 1.8default="true" 为默认值project-jdk-name="1.8" 和 project-jdk-type="JavaSDK" 明确项目使用的 JDK 名称和类型 -->
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<!-- 定义输出路径url 指向项目目录下的 out 文件夹,可能用于存放项目构建输出结果 -->
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
<!-- 抑制组件 -->
<component name="SuppressionsComponent"> <component name="SuppressionsComponent">
<!-- 定义抑制注释选项,值为空列表,可能用于控制是否显示某些注释或抑制特定的代码检查结果 -->
<option name="suppComments" value="[]" /> <option name="suppComments" value="[]" />
</component> </component>
</project> </project>

@ -1,12 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML文档声明表明该XML文件遵循的版本是1.0采用的字符编码为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为AnalysisProjectProfileManager的组件可能用于项目分析相关的配置管理 -->
<component name="AnalysisProjectProfileManager"> <component name="AnalysisProjectProfileManager">
<!-- 定义一个名为PROJECT_PROFILE的选项其值为Project Default或许是指定项目所使用的默认配置文件之类的标识 -->
<option name="PROJECT_PROFILE" value="Project Default" /> <option name="PROJECT_PROFILE" value="Project Default" />
<!-- 定义一个名为USE_PROJECT_LEVEL_SETTINGS的选项值为false表示不使用项目级别的设置具体含义需结合实际应用场景确定 -->
<option name="USE_PROJECT_LEVEL_SETTINGS" value="false" /> <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
<!-- 定义一个空的作用域节点,可能后续用于添加具体的作用域相关配置内容 -->
<scopes /> <scopes />
<!-- 开始定义配置文件相关信息 -->
<profiles> <profiles>
<!-- 定义一个名为Project Default的配置文件版本号为1.0is_locked属性为false意味着该配置文件未被锁定可进行修改等操作 -->
<profile profile_name="Project Default" version="1.0" is_locked="false" /> <profile profile_name="Project Default" version="1.0" is_locked="false" />
</profiles> </profiles>
<!-- 定义一个列表其大小为0具体用途要根据所在的整体配置逻辑来进一步明确 -->
<list size="0" /> <list size="0" />
</component> </component>
</project> </project>

@ -1,2 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" /> <!-- XML文档声明表明此XML文件使用的版本是1.0采用的字符编码为UTF-8 -->
<module type="JAVA_MODULE" version="4" />
<!-- 定义一个模块元素type属性值为"JAVA_MODULE"说明该模块是Java类型的模块version属性值为"4"可能代表该模块的版本号等相关版本信息具体含义要结合使用该XML配置的具体应用场景来进一步判断 -->

@ -1,121 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML文档声明表明此XML文件使用的版本是1.0采用的字符编码为UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义名为Palette2的组件可能用于管理一些图形化界面相关的元素配置等 -->
<component name="Palette2"> <component name="Palette2">
<!-- 定义一个名为Swing的组推测里面包含的都是Swing相关的界面组件配置 -->
<group name="Swing"> <group name="Swing">
<!-- 定义一个水平间隔组件Horizontal Spacer相关配置 -->
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<!-- 设置默认约束vsize-policy="1"、hsize-policy="6"等属性用于规定垂直、水平方向的尺寸策略等相关布局规则anchor="0"和fill="1"等属性也与布局相关 -->
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" /> <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item> </item>
<!-- 定义一个垂直间隔组件Vertical Spacer相关配置 -->
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" /> <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item> </item>
<!-- 定义一个JPanel组件相关配置 -->
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" /> <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item> </item>
<!-- 定义一个JScrollPane组件相关配置removable="false"表示不可移除auto-create-binding="false"等属性规定了一些绑定相关特性can-attach-label="true"表示可以附加标签 -->
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true"> <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" /> <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item> </item>
<!-- 定义一个JButton组件相关配置auto-create-binding="true"表示自动创建绑定,下面还设置了初始值相关内容 -->
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<!-- 设置初始值,这里设置按钮的文本初始值为"Button" -->
<initial-values> <initial-values>
<property name="text" value="Button" /> <property name="text" value="Button" />
</initial-values> </initial-values>
</item> </item>
<!-- 定义一个JRadioButton组件相关配置 -->
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values> <initial-values>
<property name="text" value="RadioButton" /> <property name="text" value="RadioButton" />
</initial-values> </initial-values>
</item> </item>
<!-- 定义一个JCheckBox组件相关配置 -->
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values> <initial-values>
<property name="text" value="CheckBox" /> <property name="text" value="CheckBox" />
</initial-values> </initial-values>
</item> </item>
<!-- 定义一个JLabel组件相关配置 -->
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" /> <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values> <initial-values>
<property name="text" value="Label" /> <property name="text" value="Label" />
</initial-values> </initial-values>
</item> </item>
<!-- 定义一个JTextField组件相关配置还包含了首选尺寸preferred-size相关设置这里宽度设置为150高度为自动-1表示自适应 -->
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" /> <preferred-size width="150" height="-1" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JPasswordField组件相关配置与JTextField类似有默认约束和首选尺寸相关设定 -->
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" /> <preferred-size width="150" height="-1" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JFormattedTextField组件相关配置 -->
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" /> <preferred-size width="150" height="-1" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JTextArea组件相关配置设置了默认约束中的尺寸策略等以及首选尺寸宽度150高度50 -->
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JTextPane组件相关配置 -->
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JEditorPane组件相关配置 -->
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JComboBox组件相关配置 -->
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item> </item>
<!-- 定义一个JTable组件相关配置 -->
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JList组件相关配置 -->
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JTree组件相关配置 -->
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" /> <preferred-size width="150" height="50" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JTabbedPane组件相关配置设置了默认约束中的尺寸策略等以及首选尺寸宽度200高度200 -->
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" /> <preferred-size width="200" height="200" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JSplitPane组件相关配置 -->
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" /> <preferred-size width="200" height="200" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JSpinner组件相关配置 -->
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true"> <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item> </item>
<!-- 定义一个JSlider组件相关配置 -->
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item> </item>
<!-- 定义一个JSeparator组件相关配置 -->
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" /> <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item> </item>
<!-- 定义一个JProgressBar组件相关配置 -->
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item> </item>
<!-- 定义一个JToolBar组件相关配置设置了默认约束中的尺寸策略等以及首选尺寸宽度自适应高度20 -->
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1"> <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" /> <preferred-size width="-1" height="20" />
</default-constraints> </default-constraints>
</item> </item>
<!-- 定义一个JToolBar$Separator组件相关配置 -->
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false"> <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" /> <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item> </item>
<!-- 定义一个JScrollBar组件相关配置 -->
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" /> <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item> </item>

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML 文档声明,表明此 XML 文件遵循的版本是 1.0,使用的字符编码为 UTF-8 -->
<project version="4"> <project version="4">
<!-- 定义一个名为“project”的根元素其“version”属性值为 4可能表示该项目配置的版本信息具体含义取决于使用该配置的系统或工具 -->
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<!-- 定义一个名为“VcsDirectoryMappings”的组件元素通常用于配置版本控制系统VCS与项目目录的映射关系相关内容 -->
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
<!-- 定义一个具体的映射配置“directory”属性值为“$PROJECT_DIR$”,这大概率是一个占位符或者变量,表示项目所在的目录,
“vcs”属性值为“Git”表明该项目目录对应的版本控制系统是 Git也就是将项目目录关联到 Git 版本控制系统进行管理 -->
</component> </component>
</project> </project>

@ -1,6 +1,8 @@
/* /*
Navicat MySQL Data Transfer Navicat MySQL Data Transfer
NavicatMySQL
Source Server : localhost_3306 Source Server : localhost_3306
Source Server Version : 50719 Source Server Version : 50719
Source Host : localhost:3306 Source Host : localhost:3306
@ -13,181 +15,215 @@ File Encoding : 65001
Date: 2022-04-21 20:37:33 Date: 2022-04-21 20:37:33
*/ */
-- 关闭外键约束检查,方便后续对表结构和数据进行操作,比如删除、插入等可能涉及外键关联的数据变更时避免约束限制报错
SET FOREIGN_KEY_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
-- ---------------------------- -- ----------------------------
-- Table structure for `dept_table` -- Table structure for `dept_table`
-- 以下是关于 `dept_table` 表结构的定义部分,通过注释进行了详细说明
-- ---------------------------- -- ----------------------------
-- 如果表 `dept_table` 存在则先删除,确保后续创建表操作顺利进行,避免因表已存在而报错
DROP TABLE IF EXISTS `dept_table`; DROP TABLE IF EXISTS `dept_table`;
-- 创建 `dept_table` 表使用InnoDB存储引擎字符集为utf8并且设置了自增主键
CREATE TABLE `dept_table` ( CREATE TABLE `dept_table` (
`id` int(11) NOT NULL AUTO_INCREMENT, -- 定义 `id` 字段类型为整型长度为11位不允许为空并且设置为自增作为表的主键
`deptname` varchar(255) NOT NULL COMMENT '部门名称', `id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(255) NOT NULL COMMENT '部门地址', -- 定义 `deptname` 字段类型为可变长字符串最长255位不允许为空用于存储部门名称并添加了注释说明
`remark` text COMMENT '备注', `deptname` varchar(255) NOT NULL COMMENT '部门名称',
PRIMARY KEY (`id`) -- 定义 `address` 字段类型为可变长字符串最长255位不允许为空用于存储部门地址并添加了注释说明
`address` varchar(255) NOT NULL COMMENT '部门地址',
-- 定义 `remark` 字段,类型为文本类型,用于存储备注信息,并添加了注释说明
`remark` text COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of dept_table -- Records of dept_table
-- 以下是向 `dept_table` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `dept_table` 表插入一条数据,对应各字段分别填入相应的值,这里插入的是测试部相关信息及备注
INSERT INTO `dept_table` VALUES ('1', '测试部', '云南省昭通市', '好像都错了'); INSERT INTO `dept_table` VALUES ('1', '测试部', '云南省昭通市', '好像都错了');
-- 再次向 `dept_table` 表插入一条数据,同样是测试部的相关记录
INSERT INTO `dept_table` VALUES ('2', '测试部', '云南省昭通市', '什么也'); INSERT INTO `dept_table` VALUES ('2', '测试部', '云南省昭通市', '什么也');
-- 插入信息部相关记录到 `dept_table` 表
INSERT INTO `dept_table` VALUES ('3', '信息部', '楚雄', '尚硅谷'); INSERT INTO `dept_table` VALUES ('3', '信息部', '楚雄', '尚硅谷');
-- 插入技术部相关记录到 `dept_table` 表
INSERT INTO `dept_table` VALUES ('4', '技术部', '云南省', '33'); INSERT INTO `dept_table` VALUES ('4', '技术部', '云南省', '33');
-- 插入工程部相关记录到 `dept_table` 表
INSERT INTO `dept_table` VALUES ('5', '工程部', '东门', ''); INSERT INTO `dept_table` VALUES ('5', '工程部', '东门', '');
-- 插入测试部相关记录到 `dept_table` 表
INSERT INTO `dept_table` VALUES ('6', '测试部', '西门', ''); INSERT INTO `dept_table` VALUES ('6', '测试部', '西门', '');
-- ---------------------------- -- ----------------------------
-- Table structure for `employee_table` -- Table structure for `employee_table`
-- 以下是关于 `employee_table` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `employee_table`; DROP TABLE IF EXISTS `employee_table`;
CREATE TABLE `employee_table` ( CREATE TABLE `employee_table` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', -- 定义 `id` 字段类型为整型长度为11位不允许为空设置为自增作为表的主键并且添加注释说明是用户编号
`username` varchar(100) NOT NULL COMMENT '用户名', `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`password` varchar(100) NOT NULL COMMENT '登录密码', -- 定义 `username` 字段类型为可变长字符串最长100位不允许为空用于存储用户名并添加了注释说明
`name` varchar(20) NOT NULL COMMENT '用户姓名', `username` varchar(100) NOT NULL COMMENT '用户名',
`sex` varchar(5) DEFAULT NULL COMMENT '性别', -- 定义 `password` 字段类型为可变长字符串最长100位不允许为空用于存储登录密码并添加了注释说明
`deptId` int(11) DEFAULT NULL COMMENT '所在部门编号', `password` varchar(100) NOT NULL COMMENT '登录密码',
`hiredate` varchar(100) DEFAULT NULL COMMENT '入职时间', -- 定义 `name` 字段类型为可变长字符串最长20位不允许为空用于存储用户姓名并添加了注释说明
PRIMARY KEY (`id`) `name` varchar(20) NOT NULL COMMENT '用户姓名',
-- 定义 `sex` 字段类型为可变长字符串最长5位允许为空用于存储性别并添加了注释说明
`sex` varchar(5) DEFAULT NULL COMMENT '性别',
-- 定义 `deptId` 字段类型为整型长度为11位允许为空用于存储所在部门编号并添加了注释说明
`deptId` int(11) DEFAULT NULL COMMENT '所在部门编号',
-- 定义 `hiredate` 字段类型为可变长字符串最长100位允许为空用于存储入职时间并添加了注释说明
`hiredate` varchar(100) DEFAULT NULL COMMENT '入职时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of employee_table -- Records of employee_table
-- 以下是向 `employee_table` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `employee_table` 表插入一条用户记录,包含用户名、密码、姓名、性别、部门编号、入职时间等信息
INSERT INTO `employee_table` VALUES ('1', 'xyp1', '202cb962ac59075b964b07152d234b70', '谢应鹏', '', '3', '2022年'); INSERT INTO `employee_table` VALUES ('1', 'xyp1', '202cb962ac59075b964b07152d234b70', '谢应鹏', '', '3', '2022年');
-- 再次向 `employee_table` 表插入一条用户记录
INSERT INTO `employee_table` VALUES ('8', 'xypp', '345', 'ss', '', '1', '2022年'); INSERT INTO `employee_table` VALUES ('8', 'xypp', '345', 'ss', '', '1', '2022年');
-- 插入另一条用户记录到 `employee_table` 表
INSERT INTO `employee_table` VALUES ('11', 'hh', '123', '解决', '', '2', '2022年'); INSERT INTO `employee_table` VALUES ('11', 'hh', '123', '解决', '', '2', '2022年');
-- 插入又一条用户记录到 `employee_table` 表
INSERT INTO `employee_table` VALUES ('12', '谢应鹏', 'kk', '哈哈', '', '2', '2022年'); INSERT INTO `employee_table` VALUES ('12', '谢应鹏', 'kk', '哈哈', '', '2', '2022年');
-- 插入一条用户记录到 `employee_table` 表
INSERT INTO `employee_table` VALUES ('14', 'xx', '202cb962ac59075b964b07152d234b70', '谢应鹏', '', '3', '2022年'); INSERT INTO `employee_table` VALUES ('14', 'xx', '202cb962ac59075b964b07152d234b70', '谢应鹏', '', '3', '2022年');
-- ---------------------------- -- ----------------------------
-- Table structure for `floor_table` -- Table structure for `floor_table`
-- 以下是关于 `floor_table` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `floor_table`; DROP TABLE IF EXISTS `floor_table`;
CREATE TABLE `floor_table` ( CREATE TABLE `floor_table` (
`id` int(10) NOT NULL COMMENT '楼层号', -- 定义 `id` 字段类型为整型长度为10位不允许为空用于存储楼层号并添加了注释说明
`name` varchar(100) DEFAULT NULL COMMENT '楼层名称', `id` int(10) NOT NULL COMMENT '楼层号',
`remark` varchar(100) DEFAULT NULL COMMENT '备注', -- 定义 `name` 字段类型为可变长字符串最长100位允许为空用于存储楼层名称并添加了注释说明
PRIMARY KEY (`id`) `name` varchar(100) DEFAULT NULL COMMENT '楼层名称',
-- 定义 `remark` 字段类型为可变长字符串最长100位允许为空用于存储备注信息并添加了注释说明
`remark` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of floor_table -- Records of floor_table
-- 以下是向 `floor_table` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `floor_table` 表插入一条楼层记录,包含楼层号、楼层名称和备注信息
INSERT INTO `floor_table` VALUES ('2', '2楼', '旅馆2楼'); INSERT INTO `floor_table` VALUES ('2', '2楼', '旅馆2楼');
-- 插入另一条楼层记录到 `floor_table` 表
INSERT INTO `floor_table` VALUES ('3', '3楼', '东方向'); INSERT INTO `floor_table` VALUES ('3', '3楼', '东方向');
-- 插入又一条楼层记录到 `floor_table` 表
INSERT INTO `floor_table` VALUES ('4', '4楼', '酒店4楼'); INSERT INTO `floor_table` VALUES ('4', '4楼', '酒店4楼');
-- ---------------------------- -- ----------------------------
-- Table structure for `front_user` -- Table structure for `front_user`
-- 以下是关于 `front_user` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `front_user`; DROP TABLE IF EXISTS `front_user`;
CREATE TABLE `front_user` ( CREATE TABLE `front_user` (
`id` int(11) NOT NULL AUTO_INCREMENT, -- 定义 `id` 字段类型为整型长度为11位不允许为空设置为自增作为表的主键
`username` varchar(200) DEFAULT NULL, `id` int(11) NOT NULL AUTO_INCREMENT,
`phone` varchar(11) DEFAULT NULL, -- 定义 `username` 字段类型为可变长字符串最长200位允许为空用于存储用户名
`password` varchar(100) DEFAULT NULL, `username` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`) -- 定义 `phone` 字段类型为可变长字符串最长11位允许为空用于存储电话号码
`phone` varchar(11) DEFAULT NULL,
-- 定义 `password` 字段类型为可变长字符串最长100位允许为空用于存储密码
`password` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of front_user -- Records of front_user
-- 以下是向 `front_user` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `front_user` 表插入一条用户记录,包含用户名、电话号码和密码信息
INSERT INTO `front_user` VALUES ('1', 'xyp', '15284524485', '123'); INSERT INTO `front_user` VALUES ('1', 'xyp', '15284524485', '123');
-- 插入另一条用户记录到 `front_user` 表
INSERT INTO `front_user` VALUES ('2', '谢应鹏', '15284524486', '202cb962ac59075b964b07152d234b70'); INSERT INTO `front_user` VALUES ('2', '谢应鹏', '15284524486', '202cb962ac59075b964b07152d234b70');
-- 插入又一条用户记录到 `front_user` 表
INSERT INTO `front_user` VALUES ('3', '谢应鹏1', '15284524485', '202cb962ac59075b964b07152d234b70'); INSERT INTO `front_user` VALUES ('3', '谢应鹏1', '15284524485', '202cb962ac59075b964b07152d234b70');
-- ---------------------------- -- ----------------------------
-- Table structure for `roomtype_table` -- Table structure for `roomtype_table`
-- 以下是关于 `roomtype_table` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `roomtype_table`; DROP TABLE IF EXISTS `roomtype_table`;
CREATE TABLE `roomtype_table` ( CREATE TABLE `roomtype_table` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '房型编号', -- 定义 `id` 字段类型为整型长度为11位不允许为空设置为自增作为表的主键并添加注释说明是房型编号
`roomname` varchar(100) NOT NULL COMMENT '房型名称', `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '房型编号',
`price` double(11,2) DEFAULT NULL COMMENT '参考价格', -- 定义 `roomname` 字段类型为可变长字符串最长100位不允许为空用于存储房型名称并添加了注释说明
`livenum` int(11) DEFAULT NULL COMMENT '可以入住人数', `roomname` varchar(100) NOT NULL COMMENT '房型名称',
`bednum` int(11) DEFAULT NULL COMMENT '床位数', -- 定义 `price` 字段类型为双精度浮点数总共11位小数点后保留2位允许为空用于存储参考价格并添加了注释说明
`roomnum` int(11) DEFAULT NULL COMMENT '房间数量', `price` double(11,2) DEFAULT NULL COMMENT '参考价格',
`reservednum` int(11) DEFAULT NULL COMMENT '已预订数量', -- 定义 `livenum` 字段类型为整型长度为11位允许为空用于存储可以入住人数并添加了注释说明
`avilablenum` int(11) DEFAULT NULL COMMENT '可以住房间数', `livenum` int(11) DEFAULT NULL COMMENT '可以入住人数',
`livednum` int(11) DEFAULT NULL COMMENT '已入住人数', -- 定义 `bednum` 字段类型为整型长度为11位允许为空用于存储床位数并添加了注释说明
`status` int(11) DEFAULT NULL COMMENT '房间状态', `bednum` int(11) DEFAULT NULL COMMENT '床位数',
`remark` varchar(200) DEFAULT NULL COMMENT '备注', -- 定义 `roomnum` 字段类型为整型长度为11位允许为空用于存储房间数量并添加了注释说明
PRIMARY KEY (`id`) `roomnum` int(11) DEFAULT NULL COMMENT '房间数量',
-- 定义 `reservednum` 字段类型为整型长度为11位允许为空用于存储已预订数量并添加了注释说明
`reservednum` int(11) DEFAULT NULL COMMENT '已预订数量',
-- 定义 `avilablenum` 字段类型为整型长度为11位允许为空用于存储可以住房间数并添加了注释说明
`avilablenum` int(11) DEFAULT NULL COMMENT '可以住房间数',
-- 定义 `livednum` 字段类型为整型长度为11位允许为空用于存储已入住人数并添加了注释说明
`livednum` int(11) DEFAULT NULL COMMENT '已入住人数',
-- 定义 `status` 字段类型为整型长度为11位允许为空用于存储房间状态并添加了注释说明
`status` int(11) DEFAULT NULL COMMENT '房间状态',
-- 定义 `remark` 字段类型为可变长字符串最长200位允许为空用于存储备注信息并添加了注释说明
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of roomtype_table -- Records of roomtype_table
-- 以下是向 `roomtype_table` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `roomtype_table` 表插入一条房型记录,包含房型名称、参考价格、可入住人数、床位数等诸多相关信息
INSERT INTO `roomtype_table` VALUES ('1', '单人间', '200.00', '2', '1', '20', '12', '20', '3', '2', null); INSERT INTO `roomtype_table` VALUES ('1', '单人间', '200.00', '2', '1', '20', '12', '20', '3', '2', null);
-- 插入另一条房型记录到 `roomtype_table` 表
INSERT INTO `roomtype_table` VALUES ('2', '双人间', '66.00', '20', '12', '7', null, '7', null, '2', ''); INSERT INTO `roomtype_table` VALUES ('2', '双人间', '66.00', '20', '12', '7', null, '7', null, '2', '');
-- 插入又一条房型记录到 `roomtype_table` 表
INSERT INTO `roomtype_table` VALUES ('3', '标准间', '44.00', '8', '1', '7', null, null, null, '1', ''); INSERT INTO `roomtype_table` VALUES ('3', '标准间', '44.00', '8', '1', '7', null, null, null, '1', '');
-- 插入一条房型记录到 `roomtype_table` 表
INSERT INTO `roomtype_table` VALUES ('22', '总体套房', '888.00', '2', '2', '4', null, '4', null, '1', ''); INSERT INTO `roomtype_table` VALUES ('22', '总体套房', '888.00', '2', '2', '4', null, '4', null, '1', '');
-- ---------------------------- -- ----------------------------
-- Table structure for `room_table` -- Table structure for `room_table`
-- 以下是关于 `room_table` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `room_table`; DROP TABLE IF EXISTS `room_table`;
CREATE TABLE `room_table` ( CREATE TABLE `room_table` (
`id` int(11) NOT NULL AUTO_INCREMENT, -- 定义 `id` 字段类型为整型长度为11位不允许为空设置为自增作为表的主键
`roomid` int(11) NOT NULL COMMENT '房间编号', `id` int(11) NOT NULL AUTO_INCREMENT,
`typename` varchar(50) DEFAULT NULL COMMENT '房间类型', -- 定义 `roomid` 字段类型为整型长度为11位不允许为空用于存储房间编号并添加了注释说明
`floorname` varchar(50) DEFAULT NULL COMMENT '所属楼层', `roomid` int(11) NOT NULL COMMENT '房间编号',
`status` int(4) DEFAULT NULL, -- 定义 `typename` 字段类型为可变长字符串最长50位允许为空用于存储房间类型并添加了注释说明
PRIMARY KEY (`id`) `typename` varchar(50) DEFAULT NULL COMMENT '房间类型',
-- 定义 `floorname` 字段类型为可变长字符串最长50位允许为空用于存储所属楼层并添加了注释说明
`floorname` varchar(50) DEFAULT NULL COMMENT '所属楼层',
-- 定义 `status` 字段类型为整型长度为4位允许为空用于存储房间状态
`status` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ---------------------------- -- ----------------------------
-- Records of room_table -- Records of room_table
-- 以下是向 `room_table` 表中插入数据的记录部分
-- ---------------------------- -- ----------------------------
-- 向 `room_table` 表插入一条房间记录,包含房间编号、房间类型、所属楼层和房间状态信息
INSERT INTO `room_table` VALUES ('1', '20013', '总体套房', '2楼', '3'); INSERT INTO `room_table` VALUES ('1', '20013', '总体套房', '2楼', '3');
-- 插入另一条房间记录到 `room_table` 表
INSERT INTO `room_table` VALUES ('4', '20012', '双人间', '2楼', '2'); INSERT INTO `room_table` VALUES ('4', '20012', '双人间', '2楼', '2');
-- ---------------------------- -- ----------------------------
-- Table structure for `sys_menu` -- Table structure for `sys_menu`
-- 以下是关于 `sys_menu` 表结构的定义部分,通过注释进行详细说明
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `sys_menu`; DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` ( CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单编号', -- 定义 `id` 字段类型为整型长度为11位不允许为空设置为自增作为表的主键并添加注释说明是菜单编号
`pid` int(11) DEFAULT NULL COMMENT '所属父级菜单', `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单编号',
`title` varchar(200) DEFAULT NULL COMMENT '菜单名称', -- 定义 `pid` 字段类型为整型长度为11位
`href` varchar(200) DEFAULT NULL COMMENT '打开链接地址',
`spread` int(11) DEFAULT NULL COMMENT '是否展开 0 不1 展示',
`target` varchar(100) DEFAULT NULL COMMENT '打开方式',
`icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES ('1', '0', '系统管理', null, '1', 'self', 'fa fa-user');
INSERT INTO `sys_menu` VALUES ('2', '0', '客房管理', null, '1', 'self', 'fa fa-user');
INSERT INTO `sys_menu` VALUES ('4', '2', '房间类型', null, '1', 'self', 'fa fa-user');
INSERT INTO `sys_menu` VALUES ('5', '1', '部门管理', '/admin/ToDeptManage', '1', 'self', 'fa fa-user');
INSERT INTO `sys_menu` VALUES ('6', '1', '员工管理', null, '1', 'self', 'fa fa-user');
INSERT INTO `sys_menu` VALUES ('7', '1', '系统设置', null, '1', 'self', 'fa fa-user');
-- ----------------------------
-- Table structure for `user_table`
-- ----------------------------
DROP TABLE IF EXISTS `user_table`;
CREATE TABLE `user_table` (
`id` varchar(11) NOT NULL COMMENT '员工编号',
`empname` varchar(100) DEFAULT NULL COMMENT '员工姓名',
`sex` varchar(10) DEFAULT NULL,
`deptname` varchar(100) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`hireDate` varchar(100) DEFAULT NULL,
`remark` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_table
-- ----------------------------
INSERT INTO `user_table` VALUES ('20221', '成成', '', '财务部', '云南省', '2022年', '');
INSERT INTO `user_table` VALUES ('2022112', '航嘉', '', '信息部', '云南省', '2019年', '');
INSERT INTO `user_table` VALUES ('2022113', '康熙', '', '技术部', '云南省', '2022年', '');
INSERT INTO `user_table` VALUES ('235533', '湖广会馆', '', '技术部', '同意后', '644', '');

@ -1,188 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- 这是XML声明指定了XML的版本为1.0以及编码格式为UTF-8 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- project根元素定义了整个Maven项目的配置信息这里引入了相关的XML命名空间和对应的模式定义位置 -->
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<!-- 定义了POMProject Object Model项目对象模型的版本这里使用的是4.0.0版本 -->
<groupId>org.example</groupId> <groupId>org.example</groupId>
<!-- 项目的groupId一般是项目所属组织或公司的反向域名用于唯一标识项目的归属 -->
<artifactId>ssm-shop</artifactId> <artifactId>ssm-shop</artifactId>
<!-- 项目的artifactId是项目在groupId下的唯一标识通常就是项目的名称或者模块名 -->
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<!-- 项目的版本号SNAPSHOT表示这是一个快照版本常用于开发过程中还不稳定的版本标识 -->
<packaging>war</packaging> <packaging>war</packaging>
<!-- 项目的打包类型war表示这是一个Web应用程序的打包格式适合部署到Web容器中 -->
<name>ssm-shop Maven Webapp</name> <name>ssm-shop Maven Webapp</name>
<!-- 项目的显示名称 -->
<!-- FIXME change it to the project's website --> <!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <url>http://www.example.com</url>
<!-- 项目的网址这里用FIXME标记提示需要修改为项目实际的网站地址 -->
<properties> <properties>
<!-- properties元素用于定义项目中可以复用的属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 定义项目构建时源代码的编码格式为UTF-8 -->
<maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.source>1.7</maven.compiler.source>
<!-- 定义Maven编译时使用的Java源代码版本为1.7 -->
<maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.target>1.7</maven.compiler.target>
<!-- 定义Maven编译时生成的字节码对应的Java目标版本为1.7 -->
</properties> </properties>
<dependencies> <dependencies>
<!-- dependencies元素用于定义项目的依赖关系也就是项目运行所需要的其他库或模块 -->
<!--关于spring的坐标--> <!--关于spring的坐标-->
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId> <artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version> <version>5.0.5.RELEASE</version>
<!-- 引入Spring的核心上下文模块用于管理Spring应用的Bean等相关功能指定了其版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.aspectj</groupId> <groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId> <artifactId>aspectjweaver</artifactId>
<version>1.8.7</version> <version>1.8.7</version>
<!-- 引入AspectJ的织入器用于实现面向切面编程AOP相关功能指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId> <artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version> <version>5.0.5.RELEASE</version>
<!-- 引入Spring对JDBC的支持模块方便进行数据库操作指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId> <artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version> <version>5.0.5.RELEASE</version>
<!-- 引入Spring的事务管理模块用于处理数据库事务等相关操作指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId> <artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version> <version>5.0.5.RELEASE</version>
<!-- 引入Spring的测试相关模块便于编写单元测试等测试用例指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId> <artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version> <version>5.0.5.RELEASE</version>
<!-- 引入Spring的Web MVC模块用于构建Web应用的MVC架构指定了版本号 -->
</dependency> </dependency>
<!--关于servilet和jsp--> <!--关于servilet和jsp-->
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId> <artifactId>servlet-api</artifactId>
<version>2.5</version> <version>2.5</version>
<!-- 引入Servlet API用于在Java Web应用中编写Servlet相关代码指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.servlet.jsp</groupId> <groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId> <artifactId>jsp-api</artifactId>
<version>2.0</version> <version>2.0</version>
<!-- 引入JSP API用于在Java Web应用中编写JSP页面相关代码指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>jstl</groupId> <groupId>jstl</groupId>
<artifactId>jstl</artifactId> <artifactId>jstl</artifactId>
<version>1.2</version> <version>1.2</version>
<!-- 引入JSTLJavaServer Pages Standard Tag Library用于在JSP页面中进行更方便的标签操作比如循环、条件判断等指定了版本号 -->
</dependency> </dependency>
<!--关于mybatis--> <!--关于mybatis-->
<!--引入mybatis的MBG逆向工程 逆向帮我们生成dao层的相关表类实现和数据--> <!--引入mybatis的MBG逆向工程 逆向帮我们生成dao层的相关表类实现和数据-->
<dependency> <dependency>
<groupId>org.mybatis.generator</groupId> <groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId> <artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version> <version>1.3.5</version>
<!-- 引入MyBatis的代码生成器核心模块通过逆向工程可以根据数据库表结构自动生成MyBatis的相关代码比如Mapper接口、实体类等指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mybatis</groupId> <groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId> <artifactId>mybatis</artifactId>
<version>3.4.5</version> <version>3.4.5</version>
<!-- 引入MyBatis的核心框架用于进行数据库访问操作指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mybatis</groupId> <groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId> <artifactId>mybatis-spring</artifactId>
<version>1.3.1</version> <version>1.3.1</version>
<!-- 引入MyBatis与Spring框架整合的模块方便在Spring项目中使用MyBatis指定了版本号 -->
</dependency> </dependency>
<!--mysql相关坐标--> <!--mysql相关坐标-->
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version> <version>5.1.6</version>
<!-- 引入MySQL的JDBC驱动使得项目可以连接到MySQL数据库指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>c3p0</groupId> <groupId>c3p0</groupId>
<artifactId>c3p0</artifactId> <artifactId>c3p0</artifactId>
<version>0.9.1.2</version> <version>0.9.1.2</version>
<!-- 引入c3p0数据库连接池用于管理数据库连接提高连接的复用性和性能指定了版本号 -->
</dependency> </dependency>
<!--日志--> <!--日志-->
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
<version>1.2.17</version> <version>1.2.17</version>
<!-- 引入Log4j日志框架用于记录项目运行过程中的日志信息方便调试和查看运行状态指定了版本号 -->
</dependency> </dependency>
<!--分页插件--> <!--分页插件-->
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId> <artifactId>pagehelper</artifactId>
<version>5.0.0</version> <version>5.0.0</version>
<!-- 引入PageHelper分页插件用于在MyBatis等数据库操作中方便地实现分页功能指定了版本号 -->
</dependency> </dependency>
<!--jackson json处理工具包--> <!--jackson json处理工具包-->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>2.9.0</version> <version>2.9.0</version>
<!-- 引入Jackson的databind模块用于将Java对象和JSON数据进行相互转换是处理JSON数据常用的工具指定了版本号 -->
</dependency> </dependency>
<!--封装为json另外一个工具--> <!--封装为json另外一个工具-->
<dependency> <dependency>
<groupId>org.json</groupId> <groupId>org.json</groupId>
<artifactId>json</artifactId> <artifactId>json</artifactId>
<version>20140107</version> <version>20140107</version>
<!-- 引入org.json这个JSON处理库也可以进行JSON相关的操作比如创建JSON对象、解析JSON字符串等指定了版本号 -->
</dependency> </dependency>
<!--Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式, <!--Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,
当然它也可以将 JSON 字符串转换为 Java 对象。.--> 当然它也可以将 JSON 字符串转换为 Java 对象。.-->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.73</version> <version>1.2.73</version>
<!-- 引入阿里巴巴的Fastjson库用于JSON数据和Java对象之间的高效转换指定了版本号 -->
</dependency> </dependency>
<!--文件异步上传--> <!--文件异步上传-->
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.5</version> <version>2.5</version>
<!-- 引入Apache Commons IO库提供了一些方便的文件操作相关的工具方法常用于文件上传等功能中指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>1.3.1</version> <version>1.3.1</version>
<!-- 引入Apache Commons FileUpload库用于在Web应用中实现文件上传功能指定了版本号 -->
</dependency> </dependency>
<!--测试--> <!--测试-->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.12</version> <version>4.12</version>
<scope>test</scope> <scope>test</scope>
<!-- 引入JUnit测试框架用于编写单元测试用例这里的scope为test表示只在测试阶段使用该依赖指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.testng</groupId> <groupId>org.testng</groupId>
<artifactId>testng</artifactId> <artifactId>testng</artifactId>
<version>RELEASE</version> <version>RELEASE</version>
<scope>compile</scope> <scope>compile</scope>
<!-- 引入TestNG测试框架也是用于编写测试用例scope为compile表示在编译和运行阶段都需要该依赖指定了版本号 -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.12</version> <version>4.12</version>
<scope>compile</scope> <scope>compile</scope>
<!-- 再次引入JUnit测试框架这里的scope为compile可能是在不同场景下都需要JUnit参与编译和运行指定了版本号 -->
</dependency> </dependency>
<!-- shiro --> <!-- shiro -->
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId> <artifactId>shiro-core</artifactId>
<version>1.6.0</version> <version>1.6.0</version>
<!-- 引入Apache Shiro的核心模块Shiro常用于进行身份认证、授权等安全相关功能指定了版本号 -->
</dependency> </dependency>
</dependencies> </dependencies>
<!--有时候不添加下面这段代码会报mybatis的错找不到mapping文件 所以最好加上--> <!--有时候不添加下面这段代码会报mybatis的错找不到mapping文件 所以最好加上-->
<build> <build>
<!-- build元素用于配置项目构建相关的设置 -->
<plugins> <plugins>
<!-- plugins元素内配置具体的插件 -->
<plugin> <plugin>
<groupId>org.mybatis.generator</groupId> <groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId> <artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version> <version>1.3.2</version>
<configuration> <configuration>
<!-- 配置MyBatis代码生成器插件的相关配置 -->
<!--配置文件的位置--> <!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!-- 指定MyBatis代码生成器插件所使用的配置文件的位置 -->
<verbose>true</verbose> <verbose>true</verbose>
<!-- 设置为true表示在生成代码时打印详细的日志信息 -->
<overwrite>true</overwrite> <overwrite>true</overwrite>
<!-- 设置为true表示如果生成的代码文件已存在则覆盖它 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<!-- 配置Maven编译时使用的Java源代码版本 -->
<target>7</target>
<!-- 配置Maven编译时生成的字节码对应的Java目标版本 -->
</configuration> </configuration>
</plugin><plugin> </plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

@ -1,7 +1,5 @@
package comxyp.controller; package comxyp.controller;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import comxyp.pojo.Dept; import comxyp.pojo.Dept;
import comxyp.pojo.Vo; import comxyp.pojo.Vo;
import comxyp.service.DeptService; import comxyp.service.DeptService;
@ -14,96 +12,228 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 这个类是一个控制器类专门用于处理与部门Dept相关的各种请求操作。
//部门管理查询显示 // 它使用了 Spring 框架的相关注解,通过 Spring 容器进行管理,能够接收和处理来自 Web 的请求,
// 并将处理结果返回给客户端。
// 作为一个控制器,它在 Spring MVC 架构中扮演着重要的角色,负责接收用户请求、
// 调用相应的服务层方法处理请求,并将处理结果以合适的格式返回给用户。
// 这种控制器的设计遵循了 MVC 架构的设计原则,将用户界面和业务逻辑分离,
// 提高了代码的可维护性、可扩展性和可测试性,使开发人员可以专注于不同层次的开发工作,
// 例如,前端开发人员可以专注于界面的设计和开发,而后端开发人员可以专注于业务逻辑的实现。
@Controller @Controller
// 此注解将该控制器映射到 "/dept" 路径下,意味着该控制器将处理所有以 "/dept" 开头的请求。
// 例如,"/dept/deptList"、"/dept/addDept" 等请求都将由这个控制器的相应方法来处理。
// 这样的映射方式有助于将不同模块的请求进行分类管理,方便维护和扩展。
// 它使得请求的路由清晰明确当收到相应的请求时Spring 框架会将请求分发到该控制器的相应方法进行处理,
// 提高了请求处理的效率和准确性,同时也使得代码结构更加清晰,易于理解和维护。
@RequestMapping("/dept") @RequestMapping("/dept")
public class DeptController { public class DeptController {
// 以下是自动注入的部门服务对象,通过 Spring 的依赖注入机制将其注入到该控制器中。
// 这种自动注入的方式是 Spring 框架的一个重要特性,它根据类型匹配的原则,
// 在 Spring 容器中找到对应的 DeptService 实现类并注入到这里,
// 使得我们可以方便地调用 DeptService 层提供的各种业务逻辑方法,
// 而无需手动创建 DeptService 的实例,减少了代码的耦合性,提高了代码的可维护性和可测试性。
// 这有助于代码的模块化,将业务逻辑和控制逻辑分离,使得代码结构更加清晰。
// 当控制器需要执行部门相关的业务逻辑操作时,无需关心服务的具体实现细节,
// 只需要调用注入的服务对象的相应方法即可,降低了代码的复杂性。
@Autowired @Autowired
private DeptService deptService; private DeptService deptService;
// 同样通过自动注入获取员工服务对象,这是为了在某些操作中,
// 可能需要涉及员工信息的查询,例如在删除部门时,需要检查该部门下是否还有员工,
// 或者在显示部门信息时可能会关联员工信息,从而方便调用相关的员工服务方法。
// 这样可以更好地实现不同服务层之间的协作,提高代码的复用性和可扩展性。
// 自动注入的机制确保了代码的简洁性,避免了繁琐的对象创建和管理过程,
// 同时也遵循了依赖倒置原则,让高层模块(控制器)不依赖于低层模块(服务实现)的具体实现,
// 而是依赖于抽象(服务接口),提高了代码的灵活性和可维护性。
@Autowired @Autowired
private EmployeeService employeeService; private EmployeeService employeeService;
// 这个方法用于处理部门列表的请求。
// 当客户端发送一个请求到 "/dept/deptList" 时,该方法将被调用,并且会将结果以 JSON 格式返回给客户端。
// 它接收一个可选的 Vo 对象作为参数,这个 Vo 对象可能包含了一些筛选条件,例如部门名称、部门状态等,
// 可以根据这些条件来查询相应的部门信息。
// 这种参数的设计使得该方法具有更强的灵活性,可以根据不同的筛选条件动态地查询部门信息。
// 这种动态查询的方式提高了系统的适应性,能够根据用户的不同需求返回相应的部门列表,
// 满足了不同用户在不同场景下的需求,例如,用户可以根据部门名称筛选,也可以根据部门状态筛选等。
@RequestMapping("/deptList") @RequestMapping("/deptList")
@ResponseBody @ResponseBody
public DataGridViewResult deptList(@RequestParam(required = false) Vo vo){ public DataGridViewResult deptList(@RequestParam(required = false) Vo vo) {
//设置分页信息 // 首先,使用 PageHelper 进行分页设置。
PageHelper.startPage(1,20); // 这里设置从第 1 页开始,每页显示 20 条记录。
//调用分页查询的方法 // PageHelper 是一个非常实用的分页插件,它会在后续的查询操作中自动添加分页所需的信息,
// 比如在数据库查询时添加 LIMIT 子句,以实现分页功能。
// 这样可以避免手动编写复杂的分页 SQL 语句,提高开发效率。
// 分页功能的使用可以提高系统的性能,避免一次性加载大量数据,
// 尤其是在部门数据量较大时,只加载当前页的数据,提高了用户的使用体验,
// 同时也减轻了服务器的压力,避免资源的浪费。
PageHelper.startPage(1, 20);
// 调用 DeptService 的 findAll 方法进行部门列表的查询操作。
// 该方法可能会根据传入的 vo 参数进行筛选,例如根据 vo 中的部门名称、状态等信息进行查询,
// 并将查询结果存储在一个 List<Dept> 集合中,其中包含了符合条件的部门信息。
// 这里体现了服务层和控制层的分工,控制层负责接收请求和处理结果,服务层负责具体的业务逻辑,
// 如数据库查询、数据筛选等操作。
// 这种分层的设计使得不同层次的代码职责清晰,服务层专注于业务逻辑的实现,
// 而控制层专注于请求的接收和结果的处理,提高了代码的可维护性和可扩展性。
List<Dept> list = deptService.findAll(vo); List<Dept> list = deptService.findAll(vo);
//创建分页对象
// 使用 PageInfo 类将查询结果包装起来,创建一个分页对象。
// 这样做的目的是为了获取更多与分页相关的信息,例如总记录数、总页数、当前页的数据等,
// 这些信息对于前端进行分页展示非常有用,比如可以显示当前是第几页、总共有多少页等信息。
// 这种分页信息的封装有助于前端更好地进行数据展示和用户交互,
// 为用户提供良好的分页浏览体验,使用户能够方便地浏览大量的数据。
// 同时PageInfo 提供了丰富的分页信息,方便前端进行分页导航的开发,
// 例如,用户可以方便地跳转到上一页、下一页、指定页等操作。
PageInfo<Dept> pageInfo = new PageInfo<>(list); PageInfo<Dept> pageInfo = new PageInfo<>(list);
//返回数据
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList()); // 将分页信息,包括总记录数和当前页的部门列表,封装到 DataGridViewResult 中返回。
// DataGridViewResult 可能是一个自定义的类,专门用于将分页数据进行统一的封装,
// 方便前端进行解析和展示,使得前端能够以一种统一的数据格式接收和处理分页信息。
// 它将分页数据进行结构化封装,有助于前端代码的简洁性和可维护性,
// 同时也方便前后端数据的交互和通信。
// 这种封装方式使得前后端之间的数据传输更加规范,避免了数据传输的混乱,
// 提高了数据传输的可靠性和一致性,方便前端开发人员根据统一的格式进行数据的解析和处理。
return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
} }
// 这个方法用于处理添加部门的请求。
// 当客户端发送一个请求到 "/dept/addDept" 时,该方法会被调用,它接收一个 Dept 对象作为参数,
// 这个 Dept 对象包含了要添加的部门的详细信息,如部门名称、部门描述、部门负责人等。
// 这种参数的传递方式使得添加部门的信息可以通过对象的形式进行传递,更加直观和易于管理。
// 以对象作为参数传递数据,可以方便地将多个属性封装在一起,
// 提高了代码的可读性和可维护性,避免了多个零散参数的传递,
// 同时也方便服务层对部门信息的整体处理,提高了代码的简洁性。
@RequestMapping("/addDept") @RequestMapping("/addDept")
@ResponseBody @ResponseBody
public String addDept(Dept dept){ public String addDept(Dept dept) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 来存储操作结果的信息,包括添加操作是否成功以及相应的提示消息。
int n= deptService.addDept(dept); // 这个 Map 可以存储不同类型的数据,使用键值对的形式存储,便于后续将其转换为 JSON 格式返回给客户端。
if(n>0){ // 这样的存储方式非常灵活,可以方便地添加不同的信息,如操作结果、错误消息、警告信息等。
map.put("success",true); // 使用 Map 存储操作结果,为后续的结果处理提供了很大的灵活性,
map.put("msg","添加成功"); // 可以根据不同的情况添加不同的键值对,满足不同的信息需求,
} else{ // 方便在前端进行各种不同情况的处理和显示。
Map<String, Object> map = new HashMap<>();
// 调用 DeptService 的 addDept 方法将部门信息添加到数据库中。
// 该方法会执行添加操作,并返回受影响的行数,受影响的行数表示操作的结果,
// 例如,当返回值大于 0 时,表示成功添加了相应的部门记录;
// 当返回值小于或等于 0 时,表示添加操作失败,可能是由于数据库操作错误或数据不合法等原因。
// 这里将控制层的请求处理和服务层的业务逻辑调用进行了分离,
// 控制层负责调用服务层的方法并处理结果,服务层负责具体的数据库操作。
// 这种分层设计使得代码的职责更加明确,易于维护和扩展,
// 服务层专注于业务逻辑的实现,控制层专注于请求的处理和结果的反馈。
int n = deptService.addDept(dept);
// 如果添加操作成功,即受影响的行数大于 0。
if (n > 0) {
// 在 Map 中设置 success 键为 true表示添加操作成功。
// 这种使用键值对存储操作结果的方式便于在前端根据键名来获取操作结果的状态。
// 通过键值对的方式存储操作结果,可以方便前端开发人员根据键名获取相应的结果,
// 并根据结果进行相应的操作,例如显示成功消息、更新界面等。
map.put("success", true);
// 同时添加一条相应的消息,方便前端显示给用户,告知用户添加操作成功。
// 这条消息可以在前端以弹窗、提示框等形式展示给用户,让用户了解操作的结果。
// 为用户提供操作结果的反馈,提高了用户体验,使用户能够清楚地知道操作是否成功。
map.put("msg", "添加成功");
} else {
// 如果添加操作失败,即受影响的行数小于或等于 0。
// 在 Map 中设置 success 键为 false表示添加操作失败。
map.put("success", false); map.put("success", false);
// 添加一条相应的消息,方便前端显示给用户,告知用户添加操作失败。
// 该消息可以为用户提供操作失败的反馈,帮助用户查找问题所在,
// 例如,用户可以根据提示信息检查输入的数据是否正确,
// 或者联系管理员解决可能的数据库问题。
map.put("msg", "添加失败"); map.put("msg", "添加失败");
} }
return JSON.toJSONString(map);
// 最后,使用阿里巴巴的 fastjson 工具将存储操作结果的 Map 转换为 JSON 字符串。
// 这样做是因为在 Web 开发中,通常将数据以 JSON 格式返回给客户端,
// 以便客户端能够方便地解析和处理这些数据,而 fastjson 是一个高效的 JSON 处理工具。
// 它可以将 Java 对象快速地转换为 JSON 字符串,便于在网络中传输和前端解析。
// 使用 JSON 格式传输数据,是现代 Web 开发中前后端数据交互的常用方式,
// 它具有良好的跨平台性和兼容性,方便不同编程语言和平台之间的数据交换,
// 同时也方便前端使用 JavaScript 等语言进行数据的解析和处理。
return com.alibaba.fastjson.JSON.toJSONString(map);
} }
// 这个方法用于处理修改部门信息的请求。
// 当客户端发送一个请求到 "/dept/updateDept" 时,该方法会被调用,它接收一个 Dept 对象作为参数,
// 这个 Dept 对象包含了修改后的部门信息,如修改后的部门名称、部门描述、部门负责人等。
// 这种方式可以将修改后的信息统一封装在对象中传递,便于维护和管理。
// 以对象作为参数,可以更好地封装和传递复杂的数据结构,
// 避免了多个参数的传递,提高了代码的可读性和可维护性,
// 同时也方便服务层对修改后的部门信息进行整体处理。
@RequestMapping("/updateDept") @RequestMapping("/updateDept")
@ResponseBody @ResponseBody
public String updateDept(Dept dept){ public String updateDept(Dept dept) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 来存储操作结果的信息,包括修改操作是否成功以及相应的提示消息。
int n= deptService.updateDept(dept); // 与添加部门操作类似,使用 Map 存储结果信息,方便后续的处理和结果返回。
if(n>0){ // 使用 Map 存储操作结果,可以方便地存储和管理操作结果信息,
map.put("success",true); // 为不同的操作结果提供了统一的存储和处理方式,
map.put("msg","修改成功"); // 同时也方便后续将结果转换为 JSON 格式进行数据传输。
} else{ Map<String, Object> map = new HashMap<>();
// 调用 DeptService 的 updateDept 方法来更新部门信息。
// 该方法会根据传入的 Dept 对象更新数据库中的部门信息,并返回受影响的行数,
// 这个返回值可以用来判断更新操作是否成功。
// 服务层的 updateDept 方法负责根据传入的部门信息更新数据库中的数据,
// 而控制层根据服务层的返回结果进行后续处理。
// 这种分层的设计将更新操作的业务逻辑和请求处理分离,
// 使得服务层专注于更新操作的实现,控制层专注于结果的处理和反馈。
int n = deptService.updateDept(dept);
// 如果更新操作成功,即受影响的行数大于 0。
if (n > 0) {
// 在 Map 中设置 success 键为 true表示更新操作成功。
map.put("success", true);
// 同时添加一条相应的消息,方便前端显示给用户,告知用户更新操作成功。
// 此消息可以帮助用户了解操作是否完成,并提供用户操作反馈,
// 让用户知道自己的操作是否已经生效,提高了用户体验。
map.put("msg", "修改成功");
} else {
// 如果更新操作失败,即受影响的行数小于或等于 0。
// 在 Map 中设置 success 键为 false表示更新操作失败。
map.put("success", false); map.put("success", false);
// 添加一条相应的消息,方便前端显示给用户,告知用户更新操作失败。
// 这条消息可以帮助用户查找更新操作失败的原因,如数据不符合要求等。
// 用户可以根据消息进行相应的操作,例如检查修改的数据是否正确,
// 或者尝试重新提交修改请求等。
map.put("msg", "修改失败"); map.put("msg", "修改失败");
} }
return JSON.toJSONString(map);
} // 使用阿里巴巴的 fastjson 工具将存储操作结果的 Map 转换为 JSON 字符串,
/** // 以便将结果以 JSON 格式返回给客户端,方便客户端进行解析和处理。
* // 使用 fastjson 进行 JSON 转换,确保了数据的高效转换和传输,
* @param id // 同时也遵循了前后端数据交互的通用规范,方便前端开发人员使用 JSON 数据进行界面更新和用户提示。
* @return return com.alibaba.fastjson.JSON.toJSONString(map);
*/
@RequestMapping("/checkDeptHasEmployee")
@ResponseBody
public String checkDeptHasEmployee(Integer id){
Map<String,Object> map = new HashMap<String,Object>();
//调用根据部门编号查询员工数量的方法
if(employeeService.getEmployeeCountByDeptId(id)>0){
map.put("exist",true);//存在
map.put("msg","该部门存在员工信息,无法删除");
}else{
map.put("exist",false);//不存在
}
return JSON.toJSONString(map);
} }
/** /**
* *
* @param id *
* @return * @param id
* @return JSON
* exist true JSON
* exist false JSON
*
*
*
*/ */
@RequestMapping("/deleteById") @RequestMapping("/checkDeptHasEmployee")
@ResponseBody @ResponseBody
public String deleteById(Integer id){ public String checkDeptHasEmployee(Integer id) {
Map<String,Object> map = new HashMap<String,Object>(); // 创建一个 Map 来存储检查结果的信息,包括是否存在员工以及相应的消息。
//调用删除部门的方法 // 这里使用 Map 存储检查结果,方便后续转换为 JSON 格式返回给客户端。
if(deptService.deleteById(id)>0){ // 使用 Map 存储检查结果,可以方便地存储和管理检查结果信息,
map.put("success",true);//成功 // 为不同的检查结果提供了统一的存储和处理方式,
map.put("msg","删除成功"); // 同时也方便将结果转换为 JSON 格式
}else{
map.put("success",false);//失败
map.put("msg","删除失败");
}
return JSON.toJSONString(map);
}
}

@ -1,4 +1,5 @@
package comxyp.controller; package comxyp.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -16,49 +17,114 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 此控制器类主要负责处理与员工相关的各种请求操作。
// 它使用了 Spring 框架的相关注解,将其标记为一个控制器,以便 Spring 容器能够对其进行管理。
// 该控制器会接收以 "/employee" 为前缀的请求,并根据不同的请求路径调用相应的处理方法。
@Controller @Controller
@RequestMapping("/employee") @RequestMapping("/employee")
public class EmployeeController { public class EmployeeController {
// 通过自动注入的方式,将 EmployeeService 的实现类注入到该控制器中。
// 这样可以方便地调用 EmployeeService 提供的业务逻辑方法,而无需手动创建实例,
// 减少了代码的耦合度,提高了代码的可维护性和可测试性。
@Autowired @Autowired
private EmployeeService employeeService; private EmployeeService employeeService;
// 此方法用于处理员工列表的请求。
// 当用户发送请求到 "/employee/employeeList" 时,该方法会被调用。
// 它会从数据库中获取员工列表,并将结果以分页的形式返回给客户端。
@RequestMapping("/employeeList") @RequestMapping("/employeeList")
@ResponseBody @ResponseBody
public DataGridViewResult employeeList(){ public DataGridViewResult employeeList() {
Map<String ,Object> map = new HashMap<>(); // 创建一个 Map 对象,可用于存储一些额外的参数或数据,以便在后续进行扩展时使用。
// 例如,未来可能会添加一些筛选条件或排序规则等,都可以存储在这个 Map 中。
Map<String, Object> map = new HashMap<>();
// 调用 EmployeeService 的 employeeList 方法来获取员工列表。
// 该方法将在 EmployeeService 中实现,可能会从数据库中查询所有员工的信息,
// 并将结果存储在一个 List<Employee> 中。
List<Employee> list = employeeService.employeeList(); List<Employee> list = employeeService.employeeList();
PageHelper.startPage(1,10000);
//创建分页对象 // 使用 PageHelper 进行分页设置,这里设置为从第 1 页开始,每页显示 10000 条记录。
// PageHelper 是一个强大的分页插件,它会在后续的数据库查询操作中自动添加分页逻辑,
// 比如在 SQL 查询语句中添加 LIMIT 子句,以实现分页功能。
PageHelper.startPage(1, 10000);
// 将查询得到的员工列表包装在 PageInfo 对象中,以获取更详细的分页信息。
// 这些信息包括总记录数、总页数、当前页的记录列表等,对于前端的分页显示非常有用。
PageInfo<Employee> pageInfo = new PageInfo<>(list); PageInfo<Employee> pageInfo = new PageInfo<>(list);
//返回数据
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList()); // 将分页信息封装在 DataGridViewResult 对象中返回给客户端。
// DataGridViewResult 可能是一个自定义的类,用于统一封装分页数据,
// 它包含了总记录数和当前页的员工列表,方便前端进行数据展示和处理。
return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
} }
// 此方法用于处理用户登录请求。
// 当用户发送请求到 "/employee/login" 时,该方法会被调用,
// 它接收用户名、密码和验证码作为输入参数,进行用户登录的验证操作。
@RequestMapping("/login") @RequestMapping("/login")
@ResponseBody @ResponseBody
public String login(String username, String password,String code,HttpSession session){ public String login(String username, String password, String code, HttpSession session) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储登录操作的响应信息,包括登录是否成功和相应的消息。
Employee employee = employeeService.userLogin(username,password); // 这个 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端进行相应的处理。
if(employee!=null){ Map<String, Object> map = new HashMap<>();
if(code.equals("xSzG")){
//保存用户登录信息 // 调用 EmployeeService 的 userLogin 方法,根据用户名和密码查找用户。
session.setAttribute("user",employee); // 该方法会在 EmployeeService 中根据传入的用户名和密码从数据库中查找匹配的用户信息,
map.put("success",true); // 并将结果存储在 Employee 对象中。
}else { Employee employee = employeeService.userLogin(username, password);
// 对用户登录的结果进行判断。
if (employee!= null) {
// 如果查找到用户信息,说明用户存在,接下来需要检查验证码是否正确。
// 这里的验证码是硬编码的 "xSzG",在实际应用中,应该从用户输入中获取验证码,
// 以提高系统的安全性和灵活性。
if (code.equals("xSzG")) {
// 如果验证码正确,将用户信息存储在 HttpSession 中。
// HttpSession 是一种会话管理机制,可用于存储用户的登录状态,
// 以便在用户后续的请求中识别用户身份,保持用户的登录状态。
session.setAttribute("user", employee);
// 登录成功,设置登录成功的标志和相应的消息。
map.put("success", true);
} else {
// 如果验证码错误,设置登录失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("msg","验证码错误"); map.put("msg", "验证码错误");
} }
} else{ } else {
// 如果未查找到用户信息,说明用户名或密码错误,设置登录失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("msg", "用户名或者密码错误"); map.put("msg", "用户名或者密码错误");
} }
// 将存储登录结果的 Map 对象转换为 JSON 字符串,以便将结果以 JSON 格式返回给客户端。
// 使用 fastjson 库的 toJSONString 方法可以方便地将 Map 转换为 JSON 字符串,
// 客户端可以很容易地解析该 JSON 字符串并进行相应的处理。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理用户注册请求。
// 当用户发送请求到 "/employee/register" 时,该方法会被调用,
// 它接收用户注册所需的各种信息,如用户名、密码、姓名、性别和部门 ID。
@RequestMapping("/register") @RequestMapping("/register")
@ResponseBody @ResponseBody
public String register( String username, String password, String names, String sex,Integer depId){ public String register(String username, String password, String names, String sex, Integer depId) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储注册操作的响应信息,包括注册是否成功和相应的消息。
// 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的注册结果。
Map<String, Object> map = new HashMap<>();
// 使用 MD5Util 工具类对用户输入的密码进行 MD5 加密。
// MD5 是一种常用的哈希算法,将密码转换为不可逆的字符串存储在数据库中,
// 这样可以在一定程度上提高密码的安全性,避免明文存储密码带来的风险。
String newPas = MD5Util.getMD5(password); String newPas = MD5Util.getMD5(password);
// 创建一个新的 Employee 对象,用于存储用户注册的信息。
// 这里将新用户的 ID 设置为 null因为通常在数据库中用户的唯一标识符ID会自动生成
// 避免手动设置可能导致的 ID 冲突或不唯一的问题。
Employee employees = new Employee(); Employee employees = new Employee();
employees.setId(null); employees.setId(null);
employees.setUsername(username); employees.setUsername(username);
@ -66,106 +132,192 @@ public class EmployeeController {
employees.setName(names); employees.setName(names);
employees.setSex(sex); employees.setSex(sex);
employees.setDeptId(depId); employees.setDeptId(depId);
Employee employee = employeeService.userLogin(username,password);
int n = employeeService.saveUser(employees); // 首先调用 EmployeeService 的 userLogin 方法,检查用户是否已经存在。
if(employee!=null){ // 这是为了确保用户名的唯一性,避免重复注册相同用户名的用户,
//保存用户登录信息 // 该方法会根据传入的用户名和密码从数据库中查找用户信息。
//用户名已经存在 Employee employee = employeeService.userLogin(username, password);
// 调用 EmployeeService 的 saveUser 方法将新用户信息保存到数据库中。
// 该方法将执行插入操作,并返回受影响的行数,以此来判断操作是否成功。
int n = employeeService.saveUser(employees);
// 如果用户已经存在,设置注册失败的标志,并添加相应的错误消息。
if (employee!= null) {
map.put("success", false); map.put("success", false);
map.put("msg", "用户名已经存在"); map.put("msg", "用户名已经存在");
} else{ } else {
if(n>0){ // 如果用户不存在,并且保存操作成功(受影响的行数大于 0
// 表示注册成功,设置相应的成功标志和消息。
if (n > 0) {
map.put("success", true); map.put("success", true);
map.put("msg","注册成功"); map.put("msg", "注册成功");
} }
} }
// 将存储注册结果的 Map 对象转换为 JSON 字符串,并将其作为响应返回给客户端。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理更新用户信息的请求。
// 当用户发送请求到 "/employee/updateUser" 时,该方法会被调用,
// 它接收一个 Employee 对象,该对象包含了需要更新的用户信息。
@RequestMapping("/updateUser") @RequestMapping("/updateUser")
@ResponseBody @ResponseBody
public String updateUser(Employee employee){ public String updateUser(Employee employee) {
// 从传入的 Employee 对象中提取用户的各个信息,包括用户 ID、用户名、姓名、性别和部门 ID。
// 这些信息将作为更新用户信息的依据,用于更新数据库中的用户记录。
Integer id = employee.getId(); Integer id = employee.getId();
String username=employee.getUsername(); String username = employee.getUsername();
String name = employee.getName(); String name = employee.getName();
String sex = employee.getSex(); String sex = employee.getSex();
Integer deptId = employee.getDeptId(); Integer deptId = employee.getDeptId();
//System.out.println(id+username+name+sex+deptId);
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储更新操作的响应信息,包括更新是否成功和相应的消息。
int n= employeeService.updateUser(id,username,name,sex,deptId); // 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的更新结果。
if(n>0){ Map<String, Object> map = new HashMap<>();
map.put("success",true);
map.put("msg","修改成功"); // 调用 EmployeeService 的 updateUser 方法,将更新用户信息的操作委托给服务层。
} else{ // 该方法将根据传入的用户信息更新数据库中的用户记录,并返回受影响的行数,
// 以此来判断更新操作是否成功。
int n = employeeService.updateUser(id, username, name, sex, deptId);
// 如果更新操作成功(受影响的行数大于 0设置更新成功的标志和相应的消息。
if (n > 0) {
map.put("success", true);
map.put("msg", "修改成功");
} else {
// 如果更新操作失败,设置更新失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("error", "修改失败"); map.put("error", "修改失败");
} }
// 将存储更新结果的 Map 对象转换为 JSON 字符串,并将其作为响应返回给客户端。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理更新用户密码的请求。
// 当用户发送请求到 "/employee/updatePassword" 时,该方法会被调用,
// 它接收用户 ID、原密码、新密码和再次输入的新密码作为输入参数用于更新用户的密码。
@RequestMapping("/updatePassword") @RequestMapping("/updatePassword")
@ResponseBody @ResponseBody
public String updatePassword(Integer id,String password,String new_password,String again_password){ public String updatePassword(Integer id, String password, String new_password, String again_password) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储密码更新操作的响应信息,包括更新是否成功和相应的消息。
// 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的更新结果。
Map<String, Object> map = new HashMap<>();
// 调用 EmployeeService 的 selectPassword 方法,根据用户 ID 获取用户的原始密码。
// 该方法会从数据库中查询用户的原始密码,以便进行后续的密码验证。
String psw = employeeService.selectPassword(id); String psw = employeeService.selectPassword(id);
if(new_password.equals(again_password)){
if(MD5Util.getMD5(password).equals(psw)){ // 首先检查两次输入的新密码是否一致。
int n= employeeService.updatePassword(id,new_password); if (new_password.equals(again_password)) {
if(n>0){ // 如果两次新密码一致,将用户输入的原密码进行 MD5 加密,并与数据库中的原始密码进行比较。
map.put("success",true); // 这里使用 MD5 加密是为了保证密码的一致性,因为存储在数据库中的密码可能是经过 MD5 加密的。
map.put("msg","修改成功"); if (MD5Util.getMD5(password).equals(psw)) {
} else{ // 如果原密码正确,调用 EmployeeService 的 updatePassword 方法更新用户密码。
// 该方法将执行更新操作,并返回受影响的行数,以此来判断更新操作是否成功。
int n = employeeService.updatePassword(id, new_password);
// 如果密码更新操作成功(受影响的行数大于 0设置更新成功的标志和相应的消息。
if (n > 0) {
map.put("success", true);
map.put("msg", "修改成功");
} else {
// 如果密码更新操作失败,设置更新失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("error", "修改失败"); map.put("error", "修改失败");
} }
} else { } else {
// 如果原密码错误,设置更新失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("error", "原始密码错误或者不存在"); map.put("error", "原始密码错误或者不存在");
} }
} else { } else {
// 如果两次输入的新密码不一致,设置更新失败的标志,并添加相应的错误消息。
map.put("success", false); map.put("success", false);
map.put("error", "输入两次密码不一致"); map.put("error", "输入两次密码不一致");
} }
// 将存储密码更新结果的 Map 对象转换为 JSON 字符串,并将其作为响应返回给客户端。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理添加员工的请求。
// 当用户发送请求到 "/employee/addEmployee" 时,该方法会被调用,
// 它接收一个 User 对象,该对象包含了需要添加的员工信息。
@RequestMapping("/addEmployee") @RequestMapping("/addEmployee")
@ResponseBody @ResponseBody
public String addEmployee(User user){ public String addEmployee(User user) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储添加操作的响应信息,包括添加是否成功和相应的消息。
// 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的添加结果。
Map<String, Object> map = new HashMap<>();
// 调用 EmployeeService 的 addEmployee 方法,将添加员工的操作委托给服务层。
// 该方法将执行插入操作,并返回受影响的行数,以此来判断添加操作是否成功。
int n = employeeService.addEmployee(user); int n = employeeService.addEmployee(user);
if(n>0){
map.put("success",true); // 如果添加操作成功(受影响的行数大于 0设置添加成功的标志和相应的消息。
map.put("msg","添加成功"); if (n > 0) {
map.put("success", true);
map.put("msg", "添加成功");
} else { } else {
map.put("success",false); // 如果添加操作失败,设置添加失败的标志,并添加相应的错误消息。
map.put("msg","添加失败"); map.put("success", false);
map.put("msg", "添加失败");
} }
// 将存储添加结果的 Map 对象转换为 JSON 字符串,并将其作为响应返回给客户端。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理修改员工信息的请求。
// 当用户发送请求到 "/employee/updateEmployee" 时,该方法会被调用,
// 它接收一个 User 对象,该对象包含了需要修改的员工信息。
@RequestMapping("/updateEmployee") @RequestMapping("/updateEmployee")
@ResponseBody @ResponseBody
public String updateEmployee(User user){ public String updateEmployee(User user) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储修改操作的响应信息,包括修改是否成功和相应的消息。
// 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的修改结果。
Map<String, Object> map = new HashMap<>();
// 调用 EmployeeService 的 updateEmployee 方法,将修改员工信息的操作委托给服务层。
// 该方法将根据传入的员工信息更新数据库中的员工记录,并返回受影响的行数,
// 以此来判断修改操作是否成功。
int n = employeeService.updateEmployee(user); int n = employeeService.updateEmployee(user);
if(n>0){
map.put("success",true); // 如果修改操作成功(受影响的行数大于 0设置修改成功的标志和相应的消息。
map.put("msg","修改成功"); if (n > 0) {
map.put("success", true);
map.put("msg", "修改成功");
} else { } else {
map.put("success",false); // 如果修改操作失败,设置修改失败的标志,并添加相应的错误消息。
map.put("msg","修改失败"); map.put("success", false);
map.put("msg", "修改失败");
} }
// 将存储修改结果的 Map 对象转换为 JSON 字符串,并将其作为响应返回给客户端。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 此方法用于处理删除员工的请求。
// 当用户发送请求到 "/employee/deleteEmployee" 时,该方法会被调用,
// 它接收员工的 ID 作为输入,用于删除对应的员工记录。
@RequestMapping("/deleteEmployee") @RequestMapping("/deleteEmployee")
@ResponseBody @ResponseBody
public String deleteEmployee(String id){ public String deleteEmployee(String id) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 对象,用于存储删除操作的响应信息,包括删除是否成功和相应的消息。
// 该 Map 将最终被转换为 JSON 字符串并返回给客户端,以便客户端显示相应的删除结果。
Map<String, Object> map = new HashMap<>();
// 调用 EmployeeService 的 deleteEmployee 方法,将删除员工的操作委托给服务层。
// 该方法将根据传入的员工 ID 删除数据库中的员工记录,并返回受影响的行数,
// 以此来判断删除操作是否成功。
int n = employeeService.deleteEmployee(id); int n = employeeService.deleteEmployee(id);
if(n>0){
map.put("success",true); // 如果删除操作成功(受影响的行数大于 0设置删除成功的标志和相应的消息。
map.put("msg","删除成功"); if (n > 0)
} else {
map.put("success",false);
map.put("msg","删除失败");
}
return JSON.toJSONString(map);
}
}

@ -1,4 +1,5 @@
package comxyp.controller; package comxyp.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -14,65 +15,159 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 该类是一个控制器类主要负责处理与楼层Floor管理相关的请求。
// 作为 Spring MVC 架构中的控制器,它在处理用户请求和服务层之间起着桥梁的作用,
// 接收来自前端的请求,并调用相应的服务层方法进行处理,最终将处理结果返回给前端。
// 它利用了 Spring 的依赖注入和请求映射机制,使得代码结构清晰,易于维护和扩展。
@Controller @Controller
@RequestMapping("/floor") @RequestMapping("/floor")
public class FloorController { public class FloorController {
// 通过自动注入的方式将 FloorService 注入到该控制器中,以便调用其提供的业务逻辑方法。
// 这种自动注入是 Spring 框架的核心特性之一,它利用依赖注入容器,
// 根据类型自动将相应的服务实例注入到控制器中,避免了手动创建服务实例的繁琐过程,
// 提高了代码的可维护性和可测试性,降低了代码的耦合性。
@Autowired @Autowired
private FloorService floorService; private FloorService floorService;
// 该方法用于处理获取楼层列表的请求。
// 当用户在前端发起获取楼层列表的请求时,该方法会被调用,
// 并将查询到的楼层信息以分页形式返回给前端,方便用户浏览和管理楼层信息。
@RequestMapping("/floorList") @RequestMapping("/floorList")
@ResponseBody @ResponseBody
public DataGridViewResult floorList(){ public DataGridViewResult floorList() {
//设置分页信息 // 开始分页设置,这里设置为从第 1 页开始,每页显示 1000 条记录。
PageHelper.startPage(1,1000); // PageHelper 是一个强大的分页插件,它会在后续的查询操作中自动拦截 SQL 语句,
//调用分页查询的方法 // 并添加相应的分页逻辑,例如在 SQL 语句中添加 LIMIT 子句,实现分页查询的功能。
// 这样可以避免在代码中手动编写复杂的分页 SQL 语句,提高开发效率。
PageHelper.startPage(1, 1000);
// 调用 floorService 的 floorList 方法获取楼层列表。
// floorService 中的 floorList 方法会根据分页设置,从数据库或其他数据源中查询相应的数据,
// 并将结果存储在 List<Floor> 中。这个过程将业务逻辑封装在服务层,使得控制器专注于请求处理和结果返回。
List<Floor> list = floorService.floorList(); List<Floor> list = floorService.floorList();
//创建分页对象 // 创建 PageInfo 对象,将查询得到的楼层列表包装起来,以便获取更多的分页信息,如总记录数、总页数等。
// PageInfo 类提供了丰富的分页信息,为前端实现分页功能提供了便利,
// 例如可以根据这些信息生成分页导航栏,显示当前页、总页数、总记录数等信息,
// 增强用户体验和页面交互性。
PageInfo<Floor> pageInfo = new PageInfo<>(list); PageInfo<Floor> pageInfo = new PageInfo<>(list);
//返回数据 // 使用 DataGridViewResult 类对分页结果进行封装,将总记录数和当前页的楼层列表存储在其中。
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList()); // DataGridViewResult 可能是自定义的一个类,它的作用是将分页结果进行统一封装,
// 以一种标准化的格式返回给前端,方便前端进行数据的解析和展示,
// 使前端代码更加简洁和易于维护。
return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
} }
// 该方法用于处理添加新楼层的请求。
// 当用户在前端发起添加楼层的请求时,该方法会被调用,接收一个 Floor 对象作为参数,
// 该对象包含了新楼层的详细信息,如楼层名称、楼层描述等。
@RequestMapping("/addFloor") @RequestMapping("/addFloor")
@ResponseBody @ResponseBody
public String addFloor(Floor floor){ public String addFloor(Floor floor) {
Map<String,Object> map = new HashMap<>(); // 创建一个 HashMap 用于存储操作结果信息,包括操作是否成功和相应的消息。
int n = floorService.addFloor(floor); // HashMap 是一种常用的数据结构,在该场景中用于存储操作结果,
if(n>0){ // 以键值对的形式存储,方便后续转换为 JSON 字符串返回给前端。
map.put("success",true); Map<String, Object> map = new HashMap<>();
map.put("msg","添加成功"); // 调用 floorService 的 addFloor 方法将新楼层信息添加到数据库或其他存储介质中。
} else{ // addFloor 方法会将传入的 Floor 对象存储到相应的数据存储中,并返回受影响的行数,
map.put("success",false); // 该返回值可以用来判断操作是否成功。通过将业务逻辑封装在服务层,
map.put("msg","添加失败"); // 控制器只需关注操作结果的处理,提高了代码的可维护性。
} int n = floorService.addFloor(floor);
return JSON.toJSONString(map); // 如果受影响的行数大于 0说明添加操作成功。
if (n > 0) {
// 将 success 键的值设置为 true表示添加操作成功。
// 这种键值对的存储方式使得前端可以根据键名方便地获取操作结果,
// 进而采取相应的操作,例如显示成功提示信息。
map.put("success", true);
// 将 msg 键的值设置为 "添加成功",用于给前端传递操作成功的消息。
// 该消息可以显示在前端页面上,告知用户操作的结果。
map.put("msg", "添加成功");
} else {
// 若受影响的行数小于等于 0说明添加操作失败。
// 将 success 键的值设置为 false表示添加操作失败。
map.put("success", false);
// 将 msg 键的值设置为 "添加失败",用于给前端传递操作失败的消息。
// 此消息可以帮助用户排查问题,例如检查输入的楼层信息是否正确等。
map.put("msg", "添加失败");
}
// 使用 Fastjson 的 toJSONString 方法将 map 转换为 JSON 字符串。
// Fastjson 是一个高性能的 JSON 处理库,将操作结果转换为 JSON 格式,
// 可以方便地在网络中传输,并且符合前端和后端数据交互的常用格式,
// 方便前端进行解析和处理操作结果。
return JSON.toJSONString(map);
} }
// 该方法用于处理更新楼层信息的请求。
// 当用户在前端发起更新楼层信息的请求时,该方法会被调用,接收一个 Floor 对象作为参数,
// 该对象包含了更新后的楼层信息,如修改后的楼层名称、楼层描述等。
@RequestMapping("/updateFloor") @RequestMapping("/updateFloor")
@ResponseBody @ResponseBody
public String updateFloor(Floor floor){ public String updateFloor(Floor floor) {
Map<String,Object> map = new HashMap<>(); // 创建一个 HashMap 用于存储操作结果信息,包括操作是否成功和相应的消息。
// 该 HashMap 存储操作结果的目的是方便后续转换为 JSON 字符串,
// 并将结果信息以一种易于解析和处理的方式返回给前端。
Map<String, Object> map = new HashMap<>();
// 调用 floorService 的 updateFloor 方法更新楼层信息。
// updateFloor 方法会根据传入的 Floor 对象更新数据库或其他存储介质中的相应楼层信息,
// 并返回受影响的行数,通过该返回值可以判断更新操作是否成功。
int n = floorService.updateFloor(floor); int n = floorService.updateFloor(floor);
if(n>0){ // 如果受影响的行数大于 0说明更新操作成功。
map.put("success",true); if (n > 0) {
map.put("msg","修改成功"); // 将 success 键的值设置为 true表示更新操作成功。
} else{ map.put("success", true);
map.put("success",false); // 将 msg 键的值设置为 "修改成功",用于给前端传递操作成功的消息。
map.put("msg","修改失败"); // 该消息可以在前端页面上显示,让用户知道更新操作已成功完成。
map.put("msg", "修改成功");
} else {
// 若受影响的行数小于等于 0说明更新操作失败。
// 将 success 键的值设置为 false表示更新操作失败。
map.put("success", false);
// 将 msg 键的值设置为 "修改失败",用于给前端传递操作失败的消息。
// 该消息可以引导用户检查更新的信息是否准确,或者是否存在其他问题。
map.put("msg", "修改失败");
} }
// 使用 Fastjson 的 toJSONString 方法将 map 转换为 JSON 字符串。
// 这种转换是为了将操作结果以 JSON 格式返回给前端,
// 因为 JSON 是前后端数据交互的常用格式,方便前端使用 JavaScript 进行解析和处理。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 该方法用于处理删除楼层的请求。
// 当用户在前端发起删除楼层的请求时,该方法会被调用,接收一个楼层的唯一标识符(通常是楼层的 ID作为参数
// 根据该 ID 删除相应的楼层信息。
@RequestMapping("/deteleFloor") @RequestMapping("/deteleFloor")
@ResponseBody @ResponseBody
public String deteleFloor(Integer id){ public String deteleFloor(Integer id) {
Map<String,Object> map = new HashMap<>(); // 创建一个 HashMap 用于存储操作结果信息,包括操作是否成功和相应的消息。
// 此 HashMap 存储操作结果,为后续转换为 JSON 字符串并返回给前端做准备,
// 以便前端可以根据结果信息进行相应的处理。
Map<String, Object> map = new HashMap<>();
// 调用 floorService 的 deleteFloor 方法删除楼层信息。
// deleteFloor 方法会根据传入的楼层 ID 从数据库或其他存储介质中删除相应的楼层信息,
// 并返回受影响的行数,通过该返回值可以判断删除操作是否成功。
int n = floorService.deleteFloor(id); int n = floorService.deleteFloor(id);
if(n>0){ // 如果受影响的行数大于 0说明删除操作成功。
map.put("success",true); if (n > 0) {
map.put("msg","删除成功"); // 将 success 键的值设置为 true表示删除操作成功。
} else{ map.put("success", true);
map.put("success",false); // 将 msg 键的值设置为 "删除成功",用于给前端传递操作成功的消息。
map.put("msg","删除失败"); // 该消息可以在前端页面上显示,告知用户楼层已成功删除。
map.put("msg", "删除成功");
} else {
// 若受影响的行数小于等于 0说明删除操作失败。
// 将 success 键的值设置为 false表示删除操作失败。
map.put("success", false);
// 将 msg 键的值设置为 "删除失败",用于给前端传递操作失败的消息。
// 该消息可以提醒用户检查是否存在关联数据,或者是否有其他问题导致删除失败。
map.put("msg", "删除失败");
} }
// 使用 Fastjson 的 toJSONString 方法将 map 转换为 JSON 字符串。
// 将操作结果以 JSON 格式返回给前端,方便前端使用 JavaScript 解析,
// 并根据结果进行相应的页面操作,如显示删除结果提示信息等。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
}
}

@ -1,4 +1,5 @@
package comxyp.controller; package comxyp.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import comxyp.pojo.Menu; import comxyp.pojo.Menu;
import comxyp.service.MenuService; import comxyp.service.MenuService;
@ -13,55 +14,146 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 控制器类,主要负责处理与菜单相关的请求操作。
// 它是 Spring 框架中的一个控制器,使用了 @Controller 注解进行标记,以便 Spring 容器对其进行管理。
// 通过 @RequestMapping 注解将该控制器的请求映射到 "/admin/menu" 路径下,
// 表示该控制器下的所有请求都将以 "/admin/menu" 作为请求的前缀。
@Controller @Controller
@RequestMapping("/admin/menu") @RequestMapping("/admin/menu")
public class MenuController { public class MenuController {
// 自动注入 MenuService通过 Spring 的依赖注入机制,将 MenuService 的实现类注入到该控制器中。
// 这样,在这个控制器中就可以方便地调用 MenuService 提供的业务逻辑方法,而无需手动创建 MenuService 的实例。
@Autowired @Autowired
private MenuService menuService; private MenuService menuService;
//加载首页左侧菜单栏 对应着api接口中init.json中的格式
// 此方法用于加载首页左侧菜单栏,对应着 api 接口中 init.json 中的格式。
// 使用 @RequestMapping 注解将该方法映射到 "/admin/menu/loadMenuList" 请求路径上,
// 当接收到该请求时,将调用此方法。
// 使用 @ResponseBody 注解表示该方法的返回值将直接作为 HTTP 响应体的内容,
// 通常以 JSON 格式返回给客户端,方便客户端进行解析和处理。
@RequestMapping("/loadMenuList") @RequestMapping("/loadMenuList")
@ResponseBody @ResponseBody
public String loadMenuList(){ public String loadMenuList() {
//创建map集合保存菜单信息 // 创建一个 LinkedHashMap 来存储菜单的整体信息,使用 LinkedHashMap 是为了保持元素的插入顺序,
Map<String,Object> map = new LinkedHashMap<>(); // 因为菜单信息的顺序可能会影响到页面的显示效果。
//创建map集合保存 homeInfo信息 Map<String, Object> map = new LinkedHashMap<>();
Map<String,Object> homeInfo = new LinkedHashMap<>();
//创建map集合保存 logoInfo信息
Map<String,Object> logoInfo = new LinkedHashMap<>(); // 创建一个 LinkedHashMap 来存储 homeInfo 的信息,
//查询所有菜单 // homeInfo 可能包含了首页的一些相关信息,如标题、链接等。
Map<String, Object> homeInfo = new LinkedHashMap<>();
// 创建一个 LinkedHashMap 来存储 logoInfo 的信息,
// logoInfo 可能包含了系统的 logo 相关信息,如标题、图片地址、链接等。
Map<String, Object> logoInfo = new LinkedHashMap<>();
// 调用 menuService 的 findAll 方法查询所有菜单信息,
// 该方法将从数据库或其他数据源中获取菜单列表,并将结果存储在 List<Menu> 中。
// 这些菜单信息可能包含了菜单的各种属性,如菜单的 ID、父菜单 ID、标题、图标、链接等。
List<Menu> list = menuService.findAll(); List<Menu> list = menuService.findAll();
//创建集合保存菜单关系
// 创建一个 ArrayList 来存储 MenuNode 对象,用于存储菜单节点的信息,
// 后续将对这些菜单节点进行处理,以构建菜单的层级关系。
List<MenuNode> menuNodeList = new ArrayList<>(); List<MenuNode> menuNodeList = new ArrayList<>();
//循环遍历菜单列表 目的是创建菜单之间的层级关系
for(Menu m:list){
//创建菜单节点对象 // 循环遍历菜单列表,目的是将菜单列表中的每个菜单信息转换为 MenuNode 对象,
// 并创建菜单之间的层级关系。通过遍历,我们可以将菜单的各个属性设置到 MenuNode 对象中。
for (Menu m : list) {
// 创建一个 MenuNode 对象,该对象用于存储菜单节点的信息,
// 是构建菜单树结构的基本元素。
MenuNode menuNode = new MenuNode(); MenuNode menuNode = new MenuNode();
menuNode.setHref(m.getHref());//链接地址
menuNode.setIcon(m.getIcon());//菜单图标
menuNode.setId(m.getId());//菜单编号 // 将菜单的链接地址设置到 MenuNode 对象中,
menuNode.setPid(m.getPid());//父级编号 // 该链接地址将用于用户点击菜单时的跳转操作。
menuNode.setSpread(m.getSpread());//是否展开 menuNode.setHref(m.getHref());
menuNode.setTitle(m.getTitle());//菜单标题
menuNode.setTarget(m.getTarget());//打开方式
//将对象添加到集合中 // 将菜单的图标设置到 MenuNode 对象中,
// 该图标将显示在菜单的前面,用于标识菜单的类型或功能。
menuNode.setIcon(m.getIcon());
// 将菜单的编号设置到 MenuNode 对象中,
// 该编号是菜单的唯一标识符,用于区分不同的菜单。
menuNode.setId(m.getId());
// 将菜单的父级编号设置到 MenuNode 对象中,
// 父级编号用于构建菜单的层级关系,通过父级编号可以确定菜单的父子关系。
menuNode.setPid(m.getPid());
// 将菜单是否展开的状态设置到 MenuNode 对象中,
// 该状态决定了菜单在页面显示时是否默认展开。
menuNode.setSpread(m.getSpread());
// 将菜单的标题设置到 MenuNode 对象中,
// 该标题将显示在菜单上,用户可以看到菜单的名称。
menuNode.setTitle(m.getTitle());
// 将菜单的打开方式设置到 MenuNode 对象中,
// 该打开方式可能是在新窗口打开或在当前窗口打开等,用于指定点击菜单时的打开行为。
menuNode.setTarget(m.getTarget());
// 将创建好的 MenuNode 对象添加到 menuNodeList 集合中,
// 以便后续进行菜单树的构建操作。
menuNodeList.add(menuNode); menuNodeList.add(menuNode);
} }
//保存homeInfo中信息
homeInfo.put("title","首页");
homeInfo.put("href","");
//保存logoInfo 中信息 // 将 homeInfo 中的信息进行存储,设置首页的标题为 "首页"
logoInfo.put("title","酒店管理系统");//系统标题 // 这里的标题将显示在页面的首页位置,给用户一个清晰的标识。
logoInfo.put("image","/static/layui/images/logo.png");//logo图标 homeInfo.put("title", "首页");
logoInfo.put("href","");//首页地址
// 将首页的链接设置为空,
// 表示该首页可能是系统的默认首页,不需要额外的链接地址。
homeInfo.put("href", "");
// 将 logoInfo 中的信息进行存储,设置系统的标题为 "酒店管理系统"
// 这是系统的名称,将显示在页面的相应位置,让用户知道正在使用的系统名称。
logoInfo.put("title", "酒店管理系统");
// 将系统的 logo 图标地址设置为 "/static/layui/images/logo.png"
// 该地址将指向系统的 logo 图片,用于在页面上显示系统的标志。
logoInfo.put("image", "/static/layui/images/logo.png");
// 将首页的地址设置为空,
// 可能表示点击 logo 时不需要跳转到其他页面,保持在当前页面或跳转到默认的首页。
logoInfo.put("href", "");
// 将菜单信息添加到 MenuInfo 集合中,使用 TreeUtil 的 toTree 方法构建菜单树结构。
// 这里将 menuNodeList 作为菜单节点列表0 作为根节点的父节点 ID
// 表示从根节点开始构建菜单树,以便生成一个完整的菜单层级结构。
map.put("menuInfo", TreeUtil.toTree(menuNodeList, 0));
// 将 homeInfo 信息添加到 map 集合中,
// 这样可以将首页的信息和菜单信息一起返回给客户端。
map.put("homeInfo", homeInfo);
// 将 logoInfo 信息添加到 map 集合中,
// 这样可以将系统的 logo 信息和菜单信息一起返回给客户端。
map.put("logoInfo", logoInfo);
//将菜单信息添加到MenuInfo集合中
map.put("menuInfo", TreeUtil.toTree(menuNodeList,0));
map.put("homeInfo",homeInfo);
map.put("logoInfo",logoInfo);
//将信息以json格式返回 // 使用阿里巴巴的 fastjson 工具将存储菜单信息的 map 转换为 JSON 字符串,
// 以便将信息以 JSON 格式返回给客户端,方便客户端进行解析和使用。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
} }

@ -1,4 +1,5 @@
package comxyp.controller; package comxyp.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -13,64 +14,209 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 控制器类处理与房间Room相关的请求
// 该类使用了 Spring 框架的相关注解,被标记为一个控制器,用于接收和处理与房间相关的各种 Web 请求
// 通过 @RequestMapping 注解将该控制器映射到 "/rooms" 路径下,即该控制器下的所有请求都将以 "/rooms" 作为请求的前缀
@Controller @Controller
@RequestMapping("/rooms") @RequestMapping("/rooms")
public class RoomConroller { public class RoomConroller {
// 自动注入 RoomService用于调用业务逻辑层的方法
// 通过 Spring 的依赖注入机制,将 RoomService 的实现类自动注入到这个控制器中
// 这样可以方便地调用 RoomService 中的业务逻辑方法,实现房间信息的增删改查等操作,而无需手动创建 RoomService 的实例
@Autowired @Autowired
private RoomService roomService; private RoomService roomService;
// 处理房间列表请求
// 该方法用于获取房间列表,并将结果以分页的形式返回给客户端
// 通过 @RequestMapping 注解将该方法映射到 "/rooms/roomsList" 请求路径上
// 当客户端发起该请求时,此方法会被调用
// 使用 @ResponseBody 注解表示该方法的返回值将直接作为 HTTP 响应体的内容,通常会以 JSON 等格式返回给客户端
@RequestMapping("/roomsList") @RequestMapping("/roomsList")
@ResponseBody @ResponseBody
public DataGridViewResult roomsList(){ public DataGridViewResult roomsList() {
//设置分页信息 // 设置分页信息,从第 1 页开始,每页显示 1000 条记录
PageHelper.startPage(1,1000); // 使用 PageHelper 工具进行分页设置,它会对后续的查询操作进行拦截并添加分页逻辑
//调用分页查询的方法 // 例如,在数据库查询时添加 LIMIT 子句,以实现分页效果
PageHelper.startPage(1, 1000);
// 调用 roomService 的 roomList 方法获取房间列表
// 该方法将从数据源(如数据库)中查询房间信息,具体的查询逻辑在 RoomService 中实现
// 并将查询结果存储在一个 List<Room> 集合中,其中包含了符合条件的房间信息
List<Room> list = roomService.roomList(); List<Room> list = roomService.roomList();
//创建分页对象
// 创建分页对象,将房间列表放入分页对象中
// 使用 PageInfo 类对查询得到的房间列表进行包装,以获取更多的分页信息,如总记录数、总页数等
// 这些信息对于前端进行分页展示和操作非常重要,例如可以根据总记录数计算分页导航栏的页数,根据当前页的数据展示房间列表
PageInfo<Room> pageInfo = new PageInfo<>(list); PageInfo<Room> pageInfo = new PageInfo<>(list);
//返回数据
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
// 以 DataGridViewResult 的形式返回分页信息,包括总记录数和当前页的房间列表
// DataGridViewResult 可能是一个自定义的结果类,它将存储分页的总记录数和当前页的房间列表
// 这样可以将数据以一种结构化的方式返回给前端,方便前端进行展示和处理
// 前端可以根据返回的结果,将房间信息展示在页面上,并根据分页信息进行分页操作,如切换页面、显示总记录数等
return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
} }
// 处理添加房间请求
// 该方法用于处理添加房间的操作,接收一个 Room 对象作为参数
// 通过 @RequestMapping 注解将该方法映射到 "/rooms/addRoom" 请求路径上
// 当客户端发起该请求时,此方法会被调用
// 使用 @ResponseBody 注解表示该方法的返回值将直接作为 HTTP 响应体的内容,通常会以 JSON 等格式返回给客户端
@RequestMapping("/addRoom") @RequestMapping("/addRoom")
@ResponseBody @ResponseBody
public String addRoom(Room room){ public String addRoom(Room room) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 存储响应信息
// 该 Map 用于存储添加房间操作的结果信息,包括操作是否成功和相应的消息
// 可以使用不同的键值对存储不同的信息,方便后续将其转换为 JSON 字符串返回给客户端
Map<String, Object> map = new HashMap<>();
// 调用 roomService 的 addRoom 方法添加房间
// 该方法将执行添加房间的业务逻辑,将传入的 Room 对象存储到数据库或其他存储介质中
// 并返回受影响的行数,以此来判断添加操作是否成功
int n = roomService.addRoom(room); int n = roomService.addRoom(room);
if(n>0){
map.put("success",true);
map.put("msg","添加成功"); // 若添加成功,设置相应的成功信息
} else{ // 当受影响的行数大于 0 时,表示添加操作成功
map.put("success",false); if (n > 0) {
map.put("msg","添加失败"); // 在 Map 中设置 success 键的值为 true表示添加操作成功
map.put("success", true);
// 在 Map 中设置 msg 键的值为 "添加成功",作为给客户端的成功消息
// 客户端可以根据该消息提示用户添加操作成功
map.put("msg", "添加成功");
} else {
// 若添加失败,设置相应的错误信息
// 当受影响的行数小于或等于 0 时,表示添加操作失败
// 可能是由于数据库操作错误、数据不合法等原因导致添加失败
// 在 Map 中设置 success 键的值为 false表示添加操作失败
map.put("success", false);
// 在 Map 中设置 msg 键的值为 "添加失败",作为给客户端的错误消息
// 客户端可以根据该消息提示用户添加操作失败,并可以根据具体情况进行相应的处理,如重新输入房间信息等
map.put("msg", "添加失败");
} }
// 将结果转换为 JSON 字符串并返回
// 使用阿里巴巴的 fastjson 工具将存储操作结果的 Map 转换为 JSON 字符串
// 以便将结果以 JSON 格式返回给客户端,客户端可以方便地解析该 JSON 字符串,获取操作结果信息
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 处理更新房间请求
// 该方法用于处理更新房间信息的操作,接收一个 Room 对象作为参数
// 通过 @RequestMapping 注解将该方法映射到 "/rooms/updateRoom" 请求路径上
// 当客户端发起该请求时,此方法会被调用
// 使用 @ResponseBody 注解表示该方法的返回值将直接作为 HTTP 响应体的内容,通常会以 JSON 等格式返回给客户端
@RequestMapping("/updateRoom") @RequestMapping("/updateRoom")
@ResponseBody @ResponseBody
public String updateRoom(Room room){ public String updateRoom(Room room) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 存储响应信息
// 该 Map 用于存储更新房间操作的结果信息,包括操作是否成功和相应的消息
// 可以使用不同的键值对存储不同的信息,方便后续将其转换为 JSON 字符串返回给客户端
Map<String, Object> map = new HashMap<>();
// 调用 roomService 的 updateRoom 方法更新房间信息
// 该方法将根据传入的 Room 对象更新数据库或其他存储介质中的房间信息
// 并返回受影响的行数,以此来判断更新操作是否成功
int n = roomService.updateRoom(room); int n = roomService.updateRoom(room);
if(n>0){
map.put("success",true);
map.put("msg","更新成功"); // 若更新成功,设置相应的成功信息
} else{ // 当受影响的行数大于 0 时,表示更新操作成功
map.put("success",false); if (n > 0) {
map.put("msg","更新失败"); // 在 Map 中设置 success 键的值为 true表示更新操作成功
map.put("success", true);
// 在 Map 中设置 msg 键的值为 "更新成功",作为给客户端的成功消息
// 客户端可以根据该消息提示用户更新操作成功
map.put("msg", "更新成功");
} else {
// 若更新失败,设置相应的错误信息
// 当受影响的行数小于或等于 0 时,表示更新操作失败
// 可能是由于数据库操作错误、数据不合法等原因导致更新失败
// 在 Map 中设置 success 键的值为 false表示更新操作失败
map.put("success", false);
// 在 Map 中设置 msg 键的值为 "更新失败",作为给客户端的错误消息
// 客户端可以根据该消息提示用户更新操作失败,并可以根据具体情况进行相应的处理,如检查更新的房间信息是否正确等
map.put("msg", "更新失败");
} }
// 将结果转换为 JSON 字符串并返回
// 使用阿里巴巴的 fastjson 工具将存储操作结果的 Map 转换为 JSON 字符串
// 以便将结果以 JSON 格式返回给客户端,客户端可以方便地解析该 JSON 字符串,获取操作结果信息
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
// 处理删除房间请求
// 该方法用于处理删除房间的操作,接收一个房间的唯一标识符(通常是房间的 ID作为参数
// 通过 @RequestMapping 注解将该方法映射到 "/rooms/deleteRoom" 请求路径上
// 当客户端发起该请求时,此方法会被调用
// 使用 @ResponseBody 注解表示该方法的返回值将直接作为 HTTP 响应体的内容,通常会以 JSON 等格式返回给客户端
@RequestMapping("/deleteRoom") @RequestMapping("/deleteRoom")
@ResponseBody @ResponseBody
public String deleteRoom(int id){ public String deleteRoom(int id) {
Map<String,Object> map = new HashMap<>(); // 创建一个 Map 存储响应信息
// 该 Map 用于存储删除房间操作的结果信息,包括操作是否成功和相应的消息
// 可以使用不同的键值对存储不同的信息,方便后续将其转换为 JSON 字符串返回给客户端
Map<String, Object> map = new HashMap<>();
// 调用 roomService 的 deleteRoom 方法删除房间
// 该方法将根据传入的房间 ID 删除数据库或其他存储介质中的房间信息
// 并返回受影响的行数,以此来判断删除操作是否成功
int n = roomService.deleteRoom(id); int n = roomService.deleteRoom(id);
if(n>0){
map.put("success",true);
map.put("msg","删除成功"); // 若删除成功,设置相应的成功信息
} else{ // 当受影响的行数大于 0 时,表示删除操作成功
map.put("success",false); if (n > 0) {
map.put("msg","删除失败"); // 在 Map 中设置 success 键的值为 true表示删除操作成功
map.put("success", true);
// 在 Map 中设置 msg 键的值为 "删除成功",作为给客户端的成功消息
// 客户端可以根据该消息提示用户删除操作成功
map.put("msg", "删除成功");
} else {
// 若删除失败,设置相应的错误信息
// 当受影响的行数小于或等于 0 时,表示删除操作失败
// 可能是由于数据库操作错误、数据不合法等原因导致删除失败
// 在 Map 中设置 success 键的值为 false表示删除操作失败
map.put("success", false);
// 在 Map 中设置 msg 键的值为 "删除失败",作为给客户端的错误消息
// 客户端可以根据该消息提示用户删除操作失败,并可以根据具体情况进行相应的处理,如检查房间是否已被占用等
map.put("msg", "删除失败");
} }
// 将结果转换为 JSON 字符串并返回
// 使用阿里巴巴的 fastjson 工具将存储操作结果的 Map 转换为 JSON 字符串
// 以便将结果以 JSON 格式返回给客户端,客户端可以方便地解析该 JSON 字符串,获取操作结果信息
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
}
}

@ -23,113 +23,276 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// 该类是一个 Spring 控制器主要负责处理与房间类型RoomType相关的各种操作请求。
// 它使用了 Spring 框架的相关注解,将其标记为一个控制器,并将请求映射到 "/roomtype" 路径下。
@Controller @Controller
@RequestMapping("/roomtype") @RequestMapping("/roomtype")
public class RoomTypeController { public class RoomTypeController {
// 自动注入 RoomTypeService通过 Spring 的依赖注入机制将 RoomTypeService 的实现类注入到该控制器中。
// 这样可以方便地调用 RoomTypeService 提供的业务逻辑方法,而无需手动创建 RoomTypeService 的实例。
@Autowired @Autowired
RoomTypeService typeService; RoomTypeService typeService;
// 此方法用于处理房间类型列表的请求,返回分页的房间类型信息。
// 它将使用 PageHelper 进行分页处理,并将结果以 DataGridViewResult 格式返回给客户端。
@RequestMapping("/roomTypeList") @RequestMapping("/roomTypeList")
@ResponseBody @ResponseBody
public DataGridViewResult roomTypeList(){ public DataGridViewResult roomTypeList() {
//设置分页信息 // 设置分页信息,使用 PageHelper 进行分页设置。
PageHelper.startPage(1,1000); // 这里从第 1 页开始,每页显示 1000 条记录。PageHelper 会对后续的查询操作进行分页处理,
//调用分页查询的方法 // 例如,它可能会在数据库查询语句中添加 LIMIT 子句,以实现分页功能。
PageHelper.startPage(1, 1000);
// 调用 RoomTypeService 的 roomTypeList 方法,该方法将从数据源(如数据库)中查询房间类型列表。
// 具体的查询逻辑在 RoomTypeService 中实现,将查询结果存储在 List<RoomType> 中。
List<RoomType> list = typeService.roomTypeList(); List<RoomType> list = typeService.roomTypeList();
//创建分页对象
// 创建分页对象,使用 PageInfo 类将查询结果包装起来,以便获取更多的分页信息,
// 如总记录数、总页数等。这些信息对于前端的分页展示和操作非常有用,
// 可以帮助前端实现分页导航栏的显示和页面跳转等功能。
PageInfo<RoomType> pageInfo = new PageInfo<>(list); PageInfo<RoomType> pageInfo = new PageInfo<>(list);
//返回数据
return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
// 以 DataGridViewResult 的形式返回分页信息,将总记录数和当前页的房间类型列表封装在其中。
// DataGridViewResult 可能是一个自定义的类,用于统一封装分页数据,方便前端进行数据展示和处理。
return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
} }
//文件上传
// 此方法用于处理文件上传请求,主要用于上传与房间类型相关的文件,如房间类型的图片等。
@RequestMapping("/uploadFile") @RequestMapping("/uploadFile")
@ResponseBody @ResponseBody
public String uploadFile(MultipartFile file){ public String uploadFile(MultipartFile file) {
//创建Map集合保存返回的JSON数据 // 创建一个 Map 集合,用于存储文件上传操作的结果信息,
Map<String,Object> map = new HashMap<String,Object>(); // 最终将其转换为 JSON 字符串返回给客户端,以便客户端可以根据结果进行相应的操作。
//判断是否有选中文件 Map<String, Object> map = new HashMap<String, Object>();
if(!file.isEmpty()){
//获取文件上传的地址
String path = "E:/javaWeb项目/ssm+酒店管理系统/upload/"; // 判断是否有选中文件。如果用户没有选择文件,将不进行后续的文件上传操作。
//获取源文件的名称 if (!file.isEmpty()) {
// 获取文件上传的地址,这里硬编码为 "E:/javaWeb 项目/ssm+酒店管理系统/upload/"
// 在实际应用中,建议将文件上传路径存储在配置文件中,以便于修改和维护。
String path = "E:/javaWeb 项目/ssm+酒店管理系统/upload/";
// 获取源文件的名称,即用户上传文件的原始名称,包含文件的后缀名。
String oldFileName = file.getOriginalFilename(); String oldFileName = file.getOriginalFilename();
//获取文件的后缀名
// 使用 FilenameUtils 工具类获取文件的后缀名,
// 以便在后续操作中对文件进行重命名或进行文件类型的验证等。
String extension = FilenameUtils.getExtension(oldFileName); String extension = FilenameUtils.getExtension(oldFileName);
//重命名旧文件
String newFileName = UUIDUtils.randomUUID()+"."+extension;
//为了解决同一个文件夹下文件过多的问题,使用日期作为文件夹管理 // 使用 UUIDUtils 生成一个唯一的文件名,以避免文件名冲突。
// 加上文件的后缀名,保证文件的完整性和可识别性。
String newFileName = UUIDUtils.randomUUID() + "." + extension;
// 为了解决同一个文件夹下文件过多的问题,使用日期作为文件夹管理。
// 使用 SimpleDateFormat 对当前日期进行格式化,生成日期格式的文件夹名称。
String datePath = new SimpleDateFormat("yyyyMMdd").format(new Date()); String datePath = new SimpleDateFormat("yyyyMMdd").format(new Date());
//组装最终的文件名
// 组装最终的文件名,将日期文件夹和新文件名组合在一起,
// 以实现更好的文件管理和存储结构,方便查找和维护。
String finalName = datePath + "/" + newFileName; String finalName = datePath + "/" + newFileName;
//创建文件对象
//参数1文件上传的地址 参数2文件名称
File dest = new File(path,finalName); // 创建文件对象,指定文件上传的地址和最终的文件名称。
//判断该文件夹是否存在,不存在则创建文件夹 // 这里的文件对象表示文件在服务器上的存储位置和名称。
if(!dest.getParentFile().exists()){ File dest = new File(path, finalName);
dest.getParentFile().mkdirs();//创建文件夹
// 判断该文件夹是否存在,如果不存在,则创建相应的文件夹。
// 确保文件存储的文件夹存在,避免文件存储时出现文件找不到的错误。
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();// 创建文件夹
} }
try { try {
//进行文件上传 // 进行文件上传操作,将上传的文件保存到指定的文件对象所代表的位置。
// 使用 MultipartFile 的 transferTo 方法将文件数据写入文件。
file.transferTo(dest); file.transferTo(dest);
map.put("code",0);//状态码
map.put("msg","上传成功");//执行消息
Map<String,Object> dataMap = new HashMap<String,Object>(); // 存储文件上传成功的信息到 Map 中。
dataMap.put("src","hotel/show/"+finalName); // 设置状态码为 0表示操作成功。
map.put("data",dataMap);//文件数据 map.put("code", 0);
map.put("imagePath",finalName);//隐藏域的值,只保留日期文件夹+重命名后的文件名
// 存储操作消息,提示用户文件上传成功。
map.put("msg", "上传成功");
// 创建一个子 Map 存储文件的具体数据,方便前端进行更多的操作和展示。
Map<String, Object> dataMap = new HashMap<String, Object>();
// 存储文件的访问路径,这里的路径是给前端使用的,可能会根据实际情况进行调整,
// 例如在实际应用中可能会根据服务器的配置和项目部署结构进行修改。
dataMap.put("src", "hotel/show/" + finalName);
// 将文件数据存储在 Map 中,方便前端进行后续的操作,
// 如显示文件的预览或进行文件的下载等。
map.put("data", dataMap);
// 存储文件的相对路径,作为隐藏域的值,
// 只保留日期文件夹和重命名后的文件名,方便后续的操作,
// 如在更新或删除文件时使用该信息。
map.put("imagePath", finalName);
} catch (IOException e) { } catch (IOException e) {
// 打印异常信息,在实际应用中,应进行更详细的异常处理,
// 如记录日志、向用户返回更友好的错误消息等。
e.printStackTrace(); e.printStackTrace();
} }
} }
// 将存储文件上传结果的 Map 转换为 JSON 字符串并返回给客户端,
// 以便客户端可以解析并根据结果进行相应的操作。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
//添加房型
// 此方法用于处理添加房间类型的请求,接收一个 RoomType 对象作为参数。
// 该对象包含了要添加的房间类型的信息,如房间类型名称、价格、描述等。
@RequestMapping("/addRoomType") @RequestMapping("/addRoomType")
@ResponseBody @ResponseBody
private String addRoomType(RoomType roomType){ private String addRoomType(RoomType roomType) {
Map<String ,Object> map = new HashMap<>(); // 创建一个 Map 集合,用于存储添加房间类型操作的结果信息,
// 最终将其转换为 JSON 字符串返回给客户端,以便客户端可以根据结果进行相应的操作。
Map<String, Object> map = new HashMap<>();
// 调用 RoomTypeService 的 addRoomType 方法,将房间类型信息添加到数据库或其他存储介质中。
// 该方法会执行添加操作,并返回受影响的行数,以此来判断添加操作是否成功。
int n = typeService.addRoomType(roomType); int n = typeService.addRoomType(roomType);
if(n>0){
map.put("success",true);
map.put("msg","添加成功"); // 如果受影响的行数大于 0表示添加操作成功。
if (n > 0) {
// 在 Map 中设置 success 键为 true表示添加操作成功。
map.put("success", true);
// 存储操作消息,提示用户添加操作成功。
map.put("msg", "添加成功");
} else { } else {
map.put("success",false); // 如果受影响的行数小于或等于 0表示添加操作失败。
map.put("msg","添加失败"); // 在 Map 中设置 success 键为 false表示添加操作失败。
map.put("success", false);
// 存储操作消息,提示用户添加操作失败。
map.put("msg", "添加失败");
} }
// 将存储添加结果的 Map 转换为 JSON 字符串并返回给客户端,
// 以便客户端可以解析并根据结果进行相应的操作。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
//修改房型
// 此方法用于处理修改房间类型的请求,接收一个 RoomType 对象作为参数。
// 该对象包含了要修改的房间类型的信息,如修改后的房间类型名称、价格、描述等。
@RequestMapping("/updateRoomType") @RequestMapping("/updateRoomType")
@ResponseBody @ResponseBody
private String updateRoomType(RoomType roomType){ private String updateRoomType(RoomType roomType) {
Map<String ,Object> map = new HashMap<>(); // 创建一个 Map 集合,用于存储修改房间类型操作的结果信息,
// 最终将其转换为 JSON 字符串返回给客户端,以便客户端可以根据结果进行相应的操作。
Map<String, Object> map = new HashMap<>();
// 调用 RoomTypeService 的 updateRoomType 方法,根据传入的房间类型信息更新数据库中的数据。
// 该方法会执行更新操作,并返回受影响的行数,以此来判断更新操作是否成功。
int n = typeService.updateRoomType(roomType); int n = typeService.updateRoomType(roomType);
if(n>0){
map.put("success",true);
map.put("msg","修改成功"); // 如果受影响的行数大于 0表示更新操作成功。
if (n > 0) {
// 在 Map 中设置 success 键为 true表示更新操作成功。
map.put("success", true);
// 存储操作消息,提示用户更新操作成功。
map.put("msg", "修改成功");
} else { } else {
map.put("success",false); // 如果受影响的行数小于或等于 0表示更新操作失败。
map.put("msg","修改失败"); // 在 Map 中设置 success 键为 false表示更新操作失败。
map.put("success", false);
// 存储操作消息,提示用户更新操作失败。
map.put("msg", "修改失败");
} }
// 将存储更新结果的 Map 转换为 JSON 字符串并返回给客户端,
// 以便客户端可以解析并根据结果进行相应的操作。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
//修改房型
// 此方法用于处理删除房间类型的请求,接收一个房间类型的唯一标识符(通常是房间类型的 ID作为参数。
@RequestMapping("/deleteRoomType") @RequestMapping("/deleteRoomType")
@ResponseBody @ResponseBody
private String deleteRoomType(int id){ private String deleteRoomType(int id) {
Map<String ,Object> map = new HashMap<>(); // 创建一个 Map 集合,用于存储删除房间类型操作的结果信息,
// 最终将其转换为 JSON 字符串返回给客户端,以便客户端可以根据结果进行相应的操作。
Map<String, Object> map = new HashMap<>();
// 调用 RoomTypeService 的 deleteRoomType 方法,根据传入的 ID 删除数据库中的房间类型信息。
// 该方法会执行删除操作,并返回受影响的行数,以此来判断删除操作是否成功。
int n = typeService.deleteRoomType(id); int n = typeService.deleteRoomType(id);
if(n>0){
map.put("success",true);
map.put("msg","删除成功"); // 如果受影响的行数大于 0表示删除操作成功。
if (n > 0) {
// 在 Map 中设置 success 键为 true表示删除操作成功。
map.put("success", true);
// 存储操作消息,提示用户删除操作成功。
map.put("msg", "删除成功");
} else { } else {
map.put("success",false); // 如果受影响的行数小于或等于 0表示删除操作失败。
map.put("msg","删除失败"); // 在 Map 中设置 success 键为 false表示删除操作失败。
map.put("success", false);
// 存储操作消息,提示用户删除操作失败。
map.put("msg", "删除失败");
} }
// 将存储删除结果的 Map 转换为 JSON 字符串并返回给客户端,
// 以便客户端可以解析并根据结果进行相应的操作。
return JSON.toJSONString(map); return JSON.toJSONString(map);
} }
}
}

@ -1,50 +1,110 @@
package comxyp.controller; package comxyp.controller;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
//专门用来控制 负责跳转后台页面的 // 这个控制器类专门用来控制后台页面的跳转操作。
// 它使用了 Spring 框架的相关注解,将该类标记为一个控制器,
// 并且通过 @RequestMapping 注解将该控制器的请求映射到 "/admin" 路径下,
// 意味着该控制器将处理所有以 "/admin" 为前缀的请求。
@Controller @Controller
@RequestMapping("/admin") @RequestMapping("/admin")
public class SystemController { public class SystemController {
//去到登录页面
// 此方法用于将用户引导至登录页面。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/login.html" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "login" 表示将用户重定向到名为 "login" 的页面,
// 这里的 "login" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/login.html") @RequestMapping("/login.html")
public String login(){ public String login() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "login"; return "login";
} }
//退出登录
// 此方法用于处理用户的退出登录操作。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/logout.html" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法接收一个 HttpSession 对象,用于操作会话信息。
@RequestMapping("/logout.html") @RequestMapping("/logout.html")
public String logout(HttpSession session){ public String logout(HttpSession session) {
//清空session // 清空用户的会话信息,通过 removeAttribute 方法移除 "user" 属性,
// 这通常表示清除用户的登录状态,"user" 属性可能存储着用户的登录信息。
session.removeAttribute("user"); session.removeAttribute("user");
// 使用 "redirect:/admin/login.html" 进行重定向,
// 将用户重定向到登录页面,以便用户重新登录。
// 这里使用了重定向而不是转发,以避免用户刷新页面时重复提交表单等问题。
return "redirect:/admin/login.html"; return "redirect:/admin/login.html";
} }
//去到注册页面
// 此方法用于将用户引导至注册页面。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/register.html" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "register" 表示将用户重定向到名为 "register" 的页面,
// 这里的 "register" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/register.html") @RequestMapping("/register.html")
public String register(){ public String register() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "register"; return "register";
} }
//进入首页
// 此方法用于将用户引导至首页。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/home.html" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "home" 表示将用户重定向到名为 "home" 的页面,
// 这里的 "home" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/home.html") @RequestMapping("/home.html")
public String home(){ public String home() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "home"; return "home";
} }
//进入部门管理页面
// 此方法用于将用户引导至部门管理页面。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/ToDeptManage" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "dept/deptManage" 表示将用户重定向到名为 "dept/deptManage" 的页面,
// 这里的 "dept/deptManage" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/ToDeptManage") @RequestMapping("/ToDeptManage")
public String ToDeptManage(){ public String ToDeptManage() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "dept/deptManage"; return "dept/deptManage";
} }
//进入个人信息页面
// 此方法用于将用户引导至个人信息页面。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/myInfo" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "user-setting" 表示将用户重定向到名为 "user-setting" 的页面,
// 这里的 "user-setting" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/myInfo") @RequestMapping("/myInfo")
public String myInfo(){ public String myInfo() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "user-setting"; return "user-setting";
} }
//修改密码
// 此方法用于将用户引导至修改密码页面。
// 通过 @RequestMapping 注解将该方法映射到 "/admin/mypassword" 请求路径上,
// 当用户访问该路径时,该方法会被调用。
// 该方法的返回值 "user-password" 表示将用户重定向到名为 "user-password" 的页面,
// 这里的 "user-password" 通常是一个视图名称Spring 会根据配置将其解析为实际的页面路径。
@RequestMapping("/mypassword") @RequestMapping("/mypassword")
public String mypassword(){ public String mypassword() {
// 此方法只是简单地返回一个视图名称,
// 具体的页面解析和跳转由 Spring 的视图解析器根据配置完成。
return "user-password"; return "user-password";
} }
}
}

@ -1,38 +1,63 @@
package comxyp.filter; package comxyp.filter;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
//自定义过滤器 // 自定义过滤器,用于对请求进行过滤处理,通常用于用户登录验证等功能。
// 该过滤器是 Servlet 规范中的一部分,通过实现 Filter 接口,可以对进入 Web 应用的请求进行拦截和处理,
// 确保请求的安全性和合法性,例如防止未登录用户访问受保护的页面或资源。
public class LoginFilter implements Filter { public class LoginFilter implements Filter {
//初始化方法
// 初始化方法,在过滤器被创建时调用,进行一些初始化操作。
// 该方法通常用于执行一些一次性的设置,例如加载配置信息、初始化资源等。
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException { public void init(FilterConfig filterConfig) throws ServletException {
//初始化处理 // 输出初始化信息,表明过滤器正在进行初始化。
// 可以在这里添加更多的初始化代码,例如读取配置文件中的参数,设置过滤器的某些属性等。
System.out.println("过滤器初始化"); System.out.println("过滤器初始化");
} }
// 核心过滤方法,对每个请求进行处理。
// 该方法会在每次请求到达时被调用,根据请求的情况进行相应的处理,如检查用户登录状态、记录请求信息等。
@Override @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest; // 将 ServletRequest 转换为 HttpServletRequest以便获取更多 HTTP 相关信息。
HttpServletResponse response= (HttpServletResponse) servletResponse; // 这样可以使用 HttpServletRequest 提供的更多功能,如获取请求参数、请求头、会话等。
HttpSession session=request.getSession(); HttpServletRequest request = (HttpServletRequest) servletRequest;
if(session.getAttribute("user")==null){ // 将 ServletResponse 转换为 HttpServletResponse以便进行 HTTP 响应操作。
//非法请求,直接跳转到登陆界面 // 例如,可以使用 HttpServletResponse 进行重定向、设置响应状态码、添加响应头信息等。
//如果没有登录,则去到登录页面 HttpServletResponse response = (HttpServletResponse) servletResponse;
response.sendRedirect(request.getContextPath()+"/admin/login.html"); // 获取当前请求的 HttpSession 对象,用于检查用户登录状态。
}else{ // 会话对象可以存储用户的登录信息,通过检查会话中的用户信息可以判断用户是否已经登录。
//正常登录,放行 HttpSession session = request.getSession();
filterChain.doFilter(request,response); // 检查 session 中是否存在名为 "user" 的属性,以此来判断用户是否已经登录。
// 通常 "user" 属性可以存储用户的登录信息,如用户对象、用户 ID 等。
if (session.getAttribute("user") == null) {
// 如果 session 中不存在 "user" 属性,说明用户未登录,属于非法请求。
// 进行重定向操作,将用户引导至登录页面,登录页面的路径是 /admin/login.html。
// 重定向是将用户的浏览器重新定向到另一个 URL使其重新发起请求。
// request.getContextPath() 用于获取当前应用的上下文路径,确保重定向的 URL 是正确的。
// 这是为了避免在不同部署环境中出现路径错误的问题,保证重定向的 URL 是相对于当前应用的根路径。
response.sendRedirect(request.getContextPath() + "/admin/login.html");
} else {
// 如果 session 中存在 "user" 属性,说明用户已经登录,请求合法。
// 调用 filterChain.doFilter 方法,允许请求继续向下传递,
// 通过过滤器链中的下一个过滤器或到达最终的目标资源。
// 这样可以保证合法请求能够正常访问相应的资源或服务。
filterChain.doFilter(request, response);
} }
} }
// 销毁方法,在过滤器被销毁时调用,用于释放资源。
// 该方法通常在应用关闭或过滤器不再使用时调用,用于释放过滤器占用的资源,
// 例如关闭文件、释放数据库连接等。
@Override @Override
public void destroy() { public void destroy() {
//释放资源 // 输出销毁信息,表明过滤器正在销毁。
// 可以在这里添加更多的资源释放代码,例如关闭文件流、释放数据库连接等。
System.out.println("过滤器销毁"); System.out.println("过滤器销毁");
} }
} }

@ -1,19 +1,35 @@
package comxyp.interceptor; package comxyp.interceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
// 该类是一个自定义的拦截器,继承自 Spring 的 HandlerInterceptorAdapter。
// 拦截器是 Spring MVC 框架中用于拦截请求的一种机制,可在请求处理的不同阶段进行拦截和处理,
// 例如在请求处理前、请求处理后或视图渲染后进行操作,以实现诸如权限控制、日志记录等功能。
public class LoginInterceptor extends HandlerInterceptorAdapter { public class LoginInterceptor extends HandlerInterceptorAdapter {
// 该方法是在请求处理之前调用,用于进行预处理。
// 可以在这里进行权限验证、日志记录、性能统计等操作,根据方法的返回值决定是否继续处理请求。
// 若返回 true则请求将继续处理若返回 false则请求将被拦截。
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断session是否为空 // 判断 session 是否为空。
if((request.getSession().getAttribute("user")==null)){ // 通过 HttpServletRequest 获取当前请求的会话对象,并检查其中是否包含 "user" 属性。
//如果没有登录,则去到登录页面 // "user" 属性可能存储着用户的登录信息,若不存在,则表示用户未登录。
response.sendRedirect(request.getContextPath()+"/admin/login.html"); if ((request.getSession().getAttribute("user") == null)) {
return false;//验证失败,进行拦截 // 如果没有登录,则去到登录页面。
// 使用 HttpServletResponse 的 sendRedirect 方法将用户重定向到登录页面。
// request.getContextPath() 用于获取当前应用的上下文路径,确保重定向的路径是正确的。
// 这样做可以避免硬编码的问题,使得在不同部署环境下都能正确重定向。
response.sendRedirect(request.getContextPath() + "/admin/login.html");
// 验证失败,进行拦截。
// 返回 false 表示请求被拦截,不会继续处理该请求。
return false;
} }
//验证通过 // 验证通过。
// 当 session 中包含 "user" 属性时,说明用户已经登录,允许请求继续处理。
// 返回 true 表示请求可以继续进行后续的处理,如调用控制器方法等。
return true; return true;
} }
} }

@ -1,4 +1,5 @@
package comxyp.listener; package comxyp.listener;
import comxyp.pojo.Dept; import comxyp.pojo.Dept;
import comxyp.pojo.Employee; import comxyp.pojo.Employee;
import comxyp.pojo.Floor; import comxyp.pojo.Floor;
@ -14,33 +15,90 @@ import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; import javax.servlet.annotation.WebListener;
import java.util.List; import java.util.List;
//实现部门名称的监听器 使用监听器作用就是 当要使用到该数据 我们可以直接获取 // 实现部门名称的监听器,使用监听器的作用是当需要使用到该数据时可以直接获取。
// 监听器的注解(一定要加上 不然没有起到作用) // 监听器是 Servlet 规范中的一部分,它允许我们在 Servlet 容器的不同生命周期阶段执行特定的操作。
// 在这个例子中,主要利用它在 ServletContext 初始化阶段执行一些操作,以便在整个应用程序的生命周期内实现数据的共享和复用。
// 它能够监听 ServletContext 的生命周期事件,在特定的事件发生时,相应的方法会被调用,从而实现相应的逻辑处理。
// 该监听器被设计为在 ServletContext 初始化时,将一些经常需要使用的数据预先加载并存储在 ServletContext 中,
// 这样在后续的请求处理过程中,不同的组件(如 Servlet、JSP 页面等)可以方便地访问这些数据,
// 避免了多次重复查询数据库或其他数据源,提高了数据的访问效率,优化了应用程序的性能。
// 监听器的注解(一定要加上,不然无法发挥作用),通过 @WebListener 注解将该类标记为一个 Servlet 监听器,
// 此注解会被 Servlet 容器识别,容器会自动将该监听器注册并管理其生命周期。
@WebListener @WebListener
public class DeptNameListener implements ServletContextListener { public class DeptNameListener implements ServletContextListener {
@Override @Override
public void contextInitialized(ServletContextEvent servletContextEvent) { public void contextInitialized(ServletContextEvent servletContextEvent) {
//手动从spring容器中获取ProductTypeServiceImpl的对象 // 手动从 Spring 容器中获取 ApplicationContext 对象,使用 ClassPathXmlApplicationContext 加载配置文件 "applicationContext.xml"。
// ClassPathXmlApplicationContext 是 Spring 框架中用于从类路径加载 XML 配置文件的类,它是 Spring 容器的一种实现方式。
// 它的主要功能是根据配置文件中的信息创建和管理 Spring 容器,在容器创建过程中,
// 会对配置文件中声明的 Bean 进行解析,包括实例化 Bean 对象、解析 Bean 之间的依赖关系,
// 并完成依赖注入,使得各个 Bean 之间能够相互协作,共同完成业务逻辑。
// 通过这种方式,我们可以在应用程序中方便地获取各种 Bean 实例,从而调用相应的服务方法。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从 Spring 容器中获取 DeptService 的实现类对象,通过名称 "DeptServiceImpl" 获取。
// getBean 方法是 Spring 容器提供的用于获取 Bean 实例的方法,它根据提供的名称在容器中查找对应的 Bean。
// 这里使用名称 "DeptServiceImpl" 作为参数,假设这是我们在配置文件中为 DeptService 实现类配置的名称。
// 这种通过名称查找 Bean 的方式,在一定程度上实现了服务层的解耦,因为我们无需关心具体的实现类细节,
// 只需要知道服务的名称,就可以在监听器中调用相应的业务逻辑方法,增强了代码的可维护性和可扩展性。
DeptService deptService = (DeptService) context.getBean("DeptServiceImpl"); DeptService deptService = (DeptService) context.getBean("DeptServiceImpl");
// 从 Spring 容器中获取 RoomTypeService 的实现类对象,通过名称 "roomTypeService" 获取。
// 这是一种基于名称查找 Spring 容器中 Bean 的方式,和获取 DeptService 的实现类对象的原理相同。
// 这种机制使得我们可以方便地从 Spring 容器中获取所需的服务,而无需在监听器中显式创建服务类的实例,
// 降低了代码的耦合度,提高了代码的灵活性,同时也方便了服务的替换和升级。
RoomTypeService roomTypeService = (RoomTypeService) context.getBean("roomTypeService"); RoomTypeService roomTypeService = (RoomTypeService) context.getBean("roomTypeService");
// 从 Spring 容器中获取 FloorService 的实现类对象,通过名称 "floorService" 获取。
// 这同样是通过 Spring 容器的 getBean 方法,根据名称查找对应的服务 Bean 实例,
// 以便调用该服务提供的业务逻辑方法,为后续的数据存储和处理提供服务支持。
FloorService floorService = (FloorService) context.getBean("floorService"); FloorService floorService = (FloorService) context.getBean("floorService");
//将查询到的商品类别数据存入集合中
// 调用 DeptService 的 selectDeptName 方法查询部门名称数据,并将结果存储在 types 集合中。
// selectDeptName 方法是 DeptService 中的一个业务逻辑方法,它的主要功能是从数据源(如数据库)中检索部门名称信息,
// 并将这些信息以 List<Dept> 的形式返回。这个方法可能会执行 SQL 查询或其他数据源操作,
// 以获取所需的部门名称数据,为后续的应用程序功能提供数据支持。
List<Dept> types = deptService.selectDeptName(); List<Dept> types = deptService.selectDeptName();
//然后放入全局应用域中 这样当我们要修改 添加 查询功能时都可以从该域中进行获取
servletContextEvent.getServletContext().setAttribute("types",types); // 将查询到的部门名称数据存储到 ServletContext 的全局应用域中,以 "types" 为键,方便后续在修改、添加、查询功能中直接从该域中获取数据。
//将查询到的房型类型 数据存入集合中 // ServletContext 是一个全局的上下文对象,它代表了整个 Servlet 应用程序的上下文环境,
// 存储在其中的数据可以在整个应用程序的不同组件间共享。将部门名称列表存储在此处,
// 意味着在整个应用程序的生命周期内,其他 Servlet 或 JSP 页面可以通过这个键 "types" 方便地访问这些数据,
// 避免了在不同组件中多次调用服务层的 selectDeptName 方法,减少了数据库或数据源的访问次数,提高了性能。
servletContextEvent.getServletContext().setAttribute("types", types);
// 调用 RoomTypeService 的 roomTypeList 方法查询房型类型数据,并将结果存储在 roomTypeList 集合中。
// roomTypeList 方法是 RoomTypeService 提供的业务逻辑方法,其目的是从数据库或其他数据源中检索房型类型的信息,
// 并将其存储在一个 List<RoomType> 集合中,以便后续使用。
// 它可能会执行复杂的查询逻辑,根据业务需求从数据源中筛选和整理房型类型的数据。
List<RoomType> roomTypeList = roomTypeService.roomTypeList(); List<RoomType> roomTypeList = roomTypeService.roomTypeList();
//然后放入全局应用域中 这样当我们要修改 添加 查询功能时都可以从该域中进行获取
servletContextEvent.getServletContext().setAttribute("roomTypeList",roomTypeList); // 将查询到的房型类型数据存储到 ServletContext 的全局应用域中,以 "roomTypeList" 为键,方便后续在修改、添加、查询功能中直接从该域中获取数据。
//将查询到的楼层数据存入集合中 // 存储在 ServletContext 中的数据可以被多个 Servlet 或 JSP 页面共享,
// 对于需要使用房型类型数据的组件,只需要从 ServletContext 中通过键 "roomTypeList" 获取,
// 而无需再次调用服务层的 roomTypeList 方法,提高了数据的复用性和性能。
servletContextEvent.getServletContext().setAttribute("roomTypeList", roomTypeList);
// 调用 FloorService 的 floorList 方法查询楼层数据,并将结果存储在 floorList 集合中。
// floorList 方法是 FloorService 提供的业务逻辑方法,它负责从数据源中查询楼层信息,
// 可能会执行数据库查询操作,以获取楼层的详细信息,并将结果存储在 List<Floor> 集合中。
List<Floor> floorList = floorService.floorList(); List<Floor> floorList = floorService.floorList();
servletContextEvent.getServletContext().setAttribute("floorList",floorList);
// 将查询到的楼层数据存储到 ServletContext 的全局应用域中,以 "floorList" 为键,方便后续在修改、添加、查询功能中直接从该域中获取数据。
// 这种将数据存储在 ServletContext 中的方式,使得在整个应用程序中,
// 不同的 Servlet 或 JSP 页面在需要楼层数据时,能够方便地从全局上下文中获取,
// 避免了在不同组件中重复调用服务层的 floorList 方法,从而提高了数据的访问效率,
// 同时保证了数据的一致性,因为所有组件使用的是相同的数据源和查询结果。
servletContextEvent.getServletContext().setAttribute("floorList", floorList);
} }
@Override @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) { public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 该方法在 ServletContext 销毁时调用,但此代码中未进行具体的操作。
// 在实际应用中,此方法可以用来执行资源释放操作,确保在 Servlet 容器关闭或应用程序停止时,
// 对一些占用的资源进行正确的释放和清理,避免资源泄漏。例如,可能需要关闭数据库连接,
// 释放文件资源,关闭网络连接,清理缓存等操作,以保证应用程序的资源得到合理的管理和释放。
// 这里是一个可扩展的部分,当有资源需要在 ServletContext 销毁时释放,可以添加相应的代码逻辑。
} }
} }

@ -1,5 +1,50 @@
package comxyp.mapper; package comxyp.mapper;
//部门相关接口方法
// 部门相关接口方法
// 该接口是一个数据访问层Data Access LayerDAL接口通常用于定义与部门Department相关的数据操作方法。
// 在使用 MyBatis 或其他持久化框架时,这个接口会被实现,以完成具体的数据操作,如查询、插入、更新和删除部门信息。
// 接口的方法通常会在对应的 XML 映射文件中实现具体的 SQL 语句,实现了接口与 SQL 的分离,提高了代码的可维护性和可读性。
// 这样的设计模式遵循了数据访问对象Data Access ObjectDAO模式将数据访问逻辑与业务逻辑分离
// 使得代码结构更加清晰,便于维护和扩展。同时,使用接口的方式可以让我们轻松地替换不同的实现,
// 例如,在不同的环境中使用不同的数据库时,只需要提供新的实现类,而无需修改业务逻辑代码。
public interface DepartmentNapper { public interface DepartmentNapper {
} // 该接口目前为空,可能是尚未完成开发,或等待添加具体的方法。
// 以下是一些可能添加的方法示例:
// List<Department> selectAllDepartments(); // 用于查询所有部门的信息
// 此方法将返回一个包含所有部门信息的列表,列表中的每个元素都是一个 Department 对象。
// 可能会在对应的 XML 映射文件中使用 SELECT 语句从数据库中检索所有部门的记录,
// 并将结果映射到 Department 对象中,最终将这些对象存储在 List 中返回。
// 该方法可以方便地获取整个部门列表,例如在展示部门列表页面时调用,或者进行数据分析时使用。
// Department selectDepartmentById(int departmentId); // 用于根据部门 ID 查询特定部门的信息
// 此方法接收一个部门的唯一标识符 departmentId根据该 ID 从数据库中查找对应的部门信息。
// 在 XML 映射文件中,会使用带有 WHERE 子句的 SELECT 语句,通过部门 ID 作为筛选条件,
// 从数据库中精确地检索出匹配的部门记录,并将其映射到一个 Department 对象中返回。
// 这个方法通常用于在需要详细查看某个部门信息,或者对某个部门进行操作时,根据 ID 定位到该部门的信息。
// int insertDepartment(Department department); // 用于插入新的部门信息
// 此方法接收一个 Department 对象作为参数,将该对象所包含的部门信息插入到数据库中。
// 在 XML 映射文件中,会使用 INSERT 语句将该对象的属性作为参数插入到相应的数据库表中。
// 插入成功后,会返回一个整数,表示受影响的行数,通常用于判断插入操作是否成功,
// 若返回值大于 0则表示插入成功否则表示插入失败。
// 这个方法可用于在创建新部门时,将用户输入的部门信息保存到数据库中。
// int updateDepartment(Department department); // 用于更新部门信息
// 此方法接收一个 Department 对象作为参数,该对象包含了更新后的部门信息。
// 在 XML 映射文件中,会使用 UPDATE 语句根据该对象的唯一标识符(通常是部门 ID更新数据库中的记录。
// 会将该对象中的属性更新到数据库的对应记录中,返回一个整数表示受影响的行数,
// 用于判断更新操作是否成功,大于 0 表示成功,否则表示失败。
// 当需要修改部门信息时,调用此方法可以更新数据库中的部门信息。
// int deleteDepartment(int departmentId); // 用于删除部门信息
// 此方法接收一个部门的唯一标识符 departmentId用于删除数据库中相应的部门记录。
// 在 XML 映射文件中,会使用 DELETE 语句,以部门 ID 作为筛选条件,
// 从数据库中删除相应的部门记录,返回一个整数表示受影响的行数,
// 若返回值大于 0表示删除成功否则表示删除失败。
// 该方法可在需要删除某个部门时调用,例如用户操作删除部门或系统自动清理无用部门时使用。
}

@ -6,15 +6,64 @@ import comxyp.pojo.Vo;
import java.util.List; import java.util.List;
//部门相关接口 // 部门相关接口
// 该接口是数据访问层Data Access Layer, DAL的一部分主要用于定义与部门Dept操作相关的数据库操作方法。
// 通常会使用持久化框架(如 MyBatis来实现该接口将接口中的方法与具体的 SQL 语句进行映射,实现数据的持久化操作。
// 这种设计遵循了分层架构的原则,将数据访问逻辑与业务逻辑分离,
// 使得不同层之间的职责更加清晰,提高了代码的可维护性和可扩展性。
// 它可以方便地将数据存储和检索操作从业务逻辑中分离出来,
// 这样在修改数据存储方式或数据库结构时,只需要更新该接口的实现类,而不影响上层的业务逻辑代码。
public interface DeptMapper { public interface DeptMapper {
// 查询部门列表的方法
// 接收一个 Vo 对象作为参数,这个对象可能包含一些查询条件,例如分页信息、筛选条件等。
// Vo 对象可能是一个自定义的封装类,用于将多个查询条件封装在一起,以便传递给 SQL 语句。
// 例如,它可能包含了当前页码、每页显示数量、部门名称筛选条件、部门状态筛选条件等信息。
// 返回一个 Dept 类型的 List包含满足条件的部门信息。
// 这个方法可以根据传入的 Vo 对象中的查询条件,在数据库中筛选出符合条件的部门,
// 并将这些部门的信息存储在 List<Dept> 中返回,方便后续的业务逻辑处理,
// 比如在部门列表展示页面中,可以调用该方法获取需要显示的部门信息列表。
List<Dept> findAll(Vo vo); List<Dept> findAll(Vo vo);
//添加部门
// 添加部门的方法
// 接收一个 Dept 对象作为参数,该对象包含要添加的部门信息。
// Dept 对象可能包含了部门的各种属性,如部门名称、部门描述、部门负责人等信息。
// 返回一个整数,表示操作影响的行数,一般情况下,插入成功会返回 1插入失败会返回 0。
// 在实现该方法时,会将 Dept 对象中的属性值作为参数传递给相应的 SQL 语句,
// 执行插入操作。返回的结果可以用于判断插入操作是否成功,
// 当返回值为 1 时,表示成功插入了一条部门记录;当返回值为 0 时,表示插入操作未成功,
// 可能是由于数据库约束、数据不合法等原因导致的。这个方法可用于添加新的部门信息,
// 例如在用户创建新部门时,将用户输入的部门信息存储到数据库中。
int addDept(Dept dept); int addDept(Dept dept);
//部门修改
// 修改部门的方法
// 接收一个 Dept 对象作为参数,该对象包含要修改的部门信息。
// 这个 Dept 对象包含了修改后的部门信息,可能包括新的部门名称、部门描述、部门负责人等。
// 返回一个整数,表示操作影响的行数,一般情况下,修改成功会返回 1修改失败会返回 0。
// 该方法会将 Dept 对象中的属性值作为参数传递给相应的 SQL 语句,
// 执行更新操作。通过返回的影响行数来判断更新操作是否成功,
// 若返回值为 1则表示成功更新了一条部门记录若为 0则表示更新操作失败
// 可能是由于数据不存在、数据不合法或数据库操作异常等原因。
// 当用户在界面上修改部门信息时,可以调用该方法将修改后的信息更新到数据库中。
int updateDept(Dept dept); int updateDept(Dept dept);
//删除
// 删除部门的方法
// 接收一个 Integer 类型的 id 作为参数,该 id 表示要删除的部门的唯一标识符。
// 该 id 可以是部门在数据库中的主键,用于唯一标识一个部门。
// 返回一个整数,表示操作影响的行数,一般情况下,删除成功会返回 1删除失败会返回 0。
// 该方法会根据传入的 id 值,执行相应的 SQL 删除语句,删除对应的部门记录。
// 当返回值为 1 时,表示成功删除了一个部门;当返回值为 0 时,表示删除操作失败,
// 可能是由于数据不存在、有关联数据不能删除或数据库操作异常等原因。
// 在用户执行删除部门操作时,可以调用该方法将该部门从数据库中删除。
int deleteById(Integer id); int deleteById(Integer id);
//查询部门
// 查询部门名称的方法
// 该方法可能用于获取部门的名称列表,具体实现可能会根据需求进行不同的 SQL 查询。
// 可能是为了在某些页面中只显示部门名称而不需要其他部门信息,
// 或者为了构建部门名称的下拉菜单等操作。
// 返回一个 Dept 类型的 List包含部门名称信息。
// 该方法会根据特定的 SQL 语句,从数据库中检索出部门的名称信息,
// 并将其存储在 List<Dept> 中返回,每个 Dept 对象可能只包含部门名称属性,
// 也可能包含其他信息,但在使用该方法时,主要关注部门名称部分。
List<Dept> selectDeptName(); List<Dept> selectDeptName();
} }

@ -8,29 +8,112 @@ import java.util.Date;
import java.util.List; import java.util.List;
// 员工相关的数据访问接口,定义了一系列与员工操作相关的数据库操作方法
// 该接口是数据访问层Data Access Layer, DAL的一部分主要负责与数据库进行交互
// 执行与员工信息相关的操作,例如查询、添加、更新和删除等。
// 它将业务逻辑层与数据存储层隔离开来,使得不同层次的职责更加清晰,提高了代码的可维护性和可扩展性。
// 当使用持久化框架(如 MyBatis该接口的方法会被映射到具体的 SQL 语句,
// 这些 SQL 语句通常会存储在对应的 XML 文件中,实现了接口和 SQL 的分离,
// 方便开发人员根据不同的业务需求灵活调整数据库操作逻辑。
public interface EmployeeMapper { public interface EmployeeMapper {
//员工列表显示
// 员工列表显示
// 该方法用于从数据库中查询并获取员工列表
// 它将返回一个包含多个 Employee 对象的 List每个 Employee 对象代表一名员工的信息。
// 在具体实现中,可能会使用 SQL 的 SELECT 语句从员工表中查询出所有员工的记录,
// 并将结果映射到 Employee 对象中存储在 List 中。这个方法常用于员工列表的展示,
// 例如在员工管理系统的员工列表页面中,会调用此方法来获取员工信息列表,
// 以便将员工信息展示给用户查看或进行进一步的操作,如编辑、删除等。
List<Employee> employeeList(); List<Employee> employeeList();
/*按用户名查询*/
/*
*
*
* @param username
* @return Employee null
* 使 SELECT
* SQL 使 WHERE WHERE username = #{username}
* Employee
* null
*
*/
public Employee findNameLogin(String username); public Employee findNameLogin(String username);
//保存用户信息
// 保存用户信息
// 该方法用于将新的员工信息保存到数据库中
// 接收一个 Employee 对象作为参数,该对象包含要保存的员工信息。
// 该 Employee 对象包含了员工的各种属性,如姓名、性别、部门、入职日期等,
// 会将这些信息传递给 SQL 语句进行插入操作。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,保存成功返回 1保存失败返回 0。
// 当返回值为 1 时,表示成功将员工信息插入到数据库中;
// 当返回值为 0 时,可能是由于数据不合法、数据库约束或其他异常导致保存失败。
// 该方法可用于新员工的注册流程,将新员工的信息存储到数据库中。
public int saveUser(Employee employee); public int saveUser(Employee employee);
/** /**
* *
* @param deptId * deptId
* @return * @param deptId
* @return
* 使 SQL COUNT GROUP BY
* SELECT COUNT(*) FROM employee_table WHERE dept_id = #{deptId}
*
*
*/ */
int getEmployeeCountByDeptId(Integer deptId); int getEmployeeCountByDeptId(Integer deptId);
//信息修改
public int updateUser(@Param("id") Integer id,@Param("username") String username,@Param("name")String name,@Param("sex")String sex,@Param("deptId") Integer deptId); // 信息修改
//修改密码 // 该方法用于更新员工的信息
public int updatePassword(@Param("id")Integer id,@Param("password")String password); // 通过使用 @Param 注解将方法参数映射到 SQL 语句中的参数,以便在 SQL 中可以使用 #{id}、#{username} 等进行引用。
//查询密码 // 接收多个参数,包括员工的 id、用户名、姓名、性别和部门编号。
// 这些参数将作为更新条件和更新内容,通过 SQL 的 UPDATE 语句更新员工信息。
// 例如UPDATE employee_table SET username = #{username}, name = #{name}, sex = #{sex}, dept_id = #{deptId} WHERE id = #{id}。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,更新成功返回 1更新失败返回 0。
// 当返回值为 1 时,表示成功更新了一条员工信息;当返回值为 0 时,表示更新失败,
// 可能是由于数据不存在、数据不合法或数据库操作异常等原因。
// 该方法可用于用户修改员工信息的场景,将修改后的信息更新到数据库中。
public int updateUser(@Param("id") Integer id, @Param("username") String username, @Param("name") String name, @Param("sex") String sex, @Param("deptId") Integer deptId);
// 修改密码
// 该方法用于更新员工的密码
// 通过使用 @Param 注解将方法参数映射到 SQL 语句中的参数,以便在 SQL 中可以使用 #{id} 和 #{password} 进行引用。
// 接收员工的 id 和新密码作为参数。
// 在 SQL 语句中,会根据员工的 id 更新其密码例如UPDATE employee_table SET password = #{password} WHERE id = #{id}。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,更新成功返回 1更新失败返回 0。
// 当用户修改密码时,会调用该方法将新密码存储到数据库中。
public int updatePassword(@Param("id") Integer id, @Param("password") String password);
// 查询密码
// 该方法用于根据员工的 id 从数据库中查询其密码
// 接收员工的 id 作为参数。
// 在 SQL 语句中,会使用 SELECT 语句根据员工的 id 查找密码例如SELECT password FROM employee_table WHERE id = #{id}。
// 方法返回一个字符串,表示员工的密码。
// 该方法可用于用户登录验证、密码重置等场景,以确保用户输入的密码与数据库中存储的密码一致。
public String selectPassword(Integer id); public String selectPassword(Integer id);
//添加员工
// 添加员工
// 该方法用于将新的员工信息添加到数据库中
// 接收一个 User 对象作为参数,该对象包含要添加的员工信息。
// 该 User 对象包含了员工的各种属性,会将这些信息传递给 SQL 语句进行插入操作。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,添加成功返回 1添加失败返回 0。
// 该方法可用于新员工的注册流程,将新员工的信息存储到数据库中,与 saveUser 方法类似,
// 但可能适用于不同的数据结构或业务场景,具体取决于 User 对象和 Employee 对象的区别。
public int addEmployee(User user); public int addEmployee(User user);
//修改员工
// 修改员工
// 该方法用于更新员工的信息
// 接收一个 User 对象作为参数,该对象包含要更新的员工信息。
// 会将 User 对象中的信息通过 SQL 的 UPDATE 语句更新到数据库中。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,更新成功返回 1更新失败返回 0。
// 该方法可用于用户修改员工信息的场景,将修改后的信息更新到数据库中,与 updateUser 方法类似,
// 但可能适用于不同的数据结构或业务场景,具体取决于 User 对象和 Employee 对象的区别。
public int updateEmployee(User user); public int updateEmployee(User user);
//删除员工
// 删除员工
// 该方法用于从数据库中删除指定 id 的员工信息
// 接收一个字符串类型的 id 作为参数,代表要删除的员工的唯一标识符。
// 在 SQL 语句中,会使用 DELETE 语句根据 id 删除员工信息例如DELETE FROM employee_table WHERE id = #{id}。
// 方法返回一个整数,表示数据库操作所影响的行数,一般情况下,删除成功返回 1删除失败返回 0。
// 当用户或系统管理员执行删除员工操作时,会调用该方法将该员工信息从数据库中删除。
public int deleteEmployee(String id); public int deleteEmployee(String id);
} }

@ -1,10 +1,57 @@
package comxyp.mapper; package comxyp.mapper;
import comxyp.pojo.Floor; import comxyp.pojo.Floor;
import java.util.List; import java.util.List;
public interface FloorMapper { // 该接口是数据访问层Data Access LayerDAL的一部分主要用于定义与楼层Floor操作相关的数据库操作方法
// 作为数据访问层,它起到了连接业务逻辑层和数据库的桥梁作用,
// 将业务逻辑中的楼层操作需求转化为对数据库的具体操作,例如查询、添加、更新和删除楼层信息等。
// 该接口使用了面向接口编程的思想,使得在不同的数据库操作实现中可以保持一致的操作方法签名,
// 而具体的数据库操作实现可以根据不同的持久化框架(如 MyBatis、Hibernate 等)进行切换,
// 同时将数据库操作的细节封装在实现类中,提高了代码的可维护性和可扩展性。
interface FloorMapper {
// 查询楼层列表的方法
// 此方法将从数据库中查询并返回一个包含多个 Floor 对象的列表,每个 Floor 对象表示一个楼层的信息。
// 例如,在需要展示楼层列表的页面中,可以调用此方法获取数据。
// 在具体的实现中,可能会使用 SQL 的 SELECT 语句从楼层表中查询出所有楼层的记录,
// 并将结果映射到 Floor 对象中存储在 List 中,这些 Floor 对象包含了楼层的各种属性,
// 如楼层编号、楼层名称、楼层描述等,以便后续的页面展示或其他业务逻辑使用。
public List<Floor> floorList(); public List<Floor> floorList();
public int addFloor(Floor floor);
public int updateFloor(Floor floor); // 添加楼层的方法
// 接收一个 Floor 对象作为参数,该对象包含要添加的楼层信息。
// 此方法会将传入的 Floor 对象存储到数据库中。
// 该 Floor 对象包含了楼层的详细信息,例如楼层名称、楼层描述、楼层状态等,
// 这些信息会作为参数传递给 SQL 语句进行插入操作。
// 通常,返回值表示数据库操作影响的行数,成功添加楼层时返回 1添加失败时返回 0。
// 当返回值为 1 时,表示成功将楼层信息插入到数据库中,可能是因为插入操作符合数据库的约束条件和业务规则;
// 当返回值为 0 时,可能是由于数据不合法、数据库约束冲突或其他异常导致添加失败,
// 例如,楼层名称长度超过限制、楼层编号重复等原因。
// 此方法可用于在创建新楼层时,将用户输入或系统生成的楼层信息存储到数据库中。
// int addFloor(Floor floor);
// 更新楼层信息的方法
// 接收一个 Floor 对象作为参数,该对象包含更新后的楼层信息。
// 此方法会根据 Floor 对象中的信息更新数据库中相应的楼层记录。
// 该 Floor 对象包含了更新后的楼层信息,例如修改后的楼层名称、楼层描述、楼层状态等,
// 这些信息会作为参数传递给 SQL 语句进行更新操作。
// 通常,返回值表示数据库操作影响的行数,成功更新楼层信息时返回 1更新失败时返回 0。
// 当返回值为 1 时,表示成功更新了数据库中的楼层信息,说明数据库中存在对应的楼层记录,
// 并且更新操作符合数据库的约束条件和业务规则;当返回值为 0 时,可能是由于数据不存在、
// 数据不合法或数据库操作异常等原因导致更新失败,例如,更新的楼层信息与其他约束冲突等。
// 此方法可用于在用户修改楼层信息后,将修改后的信息更新到数据库中。
int updateFloor(Floor floor);
// 删除楼层的方法
// 接收一个 Integer 类型的 id 作为参数,该 id 表示要删除的楼层的唯一标识符。
// 此方法会根据传入的 id 删除数据库中相应的楼层记录。
// 在 SQL 语句中,会使用 DELETE 语句根据楼层的 id 进行删除操作,
// 例如DELETE FROM floor_table WHERE id = #{id}。
// 通常,返回值表示数据库操作影响的行数,成功删除楼层时返回 1删除失败时返回 0。
// 当返回值为 1 时,表示成功删除了数据库中的楼层记录,说明数据库中存在对应的楼层记录;
// 当返回值为 0 时,可能是由于数据不存在、楼层存在关联数据不能删除(如该楼层下还有房间等)
// 或数据库操作异常等原因导致删除失败。
// 此方法可用于在用户或系统管理员执行删除楼层操作时,将相应的楼层信息从数据库中删除。
int deleteFloor(Integer id); int deleteFloor(Integer id);
} }

@ -1,8 +1,23 @@
package comxyp.mapper; package comxyp.mapper;
import comxyp.pojo.Menu; import comxyp.pojo.Menu;
import java.util.List; import java.util.List;
// 该接口是数据访问层Data Access LayerDAL的一部分主要用于定义与菜单Menu操作相关的数据库操作方法
// 作为数据访问层接口,它在系统架构中起着至关重要的作用,是业务逻辑层与数据库之间的桥梁。
// 它将与菜单操作相关的数据库操作抽象为接口方法,以便业务逻辑层可以通过该接口调用具体的数据库操作,
// 而不用关心数据库的具体实现细节。这种分层设计提高了系统的可维护性和可扩展性,
// 当需要更换数据库或修改数据库操作时,只需更新该接口的实现类,而不影响业务逻辑层。
// 此外,它遵循了接口隔离原则,将菜单相关的数据操作单独封装在该接口中,
// 使得代码结构更加清晰,不同模块之间的职责更加明确。
public interface MenuMapper { public interface MenuMapper {
//查询所有菜单
// 查询所有菜单的方法
// 此方法将从数据库中查询并返回一个包含多个 Menu 对象的列表,每个 Menu 对象表示一个菜单的信息。
// 在业务逻辑中,当需要获取所有菜单的信息,例如在加载系统菜单或展示菜单列表时,可调用此方法。
// 在具体的实现中,会使用 SQL 的 SELECT 语句从菜单表中查询出所有的菜单记录,
// 并将这些记录映射到 Menu 对象中存储在 List 中。这些 Menu 对象包含了菜单的各种属性,
// 如菜单名称、菜单链接、菜单图标、菜单排序等,方便业务逻辑层对菜单进行处理,
// 例如构建菜单树、显示菜单列表、根据用户权限筛选菜单等操作。
List<Menu> findAll(); List<Menu> findAll();
} }

@ -1,16 +1,62 @@
package comxyp.mapper; package comxyp.mapper;
import comxyp.pojo.Room; import comxyp.pojo.Room;
import java.util.List; import java.util.List;
public interface RoomMapper { // 该接口是数据访问层Data Access LayerDAL的一部分主要用于定义与房间Room操作相关的数据库操作方法
//查询房间列表 // 作为数据访问层接口,它负责将业务逻辑层对房间操作的需求转换为具体的数据库操作,
// 从而实现对房间数据的存储、查询、更新和删除等功能。
// 该接口的存在有助于将业务逻辑与数据库操作分离,使系统架构更加清晰,
// 降低了代码的耦合性,提高了系统的可维护性和可扩展性。
// 通过使用接口,我们可以在不同的数据库实现或持久化框架之间轻松切换,
// 只要实现该接口的类遵循相同的方法签名,就能保证业务逻辑的一致性。
interface RoomMapper {
// 查询房间列表的方法
// 此方法将从数据库中查询并返回一个包含多个 Room 对象的列表,每个 Room 对象表示一个房间的信息。
// 可用于在需要展示房间列表的场景,例如在房间管理页面或预定系统中显示可用房间列表。
// 在具体的实现中,会使用 SQL 的 SELECT 语句从房间表中查询出所有房间的记录,
// 并将这些记录映射到 Room 对象中存储在 List 中。Room 对象可能包含房间的各种属性,
// 如房间号、房间类型、房间状态、房间价格、房间设施等,
// 这些信息可以方便地展示给用户或用于其他业务逻辑处理,
// 例如在房间预订系统中,可根据房间状态筛选可预订的房间。
public List<Room> roomList(); public List<Room> roomList();
//添加房间
public int addRoom(Room room); // 添加房间的方法
//修改房间 // 接收一个 Room 对象作为参数,该对象包含要添加的房间的详细信息。
public int updateRoom(Room room); // 此方法将 Room 对象中的信息插入到数据库中。
//删除房间 // 该 Room 对象包含了新房间的详细信息,如房间的名称、描述、价格、设施等,
public int deleteRoom( int id); // 这些信息会作为参数传递给 SQL 的 INSERT 语句,将房间信息存储到数据库中。
} // 通常,返回值表示数据库操作影响的行数,成功添加房间时返回 1添加失败时返回 0。
// 当返回值为 1 时,表示新房间的信息已成功插入数据库,
// 可能是因为插入操作满足数据库的约束条件和业务规则;
// 当返回值为 0 时,可能是由于数据不合法、数据库约束冲突或其他异常导致添加失败,
// 例如房间号已存在、价格超出范围等原因。
// 该方法适用于在创建新房间时,将用户输入或系统生成的房间信息存储到数据库。
int addRoom(Room room);
// 修改房间的方法
// 接收一个 Room 对象作为参数,该对象包含更新后的房间信息。
// 此方法将根据 Room 对象中的信息更新数据库中相应的房间记录。
// 该 Room 对象包含了更新后的房间信息,如修改后的房间名称、价格、设施等,
// 这些信息会作为参数传递给 SQL 的 UPDATE 语句,更新数据库中的房间记录。
// 通常,返回值表示数据库操作影响的行数,成功更新房间信息时返回 1更新失败时返回 0。
// 当返回值为 1 时,表示数据库中的房间信息已成功更新,
// 说明存在相应的房间记录且更新操作满足数据库的约束条件和业务规则;
// 当返回值为 0 时,可能是由于数据不存在、数据不合法或数据库操作异常等原因导致更新失败,
// 例如更新的房间信息与其他约束冲突等。
// 该方法适用于在用户修改房间信息后,将修改后的信息更新到数据库。
int updateRoom(Room room);
// 删除房间的方法
// 接收一个整数类型的 id 作为参数,该 id 表示要删除的房间的唯一标识符。
// 此方法将根据传入的 id 删除数据库中相应的房间记录。
// 在 SQL 语句中,会使用 DELETE 语句根据房间的 id 进行删除操作,
// 例如DELETE FROM room_table WHERE id = #{id}。
// 通常,返回值表示数据库操作影响的行数,成功删除房间时返回 1删除失败时返回 0。
// 当返回值为 1 时,表示数据库中的房间记录已成功删除,
// 说明存在相应的房间记录;当返回值为 0 时,可能是由于数据不存在、
// 房间存在关联数据不能删除(如房间已被预订)或数据库操作异常等原因导致删除失败。
// 该方法适用于在用户或系统管理员执行删除房间操作时,将相应的房间信息从数据库中删除。
int deleteRoom(int id);
}

@ -1,16 +1,31 @@
package comxyp.mapper; package comxyp.mapper;
import comxyp.pojo.RoomType; import comxyp.pojo.RoomType;
import java.util.List; import java.util.List;
public interface RoomTypeMapper { // 该接口是数据访问层Data Access LayerDAL的一部分主要用于定义与房型RoomType操作相关的数据库操作方法
//查询房型列表 interface RoomTypeMapper {
List<RoomType> roomTypeList() ;
//添加房型 // 查询房型列表的方法
public int addRoomType(RoomType roomType); // 此方法将从数据库中查询并返回一个包含多个 RoomType 对象的列表,每个 RoomType 对象表示一种房型的信息
//修改房型 // 可用于在需要展示房型列表的场景,例如在酒店预订系统的房型选择页面或者房型管理页面中显示房型信息
public int updateRoomType(RoomType roomType); List<RoomType> roomTypeList();
//删除房型
public int deleteRoomType(int id); // 添加房型的方法
} // 接收一个 RoomType 对象作为参数,该对象包含要添加的房型的详细信息
// 此方法将 RoomType 对象中的信息插入到数据库中
// 通常,返回值表示数据库操作影响的行数,成功添加房型时返回 1添加失败时返回 0
int addRoomType(RoomType roomType);
// 修改房型的方法
// 接收一个 RoomType 对象作为参数,该对象包含更新后的房型信息
// 此方法将根据 RoomType 对象中的信息更新数据库中相应的房型记录
// 通常,返回值表示数据库操作影响的行数,成功更新房型信息时返回 1更新失败时返回 0
int updateRoomType(RoomType roomType);
// 删除房型的方法
// 接收一个整数类型的 id 作为参数,该 id 表示要删除的房型的唯一标识符
// 此方法将根据传入的 id 删除数据库中相应的房型记录
// 通常,返回值表示数据库操作影响的行数,成功删除房型时返回 1
int deleteRoomType(int id);
}

@ -3,55 +3,67 @@ package comxyp.pojo;
import java.util.Date; import java.util.Date;
public class Department { public class Department {
private int id; private int id; // 部门ID
private String deptname; private String deptname; // 部门名称
private String address; private String address; // 部门地址
private Date createtime; private Date createtime; // 创建时间
private String remark; private String remark; // 备注
// 获取部门ID
public int getId() { public int getId() {
return id; return id;
} }
// 设置部门ID
public void setId(int id) { public void setId(int id) {
this.id = id; this.id = id;
} }
// 获取部门名称
public String getDeptname() { public String getDeptname() {
return deptname; return deptname;
} }
// 设置部门名称
public void setDeptname(String deptname) { public void setDeptname(String deptname) {
this.deptname = deptname; this.deptname = deptname;
} }
// 获取部门地址
public String getAddress() { public String getAddress() {
return address; return address;
} }
// 设置部门地址
public void setAddress(String address) { public void setAddress(String address) {
this.address = address; this.address = address;
} }
// 获取创建时间
public Date getCreatetime() { public Date getCreatetime() {
return createtime; return createtime;
} }
// 设置创建时间
public void setCreatetime(Date createtime) { public void setCreatetime(Date createtime) {
this.createtime = createtime; this.createtime = createtime;
} }
// 获取备注
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark;
} }
// 默认构造函数
public Department() { public Department() {
} }
// 带参数的构造函数
public Department(int id, String deptname, String address, Date createtime, String remark) { public Department(int id, String deptname, String address, Date createtime, String remark) {
this.id = id; this.id = id;
this.deptname = deptname; this.deptname = deptname;
@ -60,6 +72,7 @@ public class Department {
this.remark = remark; this.remark = remark;
} }
// 重写toString方法方便输出部门信息
@Override @Override
public String toString() { public String toString() {
return "Department{" + return "Department{" +
@ -70,4 +83,4 @@ public class Department {
", remark='" + remark + '\'' + ", remark='" + remark + '\'' +
'}'; '}';
} }
} }

@ -1,14 +1,13 @@
package comxyp.pojo; package comxyp.pojo;
import java.util.Date; // 部门类
//部门
public class Dept { public class Dept {
private Integer id; private Integer id; // 部门 ID
private String deptname; private String deptname; // 部门名称
private String address; private String address; // 部门地址
private String remark; private String remark; // 备注
// 重写toString方法用于输出部门的详细信息
@Override @Override
public String toString() { public String toString() {
return "Dept{" + return "Dept{" +
@ -19,45 +18,55 @@ public class Dept {
'}'; '}';
} }
// 默认构造函数
public Dept() { public Dept() {
} }
public Dept(Integer id, String deptname, String address, String remark) { // 带参数的构造函数,用于初始化部门对象的属性
this.id = id; public Dept(Integer id, String deptname, String address, String remark) {
this.deptname = deptname; this.id = id; // 初始化部门 ID
this.address = address; this.deptname = deptname; // 初始化部门名称
this.remark = remark; this.address = address; // 初始化部门地址
this.remark = remark; // 初始化备注信息
} }
// 获取部门 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置部门 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取部门名称
public String getDeptName() { public String getDeptName() {
return deptname; return deptname;
} }
// 设置部门名称
public void setDeptName(String deptName) { public void setDeptName(String deptName) {
this.deptname = deptName; this.deptname = deptName; // 注意确保要保持属性名的一致性deptname
} }
// 获取部门地址
public String getAddress() { public String getAddress() {
return address; return address;
} }
// 设置部门地址
public void setAddress(String address) { public void setAddress(String address) {
this.address = address; this.address = address;
} }
// 获取备注
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark;
} }
} }

@ -2,120 +2,145 @@ package comxyp.pojo;
import java.util.Date; import java.util.Date;
// 员工类
public class Employee { public class Employee {
private Integer id; private Integer id; // 员工 ID
private String username; private String username; // 用户名
private String password; private String password; // 密码
private String name; private String name; // 姓名
private String sex; private String sex; // 性别
private Integer deptId; private Integer deptId; // 所属部门 ID
private String hireDate;//入职时间 private String hireDate; // 入职时间
private String deptname;//部门名称 private String deptname; // 部门名称
private String address;//所属部门地址 private String address; // 所属部门地址
private String remark;//备注 private String remark; // 备注
// 获取备注信息
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注信息
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark;
} }
// 获取部门名称
public String getDeptname() { public String getDeptname() {
return deptname; return deptname;
} }
// 设置部门名称
public void setDeptname(String deptname) { public void setDeptname(String deptname) {
this.deptname = deptname; this.deptname = deptname;
} }
// 获取部门地址
public String getAddress() { public String getAddress() {
return address; return address;
} }
// 设置部门地址
public void setAddress(String address) { public void setAddress(String address) {
this.address = address; this.address = address;
} }
// 默认构造函数
public Employee() { public Employee() {
} }
// 带参数的构造函数,用于初始化员工对象的属性
public Employee(Integer id, String username, String password, String name, String sex, Integer deptId, String hireDate) { public Employee(Integer id, String username, String password, String name, String sex, Integer deptId, String hireDate) {
this.id = id; this.id = id; // 初始化员工 ID
this.username = username; this.username = username; // 初始化用户名
this.password = password; this.password = password; // 初始化密码
this.name = name; this.name = name; // 初始化姓名
this.sex = sex; this.sex = sex; // 初始化性别
this.deptId = deptId; this.deptId = deptId; // 初始化部门 ID
this.hireDate = hireDate; this.hireDate = hireDate; // 初始化入职时间
} }
// 重写 toString 方法,方便打印员工信息
@Override @Override
public String toString() { public String toString() {
return "Employee{" + return "Employee{" +
"id=" + id + "id=" + id + // 员工 ID
", username='" + username + '\'' + ", username='" + username + '\'' + // 用户名
", password='" + password + '\'' + ", password='" + password + '\'' + // 密码
", name='" + name + '\'' + ", name='" + name + '\'' + // 姓名
", sex='" + sex + '\'' + ", sex='" + sex + '\'' + // 性别
", deptId=" + deptId + ", deptId=" + deptId + // 部门 ID
", hireDate=" + hireDate + ", hireDate='" + hireDate + '\'' + // 入职时间
'}'; '}';
} }
// 获取员工 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置员工 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取用户名
public String getUsername() { public String getUsername() {
return username; return username;
} }
// 设置用户名
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
// 获取密码
public String getPassword() { public String getPassword() {
return password; return password;
} }
// 设置密码
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
// 获取姓名
public String getName() { public String getName() {
return name; return name;
} }
// 设置姓名
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
// 获取性别
public String getSex() { public String getSex() {
return sex; return sex;
} }
// 设置性别
public void setSex(String sex) { public void setSex(String sex) {
this.sex = sex; this.sex = sex;
} }
// 获取部门 ID
public Integer getDeptId() { public Integer getDeptId() {
return deptId; return deptId;
} }
// 设置部门 ID
public void setDeptId(Integer deptId) { public void setDeptId(Integer deptId) {
this.deptId = deptId; this.deptId = deptId;
} }
// 获取入职时间
public String getHireDate() { public String getHireDate() {
return hireDate; return hireDate;
} }
// 设置入职时间
public void setHireDate(String hireDate) { public void setHireDate(String hireDate) {
this.hireDate = hireDate; this.hireDate = hireDate;
} }
} }

@ -1,49 +1,59 @@
package comxyp.pojo; package comxyp.pojo;
// 楼层类
public class Floor { public class Floor {
private Integer id; private Integer id; // 楼层的唯一标识符
private String name; private String name; // 楼层名称
private String remark; private String remark; // 备注信息
// 获取楼层 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置楼层 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id; // 设置楼层 ID
} }
// 获取楼层名称
public String getName() { public String getName() {
return name; return name;
} }
// 设置楼层名称
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name; // 设置楼层名称
} }
// 获取备注信息
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注信息
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark; // 设置备注
} }
// 带参数的构造函数,用于初始化楼层对象的属性
public Floor(Integer id, String name, String remark) { public Floor(Integer id, String name, String remark) {
this.id = id; this.id = id; // 初始化楼层 ID
this.name = name; this.name = name; // 初始化楼层名称
this.remark = remark; this.remark = remark; // 初始化备注信息
} }
// 默认构造函数
public Floor() { public Floor() {
} }
// 重写 toString 方法,方便打印楼层信息
@Override @Override
public String toString() { public String toString() {
return "Floor{" + return "Floor{" +
"id=" + id + "id=" + id + // 楼层 ID
", name='" + name + '\'' + ", name='" + name + '\'' + // 楼层名称
", remark='" + remark + '\'' + ", remark='" + remark + '\'' + // 备注信息
'}'; '}';
} }
} }

@ -1,93 +1,111 @@
package comxyp.pojo; package comxyp.pojo;
// 菜单类
public class Menu { public class Menu {
private Integer id; private Integer id; // 菜单的唯一标识符
private Integer pid; private Integer pid; // 父菜单 ID表示层级关系
private String title; private String title; // 菜单标题
private String href; private String href; // 菜单链接地址
private Integer spread; private Integer spread; // 是否展开,通常用于表示菜单的展开状态
private String target; private String target; // 打开目标(如在新窗口中打开)
private String icon; private String icon; // 菜单图标
// 获取菜单 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置菜单 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取父菜单 ID
public Integer getPid() { public Integer getPid() {
return pid; return pid;
} }
// 设置父菜单 ID
public void setPid(Integer pid) { public void setPid(Integer pid) {
this.pid = pid; this.pid = pid;
} }
// 获取菜单标题
public String getTitle() { public String getTitle() {
return title; return title;
} }
// 设置菜单标题
public void setTitle(String title) { public void setTitle(String title) {
this.title = title; this.title = title;
} }
// 获取菜单链接地址
public String getHref() { public String getHref() {
return href; return href;
} }
// 设置菜单链接地址
public void setHref(String href) { public void setHref(String href) {
this.href = href; this.href = href;
} }
// 获取展开状态
public Integer getSpread() { public Integer getSpread() {
return spread; return spread;
} }
// 设置展开状态
public void setSpread(Integer spread) { public void setSpread(Integer spread) {
this.spread = spread; this.spread = spread;
} }
// 获取打开目标
public String getTarget() { public String getTarget() {
return target; return target;
} }
// 设置打开目标
public void setTarget(String target) { public void setTarget(String target) {
this.target = target; this.target = target;
} }
// 获取菜单图标
public String getIcon() { public String getIcon() {
return icon; return icon;
} }
// 设置菜单图标
public void setIcon(String icon) { public void setIcon(String icon) {
this.icon = icon; this.icon = icon;
} }
// 默认构造函数
public Menu() { public Menu() {
} }
// 带参数的构造函数,用于初始化菜单对象的属性
public Menu(Integer id, Integer pid, String title, String href, Integer spread, String target, String icon) { public Menu(Integer id, Integer pid, String title, String href, Integer spread, String target, String icon) {
this.id = id; this.id = id; // 初始化菜单 ID
this.pid = pid; this.pid = pid; // 初始化父菜单 ID
this.title = title; this.title = title; // 初始化菜单标题
this.href = href; this.href = href; // 初始化菜单链接地址
this.spread = spread; this.spread = spread; // 初始化菜单展开状态
this.target = target; this.target = target; // 初始化打开目标
this.icon = icon; this.icon = icon; // 初始化菜单图标
} }
// 重写 toString 方法,方便打印菜单信息
@Override @Override
public String toString() { public String toString() {
return "Menu{" + return "Menu{" +
"id=" + id + "id=" + id + // 菜单 ID
", pid=" + pid + ", pid=" + pid + // 父菜单 ID
", title='" + title + '\'' + ", title='" + title + '\'' + // 菜单标题
", href='" + href + '\'' + ", href='" + href + '\'' + // 菜单链接
", spread=" + spread + ", spread=" + spread + // 展开状态
", target='" + target + '\'' + ", target='" + target + '\'' + // 打开目标
", icon='" + icon + '\'' + ", icon='" + icon + '\'' + // 菜单图标
'}'; '}';
} }
} }

@ -1,60 +1,73 @@
package comxyp.pojo; package comxyp.pojo;
// 房间类
public class Room { public class Room {
private Integer id; private Integer id; // 房间的唯一标识符
private Integer roomid; private Integer roomid; // 房间编号
private String floorname; private String floorname; // 所在楼层名称
private String typename; private String typename; // 房间类型名称
private Integer status; private Integer status; // 房间状态例如0-空闲1-已占用)
// 默认构造函数
public Room() { public Room() {
} }
// 带参数的构造函数,用于初始化房间对象的属性
public Room(Integer id, Integer roomid, String floorname, String typename, Integer status) { public Room(Integer id, Integer roomid, String floorname, String typename, Integer status) {
this.id = id; this.id = id; // 初始化房间 ID
this.roomid = roomid; this.roomid = roomid; // 初始化房间编号
this.floorname = floorname; this.floorname = floorname; // 初始化楼层名称
this.typename = typename; this.typename = typename; // 初始化房间类型名称
this.status = status; this.status = status; // 初始化房间状态
} }
// 获取房间 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置房间 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id; // 设置房间 ID
} }
// 获取房间编号
public Integer getRoomid() { public Integer getRoomid() {
return roomid; return roomid;
} }
// 设置房间编号
public void setRoomid(Integer roomid) { public void setRoomid(Integer roomid) {
this.roomid = roomid; this.roomid = roomid; // 设置房间编号
} }
// 获取楼层名称
public String getFloorname() { public String getFloorname() {
return floorname; return floorname;
} }
// 设置楼层名称
public void setFloorname(String floorname) { public void setFloorname(String floorname) {
this.floorname = floorname; this.floorname = floorname; // 设置楼层名称
} }
// 获取房间类型名称
public String getTypename() { public String getTypename() {
return typename; return typename;
} }
// 设置房间类型名称
public void setTypename(String typename) { public void setTypename(String typename) {
this.typename = typename; this.typename = typename; // 设置房间类型名称
} }
// 获取房间状态
public Integer getStatus() { public Integer getStatus() {
return status; return status;
} }
// 设置房间状态
public void setStatus(Integer status) { public void setStatus(Integer status) {
this.status = status; this.status = status; // 设置房间状态
} }
} }

@ -1,137 +1,163 @@
package comxyp.pojo; package comxyp.pojo;
// 房间类型类
public class RoomType { public class RoomType {
private Integer id; private Integer id; // 房间类型的唯一标识符
private String roomname; private String roomname; // 房间类型名称
private Double price; private Double price; // 房间类型的价格
private Integer livenum; private Integer livenum; // 该房间类型可容纳的最大人数
private Integer bednum; private Integer bednum; // 房间中的床位数量
private Integer roomnum; private Integer roomnum; // 该房间类型的总房间数量
private Integer reservednum; private Integer reservednum; // 已预定的房间数量
private Integer avilablenum; private Integer avilablenum; // 可用的房间数量
private Integer livednum; private Integer livednum; // 已入住的房间数量
private Integer status; private Integer status; // 房间类型的状态例如0-可用1-不可用等)
private String remark; private String remark; // 备注信息
// 获取房间类型 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置房间类型 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取房间类型名称
public String getRoomname() { public String getRoomname() {
return roomname; return roomname;
} }
// 设置房间类型名称
public void setRoomname(String roomname) { public void setRoomname(String roomname) {
this.roomname = roomname; this.roomname = roomname; // 设置房间类型名称
} }
// 获取房间类型价格
public Double getPrice() { public Double getPrice() {
return price; return price;
} }
// 设置房间类型价格
public void setPrice(Double price) { public void setPrice(Double price) {
this.price = price; this.price = price; // 设置房间类型价格
} }
// 获取可入住人数
public Integer getLivenum() { public Integer getLivenum() {
return livenum; return livenum;
} }
// 设置可入住人数
public void setLivenum(Integer livenum) { public void setLivenum(Integer livenum) {
this.livenum = livenum; this.livenum = livenum; // 设置可入住人数
} }
// 获取床位数量
public Integer getBednum() { public Integer getBednum() {
return bednum; return bednum;
} }
// 设置床位数量
public void setBednum(Integer bednum) { public void setBednum(Integer bednum) {
this.bednum = bednum; this.bednum = bednum; // 设置床位数量
} }
// 获取房间数量
public Integer getRoomnum() { public Integer getRoomnum() {
return roomnum; return roomnum;
} }
// 设置房间数量
public void setRoomnum(Integer roomnum) { public void setRoomnum(Integer roomnum) {
this.roomnum = roomnum; this.roomnum = roomnum; // 设置房间数量
} }
// 获取已预定的房间数量
public Integer getReservednum() { public Integer getReservednum() {
return reservednum; return reservednum;
} }
// 设置已预定的房间数量
public void setReservednum(Integer reservednum) { public void setReservednum(Integer reservednum) {
this.reservednum = reservednum; this.reservednum = reservednum; // 设置已预定的房间数量
} }
// 获取可用的房间数量
public Integer getAvilablenum() { public Integer getAvilablenum() {
return avilablenum; return avilablenum;
} }
// 设置可用的房间数量
public void setAvilablenum(Integer avilablenum) { public void setAvilablenum(Integer avilablenum) {
this.avilablenum = avilablenum; this.avilablenum = avilablenum; // 设置可用的房间数量
} }
// 获取已入住的房间数量
public Integer getLivednum() { public Integer getLivednum() {
return livednum; return livednum;
} }
// 设置已入住的房间数量
public void setLivednum(Integer livednum) { public void setLivednum(Integer livednum) {
this.livednum = livednum; this.livednum = livednum; // 设置已入住的房间数量
} }
// 获取房间类型状态
public Integer getStatus() { public Integer getStatus() {
return status; return status;
} }
// 设置房间类型状态
public void setStatus(Integer status) { public void setStatus(Integer status) {
this.status = status; this.status = status; // 设置房间类型状态
} }
// 获取备注信息
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注信息
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark; // 设置备注信息
} }
// 带参数的构造函数,用于初始化房间类型的各个属性
public RoomType(Integer id, String roomname, Double price, Integer livenum, Integer bednum, Integer roomnum, Integer reservednum, Integer avilablenum, Integer livednum, Integer status, String remark) { public RoomType(Integer id, String roomname, Double price, Integer livenum, Integer bednum, Integer roomnum, Integer reservednum, Integer avilablenum, Integer livednum, Integer status, String remark) {
this.id = id; this.id = id; // 初始化房间类型 ID
this.roomname = roomname; this.roomname = roomname; // 初始化房间类型名称
this.price = price; this.price = price; // 初始化房间类型价格
this.livenum = livenum; this.livenum = livenum; // 初始化可入住人数
this.bednum = bednum; this.bednum = bednum; // 初始化床位数量
this.roomnum = roomnum; this.roomnum = roomnum; // 初始化房间数量
this.reservednum = reservednum; this.reservednum = reservednum; // 初始化已预定的房间数量
this.avilablenum = avilablenum; this.avilablenum = avilablenum; // 初始化可用的房间数量
this.livednum = livednum; this.livednum = livednum; // 初始化已入住的房间数量
this.status = status; this.status = status; // 初始化房间类型状态
this.remark = remark; this.remark = remark; // 初始化备注信息
} }
// 默认构造函数
public RoomType() { public RoomType() {
} }
// 重写 toString 方法,方便打印房间类型信息
@Override @Override
public String toString() { public String toString() {
return "RoomType{" + return "RoomType{" +
"id=" + id + "id=" + id + // 房间类型 ID
", roomname='" + roomname + '\'' + ", roomname='" + roomname + '\'' + // 房间类型名称
", price=" + price + ", price=" + price + // 房间类型价格
", livenum=" + livenum + ", livenum=" + livenum + // 可入住人数
", bednum=" + bednum + ", bednum=" + bednum + // 床位数量
", roomnum=" + roomnum + ", roomnum=" + roomnum + // 房间数量
", reservednum=" + reservednum + ", reservednum=" + reservednum + // 已预定的房间数量
", avilablenum=" + avilablenum + ", avilablenum=" + avilablenum + // 可用房间数量
", livednum=" + livednum + ", livednum=" + livednum + // 已入住房间数量
", status=" + status + ", status=" + status + // 房间类型状态
", remark='" + remark + '\'' + ", remark='" + remark + '\'' + // 备注信息
'}'; '}';
} }
} }

@ -1,93 +1,111 @@
package comxyp.pojo; package comxyp.pojo;
// 用户类
public class User { public class User {
private String id; private String id; // 用户 ID
private String empname; private String empname; // 员工姓名
private String sex; private String sex; // 性别
private String deptname; private String deptname; // 部门名称
private String address; private String address; // 地址
private String hireDate; private String hireDate; // 入职日期
private String remark; private String remark; // 备注信息
@Override // 默认构造函数
public String toString() {
return "User{" +
"id=" + id +
", empname='" + empname + '\'' +
", sex='" + sex + '\'' +
", deptname='" + deptname + '\'' +
", address='" + address + '\'' +
", hireDate='" + hireDate + '\'' +
", remark='" + remark + '\'' +
'}';
}
public User() { public User() {
} }
// 带参数的构造函数,用于初始化用户对象的各个属性
public User(String id, String empname, String sex, String deptname, String address, String hireDate, String remark) { public User(String id, String empname, String sex, String deptname, String address, String hireDate, String remark) {
this.id = id; this.id = id; // 初始化用户 ID
this.empname = empname; this.empname = empname; // 初始化员工姓名
this.sex = sex; this.sex = sex; // 初始化性别
this.deptname = deptname; this.deptname = deptname; // 初始化部门名称
this.address = address; this.address = address; // 初始化地址
this.hireDate = hireDate; this.hireDate = hireDate; // 初始化入职日期
this.remark = remark; this.remark = remark; // 初始化备注信息
} }
// 获取用户 ID
public String getId() { public String getId() {
return id; return id;
} }
// 设置用户 ID
public void setId(String id) { public void setId(String id) {
this.id = id; this.id = id; // 设置用户 ID
} }
// 获取员工姓名
public String getEmpname() { public String getEmpname() {
return empname; return empname;
} }
// 设置员工姓名
public void setEmpname(String empname) { public void setEmpname(String empname) {
this.empname = empname; this.empname = empname; // 设置员工姓名
} }
// 获取性别
public String getSex() { public String getSex() {
return sex; return sex;
} }
// 设置性别
public void setSex(String sex) { public void setSex(String sex) {
this.sex = sex; this.sex = sex; // 设置性别
} }
// 获取部门名称
public String getDeptname() { public String getDeptname() {
return deptname; return deptname;
} }
// 设置部门名称
public void setDeptname(String deptname) { public void setDeptname(String deptname) {
this.deptname = deptname; this.deptname = deptname; // 设置部门名称
} }
// 获取地址
public String getAddress() { public String getAddress() {
return address; return address;
} }
// 设置地址
public void setAddress(String address) { public void setAddress(String address) {
this.address = address; this.address = address; // 设置地址
} }
// 获取入职日期
public String getHireDate() { public String getHireDate() {
return hireDate; return hireDate;
} }
// 设置入职日期
public void setHireDate(String hireDate) { public void setHireDate(String hireDate) {
this.hireDate = hireDate; this.hireDate = hireDate; // 设置入职日期
} }
// 获取备注信息
public String getRemark() { public String getRemark() {
return remark; return remark;
} }
// 设置备注信息
public void setRemark(String remark) { public void setRemark(String remark) {
this.remark = remark; this.remark = remark; // 设置备注信息
}
// 重写 toString 方法,方便打印用户信息
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' + // 用户 ID
", empname='" + empname + '\'' + // 员工姓名
", sex='" + sex + '\'' + // 性别
", deptname='" + deptname + '\'' + // 部门名称
", address='" + address + '\'' + // 地址
", hireDate='" + hireDate + '\'' + // 入职日期
", remark='" + remark + '\'' + // 备注信息
'}';
} }
} }

@ -1,43 +1,49 @@
package comxyp.pojo; package comxyp.pojo;
import java.util.Date; // Vo 类实现分页功能,继承自 Dept 类
public class Vo extends Dept {
//实现分页 private Integer page; // 当前页码
public class Vo extends Dept{ private Integer limit; // 每页显示数量
private Integer page;//当前页码
private Integer limit;//每页显示数量
// 重写 toString 方法,方便打印 Vo 对象信息
@Override @Override
public String toString() { public String toString() {
return "Vo{" + return "Vo{" +
"page=" + page + "page=" + page + // 当前页码
", limit=" + limit + ", limit=" + limit + // 每页显示数量
'}'; '}';
} }
// 获取当前页码
public Integer getPage() { public Integer getPage() {
return page; return page;
} }
// 设置当前页码
public void setPage(Integer page) { public void setPage(Integer page) {
this.page = page; this.page = page; // 设置当前页码
} }
// 获取每页显示数量
public Integer getLimit() { public Integer getLimit() {
return limit; return limit;
} }
// 设置每页显示数量
public void setLimit(Integer limit) { public void setLimit(Integer limit) {
this.limit = limit; this.limit = limit; // 设置每页显示数量
} }
// 带页码和限制数量的构造函数
public Vo(Integer page, Integer limit) { public Vo(Integer page, Integer limit) {
this.page = page; this.page = page; // 初始化当前页码
this.limit = limit; this.limit = limit; // 初始化每页显示数量
} }
// 带部门信息和页码、限制数量的构造函数
public Vo(Integer id, String deptName, String address, String remark, Integer page, Integer limit) { public Vo(Integer id, String deptName, String address, String remark, Integer page, Integer limit) {
super(id, deptName, address, remark); super(id, deptName, address, remark); // 调用父类构造函数初始化部门信息
this.page = page; this.page = page; // 初始化当前页码
this.limit = limit; this.limit = limit; // 初始化每页显示数量
} }
} }

@ -1,50 +1,61 @@
package comxyp.pojo.front; package comxyp.pojo.front;
// 用户类
public class User { public class User {
private Integer id; private Integer id; // 用户 ID
private String username; private String username; // 用户名
private String phone; private String phone; // 用户手机号
private String password; private String password; // 用户密码
// 默认构造函数
public User() { public User() {
} }
// 带参数的构造函数,用于初始化用户对象的各个属性
public User(Integer id, String username, String phone, String password) { public User(Integer id, String username, String phone, String password) {
this.id = id; this.id = id; // 初始化用户 ID
this.username = username; this.username = username; // 初始化用户名
this.phone = phone; this.phone = phone; // 初始化手机号
this.password = password; this.password = password; // 初始化用户密码
} }
// 获取用户 ID
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置用户 ID
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id; // 设置用户 ID
} }
// 获取用户名
public String getUsername() { public String getUsername() {
return username; return username;
} }
// 设置用户名
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username; // 设置用户名
} }
// 获取用户手机号
public String getPhone() { public String getPhone() {
return phone; return phone;
} }
// 设置用户手机号
public void setPhone(String phone) { public void setPhone(String phone) {
this.phone = phone; this.phone = phone; // 设置手机号
} }
// 获取用户密码
public String getPassword() { public String getPassword() {
return password; return password;
} }
// 设置用户密码
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password; // 设置用户密码
} }
} }

@ -1,15 +1,23 @@
package comxyp.service; package comxyp.service;
import comxyp.pojo.Dept; import comxyp.pojo.Dept;
import comxyp.pojo.Employee;
import comxyp.pojo.Vo; import comxyp.pojo.Vo;
import java.util.List; import java.util.List;
// 部门服务接口
public interface DeptService { public interface DeptService {
// 根据条件分页查询所有部门
List<Dept> findAll(Vo vo); List<Dept> findAll(Vo vo);
// 添加部门
int addDept(Dept dept); int addDept(Dept dept);
//部门修改
// 更新部门信息
int updateDept(Dept dept); int updateDept(Dept dept);
// 根据部门 ID 删除部门
int deleteById(Integer id); int deleteById(Integer id);
// 查询所有部门名称
List<Dept> selectDeptName(); List<Dept> selectDeptName();
} }

@ -1,13 +1,19 @@
package comxyp.service; package comxyp.service;
import comxyp.pojo.Floor; import comxyp.pojo.Floor;
import java.util.List; import java.util.List;
// 楼层服务接口
public interface FloorService { public interface FloorService {
// 获取楼层列表
public List<Floor> floorList(); public List<Floor> floorList();
// 添加楼层
public int addFloor(Floor floor); public int addFloor(Floor floor);
// 更新楼层信息
public int updateFloor(Floor floor); public int updateFloor(Floor floor);
// 根据楼层 ID 删除楼层
int deleteFloor(Integer id); int deleteFloor(Integer id);
} }

@ -2,10 +2,10 @@ package comxyp.test;
import comxyp.utils.MD5Util; import comxyp.utils.MD5Util;
// MD5 测试类
public class Md5Test { public class Md5Test {
public static void main(String[] args){ public static void main(String[] args){
String psw = "1234"; String psw = "1234"; // 待加密的密码
System.out.println(MD5Util.getMD5(psw)); System.out.println(MD5Util.getMD5(psw)); // 打印加密后的密码
} }
} }

@ -4,58 +4,69 @@ package comxyp.utils;
* layui * layui
*/ */
public class DataGridViewResult { public class DataGridViewResult {
private Integer code=0;//执行状态码 private Integer code = 0; // 执行状态码
private String msg="";//提示信息 private String msg = ""; // 提示信息
private Long count=0L;//数量 private Long count = 0L; // 数据总数量
private Object data;//数据 private Object data; // 数据集合
// 获取状态码
public Integer getCode() { public Integer getCode() {
return code; return code;
} }
// 设置状态码
public void setCode(Integer code) { public void setCode(Integer code) {
this.code = code; this.code = code;
} }
// 获取提示信息
public String getMsg() { public String getMsg() {
return msg; return msg;
} }
// 设置提示信息
public void setMsg(String msg) { public void setMsg(String msg) {
this.msg = msg; this.msg = msg;
} }
// 获取数据总数量
public Long getCount() { public Long getCount() {
return count; return count;
} }
// 设置数据总数量
public void setCount(Long count) { public void setCount(Long count) {
this.count = count; this.count = count;
} }
// 获取数据集合
public Object getData() { public Object getData() {
return data; return data;
} }
// 设置数据集合
public void setData(Object data) { public void setData(Object data) {
this.data = data; this.data = data;
} }
/** /**
* *
* @param count * @param count
* @param data * @param data
*/ */
public DataGridViewResult(Long count, Object data) { public DataGridViewResult(Long count, Object data) {
super(); super();
this.count = count; this.count = count; // 初始化数据总数量
this.data = data; this.data = data; // 初始化数据集合
} }
// 构造函数,只接受数据集合
public DataGridViewResult(Object data) { public DataGridViewResult(Object data) {
super(); super();
this.data = data; this.data = data; // 初始化数据集合
} }
// 默认构造函数
public DataGridViewResult() { public DataGridViewResult() {
} }
} }

@ -3,38 +3,32 @@ package comxyp.utils;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
public class MD5Util public class MD5Util {
{
// 使用 MD5 加密算法对输入的密码进行加密
public static String getMD5(String password) public static String getMD5(String password) {
{ try {
try
{
// 得到一个信息摘要器 // 得到一个信息摘要器
MessageDigest digest = MessageDigest.getInstance("md5"); MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(password.getBytes()); byte[] result = digest.digest(password.getBytes()); // 计算 MD5 值
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer(); // 用于存储加密后的字符串
// 把每一个byte 做一个与运算 0xff;
for (byte b : result) // 将每一个 byte 做一个与运算 0xff
{ for (byte b : result) {
// 与运算 // 与运算
int number = b & 0xff;// 加盐 int number = b & 0xff; // 确保数值为正
String str = Integer.toHexString(number); String str = Integer.toHexString(number); // 转换为十六进制字符串
if (str.length() == 1) if (str.length() == 1) {
{ buffer.append("0"); // 如果位数不足 2 位,补 0
buffer.append("0");
} }
buffer.append(str); buffer.append(str); // 添加转换结果
} }
// 标准的md5加密后的结果 // 返回标准的 MD5 加密后的结果
return buffer.toString(); return buffer.toString();
} } catch (NoSuchAlgorithmException e) {
catch (NoSuchAlgorithmException e) e.printStackTrace(); // 打印异常信息
{ return ""; // 返回空字符串表示失败
e.printStackTrace();
return "";
} }
} }
}
}

@ -1,92 +1,111 @@
package comxyp.utils; package comxyp.utils;
import java.util.List; import java.util.List;
//菜单节点工具类
public class MenuNode {
private Integer id;//菜单编号
private Integer pid;//父级菜单编号
private String title;//菜单名称
private String href;//链接地址
private Integer spread;//是否展开
private String target;//打开方式
private String icon;//图标
private List<MenuNode> child;//子菜单集合列表
// 菜单节点工具类
public class MenuNode {
private Integer id; // 菜单编号
private Integer pid; // 父级菜单编号
private String title; // 菜单名称
private String href; // 链接地址
private Integer spread; // 是否展开1展开0不展开
private String target; // 打开方式(如"_self", "_blank"等)
private String icon; // 图标
private List<MenuNode> child; // 子菜单集合列表
// 获取菜单编号
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置菜单编号
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取父级菜单编号
public Integer getPid() { public Integer getPid() {
return pid; return pid;
} }
// 设置父级菜单编号
public void setPid(Integer pid) { public void setPid(Integer pid) {
this.pid = pid; this.pid = pid;
} }
// 获取菜单名称
public String getTitle() { public String getTitle() {
return title; return title;
} }
// 设置菜单名称
public void setTitle(String title) { public void setTitle(String title) {
this.title = title; this.title = title;
} }
// 获取链接地址
public String getHref() { public String getHref() {
return href; return href;
} }
// 设置链接地址
public void setHref(String href) { public void setHref(String href) {
this.href = href; this.href = href;
} }
// 获取展开状态
public Integer getSpread() { public Integer getSpread() {
return spread; return spread;
} }
// 设置展开状态
public void setSpread(Integer spread) { public void setSpread(Integer spread) {
this.spread = spread; this.spread = spread;
} }
// 获取打开方式
public String getTarget() { public String getTarget() {
return target; return target;
} }
// 设置打开方式
public void setTarget(String target) { public void setTarget(String target) {
this.target = target; this.target = target;
} }
// 获取图标
public String getIcon() { public String getIcon() {
return icon; return icon;
} }
// 设置图标
public void setIcon(String icon) { public void setIcon(String icon) {
this.icon = icon; this.icon = icon;
} }
// 获取子菜单集合
public List<MenuNode> getChild() { public List<MenuNode> getChild() {
return child; return child;
} }
// 设置子菜单集合
public void setChild(List<MenuNode> child) { public void setChild(List<MenuNode> child) {
this.child = child; this.child = child;
} }
// 默认构造函数
public MenuNode() { public MenuNode() {
} }
// 带参数的构造函数
public MenuNode(Integer id, Integer pid, String title, String href, Integer spread, String target, String icon, List<MenuNode> child) { public MenuNode(Integer id, Integer pid, String title, String href, Integer spread, String target, String icon, List<MenuNode> child) {
this.id = id; this.id = id; // 菜单编号
this.pid = pid; this.pid = pid; // 父级菜单编号
this.title = title; this.title = title; // 菜单名称
this.href = href; this.href = href; // 链接地址
this.spread = spread; this.spread = spread; // 是否展开
this.target = target; this.target = target; // 打开方式
this.icon = icon; this.icon = icon; // 图标
this.child = child; this.child = child; // 子菜单集合
} }
} }

@ -1,40 +1,39 @@
package comxyp.utils; package comxyp.utils;
import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.Sha1Hash; import org.apache.shiro.crypto.hash.Sha1Hash;
import java.util.UUID; import java.util.UUID;
// 密码加密工具类
public class PasswordUtil { public class PasswordUtil {
/** /**
* md5 * MD5
* @param source * @param source
* @param salt * @param salt
* @param hashIterations * @param hashIterations
* @return * @return
*/ */
public static String md5(String source, Object salt, Integer hashIterations) { public static String md5(String source, Object salt, Integer hashIterations) {
return new Md5Hash(source, salt, hashIterations).toString(); return new Md5Hash(source, salt, hashIterations).toString();
} }
/** /**
* sha1 * SHA1
* @param source * @param source
* @param salt * @param salt
* @param hashIterations * @param hashIterations
* @return * @return
*/ */
public static String sha1(String source, Object salt, Integer hashIterations) { public static String sha1(String source, Object salt, Integer hashIterations) {
return new Sha1Hash(source, salt, hashIterations).toString(); return new Sha1Hash(source, salt, hashIterations).toString();
} }
public static void main(String[] args) { public static void main(String[] args) {
String password = "123456"; String password = "123456"; // 明文密码
String salt = UUID.randomUUID().toString().replace("-",""); String salt = UUID.randomUUID().toString().replace("-", ""); // 生成随机盐
System.out.println("加密盐值:"+salt); System.out.println("加密盐值:"+salt); // 输出盐值
System.out.println("加密后的密码:"+ PasswordUtil.md5(password,salt,5)); System.out.println("加密后的密码:"+ PasswordUtil.md5(password, salt, 5)); // 输出加密结果
} }
}
}

@ -3,35 +3,35 @@ package comxyp.utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
//构建菜单层级关系 // 构建菜单层级关系的工具类
public class TreeUtil { public class TreeUtil {
/** /**
* *
* @param treeList * @param treeList
* @param pid 0 () * @param pid 0 ()
* @return * @return
*/ */
public static List<MenuNode> toTree(List<MenuNode> treeList, Integer pid) { public static List<MenuNode> toTree(List<MenuNode> treeList, Integer pid) {
List<MenuNode> retList = new ArrayList<MenuNode>(); List<MenuNode> retList = new ArrayList<MenuNode>(); // 存储返回的菜单节点
for (MenuNode parent : treeList) { for (MenuNode parent : treeList) {
//如果当前父级菜单编号与循环的菜单列表中的父级菜单编号一致 // 如果当前父级菜单编号与循环的菜单列表中的父级菜单编号一致
if (pid == parent.getPid()) { if (pid.equals(parent.getPid())) {
retList.add(findChildren(parent, treeList)); retList.add(findChildren(parent, treeList)); // 添加找到的子节点
} }
} }
return retList; return retList; // 返回构建的菜单结构
} }
// 递归查找子菜单
private static MenuNode findChildren(MenuNode parent, List<MenuNode> treeList) { private static MenuNode findChildren(MenuNode parent, List<MenuNode> treeList) {
for (MenuNode child : treeList) { for (MenuNode child : treeList) {
if (parent.getId() == child.getPid()) { if (parent.getId().equals(child.getPid())) { // 找到与父菜单对应的子菜单
if (parent.getChild() == null) { if (parent.getChild() == null) {
parent.setChild(new ArrayList<MenuNode>()); parent.setChild(new ArrayList<MenuNode>()); // 初始化子菜单集合
} }
parent.getChild().add(findChildren(child, treeList)); parent.getChild().add(findChildren(child, treeList)); // 递归查找
} }
} }
return parent; return parent; // 返回包含子菜单的父菜单
} }
} }

@ -2,8 +2,10 @@ package comxyp.utils;
import java.util.UUID; import java.util.UUID;
// UUID 工具类
public class UUIDUtils { public class UUIDUtils {
// 生成随机的 UUID 并去除 '-' 符号
public static String randomUUID() { public static String randomUUID() {
return UUID.randomUUID().toString().replace("-",""); return UUID.randomUUID().toString().replace("-", ""); // 返回不含 '-' 的 UUID 字符串
} }
} }

@ -11,67 +11,62 @@
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--spring的配置文件 这里主要配置和业务逻辑有关的配置-->
<!--组件扫描 扫描service和mapper pojo实体类--> <!-- Spring 的主配置文件,主要用于配置业务逻辑相关的 Beans -->
<!-- 组件扫描,扫描 service 和 mapper 包中的 POJO 实体类 -->
<context:component-scan base-package="comxyp"> <context:component-scan base-package="comxyp">
<!--除了controller的扫描 因为在spring-mvc文件中我们已经扫描 所以这里扫描除这个包之外的前提组件包--> <!-- 排除 Controller 的扫描,因为在 spring-mvc 配置文件中已经扫描过 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> </context:component-scan>
<!--加载jdbc.properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!-- 加载 jdbc.properties 配置文件,用于数据库连接信息 -->
<!--数据源的配置--> <context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源的配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property> <property name="driverClass" value="${jdbc.driver}"/> <!-- JDBC 驱动类 -->
<property name="jdbcUrl" value="${jdbc.url}"></property> <property name="jdbcUrl" value="${jdbc.url}"/> <!-- JDBC 连接 URL -->
<property name="user" value="${jdbc.username}"></property> <property name="user" value="${jdbc.username}"/> <!-- 数据库用户名 -->
<property name="password" value="${jdbc.password}"></property> <property name="password" value="${jdbc.password}"/> <!-- 数据库密码 -->
</bean> </bean>
<!--配置和mybatis的整合-->
<!--配置sessionFactory 工厂模式--> <!-- MyBatis 和 Spring 的整合配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源--> <property name="dataSource" ref="dataSource"/> <!-- 设置数据源 -->
<property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:sqlMapConfig.xml"/> <!-- 加载 MyBatis 核心配置 -->
<!--加载mybatis核心文件--> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 指定 MyBatis Mapper XML 文件的位置 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property> <!-- 以下属性用于配置实体类,已被注释 -->
<!--指定mybatis mapper配置文件的位置--> <!--<property name="typeAliases" value="comxyp.pojo"/> -->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
<!--配置实体类-->
<!--<property name="typeAliases" value="comxyp.pojo"></property>-->
</bean> </bean>
<!--扫描mapper所在的包 接口 为mapper创建实现类-->
<!-- 扫描 Mapper 接口所在的包,并为它们创建实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="comxyp.mapper"></property> <property name="basePackage" value="comxyp.mapper"/> <!-- 扫描 Mapper 包 -->
</bean> </bean>
<!-- 声明式事务管理 -->
<!--声明式事务控制-->
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--控制数据源--> <property name="dataSource" ref="dataSource"/> <!-- 设置用于管理事务的数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean> </bean>
<!-- 开启基于注解的事务控制,主要使用 XML 配置方式 -->
<!--开启基于注解的事务 使用xml配置形式的事务主要使用xml配置-->
<!--配置事务增强 事务如何切入-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes> <tx:attributes>
<!--所有方法都是事务方法--> <!-- 所有方法都将视为事务方法 -->
<tx:method name="*" propagation="SUPPORTS"/> <tx:method name="*" propagation="SUPPORTS"/>
<!--以get开始的所有方法--> <!-- 所有以 get 开头的方法 -->
<tx:method name="get*"></tx:method> <tx:method name="get*"/>
</tx:attributes> </tx:attributes>
</tx:advice> </tx:advice>
<!--事务的aop织入-->
<!-- AOP 配置,用于事务的切入点定义 -->
<aop:config> <aop:config>
<!--切入点表达式--> <!-- 切入点表达式定义 -->
<!--两种方法都可以实现 但是我们一般用下面一种--> <!-- 这里可以使用两种方法来实现 AOP 功能,以下是常用的方法 -->
<!--<aop:pointcut id="mypointcut" expression="execution(* comxyp.service..*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut="execution(* comxyp.service..*.*(..))"/> <!-- 为 service 包下的所有方法应用事务增强 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="mypointcut"></aop:advisor>-->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* comxyp.service..*.*(..))"></aop:advisor>
</aop:config> </aop:config>
</beans> </beans>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.DepartmentNapper"> <mapper namespace="comxyp.mapper.DepartmentNapper">
<!-- 这个 Mapper 目前是空的,可能用于定义部门相关的 SQL 操作 -->
</mapper> </mapper>

@ -1,38 +1,46 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.DeptMapper"> <mapper namespace="comxyp.mapper.DeptMapper">
<!-- 查询所有部门 -->
<select id="findAll" resultType="comxyp.pojo.Dept"> <select id="findAll" resultType="comxyp.pojo.Dept">
select * from dept_table select * from dept_table
<where> <where>
<if test="deptname!=null and deptname!=''"> <if test="deptname != null and deptname != ''">
and deptname like concat('%',#{deptname},'%') and deptname like concat('%', #{deptname}, '%') <!-- 根据部门名称模糊查询 -->
</if> </if>
</where> </where>
</select> </select>
<!--部门添加-->
<!-- 部门添加 -->
<insert id="addDept" parameterType="comxyp.pojo.Dept"> <insert id="addDept" parameterType="comxyp.pojo.Dept">
insert into dept_table(deptname,address,remark) values (#{deptname},#{address},#{remark}) insert into dept_table(deptname, address, remark)
values (#{deptname}, #{address}, #{remark}) <!-- 插入新部门 -->
</insert> </insert>
<!--部门修改-->
<!-- 部门修改 -->
<update id="updateDept" parameterType="comxyp.pojo.Dept"> <update id="updateDept" parameterType="comxyp.pojo.Dept">
update dept_table update dept_table
<set> <set>
<if test="deptname!=null and deptname!=''"> <if test="deptname != null and deptname != ''">
deptname = #{deptname}, deptname = #{deptname}, <!-- 更新部门名称 -->
</if> </if>
<if test="address!=null and address!=''"> <if test="address != null and address != ''">
address = #{address}, address = #{address}, <!-- 更新部门地址 -->
</if> </if>
<if test="remark!=null and remark!=''"> <if test="remark != null and remark != ''">
remark = #{remark} remark = #{remark} <!-- 更新备注 -->
</if> </if>
</set> </set>
where id=#{id} where id = #{id} <!-- 根据部门ID进行更新 -->
</update> </update>
<!-- 根据ID删除部门 -->
<delete id="deleteById"> <delete id="deleteById">
delete from dept_table where id=#{id} delete from dept_table where id = #{id}
</delete> </delete>
<select id="selectDeptName" parameterType="comxyp.pojo.Dept" resultType="comxyp.pojo.Dept">
select * from dept_table; <!-- 查询所有部门名称 -->
<select id="selectDeptName" parameterType="comxyp.pojo.Dept" resultType="comxyp.pojo.Dept">
select * from dept_table; <!-- 获取所有部门信息 -->
</select> </select>
</mapper> </mapper>

@ -1,66 +1,78 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.EmployeeMapper"> <mapper namespace="comxyp.mapper.EmployeeMapper">
<!--根据用户名查询员工信息--> <!-- 根据用户名查询员工信息 -->
<select id="findNameLogin" resultType="comxyp.pojo.Employee"> <select id="findNameLogin" resultType="comxyp.pojo.Employee">
select * from employee_table where username = #{username} select * from employee_table where username = #{username} <!-- 根据用户名查找员工 -->
</select> </select>
<!--保存用户-->
<insert id="saveUser" parameterType="comxyp.pojo.Employee"> <!-- 保存新用户 -->
insert into employee_table(id,username,password,name,sex,deptId) <insert id="saveUser" parameterType="comxyp.pojo.Employee">
values (#{id},#{username},#{password},#{name},#{sex},#{deptId}) insert into employee_table(id, username, password, name, sex, deptId)
</insert> values (#{id}, #{username}, #{password}, #{name}, #{sex}, #{deptId}) <!-- 插入新员工 -->
</insert>
<!-- 根据部门编号查询该部门下的员工数量 -->
<select id="getEmployeeCountByDeptId" resultType="int"> <select id="getEmployeeCountByDeptId" resultType="int">
<!-- 根据部门编号查询该部门下的员工数量 --> select count(1) from employee_table where deptId = #{deptId} <!-- 统计部门员工数量 -->
select count(1) from employee_table where deptId = #{deptId}
</select> </select>
<!--更新个人信息-->
<!-- 更新员工的个人信息 -->
<update id="updateUser" parameterType="comxyp.pojo.Employee"> <update id="updateUser" parameterType="comxyp.pojo.Employee">
update employee_table set username=#{username}, name = #{name},sex = #{sex}, deptId = #{deptId} where id=#{id} update employee_table
set username = #{username}, name = #{name}, sex = #{sex}, deptId = #{deptId}
where id = #{id} <!-- 更新员工信息 -->
</update> </update>
<!--更新密码-->
<!-- 更新员工密码 -->
<update id="updatePassword" parameterType="comxyp.pojo.Employee"> <update id="updatePassword" parameterType="comxyp.pojo.Employee">
update employee_table set password=#{password} where id=#{id} update employee_table set password = #{password} where id = #{id} <!-- 更新员工密码 -->
</update> </update>
<!--查询密码-->
<!-- 查询员工的密码 -->
<select id="selectPassword" parameterType="Integer" resultType="String"> <select id="selectPassword" parameterType="Integer" resultType="String">
select password from employee_table where id=#{id} select password from employee_table where id = #{id} <!-- 获取员工密码 -->
</select> </select>
<!--查询员工信息-->
<!-- 查询所有员工信息 -->
<select id="employeeList" resultType="comxyp.pojo.User"> <select id="employeeList" resultType="comxyp.pojo.User">
select * from user_table select * from user_table <!-- 获取所有员工信息 -->
</select> </select>
<!--添加员工-->
<!-- 添加员工 -->
<insert id="addEmployee" parameterType="comxyp.pojo.User"> <insert id="addEmployee" parameterType="comxyp.pojo.User">
insert into user_table(id,empname,sex,deptname,address,hireDate,remark) values (#{id},#{empname},#{sex},#{deptname},#{address},#{hireDate},#{remark}) insert into user_table(id, empname, sex, deptname, address, hireDate, remark)
values (#{id}, #{empname}, #{sex}, #{deptname}, #{address}, #{hireDate}, #{remark}) <!-- 插入新员工 -->
</insert> </insert>
<!--修改员工-->
<!-- 修改员工信息 -->
<update id="updateEmployee" parameterType="comxyp.pojo.User"> <update id="updateEmployee" parameterType="comxyp.pojo.User">
update user_table update user_table
<set> <set>
<if test="empname!=null and empname!=''"> <if test="empname != null and empname != ''">
empname = #{empname}, empname = #{empname}, <!-- 更新员工姓名 -->
</if> </if>
<if test="sex!=null and sex!=''"> <if test="sex != null and sex != ''">
sex = #{sex}, sex = #{sex}, <!-- 更新员工性别 -->
</if> </if>
<if test="deptname!=null and deptname!=''"> <if test="deptname != null and deptname != ''">
deptname = #{deptname}, deptname = #{deptname}, <!-- 更新部门名称 -->
</if> </if>
<if test="address!=null and address!=''"> <if test="address != null and address != ''">
sex = #{address}, address = #{address}, <!-- 更新地址 -->
</if> </if>
<if test="hireDate!=null and hireDate!=''"> <if test="hireDate != null and hireDate != ''">
hireDate = #{hireDate}, hireDate = #{hireDate}, <!-- 更新入职日期 -->
</if> </if>
<if test="remark!=null and remark!=''"> <if test="remark != null and remark != ''">
remark = #{remark} remark = #{remark} <!-- 更新备注 -->
</if> </if>
</set> </set>
where id=#{id} where id = #{id} <!-- 根据员工ID进行更新 -->
</update> </update>
<!--删除员工-->
<!-- 删除员工 -->
<delete id="deleteEmployee" parameterType="String"> <delete id="deleteEmployee" parameterType="String">
delete from user_table where id=#{id} delete from user_table where id = #{id} <!-- 根据员工ID删除 -->
</delete> </delete>
</mapper> </mapper>

@ -1,28 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.FloorMapper"> <mapper namespace="comxyp.mapper.FloorMapper">
<select id="floorList" resultType="comxyp.pojo.Floor"> <!-- 查询所有楼层信息 -->
<select id="floorList" resultType="comxyp.pojo.Floor">
select * from floor_table select * from floor_table
</select> </select>
<!-- 添加新楼层 -->
<insert id="addFloor" parameterType="comxyp.pojo.Floor"> <insert id="addFloor" parameterType="comxyp.pojo.Floor">
insert into floor_table(id,name,remark) values (#{id},#{name},#{remark}) insert into floor_table(id, name, remark) values (#{id}, #{name}, #{remark})
</insert> </insert>
<!-- 更新楼层信息 -->
<update id="updateFloor" parameterType="comxyp.pojo.Floor"> <update id="updateFloor" parameterType="comxyp.pojo.Floor">
update floor_table update floor_table
<set> <set>
<if test="id!=null"> <if test="id != null">
id = #{id}, id = #{id}, <!-- 更新楼层ID可选 -->
</if> </if>
<if test="name!=null and name!=''"> <if test="name != null and name != ''">
name = #{name}, name = #{name}, <!-- 更新楼层名称 -->
</if> </if>
<if test="remark!=null and remark!=''"> <if test="remark != null and remark != ''">
remark = #{remark}, remark = #{remark}, <!-- 更新楼层备注 -->
</if> </if>
</set> </set>
where id=#{id} where id = #{id} <!-- 根据楼层ID进行更新 -->
</update> </update>
<delete id="deleteFloor" parameterType="int" >
delete from floor_table where id=#{id} <!-- 根据ID删除楼层 -->
<delete id="deleteFloor" parameterType="int">
delete from floor_table where id = #{id}
</delete> </delete>
</mapper> </mapper>

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.MenuMapper"> <mapper namespace="comxyp.mapper.MenuMapper">
<!--查询所有菜单列表--> <!-- 查询所有菜单列表 -->
<select id="findAll" resultType="comxyp.pojo.Menu"> <select id="findAll" resultType="comxyp.pojo.Menu">
select * from sys_menu; select * from sys_menu; <!-- 从系统菜单表中查询所有菜单 -->
</select> </select>
</mapper> </mapper>

@ -1,31 +1,39 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.RoomMapper"> <mapper namespace="comxyp.mapper.RoomMapper">
<!-- 查询所有房间信息 -->
<select id="roomList" resultType="comxyp.pojo.Room"> <select id="roomList" resultType="comxyp.pojo.Room">
select * from room_table select * from room_table
</select> </select>
<!-- 添加新房间 -->
<insert id="addRoom" parameterType="comxyp.pojo.Room"> <insert id="addRoom" parameterType="comxyp.pojo.Room">
insert into room_table(roomid,typename,floorname,status) values (#{roomid},#{typename},#{floorname},#{status}) insert into room_table(roomid, typename, floorname, status)
values (#{roomid}, #{typename}, #{floorname}, #{status})
</insert> </insert>
<!-- 更新房间信息 -->
<update id="updateRoom" parameterType="comxyp.pojo.Room"> <update id="updateRoom" parameterType="comxyp.pojo.Room">
update room_table update room_table
<set> <set>
<if test="roomid!=null"> <if test="roomid != null">
roomid = #{roomid}, roomid = #{roomid}, <!-- 更新房间ID可选 -->
</if> </if>
<if test="typename!=null and typename!=''"> <if test="typename != null and typename != ''">
typename = #{typename}, typename = #{typename}, <!-- 更新房间类型名称 -->
</if> </if>
<if test="floorname!=null and floorname!=''"> <if test="floorname != null and floorname != ''">
floorname = #{floorname}, floorname = #{floorname}, <!-- 更新所在楼层名称 -->
</if> </if>
<if test="status!=null"> <if test="status != null">
status = #{status} status = #{status} <!-- 更新房间状态 -->
</if> </if>
</set> </set>
where id=#{id} where id = #{id} <!-- 根据房间ID进行更新 -->
</update> </update>
<!-- 根据ID删除房间 -->
<delete id="deleteRoom" parameterType="int"> <delete id="deleteRoom" parameterType="int">
delete from room_table where id=#{id} delete from room_table where id = #{id}
</delete> </delete>
</mapper> </mapper>

@ -1,51 +1,57 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.RoomTypeMapper"> <mapper namespace="comxyp.mapper.RoomTypeMapper">
<!-- 查询所有房间类型信息 -->
<select id="roomTypeList" resultType="comxyp.pojo.RoomType"> <select id="roomTypeList" resultType="comxyp.pojo.RoomType">
select * from roomtype_table select * from roomtype_table
</select> </select>
<!-- 添加新房间类型 -->
<insert id="addRoomType" parameterType="comxyp.pojo.RoomType"> <insert id="addRoomType" parameterType="comxyp.pojo.RoomType">
insert into roomtype_table (roomname,price,livenum,bednum,roomnum,reservednum,avilablenum,livednum,status,remark) insert into roomtype_table (roomname, price, livenum, bednum, roomnum, reservednum, avilablenum, livednum, status, remark)
values(#{roomname},#{price},#{livenum},#{bednum},#{roomnum},#{reservednum},#{avilablenum},#{livednum},#{status},#{remark}) values (#{roomname}, #{price}, #{livenum}, #{bednum}, #{roomnum}, #{reservednum}, #{avilablenum}, #{livednum}, #{status}, #{remark})
</insert> </insert>
<!-- 更新房间类型信息 -->
<update id="updateRoomType" parameterType="comxyp.pojo.RoomType"> <update id="updateRoomType" parameterType="comxyp.pojo.RoomType">
update roomtype_table update roomtype_table
<set> <set>
<if test="roomname!=null and roomname!=''"> <if test="roomname != null and roomname != ''">
roomname = #{roomname}, roomname = #{roomname}, <!-- 更新房间类型名称 -->
</if> </if>
<if test="price!=null"> <if test="price != null">
price = #{price}, price = #{price}, <!-- 更新房间价格 -->
</if> </if>
<if test="livenum!=null"> <if test="livenum != null">
livenum = #{livenum}, livenum = #{livenum}, <!-- 更新可住人数 -->
</if> </if>
<if test="bednum!=null"> <if test="bednum != null">
bednum = #{bednum}, bednum = #{bednum}, <!-- 更新床位数量 -->
</if> </if>
<if test="roomnum!=null"> <if test="roomnum != null">
roomnum = #{roomnum}, roomnum = #{roomnum}, <!-- 更新房间总数 -->
</if> </if>
<if test="reservednum!=null"> <if test="reservednum != null">
reservednum = #{reservednum}, reservednum = #{reservednum}, <!-- 更新已预定人数 -->
</if> </if>
<if test="avilablenum!=null"> <if test="avilablenum != null">
avilablenum = #{avilablenum}, avilablenum = #{avilablenum}, <!-- 更新可用房间数量 -->
</if> </if>
<if test="livednum!=null"> <if test="livednum != null">
livednum = #{livednum}, livednum = #{livednum}, <!-- 更新已入住人数 -->
</if> </if>
<if test="status!=null"> <if test="status != null">
status = #{status}, status = #{status}, <!-- 更新房间类型状态 -->
</if> </if>
<if test="remark!=null and remark!=''"> <if test="remark != null and remark != ''">
remark = #{remark}, remark = #{remark} <!-- 更新备注 -->
</if> </if>
</set> </set>
where id=#{id} where id = #{id} <!-- 根据房间类型ID进行更新 -->
</update> </update>
<!-- 根据ID删除房间类型 -->
<delete id="deleteRoomType" parameterType="int"> <delete id="deleteRoomType" parameterType="int">
delete from roomtype_table where id=#{id} delete from roomtype_table where id = #{id}
</delete> </delete>
</mapper> </mapper>

@ -1,16 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comxyp.mapper.front.UserMapper"> <mapper namespace="comxyp.mapper.front.UserMapper">
<!-- 查询是否存在手机号的用户 -->
<select id="existPhone" parameterType="comxyp.pojo.front.User" resultType="comxyp.pojo.front.User"> <select id="existPhone" parameterType="comxyp.pojo.front.User" resultType="comxyp.pojo.front.User">
select * from front_user where username=#{username}; select * from front_user where username=#{username}; <!-- 根据用户名查询用户 -->
</select> </select>
<!-- 添加新用户 -->
<insert id="addUser" parameterType="comxyp.pojo.front.User"> <insert id="addUser" parameterType="comxyp.pojo.front.User">
insert into front_user(username,phone,password) values (#{username},#{phone},#{password}); insert into front_user(username, phone, password) values (#{username}, #{phone}, #{password}); <!-- 插入用户信息 -->
</insert> </insert>
<!-- 用户登录验证 -->
<select id="login" parameterType="comxyp.pojo.front.User" resultType="comxyp.pojo.front.User"> <select id="login" parameterType="comxyp.pojo.front.User" resultType="comxyp.pojo.front.User">
select * from front_user where username=${username} and password=#{password} select * from front_user where username=${username} and password=#{password} <!-- 根据用户名和密码验证用户 -->
</select> </select>
<!-- 根据用户名查找用户密码 -->
<select id="findUsername" parameterType="String" resultType="String"> <select id="findUsername" parameterType="String" resultType="String">
select password from front_user where username=#{username} select password from front_user where username=#{username} <!-- 查询用户密码 -->
</select> </select>
</mapper> </mapper>

@ -10,82 +10,70 @@
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--spring-mvc的配置文件 这个文件主要配置网站跳转逻辑的控制,配置-->
<!-- 扫描组件 控制器 --> <!-- Spring MVC 配置文件,主要用于配置网站的请求跳转逻辑 -->
<context:component-scan base-package="comxyp.controller"></context:component-scan>
<!--视图解析器配置--> <!-- 扫描控制器组件 -->
<context:component-scan base-package="comxyp.controller"/>
<!-- 视图解析器配置 -->
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/admin/"></property> <property name="prefix" value="/WEB-INF/page/admin/"/> <!-- JSP 文件的前缀 -->
<property name="suffix" value=".jsp"></property> <property name="suffix" value=".jsp"/> <!-- JSP 文件的后缀 -->
</bean> </bean>
<!--设置文件上传核心组件--> <!-- 设定文件上传的核心组件 -->
<!--id值必须是multipartResolver 这个是规定的--> <!-- multipartResolver 的 ID 值必须是此名称,这是 Spring 的规定 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 可以在这里配置上传文件的大小限制等 -->
</bean> </bean>
<!-- 基于 Spring MVC 的标准配置 -->
<!-- 将 Spring MVC 不能处理的请求委托给 Tomcat开启静态资源的访问 -->
<mvc:default-servlet-handler/>
<!--两个标准的配置--> <!-- 拦截器配置 -->
<!--将spring-mvc不能处理的请求交给tomcat 开启静态资源的访问-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--拦截器配置-->
<mvc:interceptors> <mvc:interceptors>
<mvc:interceptor> <mvc:interceptor>
<!--拦截所有以/admin/开头的访问路径--> <!-- 拦截所有以 /admin/ 开头的 URL 访问 -->
<mvc:mapping path="/admin/**"></mvc:mapping> <mvc:mapping path="/admin/**"/>
<!--排除员工登录 注册的访问路径--> <!-- 排除特定的登录和注册路径,不被拦截 -->
<mvc:exclude-mapping path="/admin/employee/login"/> <mvc:exclude-mapping path="/admin/employee/login"/>
<mvc:exclude-mapping path="/admin/login.html"/> <mvc:exclude-mapping path="/admin/login.html"/>
<mvc:exclude-mapping path="/admin/employee/register"/> <mvc:exclude-mapping path="/admin/employee/register"/>
<mvc:exclude-mapping path="/admin/register.html"/> <mvc:exclude-mapping path="/admin/register.html"/>
<!--注入拦截--> <!-- 注入自定义拦截-->
<bean class="comxyp.interceptor.LoginInterceptor"></bean> <bean class="comxyp.interceptor.LoginInterceptor"/>
</mvc:interceptor> </mvc:interceptor>
</mvc:interceptors> </mvc:interceptors>
<!--配置mvc注解驱动-->
<!--能支持springmvc更高级的一些功能 JSR303校验 ajax等--> <!-- 配置 Spring MVC 注解驱动 -->
<!-- 支持 Spring MVC 的高级功能,如 JSR303 校验和 Ajax 等 -->
<mvc:annotation-driven> <mvc:annotation-driven>
<mvc:message-converters> <mvc:message-converters>
<!--@ResponseBody 中文响应乱码 --> <!-- 处理 @ResponseBody 相关的中文响应乱码问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter"> <bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes"> <property name="supportedMediaTypes">
<list> <list>
<value> <value>text/plain;charset=UTF-8</value>
text/plain;charset=UTF-8 <value>text/html;charset=UTF-8</value>
</value> <value>application/json;charset=UTF-8</value>
<value> <value>application/x-www-form-urlencoded;charset=UTF-8</value>
text/html;charset=UTF-8
</value>
<value>
application/json;charset=UTF-8
</value>
<value>
application/x-www-form-urlencoded;charset=UTF-8
</value>
</list> </list>
</property> </property>
</bean> </bean>
<!-- 处理 JSON 请求的中文乱码问题 -->
<!-- JSON中文请求乱码及解决 <!-- HttpMediaTypeNotAcceptableException: Could not find acceptable representation 异常信息 -->
HttpMediaTypeNotAcceptableException: Could not find acceptable representation 异常信息--> <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<bean id="jacksonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes"> <property name="supportedMediaTypes">
<list> <list>
<value> <value>application/json;charset=UTF-8</value>
application/json;charset=UTF-8 <value>application/x-www-form-urlencoded;charset=UTF-8</value>
</value>
<value>
application/x-www-form-urlencoded;charset=UTF-8
</value>
</list> </list>
</property> </property>
</bean> </bean>
</mvc:message-converters> </mvc:message-converters>
</mvc:annotation-driven> </mvc:annotation-driven>
</beans> </beans>

@ -2,17 +2,23 @@
<!DOCTYPE configuration <!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <configuration>
<!--定义别名--> <!-- 定义别名 -->
<typeAliases> <typeAliases>
<!-- <typeAlias type="comxyp.domain.Account" alias="account"></typeAlias>--> <!-- 定义类型别名,使用简化的名称代替完整的类名 -->
<!-- <package name="comxyp.domain"></package>--> <!-- 示例:<typeAlias type="comxyp.domain.Account" alias="account"/> -->
<!-- 批量注册所有类,取消注释来使用 -->
<!-- <package name="comxyp.domain"/> -->
</typeAliases> </typeAliases>
<!--分页插件配置-->
<!-- 分页插件配置 -->
<plugins> <plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"> <plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 支持OracleMySQLSQLiteMariaDBHsqldbPostgreSQL --> <!-- 配置分页插件,支持多种数据库 -->
<property name="helperDialect" value="mysql"/> <!-- 支持的数据库包括Oracle、MySQL、SQLite、MariaDB、Hsqldb、PostgreSQL -->
<property name="helperDialect" value="mysql"/> <!-- 设置使用的数据库方言为 MySQL -->
</plugin> </plugin>
</plugins> </plugins>

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

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

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

@ -2,23 +2,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面字符编码为UTF-8确保页面能够正确显示各种字符 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 页面标题,显示在浏览器标签栏,明确此页面的功能是用于修改密码 -->
<title>修改密码</title> <title>修改密码</title>
<!-- 指定页面渲染使用WebKit内核以保障页面在浏览器中能更好地呈现尤其是对于一些CSS样式和HTML5特性的支持 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 声明页面兼容IE浏览器的最新版本以及Chrome浏览器解决可能出现的浏览器兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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"> <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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
<style> <style>
/* 自定义了一个名为layui-input-company的类样式应用到具有该类名的元素上设置其宽度为自动根据内容自适应宽度右侧内边距为10px行高为38px可能用于特定输入框等元素的样式定制 */ .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> </style>
</head> </head>
<body> <body>
@ -29,52 +21,32 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">用户编号:</label> <label class="layui-form-label required">用户编号:</label>
<div class="layui-input-block"> <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"> <input type="text" name="id" maxlength="0" disabled="disabled" value="${sessionScope.user.id}" lay-verify="required" autocomplete="off" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">旧的密码</label> <label class="layui-form-label required">旧的密码</label>
<div class="layui-input-block"> <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"> <input type="password" name="password" lay-verify="required" lay-reqtext="旧的密码不能为空" placeholder="请输入旧的密码" value="" class="layui-input">
<tip>填写自己账号的旧的密码。</tip> <tip>填写自己账号的旧的密码。</tip>
<!-- 这里的<tip>标签看起来不太符合标准HTML规范可能是自定义的用于显示提示信息的元素不过通常更建议使用如<span>等标准标签来实现类似功能以便更好地兼容不同浏览器和遵循HTML标准 -->
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">新的密码</label> <label class="layui-form-label required">新的密码</label>
<div class="layui-input-block"> <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"> <input type="password" name="new_password" lay-verify="required" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码" value="" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">新的密码</label> <label class="layui-form-label required">新的密码</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 这里再次出现了用于输入新密码的密码输入框,可能是代码重复或者有特殊业务逻辑需求(比如用于再次确认新密码输入是否一致等情况),同样设置了必填验证规则等相关属性 -->
<input type="password" name="again_password" lay-verify="required" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码" value="" class="layui-input"> <input type="password" name="again_password" lay-verify="required" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码" value="" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <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> <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
</div> </div>
</div> </div>
@ -88,20 +60,19 @@
var $ = layui.jquery, var $ = layui.jquery,
form = layui.form; form = layui.form;
// 监听表单提交事件通过form.on方法监听lay-filter为"saveBtn"的表单提交事件与页面中按钮设置的lay-filter属性对应当用户点击“确认保存”按钮且表单验证通过时会触发该回调函数 //监听表单提交事件
form.on("submit(saveBtn)",function (data) { 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){ $.post("${pageContext.request.contextPath}/employee/updatePassword",data.field,function(result){
if(result.success){ if(result.success){
// 如果服务器返回的结果中success属性为true表示修改密码成功通过layer.msg方法弹出提示框显示服务器返回的提示信息result.msg告知用户修改密码成功 //关闭窗口
layer.msg(result.msg); layer.msg(result.msg);
} else { } else {
// 如果success属性为false表示修改密码失败同样通过layer.msg方法弹出提示框,显示服务器返回的错误信息result.error这里假设服务器返回的错误信息字段名为error告知用户修改密码失败的原因 //提示信息
layer.msg(result.error); layer.msg(result.error);
} }
},"json"); },"json");
// 返回false可以阻止表单默认的提交行为避免页面刷新因为这里是通过Ajax异步请求的方式向服务器提交数据不需要页面进行常规的刷新操作 //禁止页面刷新
return false; return false;
}); });

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

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

@ -3,335 +3,256 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的字符编码为UTF-8 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 指定页面使用webkit内核进行渲染 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 声明页面以IE的最高版本或Chrome的模式来渲染以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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"> <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.css" charset="utf-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).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"> <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"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 页面的标题,显示在浏览器标签页上 -->
<title>首页-酒店管理系统</title> <title>首页-酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部区域开始的标记通常用于放置网站的导航栏、logo等元素 --> <!-- 顶部start -->
<!-- 顶部start --> <div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-header header header-store" style="background-color: #393D49;"> <div class="layui-container">
<div class="layui-container"> <a class="logo" href="index.html">
<!-- 网站的logo图片链接点击可跳转到首页index.html通过img标签展示logo图片图片路径通过EL表达式结合项目上下文路径获取 --> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<a class="logo" href="index.html"> </a>
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
</a> <ul class="layui-nav" id="layui-nav-userinfo">
<!-- 这可能是一个用于放置表单相关组件比如搜索框、登录表单等的div通过lay-filter属性设置了一个过滤器标识可能用于后续的Layui表单相关操作 -->
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> <c:if test="${sessionScope.users!=null}">
<!-- 这是一个无序列表用于构建页面顶部的导航栏通过id属性设置了一个唯一标识方便后续进行样式设置和JavaScript操作 --> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<ul class="layui-nav" id="layui-nav-userinfo"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<!-- 使用JSTL的<c:if>标签进行条件判断判断会话session中是否存在名为"users"的属性且不为null --> </li>
<c:if test="${sessionScope.users!=null}"> <li data-id="room" class="layui-nav-item layui-hide-xs">
<!-- 导航栏中的一个菜单项,表示首页,设置了相关的数据-id属性、样式类通过a标签设置链接地址点击跳转到fronts/home.jsp以及添加了用于交互效果的自定义属性和样式类 --> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> </li>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <li data-id="register" class="layui-nav-item layui-hide-xs ">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
<!-- 导航栏中表示“房间”的菜单项链接地址暂时设置为JavaScript:void(0);可能后续通过JavaScript来动态设置实际跳转地址 --> </li>
<li data-id="room" class="layui-nav-item layui-hide-xs"> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li> </li>
<!-- 导航栏中表示“后台管理”的菜单项点击跳转到admin/login.html可能用于管理员登录进入后台管理系统 --> </c:if>
<li data-id="register" class="layui-nav-item layui-hide-xs "> <c:if test="${sessionScope.users==null}">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<!-- 导航栏中表示“退出”的菜单项,点击可能触发退出登录的操作,具体的退出逻辑应该在对应的后端接口(${pageContext.request.contextPath}/user/logout中实现 --> </li>
<li data-id="register" class="layui-nav-item layui-hide-xs "> <li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li> </li>
</c:if> <li data-id="login" class="layui-nav-item layui-hide-xs ">
<!-- 另一个<c:if>条件判断,判断会话中"users"属性是否为null --> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
<c:if test="${sessionScope.users==null}"> </li>
<!-- 导航栏中的首页菜单项与上面类似点击跳转到fronts/home.jsp --> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<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/register.jsp">注册</a>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> </li>
</li> </c:if>
<!-- 导航栏中“房间”菜单项点击跳转到fronts/hotelList.jsp用于未登录用户查看房间列表等操作 --> <span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
<li data-id="room" class="layui-nav-item layui-hide-xs"> </ul>
<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>
<!-- 顶部区域结束的标记 --> </div>
<!-- 顶部end --> <!-- 顶部end -->
<!-- 中间区域开始的标记,通常放置页面主要内容,如搜索框、筛选条件、房间列表等 -->
<!-- 中间区域开始 -->
<!-- 搜索框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>
</form>
</div>
<!--搜索 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>
</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>
</div> </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">
</a> </div>
</li> <!-- 搜索框end -->
<li data-id="2" title="酒店2楼" class="bg2"> <!-- 筛选条件start -->
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <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> </a>
</li> </li>
<li data-id="3" title="酒店3楼" class="bg3"> <li data-id="2" title="酒店2楼" class="bg2">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a> </a>
</li> </li>
<li data-id="4" title="酒店4楼" class="bg4"> <li data-id="3" title="酒店3楼" class="bg3">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a> </a>
</li> </li>
<li data-id="5" title="酒店5楼" class="bg5"> <li data-id="4" title="酒店4楼" class="bg4">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a> </a>
</li> </li>
<li data-id="6" title="酒店6楼" class="bg6"> <li data-id="5" title="酒店5楼" class="bg5">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</a> </a>
</li> </li>
</ul> <li data-id="6" title="酒店6楼" class="bg6">
</div> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<!-- 显示筛选结果数量的文本通过id为filtTotal的元素展示筛选出的房间数量数量值通过EL表达式${roomList.size()}从后端获取并动态显示 -->
<p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p> </a>
</li>
</ul>
</div> </div>
<p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p>
</div> </div>
</div> </div>
</div> </div>
<!-- 筛选条件end --> </div>
<!-- 筛选条件end -->
<!-- 房间列表start --> <!-- 房间列表start -->
<div class="shop-temp shoplist"> <div class="shop-temp shoplist">
<div class="temp-normal"> <div class="temp-normal">
<div class="layui-container"> <div class="layui-container">
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <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">
<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">
<!-- 这是一个整体的房间展示链接点击可跳转到房间详情页面fronts/detail.jsp并传递了名为toRoomInfo的数据类型参数用于在详情页做相应业务逻辑处理添加了多个样式类用于样式控制和交互效果 --> <img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <h2 class="layui-elip">标准间</h2>
<!-- 展示房间对应的图片设置了相应的图片路径以及store-list-cover样式类用于控制图片在页面中的显示样式比如大小、对齐等 --> <div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover"> <div class="store-list-colorbar">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“标准间” --> <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>
<h2 class="layui-elip">标准间</h2> <span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
<div> <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>
<!-- 展示房间价格标签使用了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> </a>
<!-- 以下每个div都是用于展示单个房间信息的容器通过data-id属性绑定房间的唯一标识${room.id}应是从后端获取的具体房间ID </div>
同时使用了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">
<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">
<!-- 这是一个整体的房间展示链接点击后会跳转到房间详情页面fronts/detail.jsp同时传递了一个名为toRoomInfo的数据类型参数 <img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
可能用于在详情页做对应业务逻辑区分添加了一些样式类template、store-list-box、fly-case-active用于样式控制和交互效果 --> <h2 class="layui-elip">单人间</h2>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<!-- 展示该房间对应的图片设置了对应的图片路径以及样式类store-list-cover用于页面中图片显示样式的定制比如大小、对齐等 --> <div class="store-list-colorbar">
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover"> <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>
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“单人间” --> <span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
<h2 class="layui-elip">单人间</h2> <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>
<!-- 展示房间价格标签使用了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> </a>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </div>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover"> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<h2 class="layui-elip">双人间</h2> <img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<div> <h2 class="layui-elip">双人间</h2>
<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"> <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="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: #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> <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> </a>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </div>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover"> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<h2 class="layui-elip">标准间</h2> <img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<div> <h2 class="layui-elip">标准间</h2>
<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"> <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="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: #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> <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>
</div>
</div>
</a>
</div> </div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </a>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> </div>
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover"> </div>
<h2 class="layui-elip">标准间</h2> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<div> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<label class="layui-badge-rim store-list-pay"> ¥120 </label> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<div class="store-list-colorbar"> <img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<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> <h2 class="layui-elip">单人间</h2>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span> <div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<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 class="store-list-colorbar">
</div> <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>
</div> <span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
</a> <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>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </a>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> </div>
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover"> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<h2 class="layui-elip">单人间</h2> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<div> <img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<label class="layui-badge-rim store-list-pay"> ¥100 </label> <h2 class="layui-elip">标准间</h2>
<div class="store-list-colorbar"> <div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<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> <div class="store-list-colorbar">
<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="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: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">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>
</div> <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 data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </a>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> </div>
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover"> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<h2 class="layui-elip">双人间</h2> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<div> <img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<label class="layui-badge-rim store-list-pay"> ¥120 </label> <h2 class="layui-elip">单人间</h2>
<div class="store-list-colorbar"> <div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<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> <div class="store-list-colorbar">
<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="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: #01aaed;color: #01aaed;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">2楼</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>
</div> <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> </div>
</div> </a>
<!-- 这是一组用于展示多个房间信息的div结构通过layui-row和layui-col-space20样式类应用了Layui框架的行布局以及列间距设置id为roomList可用于后续通过JavaScript等方式对房间列表进行操作 --> </div>
</div>
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <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"> <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"> <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"> <img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<!-- 展示房间名称使用了layui-elip样式类通常用于处理文字过长时超出部分以省略号显示等文本排版效果这里显示的房间名称是“双人间” -->
<h2 class="layui-elip">双人间</h2> <h2 class="layui-elip">双人间</h2>
<div> <div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<!-- 展示房间价格标签使用了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"> <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 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 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> <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> </div>
@ -341,8 +262,7 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="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/b4.png" class="store-list-cover"> <img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<h2 class="layui-elip">标准间</h2> <h2 class="layui-elip">标准间</h2>
<div> <div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar"> <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="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: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
@ -355,8 +275,7 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="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/d4.png" class="store-list-cover"> <img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2> <h2 class="layui-elip">单人间</h2>
<div> <div> <label class="layui-badge-rim store-list-pay"> ¥100 </label>
<label class="layui-badge-rim store-list-pay"> ¥100 </label>
<div class="store-list-colorbar"> <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="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: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span>
@ -369,8 +288,7 @@
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="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/s4.png" class="store-list-cover"> <img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2> <h2 class="layui-elip">双人间</h2>
<div> <div> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<label class="layui-badge-rim store-list-pay"> ¥120 </label>
<div class="store-list-colorbar"> <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="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: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span>
@ -380,79 +298,216 @@
</a> </a>
</div> </div>
</div> </div>
<!-- 以下是多组重复的房间信息展示结构,与上面一组的功能和结构类似,都是展示不同房间的信息,方便在页面上呈现多个房间供用户查看 -->
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示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 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> </div>
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示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 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> </div>
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<!-- 此处省略重复的单个房间信息展示div内容注释其结构和功能与上述第一个roomList中的单个房间展示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/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> </div>
<!-- 一个空的div通过设置样式来添加页面的上下边距以及文本居中对齐等样式效果可能用于页面布局中的空白间隔或者视觉上的分隔 -->
<div style="margin: 50px 0 80px; text-align: center;"> </div> <div style="margin: 50px 0 80px; text-align: center;"> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- 房间列表结束的标记,表示房间列表展示部分到此结束 --> <!-- 房间列表end -->
<!-- 中间区域结束的标记,意味着页面中间主要内容展示区域已完结 -->
<!-- 中间区域结束 -->
<!-- 底部区域开始,用于展示页面底部相关信息,比如版权声明、友情链接等 -->
<!-- 底部 -->
<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>
<!-- 脚本开始的标记意味着下面开始引入和编写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.$;
// 使用carousel模块的render方法来渲染轮播图配置相关参数 <!-- 中间区域结束 -->
// elem属性指定轮播图对应的DOM元素的ID这里是'LAY-store-banner'
// width属性设置轮播图容器的宽度为100%,使其自适应父容器宽度 <!-- 底部 -->
// height属性设置轮播图容器的高度为460像素 <!-- 底部 -->
// arrow属性设置为'always',表示始终显示轮播图的切换箭头,方便用户操作切换图片 <div class="fly-footer">
carousel.render({ <p><a href="#">酒店系统</a> 2022 © <a href="#">xyp.cn</a></p>
elem: '#LAY-store-banner' <p>
,width: '100%' //设置容器宽度 友情链接
,height: '460' //设置容器高度 <a href="https://gitee.com/xie_yingpeng/ssm-hotel-management-system.git" target="_blank">项目源码分享网</a>
,arrow: 'always' //始终显示箭头 <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>
</script> <a href="https://www.zhihu.com/people/nan-qiao-12-73" target="_blank">社区论坛</a> </p>
<!-- 脚本结束的标记表示JavaScript代码部分结束 -->
</div>
<!-- 脚本开始 -->
<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.$;
<!-- 这是一个用于实现页面固定栏可能是回到顶部等功能按钮所在栏相关样式和交互效果的无序列表使用了layui-fixbar样式类 --> //渲染轮播图
<ul class="layui-fixbar"> carousel.render({
<!-- 列表中的一个元素代表回到顶部按钮使用了layui-icon样式类来应用特定图标样式lay-type属性设置为"top"表示其功能是回到页面顶部通过style属性设置了一些额外的样式 --> elem: '#LAY-store-banner'
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li> ,width: '100%' //设置容器宽度
</ul> ,height: '460' //设置容器高度
<!-- 这是一个用于实现页面某些元素可能是弹窗等可拖动效果的空div使用了layui-layer-move样式类 --> ,arrow: 'always' //始终显示箭头
<div class="layui-layer-move"></div> });
});
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>
</body> </body>
</html> </html>

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

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

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

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

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

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

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

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

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

@ -1,114 +1,95 @@
/* 头部右侧背景色 headerRightBg */ /*头部右侧背景色 headerRightBg */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素设置其背景颜色为白色#ffffff并且使用!important来提高此样式规则的优先级确保它能覆盖可能存在的其他同名或冲突的背景色设置用于明确指定头部右侧区域的背景颜色 */ .layui-layout-admin .layui-header {
.layui-layout-admin.layui-header { background-color: #ffffff !important;
background-color: #ffffff!important;
} }
/* 头部右侧选中背景色 headerRightBgThis */ /*头部右侧选中背景色 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 {
.layui-layout-admin.layui-header.layuimini-header-content > ul >.layui-nav-item.layui-this,.layuimini-tool i:hover { background-color: #e4e4e4 !important;
background-color: #e4e4e4!important;
} }
/* 头部右侧字体颜色 headerRightColor */ /*头部右侧字体颜色 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 {
.layui-layout-admin.layui-header.layui-nav.layui-nav-item a {
color: rgba(107, 107, 107, 0.7); color: rgba(107, 107, 107, 0.7);
} }
/** 头部右侧下拉字体颜色 headerRightChildColor */ /**头部右侧下拉字体颜色 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 {
.layui-layout-admin.layui-header.layui-nav.layui-nav-item.layui-nav-child a { color: rgba(107, 107, 107, 0.7) !important;
color: rgba(107, 107, 107, 0.7)!important;
} }
/* 头部右侧鼠标选中 headerRightColorThis */ /*头部右侧鼠标选中 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 {
.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;
color: #565656!important;
} }
/* 头部右侧更多下拉颜色 headerRightNavMore */ /*头部右侧更多下拉颜色 headerRightNavMore */
/* 针对类名为layui-header的元素内部位于类名为layui-nav的导航菜单中的类名为layui-nav-more的元素通常用于表示展开更多下拉菜单的图标等相关元素设置其边框顶部颜色为带有一定透明度的灰色rgba(160, 160, 160, 0.7)),并使用!important确保该边框颜色设置优先应用用于定义头部右侧导航菜单中展开更多下拉菜单相关元素的边框颜色风格使其具有特定的视觉标识 */ .layui-header .layui-nav .layui-nav-more {
.layui-header.layui-nav.layui-nav-more { border-top-color: rgba(160, 160, 160, 0.7) !important;
border-top-color: rgba(160, 160, 160, 0.7)!important;
} }
/* 头部右侧更多下拉颜色 headerRightNavMore */ /*头部右侧更多下拉颜色 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 {
.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;
border-color: transparent transparent rgba(160, 160, 160, 0.7)!important;
} }
/** 头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */ /**头部右侧更多下拉配置色 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 {
.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;
background-color: #1E9FFF!important; color: #ffffff !important;
color: #ffffff!important;
} }
/* 头部缩放按钮样式 headerRightToolColor */ /*头部缩放按钮样式 headerRightToolColor */
/* 针对类名为layui-layout-admin且包含类名为layui-header的元素内部位于类名为layuimini-tool的元素里的i标签通常用于图标等元素设置其颜色为深灰色#565656用于定义头部区域中缩放按钮等工具图标元素的默认颜色风格使其与整体头部的颜色搭配协调一致 */ .layui-layout-admin .layui-header .layuimini-tool i {
.layui-layout-admin.layui-header.layuimini-tool i {
color: #565656; color: #565656;
} }
/* logo背景颜色 headerLogoBg */ /*logo背景颜色 headerLogoBg */
/* 针对类名为layui-layout-admin且包含类名为layuimini-logo的元素设置其背景颜色为深灰色#192027并使用!important提高优先级用于明确指定页面中logo区域的背景颜色使其具有独特的视觉标识与其他区域区分开来 */ .layui-layout-admin .layuimini-logo {
.layui-layout-admin.layuimini-logo { background-color: #192027 !important;
background-color: #192027!important;
} }
/* logo字体颜色 headerLogoColor */ /*logo字体颜色 headerLogoColor */
/* 针对类名为layui-layout-admin且包含类名为layuimini-logo的元素内部的h1标签通常用于显示logo的文字部分设置其文本颜色为浅灰色rgb(191, 187, 187)用于定义logo文字的颜色风格使其在背景颜色基础上呈现出清晰、协调的视觉效果 */ .layui-layout-admin .layuimini-logo h1 {
.layui-layout-admin.layuimini-logo h1 {
color: rgb(191, 187, 187); color: rgb(191, 187, 187);
} }
/* 左侧菜单更多下拉样式 leftMenuNavMore */ /*左侧菜单更多下拉样式 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 {
.layuimini-menu-left.layui-nav.layui-nav-more,.layuimini-menu-left-zoom.layui-nav.layui-nav-more {
border-top-color: rgb(191, 187, 187); border-top-color: rgb(191, 187, 187);
} }
/* 左侧菜单更多下拉样式 leftMenuNavMore */ /*左侧菜单更多下拉样式 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 {
.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;
border-color: transparent transparent rgb(191, 187, 187)!important;
} }
/* 左侧菜单背景 leftMenuBg */ /*左侧菜单背景 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 {
.layui-side.layui-bg-black,.layui-side.layui-bg-black >.layuimini-menu-left > ul,.layuimini-menu-left-zoom > ul { background-color: #28333E !important;
background-color: #28333E!important;
} }
/* 左侧菜单选中背景 leftMenuBgThis */ /*左侧菜单选中背景 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 {
.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
background-color: #1E9FFF!important;
} }
/* 左侧菜单子菜单背景 leftMenuChildBg */ /*左侧菜单子菜单背景 leftMenuChildBg */
/* 针对类名为layuimini-menu-left的元素内部处于展开状态layui-nav-itemed的菜单项的下拉子菜单.layui-nav-child元素设置其背景颜色为深黑色#0c0f13并使用!important提高优先级用于定义左侧菜单中展开的子菜单的背景颜色风格使其与上级菜单和其他区域在视觉上有所区分呈现出层次感 */ .layuimini-menu-left .layui-nav-itemed > .layui-nav-child {
.layuimini-menu-left.layui-nav-itemed >.layui-nav-child { background-color: #0c0f13 !important;
background-color: #0c0f13!important;
} }
/* 左侧菜单字体颜色 leftMenuColor */ /*左侧菜单字体颜色 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 {
.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;
color: rgb(191, 187, 187)!important;
} }
/* 左侧菜单选中字体颜色 leftMenuColorThis */ /*左侧菜单选中字体颜色 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 {
.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;
color: #ffffff!important;
} }
/** tab选项卡选中颜色 tabActiveColor */ /**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 {
.layuimini-tab.layui-tab-title.layui-this.layuimini-tab-active {
background-color: #1e9fff; background-color: #1e9fff;
} }

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

@ -1,27 +1,18 @@
/* 定义类名为.treeTable-empty的元素的样式 */
.treeTable-empty { .treeTable-empty {
/* 设置元素的宽度为20px用于控制该元素在页面中水平方向上占据一定的空间大小具体的用途可能根据页面布局和功能需求而定 */
width: 20px; width: 20px;
/* 将元素设置为行内块级元素,这样它既可以像行内元素一样在一行内与其他元素依次排列,又能像块级元素一样设置宽度、高度等尺寸属性以及内外边距等样式 */
display: inline-block; display: inline-block;
} }
/* 定义类名为.treeTable-icon的元素的样式 */
.treeTable-icon { .treeTable-icon {
/* 当鼠标指针移动到该元素上时,将鼠标指针的样式变为手型指针(通常用于表示该元素是可点击、可交互的),增强用户交互的视觉提示效果 */
cursor: pointer; 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"; 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"; content: "\e625";
/* 将伪元素的背景颜色设置为透明,避免出现不必要的背景色干扰图标显示或者与页面整体布局不协调的情况,确保图标能以期望的样式呈现出来 */
background-color: transparent; background-color: transparent;
} }

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

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

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

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

@ -1,58 +1,25 @@
// Bordered & Pulled // Bordered & Pulled
// ------------------------- // -------------------------
// .#{$fa-css-prefix}-border使
// $fa-css-prefix CSSSassLess
.#{$fa-css-prefix}-border { .#{$fa-css-prefix}-border {
// .2em.25em.15em.25emem使 padding: .2em .25em .15em;
padding:.2em.25em.15em; border: solid .08em $fa-border-color;
// .08em $fa-border-color 使 border-radius: .1em;
border: solid.08em $fa-border-color;
// .1em使使
border-radius:.1em;
} }
// .#{$fa-css-prefix}-pull-left使 .#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-left { .#{$fa-css-prefix}-pull-right { float: right; }
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} {
&.#{$fa-css-prefix}-pull-left { &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
margin-right:.3em; &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}
// .#{$fa-css-prefix}.#{$fa-css-prefix}-pull-right使
&.#{$fa-css-prefix}-pull-right {
margin-left:.3em;
}
} }
// Deprecated as of 4.4.04.4.0使 /* Deprecated as of 4.4.0 */
// pull-right使使.#{$fa-css-prefix}-pull-right .pull-right { float: right; }
.pull-right { .pull-left { float: left; }
float: right;
}
// pull-left使.#{$fa-css-prefix}-pull-left
.pull-left {
float: left;
}
// .#{$fa-css-prefix}pull-left使使使
.#{$fa-css-prefix} { .#{$fa-css-prefix} {
&.pull-left { &.pull-left { margin-right: .3em; }
margin-right:.3em; &.pull-right { margin-left: .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" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:context="http://www.springframework.org/schema/context"

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8"?>
<!-- XML 声明部分,表明该 XML 文件遵循的版本是 1.0,使用的字符编码为 UTF-8 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 文档类型定义DOCTYPE用于指定该 XML 文件遵循 MyBatis Mapper 3.0 的规范,并且指向对应的 DTD文档类型定义文件所在的网络地址
这个 DTD 文件用于验证当前 XML 文件的结构是否符合 MyBatis Mapper 的语法要求 -->
<mapper namespace="comxyp.mapper.DepartmentNapper"> <mapper namespace="comxyp.mapper.DepartmentNapper">
<!-- mapper 元素是 MyBatis 映射文件的根元素namespace 属性用于指定该映射文件对应的接口全限定名,
在这里表示这个映射文件与名为 "comxyp.mapper.DepartmentNapper" 的接口相关联,
通过这个关联MyBatis 可以将接口中的方法与该 XML 文件中定义的 SQL 语句等映射配置对应起来 -->
</mapper> </mapper>

@ -3,352 +3,245 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的内容类型为HTML字符编码为UTF-8 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 指定页面使用webkit内核进行渲染以保证在不同浏览器上的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 让页面以IE的最高版本模式或者Chrome Frame模式渲染提高浏览器兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入Layui框架的CSS样式文件路径通过表达式动态获取项目上下文路径方便项目部署在不同环境时能正确引用资源 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css"> <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"> <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"> <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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
<!-- 设置页面的图标,图标文件路径通过表达式根据项目上下文路径动态获取 -->
<link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面标题为"首页-酒店管理系统" -->
<title>首页-酒店管理系统</title> <title>首页-酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部start --> <!-- 页面顶部区域开始 -->
<div class="layui-header header header-store" style="background-color: #393D49;"> <div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container"> <div class="layui-container">
<a class="logo" href="index.html"> <!-- 页面的logo部分点击可跳转到index.html页面 -->
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <a class="logo" href="index.html">
</a> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> </a>
<ul class="layui-nav" id="layui-nav-userinfo"> <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}"> <!-- 根据会话中是否存在名为users的属性来动态显示不同的导航菜单项 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <c:if test="${sessionScope.users!=null}">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <!-- 导航菜单项,代表首页,设置了相关样式类和属性,点击可跳转到项目的首页 -->
</li> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<li data-id="room" class="layui-nav-item layui-hide-xs"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> </li>
</li> <!-- 导航菜单项代表房间页面点击暂时无实际跳转使用JavaScript:void(0)占位,后续可能添加交互逻辑) -->
<li data-id="register" class="layui-nav-item layui-hide-xs "> <li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li> </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 data-id="register" class="layui-nav-item layui-hide-xs ">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</c:if> </li>
<c:if test="${sessionScope.users==null}"> <!-- 导航菜单项,代表退出功能,点击可执行退出相关操作(具体逻辑需看后端对应的接口实现) -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li> </li>
<li data-id="room" class="layui-nav-item layui-hide-xs"> </c:if>
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> <c:if test="${sessionScope.users==null}">
</li> <!-- 导航菜单项,代表首页,设置了相关样式类和属性,点击可跳转到项目的首页 -->
<li data-id="login" class="layui-nav-item layui-hide-xs "> <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/login.jsp">登入</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li> </li>
<li data-id="register" class="layui-nav-item layui-hide-xs "> <!-- 导航菜单项代表房间页面点击暂时无实际跳转使用JavaScript:void(0)占位,后续可能添加交互逻辑) -->
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a> <li data-id="room" class="layui-nav-item layui-hide-xs">
</li> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</c:if> </li>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span> <!-- 导航菜单项,代表登录页面,点击可跳转到登录页面 -->
</ul> <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>
</div> </div>
</div> <!-- 页面顶部区域结束 -->
<!-- 顶部end -->
<!-- 页面中间区域开始 -->
<!-- 中间区域开始 --> <div class="shop-nav shop-index">
<div class="shop-nav shop-index"> <!-- 搜索区域开始 -->
<!--搜索 start--> <div id="LAY-topbar" style="height: auto;">
<div id="LAY-topbar" style="height: auto;"> <form class="layui-form layuimini-form">
<form class="layui-form layuimini-form"> <div class="input-search">
<div class="input-search"> <div id="searchRoom">
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords" <!-- 输入框用于输入搜索房间的关键词设置了占位文本、名称、ID等属性关闭了自动完成功能 -->
autocomplete="off" value=""> <input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"><i autocomplete="off" value="">
class="layui-icon layui-icon-search"></i></button> <!-- 搜索按钮使用Layui的按钮样式设置了点击提交表单的属性通过lay-submit以及绑定的过滤条件lay-filter背景色为特定颜色 -->
<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">
<!-- 页面中的另一个logo展示可能在不同页面布局中有不同显示需求点击可跳转到相应链接 -->
<a href="#" class="topbar-logo"> <img
src="${pageContext.request.contextPath}/statics/front/images/logo-1.png" alt="layui"> </a>
</div>
</div> </div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img </form>
src="${pageContext.request.contextPath}/statics/front/images/logo-1.png" alt="layui"> </a></div>
</div>
</form>
</div>
<!--搜索 end-->
</div>
<!-- 中间区域结束 -->
<!-- 房间详情start -->
<div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<div class="layui-card-header">
<span class="layui-breadcrumb layui-hide-xs" style="visibility: visible;">
<a href="${pageContext.request.contextPath}/fronts/home.jsp">酒店首页</a><span lay-separator="">/</span>
<a href="JavaScript:void(0);" id="floorNumber">酒店1楼</a><span lay-separator="">/</span>
<a><cite>房间详情</cite></a> </span>
</div> </div>
<div class="layui-card-body layui-row"> <!-- 搜索区域结束 -->
<div class="layui-col-md6"> </div>
<div class="intro-img photos"> <img id="coverImg" src="${pageContext.request.contextPath}/static/images/d1.png" alt="产品封面" layer-index="0"> </div> <!-- 页面中间区域结束 -->
<!-- 房间详情区域开始 -->
<div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<div class="layui-card-header">
<!-- 面包屑导航,用于显示当前页面在网站层级结构中的位置路径,部分链接有相应的跳转功能,这里展示了从酒店首页到当前房间详情页的路径 -->
<span class="layui-breadcrumb layui-hide-xs" style="visibility: visible;">
<a href="${pageContext.request.contextPath}/fronts/home.jsp">酒店首页</a><span lay-separator="">/</span>
<a href="JavaScript:void(0);" id="floorNumber">酒店1楼</a><span lay-separator="">/</span>
<a><cite>房间详情</cite></a>
</span>
</div> </div>
<div class="layui-col-md6"> <div class="layui-card-body layui-row">
<div class="intro-txt"> <div class="layui-col-md6">
<h1 class="title" id="roomName">单人间</h1> <!-- 展示房间图片的区域图片路径通过表达式动态获取项目上下文路径同时设置了图片相关的属性如layer-index -->
<input type="hidden" id="id" name="id" value="1"> <div class="intro-img photos"> <img id="coverImg" src="${pageContext.request.contextPath}/static/images/d1.png" alt="产品封面" layer-index="0"> </div>
<div class="store-attrs"> </div>
<div class="summary"> <div class="layui-col-md6">
<p class="reference"><span>房间号</span> <span id="roomNumber">NO.1</span></p> <div class="intro-txt">
<p class="reference"><span>床位数</span> <span id="bedType">1张</span></p> <!-- 展示房间名称 -->
<p class="reference"><span>宽 带</span> <span id="broadband">免费wifi</span></p> <h1 class="title" id="roomName">单人间</h1>
<p class="reference"><span>标准价</span> ¥<span id="standardPrice">100</span></p> <!-- 隐藏域用于保存房间相关的ID信息具体用途需结合后端逻辑可能用于后续的数据交互等 -->
<p class="activity"><span>会员价</span><strong class="price"><i>¥</i><span id="memberPrice">88</span></strong></p> <input type="hidden" id="id" name="id" value="1">
<p class="activity"><span>状&#12288;态</span> <div class="store-attrs">
<strong class="status"> <div class="summary">
<!-- 展示房间号 -->
<span>可预订</span> <p class="reference"><span>房间号</span> <span id="roomNumber">NO.1</span></p>
<!-- 展示床位数 -->
</strong> <p class="reference"><span>床位数</span> <span id="bedType">1张</span></p>
<!-- 展示宽带信息 -->
</p> <p class="reference"><span>宽 带</span> <span id="broadband">免费wifi</span></p>
<!-- 展示标准价 -->
<p class="reference"><span>标准价</span> ¥<span id="standardPrice">100</span></p>
<!-- 展示会员价 -->
<p class="activity"><span>会员价</span><strong class="price"><i>¥</i><span id="memberPrice">88</span></strong></p>
<!-- 展示房间状态 -->
<p class="activity"><span>状&#12288;态</span>
<strong class="status">
<span>可预订</span>
</strong>
</p>
</div>
</div> </div>
<!-- 预订房间的操作按钮设置了相应的样式类、点击事件相关属性通过lay-event等点击可触发预订房间相关操作 -->
<p class="store-detail-active" id="shopEvent">
<a lay-event="yd" id="bookRoomBtn" data-type="memberReserveHotel" class="store-bg-orange fly-memberReserveHotel">
<i class="layui-icon layui-icon-dollar"></i>立即预定 </a>
</p>
</div> </div>
<p class="store-detail-active" id="shopEvent">
<a lay-event="yd" id="bookRoomBtn" data-type="memberReserveHotel" class="store-bg-orange fly-memberReserveHotel">
<i class="layui-icon layui-icon-dollar"></i>立即预定 </a>
</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <!-- 房间详情区域结束 -->
<!-- 房间详情end -->
<!-- 预订房间窗口默认隐藏通过JavaScript控制显示用于用户填写预订房间相关的详细信息 -->
<%-- 预订房间窗口 --%> <div style="display: none;padding: 5px" id="orderRoomWindow">
<div style="display: none;padding: 5px" id="orderRoomWindow"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <!-- 隐藏域用于保存用户ID值从会话中获取具体的会话属性名和对应逻辑需结合后端代码 -->
<%-- 添加3个隐藏域分别保存用户ID、房间ID、房型ID --%> <input type="hidden" name="accountid" value="${sessionScope.currentUser.id}">
<input type="hidden" name="accountid" value="${sessionScope.currentUser.id}"> <!-- 隐藏域用于保存房间ID具体的房间对象相关逻辑需结合后端代码 -->
<input type="hidden" name="roomid" value="${room.id}"> <input type="hidden" name="roomid" value="${room.id}">
<input type="hidden" name="roomtypeid" value="${room.roomtypeid}"> <!-- 隐藏域用于保存房型ID具体的房型对象相关逻辑需结合后端代码 -->
<div class="layui-form-item"> <input type="hidden" name="roomtypeid" value="${room.roomtypeid}">
<label class="layui-form-label">预订日期</label> <div class="layui-form-item">
<div class="layui-input-block"> <!-- 预订日期输入框,设置为只读,需要通过日期选择组件选择日期,设置了验证规则等属性,提示用户选择预订日期范围 -->
<input type="text" id="book_date" lay-verify="required" autocomplete="off" readonly placeholder="请选择预订日期范围" <label class="layui-form-label">预订日期</label>
class="layui-input"> <div class="layui-input-block">
</div> <input type="text" id="book_date" lay-verify="required" autocomplete="off" readonly placeholder="请选择预订日期范围"
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">入住时间</label>
<div class="layui-input-inline">
<input type="text" name="arrivedate" id="arrivedate" lay-verify="required" readonly placeholder="请选择入住时间"
class="layui-input"> class="layui-input">
</div> </div>
</div> </div>
<div class="layui-inline"> <div class="layui-form-item">
<label class="layui-form-label">离店时间</label> <div class="layui-inline">
<div class="layui-input-inline"> <!-- 入住时间输入框,设置为只读,需要通过日期选择组件选择日期,设置了验证规则等属性,提示用户选择入住时间 -->
<input type="text" name="leavedate" id="leavedate" lay-verify="required" readonly placeholder="请选择离店时间" <label class="layui-form-label">入住时间</label>
class="layui-input"> <div class="layui-input-inline">
<input type="text" name="arrivedate" id="arrivedate" lay-verify="required" readonly placeholder="请选择入住时间"
class="layui-input">
</div>
</div> </div>
</div> <div class="layui-inline">
</div> <!-- 离店时间输入框,设置为只读,需要通过日期选择组件选择日期,设置了验证规则等属性,提示用户选择离店时间 -->
<div class="layui-form-item"> <label class="layui-form-label">离店时间</label>
<div class="layui-inline"> <div class="layui-input-inline">
<label class="layui-form-label">入住天数</label> <input type="text" name="leavedate" id="leavedate" lay-verify="required" readonly placeholder="请选择离店时间"
<div class="layui-input-inline"> class="layui-input">
<input type="text" name="day" id="day" lay-verify="required" readonly placeholder="入住天数自动计算" </div>
class="layui-input">
</div> </div>
</div> </div>
<div class="layui-inline"> <div class="layui-form-item">
<label class="layui-form-label">房费价格</label> <div class="layui-inline">
<div class="layui-input-inline"> <!-- 入住天数输入框设置为只读其值通过JavaScript根据入住时间和离店时间计算后赋值具体计算逻辑在对应的函数中 -->
<input type="text" name="reserveprice" id="reservePrice" lay-verify="required" readonly placeholder="房费价格自动计算" <label class="layui-form-label">入住天数</label>
class="layui-input"> <div class="layui-input-inline">
<input type="text" name="day" id="day" lay-verify="required" readonly placeholder="入住天数自动计算"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<!-- 房费价格输入框设置为只读其值通过JavaScript根据入住天数和相关价格计算后赋值具体计算逻辑在对应的函数中 -->
<label class="layui-form-label">房费价格</label>
<div class="layui-input-inline">
<input type="text" name="reserveprice" id="reservePrice" lay-verify="required" readonly placeholder="房费价格自动计算"
class="layui-input">
</div>
</div> </div>
</div> </div>
</div> <div class="layui-form-item">
<div class="layui-form-item"> <div class="layui-inline">
<div class="layui-inline"> <!-- 预订姓名输入框,设置了验证规则和占位文本等属性,提示用户输入预订人姓名 -->
<label class="layui-form-label">预订姓名</label> <label class="layui-form-label">预订姓名</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input type="text" name="reservationname" lay-verify="required" placeholder="请输入预订人姓名" <input type="text" name="reservationname" lay-verify="required" placeholder="请输入预订人姓名"
class="layui-input"> class="layui-input">
</div>
</div>
<div class="layui-inline">
<!-- 预订电话输入框,设置了验证规则和占位文本等属性,提示用户输入预订人电话 -->
<label class="layui-form-label">预订电话</label>
<div class="layui-input-inline">
<input type="text" name="phone" lay-verify="required" placeholder="请输入预订人电话"
class="layui-input">
</div>
</div> </div>
</div> </div>
<div class="layui-inline"> <div class="layui-form-item">
<label class="layui-form-label">预订电话</label> <!-- 身份证号输入框,设置了验证规则、自动完成属性和占位文本等属性,提示用户输入身份证号码 -->
<div class="layui-input-inline"> <label class="layui-form-label">身份证号</label>
<input type="text" name="phone" lay-verify="required" placeholder="请输入预订人电话" <div class="layui-input-block">
<input type="text" name="idcard" lay-verify="required" autocomplete="off" placeholder="请输入身份证号码"
class="layui-input"> class="layui-input">
</div> </div>
</div> </div>
</div> <div class="layui-form-item">
<!-- 备注留言文本域,用于用户输入预订房间相关的备注信息 -->
<label class="layui-form-label">备注留言</label>
<div class="layui-input-block">
<div class="layui-form-item"> <textarea class="layui-textarea" name="remark" id="content"></textarea>
<label class="layui-form-label">身份证号</label> </div>
<div class="layui-input-block">
<input type="text" name="idcard" lay-verify="required" autocomplete="off" placeholder="请输入身份证号码"
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注留言</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="remark" id="content"></textarea>
</div>
</div>
<div class="layui-form-item" style="margin-left: 80px">
<span style="color: red;font-size: 16px;">预订须知请携带本人的身份证办理入住手续办理入住需要在前台缴纳押金¥500</span>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;">
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交
</button>
<button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置
</button>
</div> </div>
</div> <div class="layui-form-item" style="margin-left: 80px">
</form> <!-- 预订
</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>
<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(["form","element","element","layer","laydate","jquery"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
laydate = layui.laydate,
$=layui.jquery,
$ = layui.$;
//渲染轮播图
carousel.render({
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
/**
* 计算两个日期的天数差
* @param strDateStart
* @param strDateEnd
* @returns {number}
*/
function getDays(strDateStart,strDateEnd){
var strSeparator = "-"; //日期分隔符
Date1= strDateStart.split(strSeparator);
oDate2= strDateEnd.split(strSeparator);
var strDateS = new Date(Date1[0], Date1[1]-1, Date1[2]);
var strDateE = new Date(oDate2[0], oDate2[1]-1, oDate2[2]);
iDays = parseInt(Math.abs(strDateS - strDateE ) / 1000 / 60 / 60 /24)//把相差的毫秒数转换为天数
return iDays ;
}
//渲染日期范围组件
laydate.render({
elem:"#book_date",
min:"new Date()",//限定开始日期
range:"至",//选择范围,内容可以自定义
done:function (value,date,endDate) {
//var startDate = value.substr(0,value.indexOf("至")).trim();
//var endDate = value.substr(value.indexOf("至")+1,value.length).trim();
var startDate = value.substr(0,value.indexOf(" ")).trim();//开始日期(入住日期)
var endDate = value.substr(value.lastIndexOf(" "),value.length).trim();//结束日期(离店日期)
//赋值
$("#arrivedate").val(startDate);
$("#leavedate").val(endDate);
//计算天数差
var day = getDays(startDate,endDate);
//赋值入住天数
$("#day").val(day);
//计算房费价格
var price = day * $("#price").val();
//赋值价格
$("#reservePrice").val(price);
}
});
var mainIndex;
/* $(document).ready(function(){
// 执行代码
$("#bookRoomBtn").click(function () {
alert("nh")
})
});*/
//点击立即预订按钮触发点击事件
$("#bookRoomBtn").click(function () {
/* //获取隐藏域中的用户ID值
var userId = $("#currentUserId").val();
//判断用户是否已经登录
if(userId=="" || userId.length==0){
//layer.alert("您还没有登录,请先登录!");
alert("您还没有登录,请先登录!")
location.href="/login.jsp";
}*/
//打开预订房间窗口
mainIndex = layer.open({
type: 1,//打开类型
title: "预订房间",//窗口标题
area: ["800px", "550px"],//窗口宽高
content: $("#orderRoomWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
}
});
});
//监听表单提交事件
form.on("submit(doSubmit)",function (data) {
layer.confirm("确定预订吗? 请检查信息是否正确", {icon: 3, title:'提示'},function () {
//关闭窗口
layer.msg("预订成功")
layer.close(mainIndex);
location.href="${pageContext.request.contextPath}/fronts/home.jsp"
}
)
});
});
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>
</body>
</html>

@ -3,103 +3,128 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的字符编码为UTF-8确保页面能正确解析和显示各种字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 指定页面渲染使用webkit引擎用于在不同浏览器中保证页面渲染效果的一致性 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 声明页面以IE的最高版本或者Chrome 1版本的模式来渲染解决浏览器兼容性问题 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- 引入layui的样式文件通过EL表达式动态获取路径方便项目部署在不同环境时路径的适配 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个自定义的全局样式文件(文件名有(1)区分同样设置字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).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"> <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"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<title>首页-酒店管理系统</title> <title>首页-酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部start --> <!-- 顶部区域开始的标记用于在HTML结构上清晰划分页面不同部分方便后续样式设置和代码维护 -->
<div class="layui-header header header-store" style="background-color: #393D49;"> <div class="layui-header header header-store" style="background-color: #393D49;">
<div class="layui-container"> <div class="layui-container">
<a class="logo" href="index.html"> <!-- 页面的logo点击可跳转到index.html页面通过图片展示logo -->
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <a class="logo" href="index.html">
</a> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> </a>
<ul class="layui-nav" id="layui-nav-userinfo"> <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}"> <!-- 根据sessionScope中users是否为空来动态显示不同的导航菜单 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <c:if test="${sessionScope.users!=null}">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <!-- 导航菜单项表示首页设置了一些属性如data-id用于标识等和样式类如layui-hide-xs控制在小屏幕设备上的显示隐藏等点击可跳转到指定的JSP页面 -->
</li> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<li data-id="room" class="layui-nav-item layui-hide-xs"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> </li>
</li> <!-- 导航菜单项表示房间点击目前无实际跳转效果JavaScript:void(0)),可能后续会添加相关交互逻辑 -->
<li data-id="register" class="layui-nav-item layui-hide-xs "> <li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</li> </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 data-id="register" class="layui-nav-item layui-hide-xs ">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</c:if> </li>
<c:if test="${sessionScope.users==null}"> <!-- 导航菜单项表示退出点击可执行退出相关操作此处具体的退出逻辑可能在对应的URL对应的后端处理中 -->
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
</li> </li>
<li data-id="room" class="layui-nav-item layui-hide-xs"> </c:if>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a> <c:if test="${sessionScope.users==null}">
</li> <!-- 导航菜单项表示首页设置了相关属性和样式类点击可跳转到指定的JSP页面 -->
<li data-id="login" class="layui-nav-item layui-hide-xs "> <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/login.jsp">登入</a> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
</li> </li>
<li data-id="register" class="layui-nav-item layui-hide-xs "> <!-- 导航菜单项表示房间点击可跳转到房间列表的JSP页面 -->
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a> <li data-id="room" class="layui-nav-item layui-hide-xs">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</c:if> </li>
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span> <!-- 导航菜单项,表示登录,点击可跳转到登录页面 -->
</ul> <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>
<!-- 用于显示导航栏的选中状态条此处初始设置了一些样式相关的属性如位置、宽度、透明度等可能会通过JavaScript等动态改变样式来体现选中效果 -->
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div> </div>
</div> <!-- 顶部区域结束的标记 -->
<!-- 顶部end -->
<!-- 中间区域开始 --> <!-- 中间区域开始的标记,用于划分页面主体内容部分 -->
<div class="shop-nav shop-index"> <div class="shop-nav shop-index">
<!--搜索 start--> <!--搜索区域开始的标记,这里包含了搜索相关的表单元素等 -->
<div id="LAY-topbar" style="height: auto;"> <div id="LAY-topbar" style="height: auto;">
<form class="layui-form layuimini-form"> <form class="layui-form layuimini-form">
<div class="input-search"> <div class="input-search">
<div id="searchRoom"> <div id="searchRoom">
<input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords" <!-- 输入框,用于输入搜索关键词,设置了一些属性如占位符提示用户输入内容、关闭自动完成功能、初始值等 -->
autocomplete="off" value=""> <input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
<button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom" style="background-color: #009688"> autocomplete="off" value="">
<i class="layui-icon layui-icon-search"></i> <!-- 搜索按钮设置了样式类如layui-btn、layui-btn-shop用于显示特定样式的按钮点击可提交表单具体的搜索逻辑需看对应的lay-filter绑定的处理函数按钮内通过图标展示搜索图标 -->
</button> <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">
<!-- 展示一个logo图片可能用于页面特定位置的品牌展示等通过EL表达式获取图片路径 -->
<img src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
</div> </div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> </form>
<img src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div> </div>
</div> <!--搜索区域结束的标记 -->
</form>
</div> <!-- 左侧导航开始的标记,用于展示房间分类等相关导航信息 -->
<!--搜索 end-->
<div class="shop-banner">
<!-- 左侧导航开始 -->
<div class="layui-container layui-hide-xs"> <div class="layui-container layui-hide-xs">
<div class="product-list"> <div class="product-list">
<dl id="getIndexRoomType"> <dl id="getIndexRoomType">
<dt style="background-color: #009688"><a href="lists.html" target="_blank">房间分类</a></dt> <dt style="background-color: #009688"><a href="lists.html" target="_blank">房间分类</a></dt>
<c:forEach items="${roomTypeList}" var="tp"> <!-- 使用JSTL的forEach标签循环遍历roomTypeList集合这个集合应该是在后端准备好并传递到页面的对于每个元素生成一个导航菜单项 -->
<dd data-id="${tp.id}"> <c:forEach items="${roomTypeList}" var="tp">
<a class="fly-case-active" href="${pageContext.request.contextPath}/fronts/hotelList.jsp" data-type=""> <dd data-id="${tp.id}">
${tp.roomname} <a class="fly-case-active" href="${pageContext.request.contextPath}/fronts/hotelList.jsp" data-type="">
</a> ${tp.roomname}
</dd> </a>
</c:forEach> </dd>
</c:forEach>
</dl> </dl>
</div> </div>
</div> </div>
<!-- 左侧导航结束 --> <!-- 左侧导航结束的标记 -->
<!-- 轮播图开始 --> <!-- 轮播图开始的标记使用layui的轮播图组件来展示图片轮播效果 -->
<div class="layui-carousel" lay-filter="LAY-store-banner" id="LAY-store-banner" lay-anim lay-indicator="inside" > <div class="layui-carousel" lay-filter="LAY-store-banner" id="LAY-store-banner" lay-anim lay-indicator="inside" >
<div carousel-item> <div carousel-item>
<div class="layui-this"> <div class="layui-this">
<div class="layui-container"><a href="javascript:;" target="_blank"> <div class="layui-container"><a href="javascript:;" target="_blank">
<!-- 轮播图中的图片展示通过EL表达式获取图片路径可点击目前点击无实际效果可能后续添加链接跳转等逻辑 -->
<img src="${pageContext.request.contextPath}/static/front/images/1.jpg" alt="酒店系统"></a> <img src="${pageContext.request.contextPath}/static/front/images/1.jpg" alt="酒店系统"></a>
</div> </div>
</div> </div>
@ -133,6 +158,7 @@
<div class="layui-carousel-ind"> <div class="layui-carousel-ind">
<ul> <ul>
<!-- 轮播图的指示器第一个li元素添加了layui-this类表示初始选中状态 -->
<li class="layui-this"></li> <li class="layui-this"></li>
<li class=""></li> <li class=""></li>
<li class=""></li> <li class=""></li>
@ -144,190 +170,67 @@
<button class="layui-icon layui-carousel-arrow" lay-type="sub"></button> <button class="layui-icon layui-carousel-arrow" lay-type="sub"></button>
<button class="layui-icon layui-carousel-arrow" lay-type="add"></button> <button class="layui-icon layui-carousel-arrow" lay-type="add"></button>
</div> </div>
<!-- 轮播图结束 --> <!-- 轮播图结束的标记 -->
<!-- 酒店楼层开始 --> <!-- 酒店楼层开始的标记,这里展示不同楼层的房间信息 -->
<div class="shop-temp" id="getIndexFloor"> <div class="shop-temp" id="getIndexFloor">
<div class="layui-container"> <div class="layui-container">
<p class="temp-title-cn"><span></span>酒店1楼<span></span></p> <p class="temp-title-cn"><span></span>酒店1楼<span></span></p>
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> <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"> <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"> <!-- 房间图片展示通过EL表达式获取图片路径 -->
<h2 class="layui-elip">单人间</h2> <img src="${pageContext.request.contextPath}/static/images/d1.png" class="store-list-cover">
<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> <h2 class="layui-elip">单人间</h2>
</div> <p class="price">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> <!-- 展示房间价格通过title属性提示显示的是金额 -->
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <span title="金额"> ¥100.00 </span>
<img src="${pageContext.request.contextPath}/static/images/d2.png" class="store-list-cover"> <!-- 展示房号,设置了相关样式如背景色、边框、文本对齐等 -->
<h2 class="layui-elip">单人间</h2> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span>
<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> </p>
</a> </a>
</div> </div>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> <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"> <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"> <img src="${pageContext.request.contextPath}/static/images/d2.png" class="store-list-cover">
<h2 class="layui-elip">单人间</h2> <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> <p class="price">
</a> <span title="金额"> ¥100.00 </span>
</div> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.2 </span>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> </p>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> </a>
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover"> </div>
<h2 class="layui-elip">单人间</h2> <div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
<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 class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
</a> <img src="${pageContext.request.contextPath}/static/images/d3.png" class="store-list-cover">
</div> <h2 class="layui-elip">单人间</h2>
</div> <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> </div>
</div> </div>
<div class="layui-container"> <div class="layui-container">
<p class="temp-title-cn"><span></span>酒店2楼<span></span></p> <p class="temp-title-cn"><span></span>酒店2楼<span></span></p>
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> <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"> <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"> <img src="${pageContext.request.contextPath}/static/images/s1.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2> <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> <p class="price">
</a> <span title="金额"> ¥120.00 </span>
</div> <span title="房号" style="color: #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.1 </span>
<div data-id="${room.id}" class="layui-col-xs6 layui-col-md3"> </p>
<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>
<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 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>
<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>
<!-- 脚本开始 -->
<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: '#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>
</body>
</html>

@ -3,511 +3,228 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的字符编码为UTF-8确保能正确显示各种字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 声明使用webkit作为渲染引擎用于优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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"> <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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个自定义的全局CSS文件可能是对global.css的补充或者修改指定字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="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"> <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"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面的标题为“首页-酒店管理系统” -->
<title>首页-酒店管理系统</title> <title>首页-酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部start --> <!-- 顶部区域开始的注释标记,方便在代码结构中区分不同部分 -->
<div class="layui-header header header-store" style="background-color: #393D49;"> <!-- 顶部start -->
<div class="layui-container"> <div class="layui-header header header-store" style="background-color: #393D49;">
<a class="logo" href="index.html"> <div class="layui-container">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <!-- 页面的logo部分点击可跳转到index.html页面 -->
</a> <a class="logo" href="index.html">
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<ul class="layui-nav" id="layui-nav-userinfo"> </a>
<!-- 可能用于放置一些表单组件等通过lay-filter属性设置了一个筛选标识 -->
<c:if test="${sessionScope.users!=null}"> <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <ul class="layui-nav" id="layui-nav-userinfo">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <!-- 根据sessionScope中users是否为空来显示不同的导航菜单选项以下是users不为空时的情况 -->
</li> <c:if test="${sessionScope.users!=null}">
<li data-id="room" class="layui-nav-item layui-hide-xs"> <!-- 首页导航菜单项设置了data-id属性、隐藏在小屏幕下的类、当前激活的类点击可跳转到指定的首页页面 -->
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<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>
</div>
<!-- 顶部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>
</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>
</div>
<!--搜索 end-->
</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>
<li data-id="2" title="酒店2楼" class="bg2"> <!-- 房间导航菜单项隐藏在小屏幕下点击暂时无实际跳转动作JavaScript:void(0); -->
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</a> </li>
</li> <!-- 后台管理导航菜单项,隐藏在小屏幕下,点击可跳转到后台管理登录页面 -->
<li data-id="3" title="酒店3楼" class="bg3"> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
</li>
</a> <!-- 退出导航菜单项,隐藏在小屏幕下,点击可执行退出相关操作(可能是注销登录等,具体看后端实现) -->
</li> <li data-id="register" class="layui-nav-item layui-hide-xs ">
<li data-id="4" title="酒店4楼" class="bg4"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/user/logout">退出</a>
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> </li>
</c:if>
</a> <!-- 根据sessionScope中users为空时显示的导航菜单选项 -->
</li> <c:if test="${sessionScope.users==null}">
<li data-id="5" title="酒店5楼" class="bg5"> <!-- 首页导航菜单项,设置了相关属性,点击可跳转到指定的首页页面 -->
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <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>
</a> </li>
</li> <!-- 房间导航菜单项,隐藏在小屏幕下,点击可跳转到房间列表页面 -->
<li data-id="6" title="酒店6楼" class="bg6"> <li data-id="room" class="layui-nav-item layui-hide-xs">
<a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists"> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
</li>
</a> <!-- 登入导航菜单项,隐藏在小屏幕下,点击可跳转到登入页面 -->
</li> <li data-id="login" class="layui-nav-item layui-hide-xs ">
</ul> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a>
</div> </li>
<p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p> <!-- 注册导航菜单项,隐藏在小屏幕下,点击可跳转到注册页面 -->
</div> <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> </div>
</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="">
<!-- 搜索按钮设置了Layui的按钮样式类点击可提交表单需配合lay-submit和lay-filter属性使用按钮图标为搜索图标 -->
<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">
<!-- 可能用于显示一个顶部的logo此处图片链接可能有误应为static而不是statics -->
<a href="#" class="topbar-logo"> <img
src="${pageContext.request.contextPath}/statics/front/images/logo-1.png" alt="layui"> </a>
</div>
</div>
</form>
</div>
<!--搜索 end-->
<!-- 房间列表start --> </div>
<div class="shop-temp shoplist"> <!-- 搜索框end -->
<div class="temp-normal"> <!-- 筛选条件start -->
<div class="shoplist-filter">
<div class="layui-container"> <div class="layui-container">
<div class="layui-row layui-col-space20 shoplist" id="roomList"> <div class="layui-card">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> <div class="layui-card-header">
<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"> <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>
<h2 class="layui-elip">标准间</h2> </span>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> </div>
<div class="store-list-colorbar"> <div class="layui-card-body">
<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> <div class="store-cat-item">
<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><i class="layui-icon layui-icon-shop-fenlei"></i>类别:</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> <ul id="getAllRoomType">
</div> <!-- 使用JSP表达式判断typeId房型ID值是否为空为空则给当前“全部”超链接所在的li元素添加active类用于样式上的选中效果 -->
</div> <li data-id="0" <c:if test="${typeId == null}">class="active"</c:if>> <a class="fly-case-active" href="#" data-type="toRoomTypeListByLists">全部</a></li>
</a> </ul>
</div> </div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> <div class="store-cat-item colorFilt">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <span><i class="layui-icon layui-icon-shop-color"></i>楼层:</span>
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover"> <ul id="getAllFloor">
<h2 class="layui-elip">单人间</h2> <!-- 代表全部楼层的选项设置了背景色、标题等样式点击无实际跳转动作JavaScript:void(0);),有一个选中的图标 -->
<div> <label class="layui-badge-rim store-list-pay"> ¥100 </label> <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>
<div class="store-list-colorbar"> <!-- 代表酒店1楼的楼层选项设置了data-id、标题和对应类名点击无实际跳转动作 -->
<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> <li data-id="1" title="酒店1楼" class="bg1">
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">单人间</span> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<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> </a>
</div> </li>
</a> <!-- 代表酒店2楼的楼层选项设置了相关属性点击无实际跳转动作 -->
</div> <li data-id="2" title="酒店2楼" class="bg2">
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<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"> </a>
<h2 class="layui-elip">双人间</h2> </li>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> <!-- 代表酒店3楼的楼层选项设置了相关属性点击无实际跳转动作 -->
<div class="store-list-colorbar"> <li data-id="3" title="酒店3楼" class="bg3">
<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> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<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> </li>
</div> <!-- 代表酒店4楼的楼层选项设置了相关属性点击无实际跳转动作 -->
</a> <li data-id="4" title="酒店4楼" class="bg4">
</div> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<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"> </a>
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover"> </li>
<h2 class="layui-elip">标准间</h2> <!-- 代表酒店5楼的楼层选项设置了相关属性点击无实际跳转动作 -->
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> <li data-id="5" title="酒店5楼" class="bg5">
<div class="store-list-colorbar"> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
<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> </a>
<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> </li>
</div> <!-- 代表酒店6楼的楼层选项设置了相关属性点击无实际跳转动作 -->
</div> <li data-id="6" title="酒店6楼" class="bg6">
</a> <a class="fly-case-active" href="JavaScript:void(0);" data-type="toFloorListByLists">
</div>
</div> </a>
<div class="layui-row layui-col-space20 shoplist" id="roomList"> </li>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </ul>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> </div>
<img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover"> <!-- 显示筛选后房间数量的提示信息数量通过EL表达式获取roomList集合的大小来显示 -->
<h2 class="layui-elip">单人间</h2> <p class="filtEnd">筛选出<span id="filtTotal">${roomList.size()}</span>个</p>
<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/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>
<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>
</div> </div>
<div class="layui-row layui-col-space20 shoplist" id="roomList"> </div>
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </div>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <!-- 筛选条件end -->
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover">
<h2 class="layui-elip">双人间</h2> <!-- 房间列表start -->
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> <div class="shop-temp shoplist">
<div class="store-list-colorbar"> <div class="temp-normal">
<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> <div class="layui-container">
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<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">
</div> <!-- 房间信息的链接点击可跳转到房间详情页面设置了相关的data-type属性 -->
</a> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
</div> <!-- 房间图片展示通过EL表达式获取图片路径 -->
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> <img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover">
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <!-- 房间名称展示使用了文本截断类layui-elip来处理过长文本 -->
<img src="${pageContext.request.contextPath}/static/images/b4.png" class="store-list-cover"> <h2 class="layui-elip">标准间</h2>
<h2 class="layui-elip">标准间</h2> <div>
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> <!-- 房间价格标签展示 -->
<div class="store-list-colorbar"> <label class="layui-badge-rim store-list-pay"> ¥120 </label>
<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> <div class="store-list-colorbar">
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span> <!-- 用于展示一些房间相关属性的样式条第一个设置了相对位置、边框颜色等样式显示NO.1 -->
<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> <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>
</div> <!-- 第二个样式条展示房间类型 -->
</div> <span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">标准间</span>
</a> <!-- 第三个样式条展示房间所在楼层 -->
</div> <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 data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </div>
<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>
<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>
<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>
</div> </a>
</a> </div>
</div> <!-- 此处省略大量重复的房间信息展示模块代码,结构和上述类似 -->
<div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3"> </div>
<a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo"> <div class="layui-row layui-col-space20 shoplist" id="roomList">
<img src="${pageContext.request.contextPath}/static/images/s4.png" class="store-list-cover"> <!-- 以下又是一组重复的房间信息展示模块,同样省略大量重复注释,结构和前面一致 -->
<h2 class="layui-elip">双人间</h2> <div data-id="${room.id}" class="layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg3">
<div> <label class="layui-badge-rim store-list-pay"> ¥120 </label> <a class="template store-list-box fly-case-active" href="${pageContext.request.contextPath}/fronts/detail.jsp" data-type="toRoomInfo">
<div class="store-list-colorbar"> <img src="${pageContext.request.contextPath}/static/images/d4.png" class="store-list-cover">
<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> <h2 class="layui-elip">单人间</h2>
<span class="store-color-bar" style="border-color: #5fb878;color: #5fb878;border-width: 1px;border-style: solid;background-color: #fff; text-align: center;">双人间</span> <div>
<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> <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> </div>
</div> </a>
</a> </div>
<!-- 此处省略更多重复的房间信息展示模块代码 -->
</div> </div>
</div> <!-- 以下还有多组重复的房间信息展示模块代码,均省略详细重复注释 -->
<div style="margin: 50px 0 80px; text-align: center;"> </div> </div
</div>
</div>
</div>
<!-- 房间列表end -->
<!-- 中间区域结束 -->
<!-- 底部 -->
<!-- 底部 -->
<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>
<!-- 脚本开始 -->
<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: '#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>
</body>
</html>

@ -1,13 +1,14 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <html>
<head> <head>
<!-- 设置页面的标题为"Title" -->
<title>Title</title> <title>Title</title>
</head> </head>
<body> <body>
<!-- 以下是一段JavaScript代码通过修改浏览器的location.href属性来进行页面跳转 -->
<script> <!-- 这里会将当前页面重定向到根目录下的index.html页面 -->
location.href="/index.html"; <script>
</script> location.href="/index.html";
</script>
</body> </body>
</html> </html>

@ -3,184 +3,234 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的字符编码为UTF-8确保能正确显示各种字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 声明使用webkit作为渲染引擎用于优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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"> <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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个自定义的全局CSS文件可能是对global.css的补充或者修改指定字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="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"> <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"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面的标题为“酒店管理系统” -->
<title>酒店管理系统</title> <title>酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部start --> <!-- 顶部区域开始的注释标记,方便在代码结构中区分不同部分 -->
<div class="layui-header header header-store" style="background-color: #393D49;"> <!-- 顶部start -->
<div class="layui-container"> <div class="layui-header header header-store" style="background-color: #393D49;">
<a class="logo" href="index.html"> <div class="layui-container">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <!-- 页面的logo部分点击可跳转到index.html页面 -->
</a> <a class="logo" href="index.html">
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<ul class="layui-nav" id="layui-nav-userinfo"> </a>
<!-- 可能用于放置一些表单组件等通过lay-filter属性设置了一个筛选标识 -->
<c:if test="${sessionScope.users!=null}"> <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <ul class="layui-nav" id="layui-nav-userinfo">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <!-- 根据sessionScope中users是否为空来显示不同的导航菜单选项以下是users不为空时的情况 -->
</li> <c:if test="${sessionScope.users!=null}">
<li data-id="room" class="layui-nav-item layui-hide-xs"> <!-- 首页导航菜单项设置了data-id属性、隐藏在小屏幕下的类、当前激活的类点击可跳转到指定的首页页面 -->
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<li data-id="register" class="layui-nav-item layui-hide-xs "> </li>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a> <!-- 房间导航菜单项,隐藏在小屏幕下,点击可跳转到房间列表页面 -->
</li> <li data-id="room" class="layui-nav-item layui-hide-xs">
</c:if> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
<c:if test="${sessionScope.users==null}"> </li>
<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 data-id="register" class="layui-nav-item layui-hide-xs ">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
<li data-id="room" class="layui-nav-item layui-hide-xs"> </li>
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> </c:if>
</li> <!-- 根据sessionScope中users为空时显示的导航菜单选项 -->
<li data-id="login" class="layui-nav-item layui-hide-xs "> <c:if test="${sessionScope.users==null}">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a> <!-- 首页导航菜单项,设置了相关属性,点击可跳转到指定的首页页面 -->
</li> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<li data-id="register" class="layui-nav-item layui-hide-xs "> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a> </li>
</li> <!-- 房间导航菜单项隐藏在小屏幕下点击暂时无实际跳转动作JavaScript:void(0); -->
</c:if> <li data-id="room" class="layui-nav-item layui-hide-xs">
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</ul> </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>
</div> </div>
</div> <!-- 顶部区域结束的注释标记 -->
<!-- 顶部end --> <!-- 顶部end -->
<!-- 中间区域开始 --> <!-- 中间区域开始的注释标记 -->
<div class="shop-nav shop-index"> <!-- 中间区域开始 -->
<!--搜索 start--> <div class="shop-nav shop-index">
<div id="LAY-topbar" style="height: auto;"> <!--搜索 start-->
<form class="layui-form layuimini-form"> <div id="LAY-topbar" style="height: auto;">
<div class="input-search"> <form class="layui-form layuimini-form">
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords" <div class="input-search">
autocomplete="off" value=""> <div id="searchRoom">
<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> <input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮设置了Layui的按钮样式类点击可提交表单需配合lay-submit和lay-filter属性使用按钮图标为搜索图标 -->
<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">
<!-- 可能用于显示一个顶部的logo此处图片链接未使用EL表达式获取路径需确保图片路径正确 -->
<a href="#" class="topbar-logo"> <img
src="images/logo-1.png" alt="layui"> </a>
</div>
</div> </div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img </form>
src="images/logo-1.png" alt="layui"> </a></div> </div>
</div> <!--搜索 end-->
</form>
</div> </div>
<!--搜索 end--> <!-- 中间区域结束的注释标记 -->
</div> <!-- 中间区域结束 -->
<!-- 中间区域结束 -->
<!-- 登录start --> <!-- 登录区域开始的注释标记 -->
<div class="layui-container shopdata"> <!-- 登录start -->
<div class="layui-card shopdata-intro"> <div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<div class=" login-content"> <div class=" login-content">
<!--登录 start--> <!--登录 start-->
<div class="login-bg"> <div class="login-bg">
<div class="login-cont w1200"> <div class="login-cont w1200">
<div class="form-box"> <div class="form-box">
<form class="layui-form" action=""> <form class="layui-form" action="">
<legend>前台用户登录</legend> <legend>前台用户登录</legend>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline iphone"> <div class="layui-inline iphone">
<div class="layui-input-inline"> <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"> <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>
</div> </div>
</div> <div class="layui-inline iphone">
<div class="layui-inline iphone"> <div class="layui-input-inline">
<div class="layui-input-inline"> <!-- 密码输入框,设置了相关图标、验证规则(必填)、提示文本、占位文本以及关闭自动完成功能等属性,密码会以加密形式显示 -->
<i class="layui-icon layui-icon-password iphone-icon"></i> <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"> <input id="pnum" type="password" name="password" lay-verify="required" lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off" class="layui-input">
</div>
</div> </div>
</div> </div>
</div> <div class="layui-form-item login-btn">
<div class="layui-form-item login-btn"> <div class="layui-input-block">
<div class="layui-input-block"> <!-- 登录按钮设置了Layui的按钮样式类点击可提交表单需配合lay-submit和lay-filter属性使用按钮背景色为特定颜色 -->
<button class="layui-btn" lay-submit="" lay-filter="logins" style="background-color: #009688">登录</button> <button class="layui-btn" lay-submit="" lay-filter="logins" style="background-color: #009688">登录</button>
</div>
</div> </div>
</div> </form>
</form> </div>
</div> </div>
</div> </div>
</div> <!--登录 end-->
<!--登录 end-->
</div>
</div> </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>
<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 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> <!-- 脚本区域开始的注释标记用于引入相关JavaScript文件以及编写页面交互逻辑 -->
<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
layui.use(["form", "element", "carousel", "jquery"], function () {
var form = layui.form,
layer = layui.layer,
$ = layui.jquery,
carousel = layui.carousel,
$ = layui.$;
// 渲染轮播图
// 通过carousel模块的render方法来创建轮播图效果
// 指定了轮播图容器的选择器、宽度、高度以及箭头显示方式等参数
carousel.render({
elem: '#LAY-store-banner'
, width: '100%' //设置容器宽度
, height: '460' //设置容器高度
, arrow: 'always' //始终显示箭头
});
<!-- 脚本开始 --> // 监听登录表单的提交事件,当点击登录按钮且表单验证通过时触发
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script> form.on('submit(logins)', function (data) {
<script> // data对象包含了表单中所有的数据可以通过data.field获取具体的表单字段值
layui.use(["form","element","carousel","jquery"], function () { // 发送登录请求,使用$.post方法向服务器端的/user/login接口发送POST请求
var form = layui.form, // data.field作为请求的数据请求成功后的回调函数中处理返回结果
layer = layui.layer, $.post("${pageContext.request.contextPath}/user/login", data.field, function (result) {
$ = layui.jquery, console.log(data.field);
carousel = layui.carousel, // 如果登录成功根据返回结果中的success字段判断则显示提示信息并跳转到首页
$ = layui.$; if (result.success) {
layer.msg(result.msg);
location.href = "${pageContext.request.contextPath}/fronts/home.jsp";
} else {
// 如果登录失败,显示相应的错误提示信息给用户
layer.msg(result.msg);
}
}, "json");
// 返回false阻止表单的默认提交行为因为已经通过Ajax发送请求了
return false;
});
//渲染轮播图 // 以下这段代码被注释掉了,可能之前用于处理另一种登录逻辑或者备用的登录验证等情况
carousel.render({ /*form.on("submit(login)",function (data) {
elem: '#LAY-store-banner' $.post("/user/login",data.field,function(result){
,width: '100%' //设置容器宽度 if(result.success){
,height: '460' //设置容器高度 //跳转到首页
,arrow: 'always' //始终显示箭头 location.href="/index.html";
}); }else{
// 进行注册操作 layer.alert(result.message,{icon:5});
form.on('submit(logins)', function (data) { }
//可以获取到表单中所有数据 data = data.field; },"json");
//发送登录请求 return false;
$.post("${pageContext.request.contextPath}/user/login",data.field,function (result) { });*/
console.log(data.field)
if(result.success){//如果登录成功跳转到后台页面
layer.msg(result.msg);
location.href="${pageContext.request.contextPath}/fronts/home.jsp";
} else{//登录失败 提示用户
layer.msg(result.msg);
}
},"json");
return false;
});
/* form.on("submit(login)",function (data) {
$.post("/user/login",data.field,function(result){
if(result.success){
//跳转到首页
location.href="/index.html";
}else{
layer.alert(result.message,{icon:5});
}
},"json");
return false;
}); });
*/ </script>
}); <!-- 脚本区域结束的注释标记 -->
</script> <!-- 脚本结束 -->
<!-- 脚本结束 --> <ul class="layui-fixbar">
<ul class="layui-fixbar"> <li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li> </ul>
</ul> <div class="layui-layer-move"></div>
<div class="layui-layer-move"></div>
</body> </body>
</html> </html>

@ -3,221 +3,272 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store"> <html lang="en" class="fly-html-layui fly-html-store">
<head> <head>
<!-- 设置页面的字符编码为UTF-8确保能正确显示各种字符 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 声明使用webkit作为渲染引擎用于优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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"> <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"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
<!-- 引入另一个自定义的全局CSS文件可能是对global.css的补充或者修改指定字符编码为utf-8 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="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"> <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"> <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
<!-- 设置页面的标题为“酒店管理系统” -->
<title>酒店管理系统</title> <title>酒店管理系统</title>
</head>
<body> <body>
<!-- 顶部start --> <!-- 顶部区域开始的注释标记,方便在代码结构中区分不同部分 -->
<div class="layui-header header header-store" style="background-color: #393D49;"> <!-- 顶部start -->
<div class="layui-container"> <div class="layui-header header header-store" style="background-color: #393D49;">
<a class="logo" href="index.html"> <div class="layui-container">
<img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui"> <!-- 页面的logo部分点击可跳转到index.html页面 -->
</a> <a class="logo" href="index.html">
<div class="layui-form component" lay-filter="LAY-site-header-component"></div> <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
<ul class="layui-nav" id="layui-nav-userinfo"> </a>
<!-- 可能用于放置一些表单组件等通过lay-filter属性设置了一个筛选标识 -->
<c:if test="${sessionScope.users!=null}"> <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
<li data-id="index" class="layui-nav-item layui-hide-xs layui-this"> <ul class="layui-nav" id="layui-nav-userinfo">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a> <!-- 根据sessionScope中users是否为空来显示不同的导航菜单选项以下是users不为空时的情况 -->
</li> <c:if test="${sessionScope.users!=null}">
<li data-id="room" class="layui-nav-item layui-hide-xs"> <!-- 首页导航菜单项设置了data-id属性、隐藏在小屏幕下的类、当前激活的类点击可跳转到指定的首页页面 -->
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<li data-id="register" class="layui-nav-item layui-hide-xs "> </li>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a> <!-- 房间导航菜单项,隐藏在小屏幕下,点击可跳转到房间列表页面 -->
</li> <li data-id="room" class="layui-nav-item layui-hide-xs">
</c:if> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/hotelList.jsp">房间</a>
<c:if test="${sessionScope.users==null}"> </li>
<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 data-id="register" class="layui-nav-item layui-hide-xs ">
</li> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/admin/login.html">后台管理</a>
<li data-id="room" class="layui-nav-item layui-hide-xs"> </li>
<a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a> </c:if>
</li> <!-- 根据sessionScope中users为空时显示的导航菜单选项 -->
<li data-id="login" class="layui-nav-item layui-hide-xs "> <c:if test="${sessionScope.users==null}">
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/login.jsp">登入</a> <!-- 首页导航菜单项,设置了相关属性,点击可跳转到指定的首页页面 -->
</li> <li data-id="index" class="layui-nav-item layui-hide-xs layui-this">
<li data-id="register" class="layui-nav-item layui-hide-xs "> <a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/home.jsp">首页</a>
<a class="fly-case-active" data-type="toTopNav" href="${pageContext.request.contextPath}/fronts/register.jsp">注册</a> </li>
</li> <!-- 房间导航菜单项隐藏在小屏幕下点击暂时无实际跳转动作JavaScript:void(0); -->
</c:if> <li data-id="room" class="layui-nav-item layui-hide-xs">
<span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span> <a class="fly-case-active" data-type="toTopNav" href="JavaScript:void(0);">房间</a>
</ul> </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>
</div> </div>
</div> <!-- 顶部区域结束的注释标记 -->
<!-- 顶部end --> <!-- 顶部end -->
<!-- 中间区域开始 --> <!-- 中间区域开始的注释标记 -->
<div class="shop-nav shop-index"> <!-- 中间区域开始 -->
<!--搜索 start--> <div class="shop-nav shop-index">
<div id="LAY-topbar" style="height: auto;"> <!--搜索 start-->
<form class="layui-form layuimini-form"> <div id="LAY-topbar" style="height: auto;">
<div class="input-search"> <form class="layui-form layuimini-form">
<div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords" <div class="input-search">
autocomplete="off" value=""> <div id="searchRoom">
<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> <input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
autocomplete="off" value="">
<!-- 搜索按钮设置了Layui的按钮样式类点击可提交表单需配合lay-submit和lay-filter属性使用按钮图标为搜索图标 -->
<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">
<!-- 可能用于显示一个顶部的logo此处图片链接未使用EL表达式获取路径需确保图片路径正确 -->
<a href="#" class="topbar-logo"> <img
src="images/logo-1.png" alt="layui"> </a>
</div>
</div> </div>
<div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img </form>
src="images/logo-1.png" alt="layui"> </a></div> </div>
</div> <!--搜索 end-->
</form>
</div> </div>
<!--搜索 end--> <!-- 中间区域结束的注释标记 -->
</div> <!-- 中间区域结束 -->
<!-- 中间区域结束 -->
<!-- 注册start --> <!-- 注册区域开始的注释标记 -->
<div class="layui-container shopdata"> <!-- 注册start -->
<div class="layui-card shopdata-intro"> <div class="layui-container shopdata">
<div class="layui-card shopdata-intro">
<div class=" login-content"> <div class=" login-content">
<!--登录 start--> <!-- 注册表单部分开始 -->
<div class="login-bg"> <div class="login-bg">
<div class="login-cont w1200"> <div class="login-cont w1200">
<div class="form-box"> <div class="form-box">
<form class="layui-form" action=""> <form class="layui-form" action="">
<legend>用户注册</legend> <legend>用户注册</legend>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline iphone">
<div class="layui-inline iphone"> <div class="layui-input-inline">
<div class="layui-input-inline"> <!-- 昵称输入框,设置了相关图标、验证规则(必填)、提示文本、占位文本以及关闭自动完成功能等属性 -->
<i class="layui-icon layui-icon-user iphone-icon"></i> <i class="layui-icon layui-icon-user iphone-icon"></i>
<input type="text" name="username" id="mNickname" lay-verify="required" lay-reqText="请输入昵称" placeholder="请输入昵称" autocomplete="off" class="layui-input"> <input type="text" name="username" id="mNickname" lay-verify="required" lay-reqText="请输入昵称" placeholder="请输入昵称" autocomplete="off" class="layui-input">
</div>
</div> </div>
</div> <div class="layui-inline iphone">
<div class="layui-input-inline">
<div class="layui-inline iphone"> <!-- 手机号输入框设置了相关图标、验证规则必填且需符合手机号格式、提示文本、占位文本以及关闭自动完成功能等属性输入类型为tel -->
<div class="layui-input-inline"> <i class="layui-icon layui-icon-cellphone iphone-icon"></i>
<i class="layui-icon layui-icon-cellphone iphone-icon"></i> <input type="tel" name="phone" id="phone" lay-verify="required|phone" lay-reqText="请输入手机号" placeholder="请输入手机号" autocomplete="off" class="layui-input">
<input type="tel" name="phone" id="phone" lay-verify="required|phone" lay-reqText="请输入手机号" placeholder="请输入手机号" autocomplete="off" class="layui-input"> </div>
</div> </div>
</div> <div class="layui-inline iphone">
<div class="layui-input-inline">
<div class="layui-inline iphone"> <!-- 密码输入框,设置了相关图标、验证规则(必填)、提示文本、占位文本以及关闭自动完成功能等属性,密码会以加密形式显示 -->
<div class="layui-input-inline"> <i class="layui-icon layui-icon-password iphone-icon"></i>
<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">
<input id="pnum" type="password" name="password" lay-verify="required" lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off" class="layui-input"> </div>
</div> </div>
</div> </div>
</div> <div class="layui-form-item login-btn">
<div class="layui-form-item login-btn"> <div class="layui-input-block">
<div class="layui-input-block"> <!-- 提交按钮设置了Layui的按钮样式类和背景色点击可提交表单需配合lay-submit和lay-filter属性使用 -->
<button class="layui-btn" style="background-color: #009688" lay-submit="" lay-filter="register">提交</button> <button class="layui-btn" style="background-color: #009688" lay-submit="" lay-filter="register">提交</button>
</div>
</div> </div>
</div> </form>
</form> </div>
</div> </div>
</div> </div>
<!-- 注册表单部分结束 -->
</div> </div>
<!--登录 end-->
</div> </div>
</div>
</div>
<!-- 登注册end -->
<!-- 底部 --> </div>
<div class="fly-footer"> <!-- 注册区域结束的注释标记 -->
<p><a href="#">酒店系统</a> 20222 © <a href="#">xyp.cn</a></p> <!-- 登注册end -->
<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 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>
<!-- 底部区域结束的注释标记 -->
<!-- 脚本区域开始的注释标记用于引入相关JavaScript文件以及编写页面交互逻辑 -->
<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
layui.use(["form", "element", "carousel", "jquery"], function () {
var form = layui.form,
layer = layui.layer,
element = layui.element,
carousel = layui.carousel,
$ = layui.jquery,
$ = layui.$;
<!-- 脚本开始 --> // 渲染轮播图
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script> // 通过carousel模块的render方法来创建轮播图效果
<script> // 指定了轮播图容器的选择器、宽度、高度以及箭头显示方式等参数
layui.use(["form","element","carousel","jquery"], function () { carousel.render({
var form = layui.form, elem: '#LAY-store-banner'
layer = layui.layer, , width: '100%' //设置容器宽度
element = layui.element, , height: '460' //设置容器高度
carousel = layui.carousel, , arrow: 'always' //始终显示箭头
$=layui.jquery, });
$ = layui.$;
//渲染轮播图 // 定义一个变量flag用于标识某个条件是否满足此处本意可能是用于标记用户名是否已存在初始设为false表示不存在
carousel.render({ var flag = false;
elem: '#LAY-store-banner'
,width: '100%' //设置容器宽度
,height: '460' //设置容器高度
,arrow: 'always' //始终显示箭头
});
var flag = false;//定义变量,标识是否存在 // 以下这段代码被注释掉了,原本的功能应该是当用户名输入框失去焦点时触发验证逻辑
// 验证用户名在服务器端是否已存在根据返回结果设置flag的值
/* //当用户名输入框失去焦点事件触发验证
$("#mNickname").blur(function () {
//获取用户名
var loginName = $("#mNickname").val().trim();
//判断用户名是否为空,不为空则发送请求验证
if (loginName.length > 0) {
$.get("/user/checkName", { "loginName": loginName }, function (result) {
if (result.exist) {
layer.alert(result.message, { icon: 5 });
//修改状态为true表示已存在
flag = true;
} else {
flag = false; //不存在
}
}, "json");
}
});*/
/* //当用户名输入框失去焦点事件触发验证 // 监听注册表单的提交事件,当点击提交按钮且表单验证通过时触发
$("#mNickname").blur(function () { form.on('submit(register)', function (data) {
//获取用户名 // data对象包含了表单中所有的数据可以通过data.field获取具体的表单字段值
var loginName = $("#mNickname").val().trim(); // 发送注册相关请求,使用$.post方法向服务器端的/user/existPhone接口发送POST请求
//判断用户名是否为空,不为空则发送请求验证 // data.field作为请求的数据请求成功后的回调函数中处理返回结果
if(loginName.length>0){ $.post("${pageContext.request.contextPath}/user/existPhone", data.field, function (result) {
$.get("/user/checkName",{"loginName":loginName},function(result){ if (result.success) {
if(result.exist){ // 如果请求成功根据返回结果中的success字段判断则显示提示信息并跳转到登录页面
layer.alert(result.message,{icon:5}); layer.msg(result.msg);
//修改状态为true表示已存在 location.href = "${pageContext.request.contextPath}/fronts/login.jsp";
flag = true; } else {
}else{ // 如果请求失败,显示相应的错误提示信息给用户
flag = false;//不存在 layer.msg(result.msg);
} }
},"json"); }, "json");
} // 返回false阻止表单的默认提交行为因为已经通过Ajax发送请求了
});*/ return false;
// 进行注册操作 });
form.on('submit(register)', function (data) {
//可以获取到表单中所有数据 data = data.field; // 以下这段代码也被注释掉了,原本应该是完整的注册表单提交处理逻辑
//发送登录请求 // 先判断用户名是否已存在通过flag变量若不存在则发送真正的注册请求到服务器端根据返回结果提示用户相应信息
$.post("${pageContext.request.contextPath}/user/existPhone",data.field,function (result) { /* //表单提交事件
if(result.success){//如果登录成功跳转到后台页面 form.on("submit(register)", function (data) {
layer.msg(result.msg); //判断是否存在
location.href="${pageContext.request.contextPath}/fronts/login.jsp"; if (flag) {
} else{//登录失败 提示用户 layer.alert("用户名已被使用,请重新输入!", { icon: 5 })
layer.msg(result.msg); } else {
//发送请求
$.post("/user/register", data.field, function (result) {
if (result.success) {
layer.alert(result.message, { icon: 6 });
} else {
layer.alert(result.message, { icon: 5 });
}
}, "json");
} }
},"json");
return false;
});
/* //表单提交事件
form.on("submit(register)",function (data) {
//判断是否存在
if(flag){
layer.alert("用户名已被使用,请重新输入!",{icon:5})
}else{
//发送请求
$.post("/user/register",data.field,function(result){
if(result.success){
layer.alert(result.message,{icon:6});
}else{
layer.alert(result.message,{icon:5});
}
},"json");
}
return false; return false;
});*/ });*/
}); });
</script> </script>
<!-- 脚本结束 --> <!-- 脚本区域结束的注释标记 -->
<ul class="layui-fixbar"> <!-- 脚本结束 -->
<li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li> <ul class="layui-fixbar">
</ul> <li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
<div class="layui-layer-move"></div> </ul>
<div class="layui-layer-move"></div>
</body> </body>
</html> </html>

@ -1,4 +1,5 @@
<%-- <%--
该部分是JSP页面的注释说明了页面创建的相关信息比如是由IntelliJ IDEA创建创建者、创建日期和时间以及页面功能相关的描述部门管理
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: ASUS User: ASUS
Date: 2022/4/16 Date: 2022/4/16
@ -9,60 +10,80 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面字符编码为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面标题为"layui" -->
<title>layui</title> <title>layui</title>
<!-- 声明使用webkit作为渲染引擎用于优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS文件用于定义页面的通用样式适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个主要的容器类用于布局页面可能是基于Layui相关的布局规范 -->
<div class="layuimini-main"> <div class="layuimini-container">
<%--搜索--%> <div class="layuimini-main">
<fieldset class="table-search-fieldset"> <!-- 搜索区域开始 -->
<legend>搜索信息</legend> <%--搜索--%>
<div style="margin: 10px 10px 10px 10px"> <fieldset class="table-search-fieldset">
<form class="layui-form layui-form-pane" action=""> <legend>搜索信息</legend>
<div class="layui-form-item"> <div style="margin: 10px 10px 10px 10px">
<div class="layui-inline"> <form class="layui-form layui-form-pane" action="">
<label class="layui-form-label">部门名称</label> <div class="layui-form-item">
<div class="layui-input-inline"> <div class="layui-inline">
<input type="text" name="username" autocomplete="off" class="layui-input"> <label class="layui-form-label">部门名称</label>
<div class="layui-input-inline">
<!-- 部门名称输入框设置了关闭自动完成功能以及相关的Layui样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</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>
</div> </div>
<div class="layui-inline"> </form>
<button type="button" class="layui-btn" lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button> </div>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button> </fieldset>
</div> <!-- 搜索区域结束 -->
</div>
</form> <!-- 添加按钮模板区域开始 -->
</div> <%--添加按钮--%>
</fieldset> <script type="text/html" id="toolbarDemo">
<%--添加按钮--%> <div class="layui-btn-container">
<script type="text/html" id="toolbarDemo"> <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 class="layui-btn-container"> </div>
<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> </script>
</div> <!-- 添加按钮模板区域结束 -->
</script>
<%--表格内容显示区域--%> <!-- 表格内容显示区域初始设置为隐藏后续通过Layui的表格渲染功能来显示数据 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"> <%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
<%--操作按钮--%> </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> <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>
<!-- 操作按钮模板区域结束 -->
<!-- 添加和修改窗口区域开始,初始设置为隐藏 -->
<%-- 添加和修改窗口 --%> <%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow"> <div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">部门名称</label> <label class="layui-form-label">部门名称</label>
<div class="layui-input-block"> <div class="layui-input-block">
<%-- 隐藏域 --%> <%-- 隐藏域,可能用于存储部门编号等信息,在添加或修改操作中传递给后端 --%>
<input type="hidden" name="id"> <input type="hidden" name="id">
<input type="text" name="deptName" lay-verify="required" autocomplete="off" <input type="text" name="deptName" lay-verify="required" autocomplete="off"
placeholder="请输入部门名称" class="layui-input"> placeholder="请输入部门名称" class="layui-input">
@ -93,159 +114,172 @@
</div> </div>
</form> </form>
</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', 'table','jquery'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
var tableList =table.render({
elem: '#currentTableId',
url: '${pageContext.request.contextPath}/dept/deptList',
toolbar: '#toolbarDemo',
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]],
page: true,
done: function (res, curr, count) {
//判断当前页码是否是大于1并且当前页的数据量为0
if (curr > 1 && res.data.length == 0) {
var pageValue = curr - 1;
//刷新数据表格的数据
tableIns.reload({
page: {curr: pageValue}
});
}
}
}); <!-- 引入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(['form', 'table', 'jquery'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
// 监听搜索操作 // 使用Layui的表格渲染功能创建一个表格实例
form.on('submit(data-search-btn)', function (data) { var tableList = table.render({
tableList.reload({ // 指定表格容器的选择器
where:data.field, elem: '#currentTableId',
page: { // 设置表格数据的请求地址通过EL表达式动态获取路径用于获取部门列表数据
curr: 1 url: '${pageContext.request.contextPath}/dept/deptList',
// 指定头部工具栏的模板选择器,用于添加按钮等操作
toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,如筛选、导出、打印等功能,以及一个自定义的提示按钮
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]],
// 开启分页功能
page: true,
// 表格数据加载完成后的回调函数用于处理一些特殊逻辑比如当当前页码大于1且当前页无数据时回退到上一页重新加载数据
done: function (res, curr, count) {
//判断当前页码是否是大于1并且当前页的数据量为0
if (curr > 1 && res.data.length == 0) {
var pageValue = curr - 1;
//刷新数据表格的数据
tableIns.reload({
page: {curr: pageValue}
});
}
} }
}); });
return false;
}); // 监听搜索按钮的点击事件通过表单提交的方式触发根据输入的搜索条件重新加载表格数据重置页码为1
//监听头部工具栏事件 form.on('submit(data-search-btn)', function (data) {
//toolbar是头部工具栏事件 tableList.reload({
//currentTableFilter是表格lay-filter过滤器的值 where: data.field,
table.on("toolbar(currentTableFilter)",function (obj) { page: {
switch (obj.event) { curr: 1
case "add"://添加按钮 }
openAddWindow();//打开添加窗口 });
break; return false;
} });
});
var url;//提交地址 // 监听头部工具栏的事件,根据不同的事件类型执行相应操作,目前只处理了"add"(添加)事件
var mainIndex;//打开窗口的索引 table.on("toolbar(currentTableFilter)", function (obj) {
switch (obj.event) {
/** case "add"://添加按钮
* 打开添加窗口 openAddWindow();//打开添加窗口
*/ break;
function openAddWindow() {
mainIndex = layer.open({
type: 1,//打开类型
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/dept/addDept";
} }
}); });
}
//监听行工具栏事件 var url; // 用于存储提交数据的地址(添加或修改操作的后端接口地址)
table.on("tool(currentTableFilter)",function (obj) { var mainIndex; // 用于记录打开窗口的索引,方便后续操作窗口(如关闭窗口)
switch (obj.event) {
case "edit"://编辑按钮 /**
openUpdateWindow(obj.data);//打开修改窗口 * 打开添加窗口的函数使用Layui的layer模块来弹出一个窗口用于添加部门信息
break; */
case "delete"://删除按钮 function openAddWindow() {
deleteById(obj.data); mainIndex = layer.open({
break; type: 1,//打开类型,这里表示以页面层的形式打开
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口的宽高尺寸
content: $("#addOrUpdateWindow"),//引用之前定义的添加和修改窗口的DOM元素作为窗口内容
success: function () {
// 清空表单数据通过原生JavaScript获取表单元素并调用reset方法
$("#dataFrm")[0].reset();
// 设置添加操作的提交请求地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/dept/addDept";
}
});
} }
});
/** // 监听表格行工具栏的事件,根据不同的事件类型(编辑、删除)执行相应操作
* 打开修改窗口 table.on("tool(currentTableFilter)", function (obj) {
* @param data 当前行的数据 switch (obj.event) {
*/ case "edit"://编辑按钮
function openUpdateWindow(data) { openUpdateWindow(obj.data);//打开修改窗口,并传入当前行的数据用于表单回显
mainIndex = layer.open({ break;
type: 1,//打开类型 case "delete"://删除按钮
title: "修改部门",//窗口标题 deleteById(obj.data);
area: ["800px", "400px"],//窗口宽高 break;
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/dept/updateDept";
} }
}); });
}
/** /**
* 删除部门 * 打开修改窗口的函数同样使用Layui的layer模块弹出窗口用于修改部门信息并进行表单数据回显
* @param data 当前行数据 * @param data 当前行的数据,包含部门相关信息,用于填充到表单中进行显示和修改
*/ */
function deleteById(data) { function openUpdateWindow(data) {
//判断当前部门下是否存在员工 mainIndex = layer.open({
$.get("${pageContext.request.contextPath}/dept/checkDeptHasEmployee",{"id":data.id},function(result){ type: 1,//打开类型
if(result.exist){ title: "修改部门",//窗口标题
//提示用户无法删除 area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
// 使用Layui的form模块进行表单数据回显将当前行的数据填充到对应的表单字段中
form.val("dataFrm", data);//参数1lay-filter值 参数2回显的数据
// 设置修改操作的提交请求地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/dept/updateDept";
}
});
}
/**
* 根据部门编号删除部门的函数,在删除前会先判断该部门下是否存在员工,根据判断结果执行相应操作
* @param data 当前行数据,包含部门的相关信息,如部门编号等,用于传递给后端进行删除操作以及判断是否有员工关联
*/
function deleteById(data) {
// 判断当前部门下是否存在员工通过发送GET请求到后端接口传递部门编号作为参数
$.get("${pageContext.request.contextPath}/dept/checkDeptHasEmployee", {"id": data.id}, function (result) {
if (result.exist) {
// 如果部门下存在员工,提示用户无法删除该部门
layer.msg(result.msg);
} else {
// 如果部门下不存在员工,提示用户是否确认删除该部门
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端接口进行部门删除操作传递部门编号作为参数
$.post("${pageContext.request.contextPath}/dept/deleteById", {"id": data.id}, function (result) {
if (result.success) {
// 如果删除成功,刷新数据表格,重新加载最新的部门数据
tableList.reload();
}
// 显示相应的提示信息给用户,提示删除操作的结果
layer.msg(result.msg);
}, "json");
layer.close(index);
});
}
}, "json");
}
// 监听表单提交事件(提交添加或修改的部门信息),根据后端返回结果进行相应操作,如刷新表格、关闭窗口、显示提示信息等
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果提交成功,刷新数据表格,显示最新数据
tableList.reload();
// 关闭弹出的添加或修改窗口
layer.close(mainIndex);
}
// 显示后端返回的提示信息给用户
layer.msg(result.msg); layer.msg(result.msg);
}else{ }, "json");
//提示用户是否删除该部门 // 返回false阻止表单默认提交行为因为使用了Ajax异步提交数据
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ return false;
//发送ajax请求进行删除 });
$.post("${pageContext.request.contextPath}/dept/deleteById",{"id":data.id},function(result){
if(result.success){
//刷新数据表格
tableList.reload();
}
//提示
layer.msg(result.msg);
},"json");
layer.close(index);
});
}
},"json");
}
//监听表单提交事件
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>
</script>
</body> </body>
</html> </html>

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%--
这部分是JSP页面的注释说明了页面创建相关信息包括创建工具IntelliJ IDEA、创建者、创建时间以及页面功能概述部门管理
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: ASUS User: ASUS
Date: 2022/4/16 Date: 2022/4/16
@ -10,60 +11,80 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面字符编码为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面标题为"layui" -->
<title>layui</title> <title>layui</title>
<!-- 声明使用webkit作为渲染引擎用于优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面以保证兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS文件用于定义页面的通用样式适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个主要的容器类用于布局页面可能遵循Layui相关的布局规范 -->
<div class="layuimini-main"> <div class="layuimini-container">
<%--搜索--%> <div class="layuimini-main">
<fieldset class="table-search-fieldset"> <!-- 搜索区域开始 -->
<legend>搜索信息</legend> <%--搜索--%>
<div style="margin: 10px 10px 10px 10px"> <fieldset class="table-search-fieldset">
<form class="layui-form layui-form-pane" action=""> <legend>搜索信息</legend>
<div class="layui-form-item"> <div style="margin: 10px 10px 10px 10px">
<div class="layui-inline"> <form class="layui-form layui-form-pane" action="">
<label class="layui-form-label">员工姓名</label> <div class="layui-form-item">
<div class="layui-input-inline"> <div class="layui-inline">
<input type="text" name="username" autocomplete="off" class="layui-input"> <label class="layui-form-label">员工姓名</label>
<div class="layui-input-inline">
<!-- 员工姓名输入框设置了关闭自动完成功能以及相关的Layui样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</div> </div>
</div> </div>
<div class="layui-inline"> </form>
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button> </div>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button> </fieldset>
</div> <!-- 搜索区域结束 -->
</div>
</form> <!-- 添加按钮模板区域开始 -->
</div> <%--添加按钮--%>
</fieldset> <script type="text/html" id="toolbarDemo">
<%--添加按钮--%> <div class="layui-btn-container">
<script type="text/html" id="toolbarDemo"> <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 class="layui-btn-container"> </div>
<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> </script>
</div> <!-- 添加按钮模板区域结束 -->
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table> <!-- 表格内容显示区域初始设置为隐藏后续通过Layui的表格渲染功能来显示员工数据 -->
<%--操作按钮--%> <%--表格内容显示区域--%>
<script type="text/html" id="currentTableBar"> <table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
<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> </table>
</script>
<!-- 操作按钮模板区域开始 -->
<%--操作按钮--%>
<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>
<!-- 操作按钮模板区域结束 -->
<!-- 添加和修改窗口区域开始,初始设置为隐藏 -->
<%-- 添加和修改窗口 --%> <%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow"> <div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">员工编号</label> <label class="layui-form-label">员工编号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 员工编号输入框,设置了验证规则(必填)、关闭自动完成功能以及占位文本等属性 -->
<input type="text" name="id" lay-verify="required" autocomplete="off" <input type="text" name="id" lay-verify="required" autocomplete="off"
placeholder="请输入员工编号" class="layui-input"> placeholder="请输入员工编号" class="layui-input">
</div> </div>
@ -71,13 +92,14 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">员工姓名</label> <label class="layui-form-label">员工姓名</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 员工姓名输入框,设置了验证规则(必填)、关闭自动完成功能以及占位文本等属性 -->
<input type="text" name="empname" lay-verify="required" autocomplete="off" <input type="text" name="empname" lay-verify="required" autocomplete="off"
placeholder="请输入姓名" class="layui-input"> placeholder="请输入姓名" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 性别单选框,设置了验证规则(必填)、关闭自动完成功能,提供了“男”“女”两个选项 -->
<input type="radio" name="sex" lay-verify="required" autocomplete="off" value="男" class="layui-input">男 <input type="radio" name="sex" lay-verify="required" autocomplete="off" value="男" class="layui-input">男
<input type="radio" name="sex" lay-verify="required" autocomplete="off" value="女" class="layui-input">女 <input type="radio" name="sex" lay-verify="required" autocomplete="off" value="女" class="layui-input">女
</div> </div>
@ -87,7 +109,8 @@
<div class="layui-input-block"> <div class="layui-input-block">
<select name="deptname"> <select name="deptname">
<option value="volvo" >请选择部门</option> <option value="volvo" >请选择部门</option>
<%--从监听器中获取到部门名称的数据--%> <%-- 通过JSTL的forEach标签循环遍历applicationScope中名为types的数据集合可能是部门信息集合
为下拉框生成选项,选项的值和显示文本都设置为部门名称 -->
<c:forEach items="${applicationScope.types}" var="tp"> <c:forEach items="${applicationScope.types}" var="tp">
<option value="${tp.deptName}" name="deptname">${tp.deptName}</option> <option value="${tp.deptName}" name="deptname">${tp.deptName}</option>
</c:forEach> </c:forEach>
@ -97,6 +120,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">家庭地址</label> <label class="layui-form-label">家庭地址</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 家庭地址输入框,设置了验证规则(必填)、关闭自动完成功能以及占位文本等属性 -->
<input type="text" name="address" lay-verify="required" autocomplete="off" placeholder="请输入家庭地址" <input type="text" name="address" lay-verify="required" autocomplete="off" placeholder="请输入家庭地址"
class="layui-input"> class="layui-input">
</div> </div>
@ -104,6 +128,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">入职年份</label> <label class="layui-form-label">入职年份</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 入职年份输入框,设置了验证规则(必填)、关闭自动完成功能以及占位文本等属性 -->
<input type="text" name="hireDate" lay-verify="required" autocomplete="off" placeholder="请输入 入职年份" <input type="text" name="hireDate" lay-verify="required" autocomplete="off" placeholder="请输入 入职年份"
class="layui-input"> class="layui-input">
</div> </div>
@ -126,139 +151,150 @@
</div> </div>
</form> </form>
</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', 'table','jquery'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
var tableList =table.render({ <!-- 引入Layui框架的JavaScript文件指定字符编码为utf-8 -->
elem: '#currentTableId', <script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
url: '${pageContext.request.contextPath}/employee/employeeList', <script>
toolbar: '#toolbarDemo', layui.use(['form', 'table', 'jquery'], function () {
defaultToolbar: ['filter', 'exports', 'print', { var $ = layui.jquery,
title: '提示', form = layui.form,
layEvent: 'LAYTABLE_TIPS', table = layui.table;
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作 // 使用Layui的表格渲染功能创建一个表格实例用于展示员工信息列表
form.on('submit(data-search-btn)', function (data) { var tableList = table.render({
tableList.reload({ // 指定表格容器的选择器
data:data.field, elem: '#currentTableId',
// 设置表格数据的请求地址通过EL表达式动态获取路径用于获取员工列表数据
url: '${pageContext.request.contextPath}/employee/employeeList',
// 指定头部工具栏的模板选择器,用于添加按钮等操作
toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,如筛选、导出、打印等功能,以及一个自定义的提示按钮
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索按钮的点击事件(通过表单提交的方式触发),根据输入的搜索条件重新加载表格数据
form.on('submit(data-search-btn)', function (data) {
tableList.reload({
data: data.field,
});
return false;
}); });
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
/** // 监听头部工具栏的事件,根据不同的事件类型执行相应操作,目前只处理了"add"(添加)事件
* 打开添加窗口 table.on("toolbar(currentTableFilter)", function (obj) {
*/ switch (obj.event) {
function openAddWindow() { case "add"://添加按钮
mainIndex = layer.open({ openAddWindow();//打开添加窗口
type: 1,//打开类型 break;
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/employee/addEmployee";
} }
}); });
}
//监听行工具栏事件 var url; // 用于存储提交数据的地址(添加或修改操作的后端接口地址)
table.on("tool(currentTableFilter)",function (obj) { var mainIndex; // 用于记录打开窗口的索引,方便后续操作窗口(如关闭窗口)
switch (obj.event) {
case "edit"://编辑按钮 /**
openUpdateWindow(obj.data);//打开修改窗口 * 打开添加窗口的函数使用Layui的layer模块来弹出一个窗口用于添加员工信息
break; */
case "delete"://删除按钮 function openAddWindow() {
deleteById(obj.data); mainIndex = layer.open({
break; type: 1,//打开类型,这里表示以页面层的形式打开
title: "添加部门",//窗口标题,此处可能命名不太准确,应该是“添加员工”更合适
area: ["800px", "400px"],//窗口的宽高尺寸
content: $("#addOrUpdateWindow"),//引用之前定义的添加和修改窗口的DOM元素作为窗口内容
success: function () {
// 清空表单数据通过原生JavaScript获取表单元素并调用reset方法
$("#dataFrm")[0].reset();
// 设置添加操作的提交请求地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/employee/addEmployee";
}
});
} }
});
/** // 监听表格行工具栏的事件,根据不同的事件类型(编辑、删除)执行相应操作
* 打开修改窗口 table.on("tool(currentTableFilter)", function (obj) {
* @param data 当前行的数据 switch (obj.event) {
*/ case "edit"://编辑按钮
function openUpdateWindow(data) { openUpdateWindow(obj.data);//打开修改窗口,并传入当前行的数据用于表单回显
mainIndex = layer.open({ break;
type: 1,//打开类型 case "delete"://删除按钮
title: "修改部门",//窗口标题 deleteById(obj.data);
area: ["800px", "400px"],//窗口宽高 break;
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/employee/updateEmployee";
} }
}); });
}
/** /**
* 删除部门 * 打开修改窗口的函数同样使用Layui的layer模块弹出窗口用于修改员工信息并进行表单数据回显
* @param data 当前行数据 * @param data 当前行的数据,包含员工相关信息,用于填充到表单中进行显示和修改
*/ */
function deleteById(data) { function openUpdateWindow(data) {
//提示管理员是否删除该部员工 mainIndex = layer.open({
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ type: 1,//打开类型
//发送ajax请求进行删除 title: "修改部门",//窗口标题,此处同样可能命名不准确,应为“修改员工”
$.post("${pageContext.request.contextPath}/employee/deleteEmployee",{"id":data.id},function(result){ area: ["800px", "400px"],//窗口宽高
if(result.success){ content: $("#addOrUpdateWindow"),//引用的内容窗口
//刷新数据表格 success: function () {
// 使用Layui的form模块进行表单数据回显将当前行的数据填充到对应的表单字段中
form.val("dataFrm", data);//参数1lay-filter值 参数2回显的数据
// 设置修改操作的提交请求地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/employee/updateEmployee";
}
});
}
/**
* 根据员工编号删除员工的函数提示管理员确认是否删除然后发送Ajax请求到后端进行删除操作根据结果刷新表格并提示信息
* @param data 当前行数据,包含员工的相关信息,如员工编号等,用于传递给后端进行删除操作
*/
function deleteById(data) {
// 提示管理员是否删除该员工
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端接口进行员工删除操作传递员工编号作为参数
$.post("${pageContext.request.contextPath}/employee/deleteEmployee", {"id": data.id}, function (result) {
if (result.success) {
// 如果删除成功,刷新数据表格,重新加载最新的员工数据
tableList.reload();
}
// 显示相应的提示信息给用户,提示删除操作的结果
layer.msg(result.msg);
}, "json");
layer.close(index);
});
}
// 监听表单提交事件(提交添加或修改的员工信息),根据后端返回结果进行相应操作,如刷新表格、关闭窗口、显示提示信息等
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果提交成功,刷新数据表格,显示最新数据
tableList.reload(); tableList.reload();
// 关闭弹出的添加或修改窗口
layer.close(mainIndex);
} }
//提示 // 显示后端返回的提示信息给用户
layer.msg(result.msg); layer.msg(result.msg);
},"json"); }, "json");
layer.close(index); // 返回false阻止表单默认提交行为因为使用了Ajax异步提交数据
return false;
}); });
}
//监听表单提交事件
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>
</script>
</body> </body>
</html> </html>

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%--
此处为JSP页面的注释内容说明了该页面是由IntelliJ IDEA创建创建者、创建时间以及页面大致的功能虽注释写的是部门管理但从代码来看实际更像是楼层管理相关功能
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: ASUS User: ASUS
Date: 2022/4/16 Date: 2022/4/16
@ -10,60 +11,80 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面的字符编码格式为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面的标题为"layui" -->
<title>layui</title> <title>layui</title>
<!-- 声明使用webkit作为页面渲染引擎有助于在不同浏览器中优化显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式来渲染页面确保页面兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS样式文件同样适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个基于Layui布局规范使用的容器类用于包裹页面主要内容方便整体布局管理 -->
<div class="layuimini-main"> <div class="layuimini-container">
<%--搜索--%> <div class="layuimini-main">
<fieldset class="table-search-fieldset"> <!-- 搜索区域开始,用于输入搜索条件查找楼层信息 -->
<legend>搜索信息</legend> <%--搜索--%>
<div style="margin: 10px 10px 10px 10px"> <fieldset class="table-search-fieldset">
<form class="layui-form layui-form-pane" action=""> <legend>搜索信息</legend>
<div class="layui-form-item"> <div style="margin: 10px 10px 10px 10px">
<div class="layui-inline"> <form class="layui-form layui-form-pane" action="">
<label class="layui-form-label">楼层名称</label> <div class="layui-form-item">
<div class="layui-input-inline"> <div class="layui-inline">
<input type="text" name="username" autocomplete="off" class="layui-input"> <label class="layui-form-label">楼层名称</label>
<div class="layui-input-inline">
<!-- 楼层名称输入框设置了关闭自动完成功能并应用了Layui的输入框样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</div> </div>
</div> </div>
<div class="layui-inline"> </form>
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button> </div>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button> </fieldset>
</div> <!-- 搜索区域结束 -->
</div>
</form> <!-- 添加按钮模板区域开始定义了一个添加按钮的模板后续会通过Layui的模板渲染机制使用 -->
</div> <%--添加按钮--%>
</fieldset> <script type="text/html" id="toolbarDemo">
<%--添加按钮--%> <div class="layui-btn-container">
<script type="text/html" id="toolbarDemo"> <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 class="layui-btn-container"> </div>
<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> </script>
</div> <!-- 添加按钮模板区域结束 -->
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table> <!-- 表格内容显示区域初始时隐藏后续通过Layui的表格渲染功能来展示楼层相关数据 -->
<%--操作按钮--%> <%--表格内容显示区域--%>
<script type="text/html" id="currentTableBar"> <table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
<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> </table>
</script>
<!-- 操作按钮模板区域开始,定义了编辑和删除按钮的模板,用于在表格每行显示对应的操作按钮 -->
<%--操作按钮--%>
<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>
<!-- 操作按钮模板区域结束 -->
<!-- 添加和修改窗口区域开始,初始设置为隐藏,用于弹出窗口添加或修改楼层信息 -->
<%-- 添加和修改窗口 --%> <%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow"> <div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">楼层编号</label> <label class="layui-form-label">楼层编号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 楼层编号输入框,设置了必填验证规则、关闭自动完成功能以及相应的占位文本提示 -->
<input type="text" name="id" lay-verify="required" autocomplete="off" <input type="text" name="id" lay-verify="required" autocomplete="off"
placeholder="请输入楼层编号" class="layui-input"> placeholder="请输入楼层编号" class="layui-input">
</div> </div>
@ -71,7 +92,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">楼层名称</label> <label class="layui-form-label">楼层名称</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 楼层名称输入框,同样设置了必填验证规则、关闭自动完成功能和占位文本提示 -->
<input type="text" name="name" lay-verify="required" autocomplete="off" <input type="text" name="name" lay-verify="required" autocomplete="off"
placeholder="请输入楼层名称" class="layui-input"> placeholder="请输入楼层名称" class="layui-input">
</div> </div>
@ -85,144 +106,155 @@
<div class="layui-form-item layui-row layui-col-xs12"> <div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block" style="text-align: center;"> <div class="layui-input-block" style="text-align: center;">
<button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span <button type="button" class="layui-btn" lay-submit lay-filter="doSubmit"><span
class="layui-icon layui-icon-add-1"></span>提交 class="layui-icon layui-icon-add-1"></i>提交
</button> </button>
<button type="reset" class="layui-btn layui-btn-warm"><span <button type="reset" class="layui-btn layui-btn-warm"><span
class="layui-icon layui-icon-refresh-1"></span>重置 class="layui-icon layui-icon-refresh-1"></i>重置
</button> </button>
</div> </div>
</div> </div>
</form> </form>
</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', 'table','jquery'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
var tableList =table.render({ <!-- 引入Layui框架的JavaScript文件指定字符编码为utf-8 -->
elem: '#currentTableId', <script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
url: '${pageContext.request.contextPath}/floor/floorList', <script>
toolbar: '#toolbarDemo', layui.use(['form', 'table', 'jquery'], function () {
defaultToolbar: ['filter', 'exports', 'print', { var $ = layui.jquery,
title: '提示', form = layui.form,
layEvent: 'LAYTABLE_TIPS', table = layui.table;
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索操作 // 使用Layui的表格渲染功能创建一个表格实例用于展示楼层信息列表
form.on('submit(data-search-btn)', function (data) { var tableList = table.render({
tableList.reload({ // 指定表格对应的DOM元素的选择器
data:data.field, elem: '#currentTableId',
// 设置获取表格数据的后端接口地址通过EL表达式动态获取路径用于获取楼层数据列表
url: '${pageContext.request.contextPath}/floor/floorList',
// 指定头部工具栏所使用的模板选择器,这里关联了之前定义的添加按钮模板
toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,包含筛选、导出、打印等功能按钮,还有一个自定义的提示按钮
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"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]]
});
// 监听搜索按钮的点击事件(通过表单提交触发),根据输入的搜索条件重新加载表格数据
form.on('submit(data-search-btn)', function (data) {
tableList.reload({
data: data.field,
});
return false;
}); });
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
/** // 监听头部工具栏的事件,根据不同的事件类型执行相应操作,目前只处理了"add"(添加)事件,点击添加按钮会打开添加窗口
* 打开添加窗口 table.on("toolbar(currentTableFilter)", function (obj) {
*/ switch (obj.event) {
function openAddWindow() { case "add"://添加按钮
mainIndex = layer.open({ openAddWindow();//打开添加窗口的函数调用
type: 1,//打开类型 break;
title: "添加部门",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/floor/addFloor";
} }
}); });
}
//监听行工具栏事件 var url; // 用于存储提交数据的后端接口地址(添加或修改操作对应的接口)
table.on("tool(currentTableFilter)",function (obj) { var mainIndex; // 用于记录弹出窗口的索引,方便后续对窗口进行操作(如关闭窗口)
switch (obj.event) {
case "edit"://编辑按钮 /**
openUpdateWindow(obj.data);//打开修改窗口 * 打开添加窗口的函数利用Layui的layer模块弹出一个页面层形式的窗口用于添加楼层信息
break; */
case "delete"://删除按钮 function openAddWindow() {
deleteById(obj.data); mainIndex = layer.open({
break; type: 1,//打开类型为页面层
title: "添加部门",//窗口标题,此处命名可能不太准确,按功能应该是“添加楼层”更合适
area: ["800px", "400px"],//窗口的宽度和高度尺寸设置
content: $("#addOrUpdateWindow"),//引用之前定义的添加和修改窗口的DOM内容作为窗口主体内容
success: function () {
// 清空表单数据通过原生JavaScript获取表单元素并调用reset方法实现
$("#dataFrm")[0].reset();
// 设置添加操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/floor/addFloor";
}
});
} }
});
/** // 监听表格行工具栏的事件,根据不同的事件类型(编辑、删除)执行相应操作
* 打开修改窗口 table.on("tool(currentTableFilter)", function (obj) {
* @param data 当前行的数据 switch (obj.event) {
*/ case "edit"://编辑按钮
function openUpdateWindow(data) { openUpdateWindow(obj.data);//打开修改窗口,并传入当前行的数据用于表单回显
mainIndex = layer.open({ break;
type: 1,//打开类型 case "delete"://删除按钮
title: "修改部门",//窗口标题 deleteById(obj.data);
area: ["800px", "400px"],//窗口宽高 break;
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/floor/updateFloor";
} }
}); });
}
/** /**
* 删除部门 * 打开修改窗口的函数同样使用Layui的layer模块弹出窗口用于修改楼层信息并将当前行的数据回显到表单中
* @param data 当前行数据 * @param data 当前行的数据对象,包含楼层相关信息,用于填充表单进行修改操作
*/ */
function deleteById(data) { function openUpdateWindow(data) {
//提示管理员是否删除该部员工 mainIndex = layer.open({
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ type: 1,//打开类型为页面层
//发送ajax请求进行删除 title: "修改部门",//窗口标题,此处也应是“修改楼层”更准确
$.post("${pageContext.request.contextPath}/floor/deteleFloor",{"id":data.id},function(result){ area: ["800px", "400px"],//窗口宽高设置
if(result.success){ content: $("#addOrUpdateWindow"),//引用的内容窗口
//刷新数据表格 success: function () {
// 使用Layui的form模块进行表单数据回显将传入的数据填充到对应表单字段中
form.val("dataFrm", data);//参数1lay-filter值 参数2回显的数据对象
// 设置修改操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/floor/updateFloor";
}
});
}
/**
* 根据楼层编号删除楼层的函数先提示管理员确认是否删除然后发送Ajax请求到后端执行删除操作根据结果刷新表格并显示提示信息
* @param data 当前行的数据对象,包含要删除楼层的相关信息,主要是楼层编号用于传递给后端进行删除操作
*/
function deleteById(data) {
// 弹出确认框提示管理员是否确定删除,设置了提示图标和标题
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端的删除楼层接口传递楼层编号作为参数根据返回结果进行相应处理
$.post("${pageContext.request.contextPath}/floor/deteleFloor", {"id": data.id}, function (result) {
if (result.success) {
// 如果删除操作成功,刷新表格数据,重新加载最新的楼层列表
tableList.reload();
}
// 显示后端返回的提示信息给用户,告知删除操作的结果情况
layer.msg(result.msg);
}, "json");
layer.close(index);
});
}
// 监听表单提交事件(提交添加或修改楼层信息的表单),根据后端返回结果进行相应操作,如刷新表格、关闭窗口、显示提示信息等
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果提交操作成功,刷新表格数据,展示最新的楼层信息
tableList.reload(); tableList.reload();
// 关闭弹出的添加或修改窗口
layer.close(mainIndex);
} }
//提示 // 显示后端返回的提示信息,告知用户提交操作的结果
layer.msg(result.msg); layer.msg(result.msg);
},"json"); }, "json");
layer.close(index); // 返回false阻止表单默认的提交行为因为采用了Ajax异步提交数据的方式
return false;
}); });
}
//监听表单提交事件
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>
</script>
</body> </body>
</html> </html>

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%--
此处为JSP页面的注释信息说明了该页面是由IntelliJ IDEA创建创建者、创建时间以及页面大致功能虽然注释写的是部门管理但从代码来看实际是房间管理相关功能
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: ASUS User: ASUS
Date: 2022/4/16 Date: 2022/4/16
@ -10,61 +11,82 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面的字符编码格式为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面的标题为"layui" -->
<title>layui</title> <title>layui</title>
<!-- 声明使用webkit作为页面渲染引擎有助于在不同浏览器中优化显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式来渲染页面确保页面兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS样式文件同样适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个基于Layui布局规范使用的容器类用于包裹页面主要内容方便整体布局管理 -->
<div class="layuimini-main"> <div class="layuimini-container">
<%--搜索--%> <div class="layuimini-main">
<fieldset class="table-search-fieldset"> <!-- 搜索区域开始,用于输入搜索条件查找房间信息 -->
<legend>搜索信息</legend> <%--搜索--%>
<div style="margin: 10px 10px 10px 10px"> <fieldset class="table-search-fieldset">
<form class="layui-form layui-form-pane" action=""> <legend>搜索信息</legend>
<div class="layui-form-item"> <div style="margin: 10px 10px 10px 10px">
<div class="layui-inline"> <form class="layui-form layui-form-pane" action="">
<label class="layui-form-label">房间名称</label> <div class="layui-form-item">
<div class="layui-input-inline"> <div class="layui-inline">
<input type="text" name="typename" autocomplete="off" class="layui-input"> <label class="layui-form-label">房间名称</label>
<div class="layui-input-inline">
<!-- 房间名称输入框设置了关闭自动完成功能并应用了Layui的输入框样式类 -->
<input type="text" name="typename" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</div> </div>
</div> </div>
<div class="layui-inline"> </form>
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button> </div>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button> </fieldset>
</div> <!-- 搜索区域结束 -->
</div>
</form> <!-- 添加按钮模板区域开始定义了一个添加按钮的模板后续会通过Layui的模板渲染机制使用 -->
</div> <%--添加按钮--%>
</fieldset> <script type="text/html" id="toolbarDemo">
<%--添加按钮--%> <div class="layui-btn-container">
<script type="text/html" id="toolbarDemo"> <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 class="layui-btn-container"> </div>
<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> </script>
</div> <!-- 添加按钮模板区域结束 -->
</script>
<%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table> <!-- 表格内容显示区域初始时隐藏后续通过Layui的表格渲染功能来展示房间相关数据 -->
<%--操作按钮--%> <%--表格内容显示区域--%>
<script type="text/html" id="currentTableBar"> <table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
<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> </table>
</script>
<!-- 操作按钮模板区域开始,定义了编辑和删除按钮的模板,用于在表格每行显示对应的操作按钮 -->
<%--操作按钮--%>
<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>
<!-- 操作按钮模板区域结束 -->
<!-- 添加和修改窗口区域开始,初始设置为隐藏,用于弹出窗口添加或修改房间信息 -->
<%-- 添加和修改窗口 --%> <%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow"> <div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 隐藏域,可能用于存储房间相关的唯一标识等信息,在添加或修改操作中传递给后端 -->
<input type="hidden" name="id"> <input type="hidden" name="id">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">房间编号</label> <label class="layui-form-label">房间编号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 房间编号输入框,设置了必填验证规则、关闭自动完成功能以及相应的占位文本提示 -->
<input type="text" name="roomid" lay-verify="required" autocomplete="off" <input type="text" name="roomid" lay-verify="required" autocomplete="off"
placeholder="请输入房间编号" class="layui-input"> placeholder="请输入房间编号" class="layui-input">
</div> </div>
@ -74,7 +96,8 @@
<div class="layui-input-block"> <div class="layui-input-block">
<select name="typename"> <select name="typename">
<option value="volvo" >请选择房间类型</option> <option value="volvo" >请选择房间类型</option>
<%--从监听器中获取到部门名称的数据--%> <%-- 通过JSTL的forEach标签循环遍历applicationScope中名为roomTypeList的数据集合可能是房间类型信息集合
为下拉框生成选项,选项的值和显示文本都设置为房间类型名称 -->
<c:forEach items="${applicationScope.roomTypeList}" var="tp"> <c:forEach items="${applicationScope.roomTypeList}" var="tp">
<option value="${tp.roomname}" name="roomname">${tp.roomname}</option> <option value="${tp.roomname}" name="roomname">${tp.roomname}</option>
</c:forEach> </c:forEach>
@ -86,7 +109,8 @@
<div class="layui-input-block"> <div class="layui-input-block">
<select name="floorname"> <select name="floorname">
<option value="volvo" >请选择所属楼层</option> <option value="volvo" >请选择所属楼层</option>
<%--从监听器中获取到部门名称的数据--%> <%-- 通过JSTL的forEach标签循环遍历applicationScope中名为floorList的数据集合可能是楼层信息集合
为下拉框生成选项,选项的值和显示文本都设置为楼层名称 -->
<c:forEach items="${applicationScope.floorList}" var="tp"> <c:forEach items="${applicationScope.floorList}" var="tp">
<option value="${tp.name}" name="name">${tp.name}</option> <option value="${tp.name}" name="name">${tp.name}</option>
</c:forEach> </c:forEach>
@ -116,139 +140,151 @@
</div> </div>
</form> </form>
</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', 'table','jquery'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
var tableList =table.render({ <!-- 引入Layui框架的JavaScript文件指定字符编码为utf-8 -->
elem: '#currentTableId', <script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
url: '${pageContext.request.contextPath}/rooms/roomsList', <script>
toolbar: '#toolbarDemo', layui.use(['form', 'table', 'jquery'], function () {
defaultToolbar: ['filter', 'exports', 'print', { var $ = layui.jquery,
title: '提示', form = layui.form,
layEvent: 'LAYTABLE_TIPS', table = layui.table;
icon: 'layui-icon-tips'
}], // 使用Layui的表格渲染功能创建一个表格实例用于展示房间信息列表
cols: [[ var tableList = table.render({
{field: 'id', width: 100, title: '编号', sort: true,align: "center"}, // 指定表格对应的DOM元素的选择器
{field: 'roomid', width: 100, title: '房间编号', sort: true,align: "center"}, elem: '#currentTableId',
{field: 'typename', width: 120, title: '房间类型',align: "center"}, // 设置获取表格数据的后端接口地址通过EL表达式动态获取路径用于获取房间数据列表
{field: 'floorname', width: 100, title: '所属楼层',align: "center"}, url: '${pageContext.request.contextPath}/rooms/roomsList',
{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>" toolbar: '#toolbarDemo',
// 设置默认的工具栏按钮,包含筛选、导出、打印等功能按钮,还有一个自定义的提示按钮
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列配置,包括列字段、宽度、标题、对齐方式等属性,用于展示房间的各项信息及操作列,
// 其中房间状态列使用了templet函数对数据进行了格式化展示根据不同状态值显示不同样式的文本
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>";
}}, }},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"} {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]] ]]
}); });
// 监听搜索操作 // 监听搜索按钮的点击事件(通过表单提交触发),根据输入的搜索条件重新加载表格数据
form.on('submit(data-search-btn)', function (data) { form.on('submit(data-search-btn)', function (data) {
tableList.reload({ tableList.reload({
data:data.field, data: data.field,
});
return false;
}); });
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
/** // 监听头部工具栏的事件,根据不同的事件类型执行相应操作,目前只处理了"add"(添加)事件,点击添加按钮会打开添加窗口
* 打开添加窗口 table.on("toolbar(currentTableFilter)", function (obj) {
*/ switch (obj.event) {
function openAddWindow() { case "add"://添加按钮
mainIndex = layer.open({ openAddWindow();//打开添加窗口的函数调用
type: 1,//打开类型 break;
title: "添加房间",//窗口标题
area: ["800px", "400px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/rooms/addRoom";
} }
}); });
}
//监听行工具栏事件 var url; // 用于存储提交数据的后端接口地址(添加或修改操作对应的接口)
table.on("tool(currentTableFilter)",function (obj) { var mainIndex; // 用于记录弹出窗口的索引,方便后续对窗口进行操作(如关闭窗口)
switch (obj.event) {
case "edit"://编辑按钮 /**
openUpdateWindow(obj.data);//打开修改窗口 * 打开添加窗口的函数利用Layui的layer模块弹出一个页面层形式的窗口用于添加房间信息
break; */
case "delete"://删除按钮 function openAddWindow() {
deleteById(obj.data); mainIndex = layer.open({
break; type: 1,//打开类型为页面层
title: "添加房间",//窗口标题,此处命名符合功能需求
area: ["800px", "400px"],//窗口的宽度和高度尺寸设置
content: $("#addOrUpdateWindow"),//引用之前定义的添加和修改窗口的DOM内容作为窗口主体内容
success: function () {
// 清空表单数据通过原生JavaScript获取表单元素并调用reset方法实现
$("#dataFrm")[0].reset();
// 设置添加操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/rooms/addRoom";
}
});
} }
});
/** // 监听表格行工具栏的事件,根据不同的事件类型(编辑、删除)执行相应操作
* 打开修改窗口 table.on("tool(currentTableFilter)", function (obj) {
* @param data 当前行的数据 switch (obj.event) {
*/ case "edit"://编辑按钮
function openUpdateWindow(data) { openUpdateWindow(obj.data);//打开修改窗口,并传入当前行的数据用于表单回显
mainIndex = layer.open({ break;
type: 1,//打开类型 case "delete"://删除按钮
title: "修改部门",//窗口标题 deleteById(obj.data);
area: ["800px", "400px"],//窗口宽高 break;
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/rooms/updateRoom";
} }
}); });
}
/** /**
* 删除部门 * 打开修改窗口的函数同样使用Layui的layer模块弹出窗口用于修改房间信息并将当前行的数据回显到表单中
* @param data 当前行数据 * @param data 当前行的数据对象,包含房间相关信息,用于填充表单进行修改操作
*/ */
function deleteById(data) { function openUpdateWindow(data) {
//提示管理员是否删除该部员工 mainIndex = layer.open({
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ type: 1,//打开类型为页面层
//发送ajax请求进行删除 title: "修改部门",//窗口标题,此处命名不太准确,按功能应该是“修改房间”更合适
$.post("${pageContext.request.contextPath}/rooms/deleteRoom",{"id":data.id},function(result){ area: ["800px", "400px"],//窗口宽高设置
if(result.success){ content: $("#addOrUpdateWindow"),//引用的内容窗口
//刷新数据表格 success: function () {
// 使用Layui的form模块进行表单数据回显将传入的数据填充到对应表单字段中
form.val("dataFrm", data);//参数1lay-filter值 参数2回显的数据对象
// 设置修改操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/rooms/updateRoom";
}
});
}
/**
* 根据房间编号删除房间的函数先提示管理员确认是否删除然后发送Ajax请求到后端执行删除操作根据结果刷新表格并显示提示信息
* @param data 当前行的数据对象,包含要删除房间的相关信息,主要是房间编号用于传递给后端进行删除操作
*/
function deleteById(data) {
// 弹出确认框提示管理员是否确定删除,设置了提示图标和标题
layer.confirm("确定要删吗", {icon: 3, title: '提示'}, function (index) {
// 发送POST请求到后端的删除房间接口传递房间编号作为参数根据返回结果进行相应处理
$.post("${pageContext.request.contextPath}/rooms/deleteRoom", {"id": data.id}, function (result) {
if (result.success) {
// 如果删除操作成功,刷新表格数据,重新加载最新的房间列表
tableList.reload();
}
// 显示后端返回的提示信息给用户,告知删除操作的结果情况
layer.msg(result.msg);
}, "json");
layer.close(index);
});
}
// 监听表单提交事件(提交添加或修改房间信息的表单),根据后端返回结果进行相应操作,如刷新表格、关闭窗口、显示提示信息等
form.on("submit(doSubmit)", function (data) {
$.post(url, data.field, function (result) {
if (result.success) {
// 如果提交操作成功,刷新表格数据,展示最新的房间信息
tableList.reload(); tableList.reload();
// 关闭弹出的添加或修改窗口
layer.close(mainIndex);
} }
//提示 // 显示后端返回的提示信息,告知用户提交操作的结果
layer.msg(result.msg); layer.msg(result.msg);
},"json"); }, "json");
layer.close(index); // 返回false阻止表单默认的提交行为因为采用了Ajax异步提交数据的方式
return false;
}); });
}
//监听表单提交事件
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>
</script>
</body> </body>
</html> </html>

@ -1,5 +1,6 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%--
此处是JSP页面的注释信息说明了该页面由IntelliJ IDEA创建创建者、创建时间以及页面原本注释写的是“部门管理”但从代码实际功能来看应该是与房型管理相关的功能。
Created by IntelliJ IDEA. Created by IntelliJ IDEA.
User: ASUS User: ASUS
Date: 2022/4/16 Date: 2022/4/16
@ -10,57 +11,77 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面的字符编码格式为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面的标题为"layui" -->
<title>layui</title> <title>layui</title>
<!-- 声明使用webkit作为页面渲染引擎有助于在不同浏览器中优化显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式来渲染页面确保页面兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS样式文件同样适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个基于Layui布局规范使用的容器类用于包裹页面主要内容方便整体布局管理 -->
<div class="layuimini-main"> <div class="layuimini-container">
<%--搜索--%> <div class="layuimini-main">
<fieldset class="table-search-fieldset"> <!-- 搜索区域开始,用于输入搜索条件查找房型信息 -->
<legend>搜索信息</legend> <%--搜索--%>
<div style="margin: 10px 10px 10px 10px"> <fieldset class="table-search-fieldset">
<form class="layui-form layui-form-pane" action=""> <legend>搜索信息</legend>
<div class="layui-form-item"> <div style="margin: 10px 10px 10px 10px">
<div class="layui-inline"> <form class="layui-form layui-form-pane" action="">
<label class="layui-form-label">房型名称</label> <div class="layui-form-item">
<div class="layui-input-inline"> <div class="layui-inline">
<input type="text" name="username" autocomplete="off" class="layui-input"> <label class="layui-form-label">房型名称</label>
<div class="layui-input-inline">
<!-- 房型名称输入框设置了关闭自动完成功能并应用了Layui的输入框样式类 -->
<input type="text" name="username" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button>
</div> </div>
</div> </div>
<div class="layui-inline"> </form>
<button type="submit" class="layui-btn" lay-submit lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索</button> </div>
<button type="reset" class="layui-btn layui-btn-warm" ><i class="layui-icon layui-icon-refresh-3"></i> 重 置</button> </fieldset>
</div> <!-- 搜索区域结束 -->
</div>
</form> <!-- 添加按钮模板区域开始定义了一个添加按钮的模板后续会通过Layui的模板渲染机制使用 -->
</div> <%--添加按钮--%>
</fieldset> <script type="text/html" id="toolbarDemo">
<%--添加按钮--%> <div class="layui-btn-container">
<script type="text/html" id="toolbarDemo"> <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 class="layui-btn-container"> </div>
<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> </script>
</div> <!-- 添加按钮模板区域结束 -->
</script>
<%--表格内容显示区域--%> <!-- 表格内容显示区域初始时隐藏后续通过Layui的表格渲染功能来展示房型相关数据 -->
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"> <%--表格内容显示区域--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter">
</table>
</table> <!-- 操作按钮模板区域开始,定义了编辑和删除按钮的模板,用于在表格每行显示对应的操作按钮 -->
<%--操作按钮--%> <%--操作按钮--%>
<script type="text/html" id="currentTableBar"> <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-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> <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> </script>
<!-- 操作按钮模板区域结束 -->
<!-- 添加和修改窗口区域开始,初始设置为隐藏,用于弹出窗口添加或修改房型信息 -->
<%-- 添加和修改窗口 --%> <%-- 添加和修改窗口 --%>
<div style="display: none;padding: 5px" id="addOrUpdateWindow"> <div style="display: none;padding: 5px" id="addOrUpdateWindow">
<form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm"> <form class="layui-form" style="width:90%;" id="dataFrm" lay-filter="dataFrm">
<!-- 隐藏域保存房型id --> <!-- 隐藏域,用于保存房型id信息,可能在添加或修改操作中传递给后端使用 -->
<input type="hidden" name="id"> <input type="hidden" name="id">
<div class="layui-col-md12 layui-col-xs12"> <div class="layui-col-md12 layui-col-xs12">
<div class="layui-row layui-col-space10"> <div class="layui-row layui-col-space10">
@ -68,6 +89,7 @@
<div class="layui-form-item magt3" style="margin-top: 8px;"> <div class="layui-form-item magt3" style="margin-top: 8px;">
<label class="layui-form-label">房型名称</label> <label class="layui-form-label">房型名称</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 房型名称输入框设置了必填验证规则lay-verify="required"有相应的占位文本提示用户输入内容应用了Layui的输入框样式类 -->
<input type="text" class="layui-input" name="roomname" lay-verify="required" placeholder="请输入房型名称"> <input type="text" class="layui-input" name="roomname" lay-verify="required" placeholder="请输入房型名称">
</div> </div>
</div> </div>
@ -75,6 +97,7 @@
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">参考价格</label> <label class="layui-form-label">参考价格</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<!-- 参考价格输入框设置了必填和只能输入数字的验证规则lay-verify="required|number"有占位文本提示应用了Layui的输入框样式类 -->
<input type="text" class="layui-input" name="price" lay-verify="required|number" <input type="text" class="layui-input" name="price" lay-verify="required|number"
placeholder="请输入参考价格"> placeholder="请输入参考价格">
</div> </div>
@ -82,6 +105,7 @@
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">可住人数</label> <label class="layui-form-label">可住人数</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<!-- 可住人数输入框同样设置了必填和只能输入数字的验证规则有占位文本提示应用了Layui的输入框样式类 -->
<input type="text" class="layui-input" name="livenum" lay-verify="required|number" <input type="text" class="layui-input" name="livenum" lay-verify="required|number"
placeholder="请输入可住人数"> placeholder="请输入可住人数">
</div> </div>
@ -89,12 +113,14 @@
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">床位数</label> <label class="layui-form-label">床位数</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<!-- 床位数输入框设置了必填和只能输入数字的验证规则有占位文本提示应用了Layui的输入框样式类 -->
<input type="text" class="layui-input" name="bednum" lay-verify="required|number" placeholder="请输入床位数"> <input type="text" class="layui-input" name="bednum" lay-verify="required|number" placeholder="请输入床位数">
</div> </div>
</div> </div>
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">房间数</label> <label class="layui-form-label">房间数</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<!-- 房间数输入框设置了必填和只能输入数字的验证规则有占位文本提示应用了Layui的输入框样式类 -->
<input type="text" class="layui-input" name="roomnum" lay-verify="required|number" <input type="text" class="layui-input" name="roomnum" lay-verify="required|number"
placeholder="请输入房间数"> placeholder="请输入房间数">
</div> </div>
@ -113,6 +139,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">房型备注</label> <label class="layui-form-label">房型备注</label>
<div class="layui-input-block"> <div class="layui-input-block">
<!-- 房型备注文本域用于输入关于房型的一些补充说明信息应用了Layui的文本域样式类 -->
<textarea class="layui-textarea" name="remark" id="remark"></textarea> <textarea class="layui-textarea" name="remark" id="remark"></textarea>
</div> </div>
</div> </div>
@ -131,163 +158,128 @@
</div> </div>
</form> </form>
</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', 'table', 'laydate', 'jquery', 'layer','upload'], function () {
var $ = layui.jquery,
form = layui.form,
laydate = layui.laydate,
upload = layui.upload,
layer = layui.layer,
table = layui.table;
var tableList =table.render({ <!-- 引入Layui框架的JavaScript文件指定字符编码为utf-8 -->
elem: '#currentTableId', <script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
url: '${pageContext.request.contextPath}/roomtype/roomTypeList', <script>
toolbar: '#toolbarDemo', layui.use(['form', 'table', 'laydate', 'jquery', 'layer', 'upload'], function () {
defaultToolbar: ['filter', 'exports', 'print', { var $ = layui.jquery,
title: '提示', form = layui.form,
layEvent: 'LAYTABLE_TIPS', laydate = layui.laydate,
icon: 'layui-icon-tips' upload = layui.upload,
}], layer = layui.layer,
cols: [[ table = layui.table;
{field: 'id', width: 60, title: '房型编号', sort: true,align: "center"},
{field: 'roomname', width: 120, title: '房型名称',align: "center"}, // 使用Layui的表格渲染功能创建一个表格实例用于展示房型信息列表
{field: 'price', width: 100, title: '参考价格',align: "center"}, var tableList = table.render({
{field: 'livenum', width: 100, title: '可入住人数',align: "center"}, // 指定表格对应的DOM元素的选择器
{field: 'bednum', width: 100, title: '床位数',align: "center"}, elem: '#currentTableId',
{field: 'roomnum', width: 100, title: '房间数量',align: "center"}, // 设置获取表格数据的后端接口地址通过EL表达式动态获取路径用于获取房型数据列表
{field: 'reservednum', width: 100, title: '已预订数量',align: "center"}, url: '${pageContext.request.contextPath}/roomtype/roomTypeList',
{field: 'avilablenum', width: 100, title: '可住房间数',align: "center"}, // 指定头部工具栏所使用的模板选择器,这里关联了之前定义的添加按钮模板
{field: 'livednum', width: 100, title: '已入住数量',align: "center"}, toolbar: '#toolbarDemo',
{field: 'status', width: 100, title: '房间状态',align: "center",templet:function (d) { // 设置默认的工具栏按钮,包含筛选、导出、打印等功能按钮,还有一个自定义的提示按钮
return d.status == 1?"可预订":"<font color='red'>房间已满</font>" defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
// 定义表格的列配置,包括列字段、宽度、标题、对齐方式等属性,用于展示房型的各项信息及操作列,
// 其中房间状态列使用了templet函数对数据进行了格式化展示根据不同状态值显示不同样式的文本
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: 'remark', title: '备注', minWidth: 50,align: "center"}, {field: 'remark', title: '备注', minWidth: 50, align: "center"},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"} {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]] ]]
}); });
// 监听搜索操作 // 监听搜索按钮的点击事件(通过表单提交触发),根据输入的搜索条件重新加载表格数据
form.on('submit(data-search-btn)', function (data) { form.on('submit(data-search-btn)', function (data) {
tableList.reload({ tableList.reload({
data:data.field, data: data.field,
});
return false;
}); });
return false;
});
//监听头部工具栏事件
//toolbar是头部工具栏事件
//currentTableFilter是表格lay-filter过滤器的值
table.on("toolbar(currentTableFilter)",function (obj) {
switch (obj.event) {
case "add"://添加按钮
openAddWindow();//打开添加窗口
break;
}
});
var url;//提交地址
var mainIndex;//打开窗口的索引
/** // 监听头部工具栏的事件,根据不同的事件类型执行相应操作,目前只处理了"add"(添加)事件,点击添加按钮会打开添加窗口
* 打开添加窗口 table.on("toolbar(currentTableFilter)", function (obj) {
*/ switch (obj.event) {
function openAddWindow() { case "add"://添加按钮
mainIndex = layer.open({ openAddWindow();//打开添加窗口的函数调用
type: 1,//打开类型 break;
title: "添加房型",//窗口标题
area: ["800px", "500px"],//窗口宽高
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//清空表单数据
$("#dataFrm")[0].reset();
//添加的提交请求
url = "${pageContext.request.contextPath}/roomtype/addRoomType";
} }
}); });
}
//监听行工具栏事件 var url; // 用于存储提交数据的后端接口地址(添加或修改操作对应的接口)
table.on("tool(currentTableFilter)",function (obj) { var mainIndex; // 用于记录弹出窗口的索引,方便后续对窗口进行操作(如关闭窗口)
switch (obj.event) {
case "edit"://编辑按钮 /**
openUpdateWindow(obj.data);//打开修改窗口 * 打开添加窗口的函数利用Layui的layer模块弹出一个页面层形式的窗口用于添加房型信息
break; */
case "delete"://删除按钮 function openAddWindow() {
deleteById(obj.data); mainIndex = layer.open({
break; type: 1,//打开类型为页面层
title: "添加房型",//窗口标题,此处命名符合功能需求
area: ["800px", "500px"],//窗口的宽度和高度尺寸设置
content: $("#addOrUpdateWindow"),//引用之前定义的添加和修改窗口的DOM内容作为窗口主体内容
success: function () {
// 清空表单数据通过原生JavaScript获取表单元素并调用reset方法实现
$("#dataFrm")[0].reset();
// 设置添加操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/roomtype/addRoomType";
}
});
} }
});
/** // 监听表格行工具栏的事件,根据不同的事件类型(编辑、删除)执行相应操作
* 打开修改窗口 table.on("tool(currentTableFilter)", function (obj) {
* @param data 当前行的数据 switch (obj.event) {
*/ case "edit"://编辑按钮
function openUpdateWindow(data) { openUpdateWindow(obj.data);//打开修改窗口,并传入当前行的数据用于表单回显
mainIndex = layer.open({ break;
type: 1,//打开类型 case "delete"://删除按钮
title: "修改部门",//窗口标题 deleteById(obj.data);
area: ["800px", "400px"],//窗口宽高 break;
content: $("#addOrUpdateWindow"),//引用的内容窗口
success: function () {
//表单数据回显
form.val("dataFrm",data);//参数1lay-filter值 参数2回显的数据
//修改的提交请求
url = "${pageContext.request.contextPath}/roomtype/updateRoomType";
} }
}); });
}
/** /**
* 删除部门 * 打开修改窗口的函数同样使用Layui的layer模块弹出窗口用于修改房型信息并将当前行的数据回显到表单中
* @param data 当前行数据 * @param data 当前行的数据对象,包含房型相关信息,用于填充表单进行修改操作
*/ */
function deleteById(data) { function openUpdateWindow(data) {
//提示管理员是否删除该部员工 mainIndex = layer.open({
layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ type: 1,//打开类型为页面层
//发送ajax请求进行删除 title: "修改部门",//窗口标题,此处命名不太准确,按功能应该是“修改房型”更合适
$.post("${pageContext.request.contextPath}/roomtype/deleteRoomType",{"id":data.id},function(result){ area: ["800px", "400px"],//窗口宽高设置
if(result.success){ content: $("#addOrUpdateWindow"),//引用的内容窗口
//刷新数据表格 success: function () {
tableList.reload(); // 使用Layui的form模块进行表单数据回显将传入的数据填充到对应表单字段中
form.val("dataFrm", data);//参数1lay-filter值 参数2回显的数据对象
// 设置修改操作对应的后端提交接口地址通过EL表达式动态获取路径
url = "${pageContext.request.contextPath}/roomtype/updateRoomType";
} }
//提示 });
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>
</body> /**
</html> * 根据房型编号删除房型的函数先提示管理员确认是否删除然后发送Ajax请求到后端执行删除操作根据结果刷新表格并显示提示信息
* @param data 当前行的数据对象,包含要删除房型的相关信息,主要是房型编号用于传递给后端进行删除操作
*/
function deleteById(data) {
// 弹出确认框提示管理员是否确定删除,设置了提示图标和标题
layer.confirm("确定要删

@ -1,107 +1,131 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- 设置页面的字符编码为utf-8 -->
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 设置页面的标题为“系统设置” -->
<title>系统设置</title> <title>系统设置</title>
<!-- 声明使用webkit作为渲染引擎以优化页面在浏览器中的显示效果 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 指示浏览器以IE的最高版本模式或者Chrome Frame模式渲染页面保证页面兼容性 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/lib/layui-v2.6.3/css/layui.css" media="all">
<!-- 引入自定义的公共CSS样式文件同样适用于所有媒体类型 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all"> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/public.css" media="all">
<!-- 自定义的内联样式用于设置layui-form-item下类名为layui-input-company的元素样式使其宽度自适应、有右内边距以及设置行高 -->
<style> <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> </style>
</head> </head>
<body> <body>
<div class="layuimini-container"> <!-- 这是一个基于Layui布局规范使用的容器类用于包裹页面主要内容方便整体布局管理 -->
<div class="layuimini-main"> <div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-form layuimini-form"> <!-- 开始一个Layui的表单 -->
<div class="layui-form-item"> <div class="layui-form layuimini-form">
<label class="layui-form-label required">系统名称</label> <div class="layui-form-item">
<div class="layui-input-block"> <label class="layui-form-label required">系统名称</label>
<input type="text" name="sitename" lay-verify="required" disabled="disabled" lay-reqtext="网站域名不能为空" placeholder="请输入系统名称" value="酒店管理系统" class="layui-input"> <div class="layui-input-block">
<tip>填写自己系统的名称。</tip> <!-- 系统名称输入框设置为必填项通过lay-verify="required"但当前是禁用状态disabled="disabled"
有相应的提示文本lay-reqtext占位文本提示用户输入内容并且已经设置了默认值“酒店管理系统”应用了Layui的输入框样式类 -->
<input type="text" name="sitename" lay-verify="required" disabled="disabled" lay-reqtext="网站域名不能为空" placeholder="请输入系统名称" value="酒店管理系统" class="layui-input">
<!-- 此处的<tip>标签看起来是非标准的HTML标签可能是用于给用户提供额外提示信息不过在正式使用中最好遵循标准HTML规范进行替换比如使用<span>等标签 -->
<tip>填写自己系统的名称。</tip>
</div>
</div> </div>
</div> <div class="layui-form-item">
<div class="layui-form-item"> <label class="layui-form-label required">项目地址</label>
<label class="layui-form-label required">项目地址</label> <div class="layui-input-block">
<div class="layui-input-block"> <!-- 项目地址输入框同样设置为必填项且处于禁用状态有相应提示文本和占位文本设置了默认的项目地址值应用了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"> <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>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">缓存时间</label> <label class="layui-form-label">缓存时间</label>
<div class="layui-input-inline" style="width: 80px;"> <div class="layui-input-inline" style="width: 80px;">
<input type="text" name="cache" lay-verify="number" value="0" class="layui-input"> <!-- 缓存时间输入框设置验证规则为只能输入数字lay-verify="number"设置了默认值为0应用了Layui的输入框样式类 -->
<input type="text" name="cache" lay-verify="number" value="0" class="layui-input">
</div>
<div class="layui-input-inline layui-input-company">分钟</div>
<div class="layui-form-mid layui-word-aux">本地开发一般推荐设置为 0线上环境建议设置为 10。</div>
</div> </div>
<div class="layui-input-inline layui-input-company">分钟</div> <div class="layui-form-item">
<div class="layui-form-mid layui-word-aux">本地开发一般推荐设置为 0线上环境建议设置为 10。</div> <label class="layui-form-label">最大文件上传</label>
</div> <div class="layui-input-inline" style="width: 80px;">
<div class="layui-form-item"> <!-- 最大文件上传大小输入框验证规则为只能输入数字设置了默认值为2048应用了Layui的输入框样式类 -->
<label class="layui-form-label">最大文件上传</label> <input type="text" name="cache" lay-verify="number" value="2048" class="layui-input">
<div class="layui-input-inline" style="width: 80px;"> </div>
<input type="text" name="cache" lay-verify="number" value="2048" class="layui-input"> <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>
<div class="layui-input-inline layui-input-company">KB</div> <div class="layui-form-item">
<div class="layui-form-mid layui-word-aux">提示1 M = 1024 KB</div> <label class="layui-form-label">上传文件类型</label>
</div> <div class="layui-input-block">
<div class="layui-form-item"> <!-- 上传文件类型输入框用于输入允许上传的文件类型设置了默认值应用了Layui的输入框样式类 -->
<label class="layui-form-label">上传文件类型</label> <input type="text" name="cache" value="png|gif|jpg|jpeg|zip|rar" class="layui-input">
<div class="layui-input-block"> </div>
<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"> <div class="layui-form-item layui-form-text">
<label class="layui-form-label required">首页标题</label> <label class="layui-form-label required">首页标题</label>
<div class="layui-input-block"> <div class="layui-input-block">
<textarea name="title" disabled="disabled" class="layui-textarea">酒店管理后台管理</textarea> <!-- 首页标题文本域设置为禁用状态用于显示首页标题内容应用了Layui的文本域样式类 -->
<textarea name="title" disabled="disabled" class="layui-textarea">酒店管理后台管理</textarea>
</div>
</div> </div>
</div> <div class="layui-form-item layui-form-text">
<div class="layui-form-item layui-form-text"> <label class="layui-form-label">META关键词</label>
<label class="layui-form-label">META关键词</label> <div class="layui-input-block">
<div class="layui-input-block"> <!-- META关键词文本域用于输入页面的关键词信息应用了Layui的文本域样式类设置了占位文本提示输入格式 -->
<textarea name="keywords" class="layui-textarea" placeholder="多个关键词用英文状态 , 号分割"></textarea> <textarea name="keywords" class="layui-textarea" placeholder="多个关键词用英文状态, 号分割"></textarea>
</div>
</div> </div>
</div> <div class="layui-form-item layui-form-text">
<div class="layui-form-item layui-form-text"> <label class="layui-form-label">META描述</label>
<label class="layui-form-label">META描述</label> <div class="layui-input-block">
<div class="layui-input-block"> <!-- META描述文本域用于输入页面的描述信息应用了Layui的文本域样式类 -->
<textarea name="descript" class="layui-textarea">管理员工 酒店功能</textarea> <textarea name="descript" class="layui-textarea">管理员工 酒店功能</textarea>
</div>
</div> </div>
</div> <div class="layui-form-item layui-form-text">
<div class="layui-form-item layui-form-text"> <label class="layui-form-label required">版权信息</label>
<label class="layui-form-label required">版权信息</label> <div class="layui-input-block">
<div class="layui-input-block"> <!-- 版权信息文本域设置为禁用状态用于显示版权相关内容应用了Layui的文本域样式类 -->
<textarea name="copyright" disabled="disabled" class="layui-textarea">© 2022 XIEYINGPENG</textarea> <textarea name="copyright" disabled="disabled" class="layui-textarea">© 2022 XIEYINGPENG</textarea>
</div>
</div> </div>
</div> <div class="layui-form-item">
<div class="layui-form-item"> <div class="layui-input-block">
<div class="layui-input-block"> <!-- 确认保存按钮设置了Layui的按钮样式类通过lay-submit和lay-filter属性绑定了提交事件和对应的事件过滤器 -->
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="setting">确认保存</button> <button class="layui-btn layui-btn-normal" lay-submit lay-filter="setting">确认保存</button>
</div>
</div> </div>
</div> </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 -->
form.on('submit(setting)', function (data) { <script src="${pageContext.request.contextPath}/static/layui/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
parent.layer.alert(JSON.stringify(data.field), { <script>
title: '最终的提交信息' 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: '最终的提交信息'
});
return false;
}); });
return false;
});
}); });
</script> </script>
</body> </body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save