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>

@ -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>

@ -1,466 +1,396 @@
/** /**
* layui
* By
*/
layuiå®˜ç½ /* 对h1、h2、h3标签设置字体大小为14px */
By 贤心 h1,h2,h3{
font-size: 14px;
*/ }
h1,h2,h3{font-size: 14px;}
::-webkit-input-placeholder{color: #999}
/* 布局 */
.site-inline{font-size: 0;}
.site-tree, .site-content{display: inline-block; *display:inline; *zoom:1; vertical-align: top; font-size: 14px;}
.site-tree{width: 220px; min-height: 900px; padding: 5px 0 20px;}
.site-content{width: 899px; min-height: 900px; padding: 20px 0 10px 20px;}
/* 头部 */
.header{height: 59px; border-bottom: 1px solid #404553; background-color: #393D49;}
.logo{position: absolute; left: 0; top: 16px;}
.logo img{width: 82px; height: 31px;}
.header .layui-nav{position: absolute; right: 0; top: 0; padding: 0; background: none;}
.header .layui-nav .layui-nav-item{margin: 0 20px; }
.header .layui-nav .layui-nav-item[mobile]{display: none;}
.header .layui-container .logo{left: 15px;}
.header .layui-container .layui-nav{right: 15px;}
.menu{position: absolute; right: 0; top: 0; line-height: 65px;}
.menu a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
.menu a{position: relative; padding: 0 20px; margin: 0 20px; color: #c2c2c2; font-size: 14px;}
.menu a:hover{color: #fff; transition: all .5s; -webkit-transition: all .5s}
.menu a.this{color: #fff}
.menu a.this::after{content: ''; position: absolute; left: 0; bottom: -1px; width: 100%; height: 5px; background-color: #5FB878;}
.header-index{background-color: #05031A; border: none;}
.header-index .site-banner-bg{}
.header-index[spring]{background-color: #0D1206}
.header-index[summer]{background-color: #0A0E11}
.header-index[autumn]{background-color: #100903}
.header-index[winter]{background-color: #110F25/*#06041C*/}
.header-demo{height: 60px; border-bottom: none;}
.header-demo .logo{left: 40px;}
.header-demo .layui-nav{top: 0;}
.header-demo .layui-nav .layui-nav-item{margin: 0 10px;}
.header-demo .layui-nav .layui-this a{padding: 0 30px;}
.component{position: absolute; width: 160px; left: 120px; top: 16px; }
.component .layui-input{height: 30px; padding-left: 12px; background-color: #424652; background-color: rgba(255,255,255,.05); border: none 0; color: #fff; color: rgba(255,255,255,.5); font-size: 12px;}
.component .layui-form-select .layui-edge{display: none; border-top-color: #999;}
.component .layui-form-select dl{top: 36px; background-color: rgba(255,255,255,.9)}
.header-demo .component{left: 185px;}
/* 子侧边 */
.layui-side-child{width: 160px!important; left: 200px; bottom: 60px!important; border-right: 1px solid #eee; background-color: #fff;}
.layui-side-child .layui-side-scroll{width: 170px;}
.layui-side-child .layui-nav{padding: 10px 0; width: 160px; border-radius: 0; background: none}
.layui-side-child .layui-nav-child{border-radius: 0;}
.layui-side-child .layui-nav .layui-nav-title a,
.layui-side-child .layui-nav .layui-nav-title a:hover,
.layui-side-child .layui-nav-itemed>a{color: #666 !important;}
.layui-side-child .layui-nav-itemed .layui-nav-child{margin-bottom: 10px; background: none !important;}
.layui-side-child .layui-nav .layui-nav-item a{height: 30px; line-height: 30px; color: #666;}
.layui-side-child .layui-nav .layui-nav-item a:hover{background: none !important;}
.layui-side-child .layui-nav .layui-nav-child a{color: #999 !important;}
.layui-side-child .layui-nav .layui-nav-more{display: none;}
.layui-side-child .layui-nav-tree .layui-this,
.layui-side-child .layui-nav-tree .layui-this>a,
.layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this,
.layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this a{background: none; color: #5FB878 !important;}
.layui-side-child .layui-nav .layui-nav-child a:hover{color: #009688 !important}
.layui-side-child .layui-nav-bar{background-color: #5FB878;}
/* 底部 */
.footer{padding: 30px 0; line-height: 30px; text-align: center; color: #666; font-weight: 300;}
body .layui-layout-admin .footer-demo{height: 50px; padding: 5px 0;}
.footer a{padding: 0 5px;}
.site-union{margin-top: 10px; color: #999;}
.site-union>*{display: inline-block; vertical-align: middle;}
.site-union a[upyun] img{width: 80px;}
.site-union span{position: relative; top: 3px;}
.site-union span a{padding: 0; display: inline; color: #999;}
.site-union span a:hover{text-decoration: underline;}
.footer-demo p{display: inline-block; vertical-align: middle; height: 50px; padding-right: 10px;}
.footer-demo .site-union{position: relative; top: -9px;}
/* é¦é¡µbanner部分 */
.site-banner{position: relative; height: 600px; text-align: center; overflow: hidden; background-color: #393D49;}
.site-banner-bg
,.site-banner-main{position: absolute; left: 0; top: 0; width: 100%; height: 100%;}
.site-banner-bg{background-position: center 0;}
.site-zfj{padding-top: 25px; height: 220px;} /* 对webkit浏览器下的输入框占位符设置颜色为#999 */
.site-zfj i{position: absolute; left: 50%; top: 50px; width: 200px; height: 200px; margin-left: -100px; font-size: 180px; color: #c2c2c2;} ::-webkit-input-placeholder{
color: #999;
}
@-webkit-keyframes site-zfj { /* 布局相关样式 */
0% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(0deg) scale(1);} /* 使内部元素字体大小设为0常用于消除inline-block元素间的空白间隙问题后续再单独设置内部元素字体大小 */
10% {opacity: 0.8; -webkit-transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);} .site-inline{
35% {opacity: 0.6; -webkit-transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);} font-size: 0;
50% {opacity: 0.4; -webkit-transform: translate3d(0, 0, 0) rotate(360deg) scale(0);}
80% {opacity: 0.2; -webkit-transform: translate3d(0, 0, 0) rotate(720deg) scale(1);}
90% {opacity: 0.1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);}
100% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);}
} }
@keyframes site-zfj { /* 设置.site-tree和.site-content为行内块元素并处理兼容IE低版本的显示问题同时设置垂直对齐方式为顶部对齐字体大小恢复为14px */
0% {opacity: 1; transform: translate3d(0, 0, 0) rotate(0deg) scale(1);} .site-tree,.site-content{
10% {opacity: 0.8; transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);} display: inline-block;
35% {opacity: 0.6; transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);} *display:inline;
50% {opacity: 0.4; transform: translate3d(0, 0, 0) rotate(360deg) scale(0);} *zoom:1;
80% {opacity: 0.2; transform: translate3d(0, 0, 0) rotate(720deg) scale(1);} vertical-align: top;
90% {opacity: 0.1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);} font-size: 14px;
100% {opacity: 1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);}
} }
/* 设置.site-tree的宽度、最小高度、内边距 */
@-webkit-keyframes site-desc { .site-tree{
0% { -webkit-transform: scale(1.1);} width: 220px;
100% {opacity: 1; -webkit-transform: scale(1);} min-height: 900px;
padding: 5px 0 20px;
} }
@keyframes site-desc { /* 设置.site-content的宽度、最小高度、内边距 */
0% { transform: scale(1.1);} .site-content{
100% {transform: scale(1);} width: 899px;
min-height: 900px;
padding: 20px 0 10px 20px;
} }
.site-zfj-anim i{-webkit-animation-name: site-zfj; animation-name: site-zfj; -webkit-animation-duration: 5s; animation-duration: 5s; -webkit-animation-timing-function: linear; animation-timing-function: linear;} /* 头部相关样式 */
/* 设置头部的高度、底部边框以及背景颜色 */
.header{
/* 描述字体 */ height: 59px;
@font-face {font-family: 'webfont-desc'; border-bottom: 1px solid #404553;
src: url('//at.alicdn.com/t/webfont_eovt4pxxy5.eot'); /* IE9*/ background-color: #393D49;
src: url('//at.alicdn.com/t/webfont_eovt4pxxy5.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('//at.alicdn.com/t/webfont_eovt4pxxy5.woff') format('woff'), /* chrome、firefox */
url('//at.alicdn.com/t/webfont_eovt4pxxy5.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('//at.alicdn.com/t/webfont_eovt4pxxy5.svg#思源黑体-极细') format('svg'); /* iOS 4.1- */
}
.web-font-desc{
font-family:"webfont-desc" !important;
font-size:16px;font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
} }
/* 设置logo的定位为绝对定位距离左边和顶部的距离 */
.logo{
.site-desc{position: relative; height: 70px; margin-top: 20px;} position: absolute;
.site-desc .web-font-desc{color: #fff; color: rgba(255,255,255,.8); font-size: 61px;} left: 0;
top: 16px;
.site-desc-anim{-webkit-animation-name: site-desc; animation-name: site-desc;} }
.site-desc cite{position: absolute; bottom: -40px; left: 0; width: 100%; color: #c2c2c2; font-style: normal;} /* 设置logo内图片的宽度和高度 */
.logo img{
.site-download{margin-top: 80px; font-size: 0;} width: 82px;
.site-download a{position: relative; padding: 0 45px 0 90px; height: 60px; line-height: 60px; border: 1px solid #c2c2c2; border-color: rgba(255,255,255,.2); font-size: 24px; color: #ccc; transition: all .5s; -webkit-transition: all .5s;} height: 31px;
.site-download a:hover{border-color: rgba(255,255,255,.3); color: #fff; background-color: rgba(255,255,255,.05); border-radius: 30px;}
.site-download a cite{position: absolute; left: 45px; font-size: 30px;}
.site-version{position: relative; margin-top: 15px; color: #ccc; font-size: 12px;}
.site-version span{padding: 0 3px;}
.site-version *{font-style: normal;}
.site-version a{color: #e2e2e2; text-decoration: underline;}
.site-banner-other{position: absolute; left: 0; bottom: 35px; width: 100%; text-align: center; font-size: 0;}
.site-banner-other iframe{border: none;}
.site-banner-other a{display: inline-block; vertical-align: middle; height: 28px; line-height: 28px; margin: 0 5px; padding: 0 8px; border-radius: 2px; color: #c2c2c2; color: rgba(255,255,255,.8); border: 1px solid #c2c2c2; border-color: rgba(255,255,255,.2); font-size: 14px; transition: all .5s; -webkit-transition: all .5s;}
.site-banner-other a:hover{color: #fff; background-color: rgba(255,255,255,.1);}
.site-idea{margin: 50px 0; font-size: 0; text-align: center; font-weight: 300;}
.site-idea li{display: inline-block; vertical-align: top; *display: inline; *zoom:1; font-size: 14px; }
.site-idea li{width: 298px; height: 150px; padding: 30px; line-height: 24px; margin-left: 30px; border: 1px solid #d2d2d2; text-align: left;}
.site-idea li:first-child{margin-left: 0}
.site-idea .layui-field-title{border-color: #d2d2d2}
.site-idea .layui-field-title legend{margin: 0 20px 20px 0; padding: 0 20px; text-align: center;}
/* 赞助商 */
.site-sponsor-home{margin-top: 40px; text-align: center;}
.site-sponsor-home .layui-btn{position: relative; width: 233px; height: 65px; line-height: 65px; background: none; border-color: #212121; font-size: 26px; border-radius: 6px; /*padding-left: 55px;*/}
.site-sponsor-home .layui-btn:hover{background: #4A4855; color: #BAB8C3;}
.site-sponsor-home .layui-btn:before{/*position: absolute; left: 15px; top: 15px; content: ''; width: 30px; height: 30px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;*/}
.site-sponsor-home p{position: relative; padding-top: 15px; font-size: 22px; color: #212121;}
.site-sponsor-home p:before{content: ''; position: relative; top: -2px; display: inline-block; vertical-align: middle; width: 30px; height: 30px; margin-right: 10px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;}
@media screen and (max-width: 750px) {
.site-sponsor-home .layui-btn{width: 180px; height: 45px; line-height: 45px; font-size: 20px;}
.site-sponsor-home p{font-size: 16px;}
.site-sponsor-home p:before{width: 20px; height: 20px;}
} }
/* 设置头部导航的定位、内边距以及去除默认背景 */
.header.layui-nav{
position: absolute;
right: 0;
top: 0;
padding: 0;
background: none;
}
/* 设置头部导航项的外边距 */
.header.layui-nav.layui-nav-item{
margin: 0 20px;
}
/* 当元素有mobile属性时隐藏该元素可能用于移动端特定显示控制 */
.header.layui-nav.layui-nav-item[mobile]{
display: none;
}
/* 当在layui-container内时重新设置logo的左边距 */
.header.layui-container.logo{
left: 15px;
}
/* 当在layui-container内时重新设置layui-nav的右边距 */
.header.layui-container.layui-nav{
right: 15px;
}
/* 辅助 */ /* 设置菜单的定位、行高 */
.site-tips{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #0078AD; background-color: #f2f2f2;} .menu{
body .site-tips p{margin: 0;} position: absolute;
body .layui-layer-notice .layui-layer-content{padding: 20px; line-height: 26px; background-color: #393D49; color: #fff; font-weight: 300;} right: 0;
.layui-layer-notice .layui-text{color: #f8f8f8;} top: 0;
.layui-layer-notice .layui-text a{color: #009688;} line-height: 65px;
}
/* 目录 */ /* 设置菜单内链接的显示方式、垂直对齐等(处理兼容问题) */
.site-dir{display: none;} .menu a{
.site-dir li{line-height: 26px; margin-left: 20px; overflow: visible; list-style-type: disc;} display:inline-block;
.site-dir li a{display: block;} *display:inline;
.site-dir li a:active{color: #01AAED;} *zoom:1;
.site-dir li a.layui-this{color: #01AAED;} vertical-align:top;
body .layui-layer-dir{box-shadow: none; border: 1px solid #d2d2d2;} }
body .layui-layer-dir .layui-layer-content{padding: 10px;} /* 设置菜单内链接的定位、内边距、外边距、颜色和字体大小等样式,以及鼠标悬停时的颜色过渡效果 */
.site-dir a em{padding-left: 5px; font-size: 12px; color: #c2c2c2; font-style: normal;} .menu a{
position: relative;
/* 文档 */ padding: 0 20px;
.site-tree{border-right: 1px solid #eee; } margin: 0 20px;
.site-tree .layui-tree{line-height: 32px;} color: #c2c2c2;
.site-tree .layui-tree li i{position: relative; font-size: 22px; color: #000} font-size: 14px;
.site-tree .layui-tree li a cite{padding: 0 8px;} }
.site-tree .layui-tree .site-tree-noicon a cite{padding-left: 15px;} .menu a:hover{
.site-tree .layui-tree li a em{font-size: 12px; color: #bbb; padding-right: 5px; font-style: normal;} color: #fff;
.site-tree .layui-tree li h2{line-height: 36px; border-left: 5px solid #009E94; margin: 15px 0 5px; padding: 0 10px; background-color: #f2f2f2;} transition: all.5s;
.site-tree .layui-tree li ul{margin-left: 27px; line-height: 28px;} -webkit-transition: all.5s
.site-tree .layui-tree li ul a, }
.site-tree .layui-tree li ul a i{color: #777;} /* 设置当前选中的菜单链接的颜色 */
.site-tree .layui-tree li ul a:hover{color: #333;} .menu a.this{
.site-tree .layui-tree li ul li{margin-left: 25px; overflow: visible; list-style-type: disc; /*list-style-position: inside;*/} color: #fff;
.site-tree .layui-tree li ul li cite, }
.site-tree .layui-tree .site-tree-noicon ul li cite{padding-left: 0;} /* 为当前选中的菜单链接添加底部伪元素,用于显示选中标识(如一条线),设置其样式 */
.menu a.this::after{
.site-tree .layui-tree .layui-this a{color: #01AAED;} content: '';
.site-tree .layui-tree .layui-this .layui-icon{color: #01AAED;} position: absolute;
left: 0;
.site-fix .site-tree{position: fixed; top: 0; bottom: 0; z-index: 666; min-height: 0; overflow: auto; background-color: #fff;} bottom: -1px;
.site-fix .site-content{margin-left: 220px;} width: 100%;
.site-fix-footer .site-tree{/*margin-bottom: 120px;*/} height: 5px;
background-color: #5FB878;
}
.site-title{ margin: 30px 0 20px;}
.site-title fieldset{border: none; padding: 0; border-top: 1px solid #eee;}
.site-title fieldset legend{margin-left: 20px; padding: 0 10px; font-size: 22px; font-weight: 300;}
.site-text a{color: #01AAED;}
.site-h1{margin-bottom: 20px; line-height: 60px; padding-bottom: 10px; color: #393D49; border-bottom: 1px solid #eee; font-size: 28px; font-weight: 300;}
.site-h1 .layui-icon{position: relative; top: 5px; font-size: 35px; margin-right: 10px;}
.site-text{position:relative;}
.site-text p{margin-bottom: 10px; line-height:22px;}
.site-text em{padding: 0 3px; font-weight: 500; font-style: italic; color: #666;}
.site-text code{margin:0 5px; padding: 3px 10px; border: 1px solid #e2e2e2; background-color: #fbfbfb; color: #666; border-radius: 2px;}
.site-table{width: 100%; margin: 10px 0;}
.site-table thead{background-color:#f2f2f2; }
.site-table th,
.site-table td{padding: 6px 15px; min-height: 20px; line-height: 20px; border:1px solid #ddd; font-size: 14px; font-weight: 400;}
.site-table tr:nth-child(even){background: #fbfbfb;}
.site-block{padding: 20px; border: 1px solid #eee;}
.site-block .layui-form{margin-right: 200px;}
/* 更新日志 */
.site-changelog .layui-timeline-title h2{display: inline-block;}
.site-changelog .layui-timeline-title .layui-badge-rim{top: -2px; left: 10px;}
/* 颜色 */
.site-doc-color{font-size: 0;}
.site-doc-color li{display: inline-block; vertical-align: middle; width: 180px; margin-left: 20px; margin-bottom: 20px; padding: 20px 10px; color: #fff; text-align: center; border-radius: 2px; line-height: 22px; font-size: 14px;}
.site-doc-color li p[tips]{opacity: 0.8; font-size: 12px;}
.site-doc-necolor li{width: 108px; margin-top: 15px; margin-left: 0; border-radius: 0;}
.site-doc-bgcolor li{padding: 10px;}
/* 宫格 */
.site-doc-icon{margin-bottom: 50px; font-size: 0;}
.site-doc-icon li{display: inline-block; vertical-align: middle; width: 127px; height: 105px; line-height: 25px; padding: 20px 0; margin-right: -1px; margin-bottom: -1px; border: 1px solid #e2e2e2; font-size: 14px; text-align: center; color: #666; transition: all .3s; -webkit-transition: all .3s;}
.site-doc-anim li{height: auto;}
.site-doc-icon li .layui-icon{display: inline-block; font-size: 36px;}
.site-doc-icon li .doc-icon-name,
.site-doc-icon li .doc-icon-code{color: #c2c2c2;}
.site-doc-icon li .doc-icon-fontclass{height: 40px; line-height: 20px; padding: 0 5px; font-size: 13px; color: #333; }
.site-doc-icon li:hover{background-color: #f2f2f2; color: #000;}
/* 栅格示例 */
.grid-demo{padding: 10px; line-height: 50px; text-align: center; background-color: #79C48C; color: #fff;}
.grid-demo-bg1{background-color: #63BA79;}
.grid-demo-bg2{background-color: #49A761;}
.grid-demo-bg3{background-color: #38814A;}
/* 演示 */
body .layui-layout-admin .site-demo{bottom: 60px; padding: 0;}
body .site-demo-nav .layui-nav-item{line-height: 40px}
.layui-nav-item .layui-icon{position: relative; font-size: 20px;}
.layui-nav-item a cite{padding: 0 10px;}
.site-demo .layui-main{margin: 15px; line-height: 22px;}
.site-demo-editor{position: absolute; top: 0; bottom: 0; left: 0; width: 50%; }
.site-demo-area{position: absolute; top: 0; bottom: 0; width: 100%;}
.site-demo-editor textarea{position: absolute; width: 100%; height: 100%; padding: 10px; border: none; resize: none; background-color: #F7FBFF; background-color: #13151A; color: #999; font-family: Courier New; font-size: 12px; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
.site-demo-btn{position: absolute; bottom: 15px; right: 20px;}
.site-demo-zanzhu{position: absolute; bottom: 0; left: 0; width: 100%; height: 90px; text-align: center; background-color: #e2e2e2; overflow: hidden;}
.site-demo-zanzhu>*{position: relative; z-index: 1;}
.site-demo-zanzhu:before{content: ""; position: absolute; z-index: 0; top: 50%; left: 50%; width: 120px; margin: -10px 0px 0px -60px; text-align: center; color: rgb(170, 170, 170); font-size: 18px; font-weight: 300; }
.site-demo-result{position: absolute; right: 0; top: 0; bottom: 0; width: 50%;}
.site-demo-result iframe{position: absolute; width: 100%; height: 100%;}
.site-demo-button{margin-bottom: 30px;}
.site-demo-button div{margin: 20px 30px 10px;}
.site-demo-button .layui-btn+.layui-btn{margin-left: 0;}
.site-demo-button .layui-btn{margin: 0 7px 10px 0; }
.site-demo-text a{color: #01AAED;}
.site-demo-laytpl{text-align: center;}
.site-demo-laytpl textarea,
.site-demo-laytpl div span{width: 40%; padding: 15px; margin: 0 15px;}
.site-demo-laytpl textarea{height: 300px; border: none; background-color: #3F3F3F; color: #E3CEAB; font-family: Courier New; resize: none;}
.site-demo-laytpl div span{display: inline-block; text-align: center; background: #101010; color: #fff;}
.site-demo-tplres{margin: 10px 0; text-align: center}
.site-demo-tplres .site-demo-tplh2,
.site-demo-tplres .site-demo-tplview{display: inline-block; width: 50%;}
.site-demo-tplres h2{padding: 15px; background: #e2e2e2;}
.site-demo-tplres h3{font-weight: 700;}
.site-demo-tplres div{padding: 14px; border: 1px solid #e2e2e2; text-align: left;}
.site-demo-upload,
.site-demo-upload img{width: 200px; height: 200px; border-radius: 100%;}
.site-demo-upload{position: relative; background: #e2e2e2;}
.site-demo-upload .site-demo-upbar{position: absolute; top: 50%; left: 50%; margin: -18px 0 0 -56px;}
.site-demo-upload .layui-upload-button{background-color: rgba(0,0,0,.2); color: rgba(255,255,255,1);}
.site-demo-util{position: relative; width: 300px;}
.site-demo-util img{width: 300px; border-radius: 100%;}
.site-demo-util span{position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #333; cursor: pointer;}
@-webkit-keyframes demo-fengjie {
0% {-webkit-filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;}
80% {-webkit-filter: blur(50px); opacity: 0.95;}
100% {-webkit-filter: blur(20px); opacity: 0; background: #fff;}
}
@keyframes demo-fengjie {
0% {filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;}
80% {filter: blur(50px); opacity: 0.95;}
100% {filter: blur(20px); opacity: 0; background: #fff;}
}
.site-demo-fengjie{-webkit-animation-name: demo-fengjie; animation-name: demo-fengjie; -webkit-animation-duration: 5s; animation-duration: 5s;}
.layui-layout-admin .site-demo-body{top: 106px;}
.site-demo-title{position: fixed; left: 200px; right: 0; top: 65px;}
.site-demo-code{position: absolute; left: 0; top: 0; width: 100%; height: 100%; border: none; padding: 10px; resize: none; font-size: 12px; background-color: #F7FBFF; color: #881280; font-family: Courier New;}
.site-demo-overflow{overflow: hidden;}
/* 其它 */
#trans-tooltip,
#tip-arrow-bottom,
#tip-arrow-top{display: none !important;}
/* 独立组件 与 主页 */
.alone{text-align: center; background-color: #009688; color: #fff; font-weight: 300; transition: all .3s; -webkit-transition: all .3s;}
.alone:hover{background-color: #5FB878;}
.alone a{display: block; padding: 50px 20px; color: #fff; font-size: 30px;}
.alone a cite{display: block; padding-top: 10px; font-size: 14px;}
.alone-banner{height: 190px; text-align: center; font-weight: 300; background-color: #009688; color:#fff;}
.alone-banner h1{padding-top: 60px; line-height: 32px; font-size: 30px; font-weight: 300;}
.alone-banner p{padding-top: 20px; color: #e2e2e2; color: rgba(255,255,255,.8);}
.alone-nav .layui-tab-title li{margin-right: 30px; padding: 0; color: #666;}
.alone-nav .layui-tab-title li a{ padding: 0 20px;}
.alone-download{margin: 30px 0;}
.alone-download .layui-btn{margin-right: 10px;}
.alone-download span{display: inline-block; line-height: 44px; padding-right: 20px;}
.alone-download span em{color: #999;}
.alone-title{margin-top: 20px;}
.alone-download-btn{text-align: center; margin-top: 50px; font-size: 0;}
.alone-download-btn .layui-btn{position: relative; width: 206px; height: 60px; line-height: 60px; font-size: 26px; font-weight: 300;}
.alone-download-btn .layui-btn+.layui-btn{margin: 0;}
.alone-download-btn .alone-download-right{margin-left: 20px !important; border-color: #009688; background: none; color: #009688;}
.alone-download-btn .layui-btn img{position: relative; top: -3px; width: 118px;}
/* 适配多设备 */
@media screen and (max-width: 750px) {
.layui-main{width: auto; margin: 0 10px;}
.logo,
.header-demo .logo{left: 10px;}
.component{display: none}
.header .layui-nav-child{left: auto; right: 0;}
.site-demo-overflow{overflow: auto;}
.site-nav-layim{display: none !important;} /* 设置特定类名header-index的头部背景颜色以及去除边框 */
.header .layui-nav .layui-nav-item{margin: 0;} .header-index{
.header .layui-nav .layui-nav-item a{padding: 0 20px;} background-color: #05031A;
.header .layui-nav .layui-nav-item[pc]{display: none;} border: none;
.header .layui-nav .layui-nav-item[mobile]{display: inline-block;} }
.site-banner{height: 300px;} .header-index.site-banner-bg{}
.site-banner-bg{background-size: cover;} /* 根据不同季节属性设置header-index不同的背景颜色 */
.site-zfj{height: 100px; padding-top: 5px;} .header-index[spring]{
.site-zfj i{top: 10px; width: 100px; height: 100px; margin-left: -50px; font-size: 100px;} background-color: #0D1206;
.site-desc{background-size: 70%; margin: 0;} }
.site-desc .web-font-desc{padding-top: 20px; font-size: 30px;} .header-index[summer]{
.site-desc cite{display: none;} background-color: #0A0E11;
.site-download{margin-top: 0; } }
.site-download a{height: 40px; line-height: 40px; padding: 0 25px 0 60px; border-radius: 30px; color: #fff; font-size: 16px;} .header-index[autumn]{
.site-download a cite{left: 20px;} background-color: #100903;
.site-banner-other{bottom: 10px;} }
.header-index[winter]{
background-color: #110F25/*#06041C*/;
}
.site-idea{margin: 20px 0;} /* 设置特定类名header-demo的头部高度以及去除底部边框 */
.site-idea li{margin: 0 0 20px 0; width: 100%; height: auto; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} .header-demo{
.site-hengfu img{max-width: 100%} height: 60px;
border-bottom: none;
}
/* 设置header-demo内logo的左边距 */
.header-demo.logo{
left: 40px;
}
/* 设置header-demo内layui-nav的顶部位置 */
.header-demo.layui-nav{
top: 0;
}
/* 设置header-demo内layui-nav项的外边距 */
.header-demo.layui-nav.layui-nav-item{
margin: 0 10px;
}
.site-block .layui-form{margin-right: 0;} /* 设置header-demo内layui-nav中当前选中项链接的内边距 */
.header-demo.layui-nav.layui-this a{
padding: 0 30px;
}
.layui-layer-dir{display: none;} /* 设置组件的定位、宽度以及距离左边和顶部的距离 */
.site-tree{position: fixed; top: 0; bottom: 0; min-height: 0; overflow: auto; z-index: 1000; left: -260px; background-color: #fff; transition: all .3s; -webkit-transition: all .3s;} .component{
.site-content{width: 100%; padding: 0; overflow: auto;} position: absolute;
.site-content img{max-width: 100%;} width: 160px;
.site-tree-mobile{display: block!important; position: fixed; z-index: 100000; bottom: 15px; left: 15px; width: 50px; height: 50px; line-height: 50px; border-radius: 2px; text-align: center; background-color: rgba(0,0,0,.7); color: #fff;} left: 120px;
.site-home .site-tree-mobile{display: none!important;} top: 16px;
.site-mobile .site-tree-mobile{display: none !important;} }
.site-mobile .site-tree{left: 0;} /* 设置组件内输入框的高度、左边内边距、背景颜色、边框以及文字颜色、字体大小等样式 */
.site-mobile .site-mobile-shade{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;} .component.layui-input{
.site-tree-mobile i{font-size: 20px;} height: 30px;
.layui-code-view{-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;} padding-left: 12px;
background-color: #424652;
background-color: rgba(255,255,255,.05);
border: none 0;
color: #fff;
color: rgba(255,255,255,.5);
font-size: 12px;
}
/* 隐藏组件内layui-form-select的下拉箭头 */
.component.layui-form-select.layui-edge{
display: none;
border-top-color: #999;
}
/* 设置组件内layui-form-select下拉列表的顶部位置以及背景颜色透明度 */
.component.layui-form-select dl{
top: 36px;
background-color: rgba(255,255,255,.9);
}
/* 当在header-demo内时重新设置组件的左边距 */
.header-demo.component{
left: 185px;
}
.layui-layout-admin .layui-side{position: fixed; top: 0; left: -260px; transition: all .3s; -webkit-transition: all .3s; z-index: 10000;}
.layui-body{position: static; bottom: 0; left: 0;}
.site-mobile .layui-side{left: 0;}
.site-mobile .layui-side-child{top: 50%; left: 200px; height: 300px; margin-top: -100px;}
body .layui-layout-admin .footer-demo{position: static; height: auto; line-height: 30px;} /* 子侧边栏相关样式 */
.footer-demo p{height: auto;} /* 设置layui-side-child的宽度、左边距、底部距、右边框以及背景颜色!important表示高优先级覆盖 */
.layui-side-child{
width: 160px!important;
left: 200px;
bottom: 60px!important;
border-right: 1px solid #eee;
background-color: #fff;
}
/* 设置layui-side-child内滚动区域的宽度 */
.layui-side-child.layui-side-scroll{
width: 170px;
}
/* 设置layui-side-child内导航的内边距、宽度、圆角以及去除默认背景 */
.layui-side-child.layui-nav{
padding: 10px 0;
width: 160px;
border-radius: 0;
background: none;
}
/* 设置layui-side-child内导航子菜单的圆角 */
.layui-side-child.layui-nav-child{
border-radius: 0;
}
/* 设置layui-side-child内导航标题链接以及鼠标悬停时的颜色!important表示高优先级覆盖 */
.layui-side-child.layui-nav.layui-nav-title a,
.layui-side-child.layui-nav.layui-nav-title a:hover,
.layui-side-child.layui-nav-itemed>a{
color: #666!important;
}
/* 设置layui-side-child内展开的导航项的子菜单的下边距以及去除默认背景!important表示高优先级覆盖 */
.layui-side-child.layui-nav-itemed.layui-nav-child{
margin-bottom: 10px;
background: none!important;
}
/* 设置layui-side-child内导航项链接的高度、行高、颜色等样式 */
.layui-side-child.layui-nav.layui-nav-item a{
height: 30px;
line-height: 30px;
color: #666;
}
/* 设置layui-side-child内导航项链接鼠标悬停时不改变背景!important表示高优先级覆盖 */
.layui-side-child.layui-nav.layui-nav-item a:hover{
background: none!important;
}
/* 设置layui-side-child内导航子菜单链接的颜色!important表示高优先级覆盖 */
.layui-side-child.layui-nav.layui-nav-child a{
color: #999!important;
}
/* 隐藏layui-side-child内导航更多图标 */
.layui-side-child.layui-nav.layui-nav-more{
display: none;
}
/* 设置layui-side-child内导航树中当前选中项以及其子菜单中当前选中项的样式包括背景、颜色等!important表示高优先级覆盖 */
.layui-side-child.layui-nav-tree.layui-this,
.layui-side-child.layui-nav-tree.layui-this>a,
.layui-side-child.layui-nav-tree.layui-nav-child dd.layui-this,
.layui-side-child.layui-nav-tree.layui-nav-child dd.layui-this a{
background: none;
color: #5FB878!important;
}
/* 设置layui-side-child内导航子菜单链接鼠标悬停时的颜色!important表示高优先级覆盖 */
.layui-side-child.layui-nav.layui-nav-child a:hover{
color: #009688!important;
}
/* 设置layui-side-child内导航条可能是当前选中项指示条的背景颜色 */
.layui-side-child.layui-nav-bar{
background-color: #5FB878;
}
.site-demo-area,
.site-demo-editor,
.site-demo-result,
.site-demo-editor textarea,
.site-demo-result iframe{position: static; width: 100%;}
.site-demo-editor textarea{height: 350px;}
.site-demo-zanzhu{display: none;}
.site-demo-btn{bottom: auto; top: 370px;}
.site-demo-result iframe{height: 500px;}
.site-demo-laytpl textarea, .site-demo-laytpl div span{margin: 0;} /* 底部相关样式 */
.site-demo-tplres .site-demo-tplh2, .site-demo-tplres .site-demo-tplview{width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;} /* 设置底部的内边距、行高、文本对齐方式、颜色以及字体粗细 */
.footer{
padding: 30px 0;
line-height: 30px;
text-align: center;
color: #666;
font-weight: 300;
}
/* 当在layui-layout-admin内时设置特定类名footer-demo的高度、内边距 */
body.layui-layout-admin.footer-demo{
height: 50px;
padding: 5px 0;
}
/* 设置底部链接的内边距 */
.footer a{
padding: 0 5px;
}
/* 设置网站联盟相关样式,设置外边距以及内部元素垂直对齐方式 */
.site-union{
margin-top: 10px;
color: #999;
}
.site-union>*{
display: inline-block;
vertical-align: middle;
}
/* 设置有upyun属性的网站联盟内链接图片的宽度 */
.site-union a[upyun] img{
width: 80px;
}
/* 设置网站联盟内span的相对定位以及顶部偏移量 */
.site-union span{
position: relative;
top: 3px;
}
/* 设置网站联盟内span内链接的样式去除内边距、显示为行内元素、颜色等 */
.site-union span a{
padding: 0;
display: inline;
color: #999;
}
/* 设置网站联盟内span内链接鼠标悬停时添加下划线 */
.site-union span a:hover{
text-decoration: underline;
}
.site-demo-title{position: static; left: 0;} /* 设置footer-demo内段落的显示方式、垂直对齐方式、高度以及右边内边距 */
body .layui-layout-admin .site-demo{} .footer-demo p{
.site-demo-code{position: static; height: 350px;} display: inline-block;
vertical-align: middle;
height: 50px;
padding-right: 10px;
}
/* 设置footer-demo内网站联盟的相对定位以及顶部偏移量 */
.footer-demo.site-union{
position: relative;
top: -9px;
} }
/* 首页banner部分样式 */
/* 设置banner的定位、高度、文本对齐方式以及溢出隐藏背景颜色 */
.site-banner{
position: relative;
height: 600px;
text-align: center;
overflow: hidden;
background-color: #393D49;
}
/* 以下两个类设置绝对定位覆盖整个banner区域可能后续用于背景图或主要内容定位 */
.site-banner-bg
,.site-banner-main{
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
/* 可能用于设置banner背景图的定位这里只设置了背景位置的垂直方向为顶部对齐 */
.site-banner-bg{
background-position: center 0;
}
@-webkit-keyframes site-anim-closeup{ /* 特写 */ /* 设置特定类名site-zfj的内上边距、高度 */
from {-webkit-transform: translate3d(0, 0, 0) scale(1); opacity: 1;} .site-zfj{
to { -webkit-transform: translate3d(0, 400px, 0) scale(2); opacity: 0.5;} padding-top: 25px;
height: 220px;
} }
@keyframes site-anim-closeup{ /* 设置site-zfj内图标i标签的定位、宽度、高度、水平居中以及字体大小、颜色等样式 */
from {transform: translate3d(0, 0, 0) scale(1); opacity: 1;} .site-zfj i{
to {transform: translate3d(0, 400px, 0) scale(2); opacity: 0.5;} position: absolute;
left: 50%;
top: 50px;
width: 200px;
height: 200px;
margin-left: -100px;
font-size: 180px;
color: #c2c2c2;
} }
.site-out-up{-webkit-animation-duration: 3s; animation-duration: 3s; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-name: site-anim-closeup; animation-name: site-anim-closeup; overflow: hidden;}
/* 定义名为site-zfj的webkit浏览器下的动画关键帧设置不同阶段的透明度、位移、旋转、缩放等动画效果 */
@-webkit-keyframes site-zfj {
0% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(0deg) scale(1);}
10% {opacity: 0.8; -webkit-transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);}
35% {opacity: 0.6; -webkit-transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);}
50% {opacity: 0.4; -webkit-transform: translate3d(0, 0, 0) rotate(360deg) scale(0);}
80% {opacity: 0.2; -webkit-transform: translate3d(0, 0, 0) rotate(720deg) scale(1);}
90% {opacity: 0.1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);}
100% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);}
}
/* 定义名为site-zfj的通用动画关键帧设置不同阶段的透明度、位移、旋转、缩放等动画效果 */
@keyframes site-zfj {
0% {opacity: 1; transform: translate3d(0, 0, 0) rotate(0deg) scale(1);}
10% {opacity: 0.8; transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);}
35% {opacity: 0.6; transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);}
50% {opacity: 0.4; transform: translate3d(0, 0, 0) rotate(360deg) scale(0);}
80% {opacity: 0.2; transform: translate3d(0, 0, 0) rotate(720deg) scale(1);}
90% {opacity: 0.1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);}
100

File diff suppressed because it is too large Load Diff

@ -1,27 +1,24 @@
/** /**
* @Name: æ´ææ¤ç¯åšæº
@Name: æ´ææ¤ç¯åšæº * @Author: xuxinyu
@Author: xuxinyu
*/ */
/** 鍥炬爣瀛椾綋 (可能是关于字体图标相关的设置部分,用于引入字体文件等) **/
/** 鍥炬爣瀛椾綋 **/ @font-face {
@font-face {font-family: 'layui-icon'; font-family: 'layui-icon';
src: url('font/iconfont.eot?v=1'); src: url('font/iconfont.eot?v=1'); /* eot格式字体文件路径版本号为v=1 */
src: url('font/iconfont.eot?v=1#iefix') format('embedded-opentype'), src: url('font/iconfont.eot?v=1#iefix') format('embedded-opentype'), /* 针对IE浏览器的嵌入式opentype格式字体文件路径 */
url('font/iconfont.svg?v=1#iconfont') format('svg'), url('font/iconfont.svg?v=1#iconfont') format('svg'), /* svg格式字体文件路径 */
url('font/iconfont.woff?v=1') format('woff'), url('font/iconfont.woff?v=1') format('woff'), /* woff格式字体文件路径 */
url('font/iconfont.ttf?v=1') format('truetype'); url('font/iconfont.ttf?v=1') format('truetype'); /* truetype格式字体文件路径 */
} }
/**会员中心**/ /**会员中心 (不太明确准确含义,从样式类名推测可能是用于标识某种激活状态的样式设置) **/
.activate{ .activate{
background-color: #b3bde8; background-color: #b3bde8; /* 设置背景颜色 */
} }
/* font-class (以下是定义了一些使用字体图标时对应的字符内容,用于显示特定图标) */
/* font-class */
.layui-icon-shop-download:before{content:"\e69f"} .layui-icon-shop-download:before{content:"\e69f"}
.layui-icon-shop-eye:before{content:"\e63a"} .layui-icon-shop-eye:before{content:"\e63a"}
.layui-icon-shop-buy:before{content:"\e601"} .layui-icon-shop-buy:before{content:"\e601"}
@ -30,327 +27,381 @@
.layui-icon-shop-dianpu:before{content:"\e7dc"} .layui-icon-shop-dianpu:before{content:"\e7dc"}
.layui-icon-shop-more:before{content:"\e9c2"} .layui-icon-shop-more:before{content:"\e9c2"}
/* 棰滆壊 */ /* 棰滆壊 (可能是用于设置不同背景颜色类,方便应用到不同元素以体现不同的视觉效果或分类) */
.store-bg-green{background-color: #5CD47D;} .store-bg-green{background-color: #5CD47D;}
.store-bg-orange{background-color: #FF9434;} .store-bg-orange{background-color: #FF9434;}
.store-bg-blue{background-color: #5694E9;} .store-bg-blue{background-color: #5694E9;}
/* 杈呭姪 */ /* 杈呭姪 可能是与鼠标悬停等交互效果相关的样式设置这里针对的是layui-card相关元素的头部和主体部分样式 */
.fly-html-store .layui-card-header{height: 50px; line-height: 50px;} .fly-html-store.layui-card-header{
.fly-html-store .layui-card-body{padding: 15px;} height: 50px;
.store-color-bar{display: inline-block; width: 67px; height: 20px;} line-height: 50px;
/*login*/
.login-content .login-bg{width: 100%; background: url(../images/load_bg.jpg) no-repeat; background-size: cover;}
.login-content .login-bg .login-cont{ height: 772px; position: relative;}
.login-content .login-bg .login-cont .form-box{width: 300px; height: 390px; border:1px solid #d9dadc; background: #fff; position: absolute; top: 196px; right: 90px; padding:0 30px;}
.login-content .login-bg .login-cont .form-box legend{font-size: 20px; color: #323232; text-align: center; padding:50px 0;}
.login-content .login-bg .login-cont .layui-inline,.login-content .login-bg .login-cont .layui-input-inline{width: 100%; position: relative;}
.login-content .login-bg .login-cont .layui-input-inline .iphone-icon{position: absolute; top: 8px; left: 10px; color: #d3d3d3; font-size: 20px;}
.login-content .login-bg .login-cont .iphone{margin-bottom: 20px;}
.login-content .login-bg .login-cont .iphone .layui-input{padding-left: 40px;}
.login-content .login-bg .login-cont .veri-code .layui-btn{width: 102px; background: #eeeeee; text-align: center; color: #333; height: 36px; line-height: 36px; display: inline-block; border:none; cursor: pointer; position: absolute; top: 1px; right: 1px; font-size: 12px; padding:0 14px;}
.login-content .login-bg .login-cont .login-btn .layui-input-block{margin-left: 0; padding-top: 25px;}
.login-content .login-bg .login-cont .login-btn .layui-input-block button{width: 100%; background: #5e6eba; font-size: 18px;}
/*end-login*/
.shop-nav{background-color: #fff;}
.topbar-logo{display: none;}
.topbar-logo img{width: 82px;}
.shop-nav .input-search{width: 100%; padding: 30px 0 10px; text-align: center; background-color: #FFF;}
.shop-nav .input-search > div{position: relative; display: inline-block;}
.shop-nav .input-search input{vertical-align: middle; width: 500px; height: 40px; background: #eff4f5; border: none; outline: none; padding-left: 10px; border-top-left-radius: 2px; border-bottom-left-radius: 2px;}
.shop-nav .input-search button.layui-btn-shop{vertical-align: middle; width: 80px; height: 40px; background: #5e6eba; border-top-left-radius: 0px; border-bottom-left-radius: 0px;}
.shop-nav .input-search button.layui-btn-shop i{font-size: 22px; line-height: 40px;}
.shop-nav .input-search dl{position: relative; text-align: left; font-size: 12px; line-height: 30px; top: 5px; left: 10px;}
.shop-nav .input-search dl dd, .shop-nav .input-search dl dt{display: inline-block; color: #9495a4;}
.shop-nav .input-search dl dd a{color: #b3b6b8; margin-right: 10px;}
.shop-nav .input-search dl dd a:hover{color: #9495a4;}
.shop-nav .input-search a.userBtn{width: 60px; padding: 0; text-align: center; height: 40px; font-size: 12px; margin-left: 20px;}
.shop-nav .input-search .layui-container{display: none;}
.shop-nav .input-search.scroll{position: fixed; top: 60px; z-index: 999; top: 0; padding-top: 10px; box-shadow: 0px 3px 3px rgba(0,0,0,0.15);}
.shop-nav .input-search.scroll .layui-container{display: block;}
.shop-nav .input-search.scroll .topbar-logo{display: block; position: absolute; left: 15px; bottom: 5px; z-index: 10;}
.shop-nav .input-search.scroll>div{display: block;}
.shop-nav .input-search.scroll>div>*{display: inline-block;}
.shop-nav .input-search.scroll input{width: 350px;}
.shop-nav .shop-banner{ margin-top: 70px; background: #677ee4; text-align: center;}
.shop-nav .shop-banner .layui-carousel{height: 460px; background: #5694E9;}
.shop-nav .shop-banner .layui-carousel img{width: 100%;}
.shop-nav .shop-banner .layui-carousel .layui-container{width: 1900px!important;}
.shop-banner .layui-carousel>*[carousel-item] > *{background: none;}
.shop-banner .layui-carousel>*[carousel-item]:before{color: #fff; color: rgba(255,255,255,.6);}
.shop-nav .product-list{position: absolute; left: 0; width: 220px; z-index: 100; /* height: 520px; */ top: -60px; background: #fff; box-shadow: 0px 1px 5px rgba(0,0,0,0.15);}
.shop-nav .product-list dl{font-size: 0;}
.shop-nav .product-list dl dt{display: none; font-size: 16px; background: #5e6eba; line-height: 60px;}
.shop-nav .product-list dl dt a{color: #FFF;}
.shop-nav .product-list dl dd{display: inline-block; font-size: 16px; color: #666; border: 1px solid #f0f0f0; border-radius: 2px; width: 30%; margin-left: 1.5%; margin-bottom: 10px;}
.shop-nav .product-list dl dd a{display: block; line-height: 40px;}
.shop-nav .product-list dl dd a:hover{color: #5eba78; background: #f0f0f0;}
/*鐑棬妯℃澘*/
.shop-temp .temp-hot{padding-top: 80px; padding-bottom: 80px; background: #FFF; text-align: center;}
.shop-temp .temp-hot p{padding-bottom: 10px; text-align: center; font-size: 16px;}
.temp-title-cn{margin-bottom: 52px; color: #333; font-size: 28px!important; line-height: 36px; position: relative; text-align: center; font-weight: 300;}
.temp-title-cn span{width: 35px; height: 2px; background: #333; display: inline-block; position: absolute; top: 16px; left: 50%; margin-left: -110px;}
.temp-title-cn span:last-child{margin-left: 70px;}
.temp-title-en{display: inline-block; color: #6e6e6e; font-size: 24px; line-height: 60px; margin-bottom: 52px;}
.shop-temp .temp-hot .temp-img{overflow: hidden;}
.shop-temp .temp-hot .temp-img img{width: 100%; transition: 2s}
.shop-temp .temp-hot .temp-img img:hover{transform: scale(1.1); transition: 2s;}
.shop-temp .temp-hot .temp-img + p{color: #333; font-size: 18px; line-height: 60px;}
.shop-temp .temp-hot p.price span{line-height: 14px; color: #f44e2d; margin-right: 15px;}
.shop-temp .temp-hot p.price del{line-height: 14px; color: #9c9c9c;}
/*鎵�鏈夋ā鏉�*/
.shop-temp .temp-normal{padding-top: 60px;padding-bottom:60px}
.shop-temp .temp-normal .title{font-size: 26px; color: #333; letter-spacing: 3px; margin-bottom: 55px; font-weight: 300;}
.shop-temp .temp-normal .title a i{font-size: 28px; color: #5eba78;}
.shop-temp .temp-normal .layui-btn-group{position: absolute; top: 0; right: 0; border: 1px solid #5eba78; border-radius: 2px;}
.shop-temp .temp-normal .layui-btn-group .layui-btn-shop-cost{font-size: 16px; color: #5eba78; border-left: none; background-color: transparent; height: 34px; line-height: 34px; padding: 0 14px;}
.shop-temp .temp-normal .layui-btn-group .layui-btn-shop-cost.active{color: #f2f2f2; background-color: #5eba78;}
.store-list-box{display: block; background-color: #FFF; transition: all .5s; -webkit-transition: all .5s; padding-bottom: 6px;}
.store-list-box:hover{box-shadow: 0px 0px 5px 5px rgba(0,0,0,0.05);}
.store-list-box img{max-width: 100%;}
.store-list-box .store-list-cover{width: 100%}
.shop-temp .temp-normal .shop-more{text-align: center; margin-top: 20px; line-height: 130px;}
.shop-temp .temp-normal .shop-more i{font-size: 50px; color: #a9a9a9;}
/*璇︽儏椤�*/
.store-detail-info{position: absolute; right: 15px; top: 0; font-size: 0}
.store-detail-info .item{display: inline-block; vertical-align: middle; font-size: 14px;}
.store-self-product{position: relative; display: inline-block; vertical-align: middle; font-size: 0;}
.store-self-product span{font-size: 14px; height: 26px; line-height: 26px; padding: 0 10px; border-radius: 2px 0 0 2px; vertical-align: middle;}
.store-self-product span:last-child{border-radius: 0 2px 2px 0;}
.shop-nav.shopdata{padding-bottom: 0;}
/*.shop-nav.shopdata .input-search input{width: 50%;}
.shop-nav.shopdata .input-search button.layui-btn-shop{padding: 0; text-align: center; width: 60px;}*/
.shopdata-intro{margin: 30px 0; background-color: #fff;}
.shopdata-intro .intro-img{position: relative; margin: 15px; margin-right: 50px; min-height: 268px; text-align: center; background-color: #fbfbfb;}
.shopdata-intro .intro-img{display: flex; justify-content: center; align-items: center;}
.shopdata-intro .intro-img img{max-width: 100%;}
.shopdata-intro .intro-img:after{content:''; position: absolute; z-index: 10; left: 0; top: 0; width: 100%; height: 100%; border: 1px solid rgba(0,0,0,.05); transition: all .3s; -webkit-transition: all .3s; pointer-events: none;}
.shopdata-intro .intro-txt{padding: 10px;}
.shopdata-intro .intro-txt .title{line-height: 35px; padding: 0 0 20px; font-size: 32px; color: #333;}
.shopdata-intro .intro-txt .title span{display: inline-block; font-size: 18px; line-height: 30px; padding: 0 10px; color: #FFF; background-color: #383e49; border-radius: 3px; vertical-align: top; margin-top: 24px; margin-right: 10px;}
.shopdata-intro .intro-txt p.desc{font-size: 16px; color: #8b8b8b; line-height: 28px; letter-spacing: 1px;}
/* .store-attrs{padding: 20px 0 15px;} */
.store-attrs li{display: inline-block; margin-right: 30px; color: #bbb; vertical-align: middle;}
.store-attrs li i{margin-right: 12px;}
.store-attrs li span,
.store-attrs li img{margin-left: 10px;}
.store-attrs li img{width: 20px; position: relative; top: -3px;}
.store-attrs li:last-child span{display: inline-block; width: 30px; height: 8px; background-color: #009688;}
.store-attrs .summary{width: 100%; height: 249px; background: #f5f5f5; padding-top: 5px; }
.store-attrs .summary p{line-height: 40px; padding-left: 34px; color: #888888;}
.store-attrs .summary p span{padding-right: 40px;}
.store-attrs .summary .activity .price{font-size: 30px; color: #ee0000;}
.store-attrs .summary .activity .price i{font-size: 14px;}
.store-attrs .summary .activity .status{font-size: 20px; color: #ee0000;}
.store-attrs .summary .activity .status i{font-size: 14px;}
.shopdata-intro .intro-txt #introrate{margin-bottom: 45px;}
.shopdata-intro .intro-txt #shopEvent a{display: inline-block; width: 120px; margin-right: 25px; line-height: 32px; font-size: 14px; color: #FFF; text-align: center; border-radius: 2px;}
.shopdata-intro .intro-txt #shopEvent a i{font-size: 20px; margin-right: 10px; display: inline-block; vertical-align: top;}
.shopdata-intro .intro-txt .collect-price{color: #f44e2d; font-size: 26px; padding-top: 15px; padding-bottom: 20px; line-height: 22px;}
.shopdata-intro .intro-txt.collect .collect-price span{font-size: 14px;}
.store-detail-price{padding-top: 15px;}
.store-detail-price span{ font-size: 26px; color: #EF4E33;}
.store-detail-price cite{font-style: normal;}
.store-detail-active{padding: 29px 0 20px;}
.shopdata-content .layui-card-body{padding: 30px;}
.shopdata-content .detail-body img{border: 1px solid #f6f6f6; cursor: default;}
.shopdata-reply{background: #FFF; padding: 40px 30px 20px; border-top: 1px solid #f2f2f2;}
.shopdata-reply dt{color: #333; font-size: 18px; line-height: 58px; font-weight: bold;}
.shopdata-reply dd{border-bottom: 1px solid #f2f2f2; position: relative; padding-top: 38px; padding-bottom: 40px;}
.shopdata-reply dd:last-child{border-bottom: none;}
.shopdata-reply dd .reply-img{width: 58px; margin-right: 25px;}
.shopdata-reply dd .reply-img img{width: 100%;}
.shopdata-reply dd .reply-img + p{font-size: 18px; color: #555; line-height: 18px; position: absolute; top: 40px; left: 83px;}
.shopdata-reply dd .reply-img + p span{color: #cacaca; font-size: 14px; display: inline-block; vertical-align: middle; margin-left: 20px;}
.shopdata-reply dd .reply-content{color: #868686; line-height: 14px; position: absolute; top: 80px; left: 83px;}
.shopdata-reply dd .reply-content + span{color: #cacaca; font-size: 14px; position: absolute; top: 40px; right: 20px;}
.shopdata-reply dd .reply-content + span i{font-size: 14px;margin-right: 10px;}
/*鍒楄〃椤�*/
.shop-temp.shoplist .temp-normal{padding-top: 45px;}
.shop-temp.shoplist div.shoplist{padding-top: 45px;}
.store-list-box h2{font-size: 18px; padding: 20px 15px; line-height: 26px;text-align: center;}
.temp-hot .store-list-box h2{padding: 20px 10px;}
.store-list-box>div{position: relative; padding: 0 15px 15px;}
.store-list-pay{border-color: #FF5722; color: #FF5722;}
.store-list-colorbar{position: absolute; right: 15px; top: -1px;}
.shop-temp.shoplist #shopList{margin-bottom: 100px;}
.shop-temp.shoplist #shopList .layui-laypage{display: block; text-align: center; margin-top: 70px;}
.shop-temp.shoplist #shopList .layui-laypage a
,.shop-temp.shoplist #shopList .layui-laypage span{padding: 0 12px; font-size: 14px; line-height: 30px; height: 30px; margin-right: 4px; border-radius: 3px; color: #e3e3e3;}
.shop-temp.shoplist #shopList .layui-laypage span em{background-color: #5eba78 !important;}
.shop-temp.shoplist .temp-normal .layui-form{padding-bottom: 30px; border-bottom: 1px solid #e9e9e9;}
.shop-temp.shoplist .temp-normal .layui-form input{width: 160px; border: none; background-color: transparent; font-size: 16px; color: #8a8a8a;}
.shop-temp.shoplist .temp-normal .layui-form dl{border: none; border-radius: 2px; box-shadow: 0px 0px 5px 5px rgba(0,0,0,0.1); color: #8a8a8a; text-align: center;}
.shoplist-filter{margin-top: 30px;}
.shoplist-filter .layui-card-body{padding-left: 25px;}
.store-cat-item{font-size: 14px; line-height: 26px; padding: 15px 0 0;}
.store-cat-item span{color: #555; width: 100px; vertical-align: top;}
.store-cat-item span,
.store-cat-item ul,
.store-cat-item ul li{display: inline-block; vertical-align: middle;}
.store-cat-item ul{width: 80%; vertical-align: top;}
.store-cat-item ul li{margin-right: 10px; cursor: pointer;}
.store-cat-item span i{font-size: 14px; margin-right: 8px;}
.shoplist-filter .layui-container li.active a,
.shoplist-filter .layui-container li a:hover{color: #5eba78;}
.store-cat-item.colorFilt li{width: 20px; height: 12px; line-height: 12px; margin-right: 2px; position: relative;}
.store-cat-item.colorFilt li.bg1{background: #f35343 }
.store-cat-item.colorFilt li.bg2{background: #fda925 }
.store-cat-item.colorFilt li.bg3{background: #f1e73a }
.store-cat-item.colorFilt li.bg4{background: #009688 }
.store-cat-item.colorFilt li.bg5{background: #39c2d2 }
.store-cat-item.colorFilt li.bg6{background: #1E9FFF }
.store-cat-item.colorFilt li.bg7{background: #813bd9 }
.store-cat-item.colorFilt li.bg8{background: #f8f8f8 }
.store-cat-item.colorFilt li.bg9{background: #e6e6e6 }
.store-cat-item.colorFilt li.bg10{background: #000 }
.store-cat-item.colorFilt li.bg11{background: #794712 }
.store-cat-item.colorFilt li a{display: block; height: 12px;}
.store-cat-item.colorFilt li img{display: block;}
.store-cat-item.colorFilt li i{position: absolute; top: 1px; left: 4px; color: #FFF; font-size: 8px; font-weight: bold;}
.shoplist-filter .layui-container p.filtEnd{margin-top: 10px; line-height: 48px;}
.shoplist-filter .layui-container p.filtEnd span{margin: 0 7px; color: #ffa921;}
/* footer */
.site-union{margin-top: 10px; color: #999;}
.site-union>*{display: inline-block; vertical-align: middle;}
.site-union a[upyun] img{width: 80px;}
.site-union span{position: relative; top: 3px;}
.site-union span a{padding: 0; display: inline; color: #999;}
.site-union span a:hover{text-decoration: underline;}
@media screen and (min-width: 480px){
.shop-nav .input-search input/*, .shop-nav.shopdata .input-search input*/{width: 300px; display: inline-block;}
.shop-temp .temp-hot img + p{font-size: 20px;}
.shop-temp.shoplist #shopList .layui-laypage a,.shop-temp.shoplist #shopList .layui-laypage span{padding: 0 15px; font-size: 18px; line-height: 40px; height: 40px; margin-right: 20px;}
.shoplist-filter .layui-container div span{width: 100px;}
} }
.fly-html-store.layui-card-body{
@media screen and (max-width: 768px){ padding: 15px; /* 设置内边距 */
}
.store-color-bar{
.shop-nav .input-search input{width: 60%!important;} display: inline-block;
.shop-nav .shop-banner{margin-top: 20px;} width: 67px;
height: 20px;
.shop-nav .shop-banner .layui-carousel .layui-container{width: 350px!important;}
.shop-nav .shop-banner .layui-carousel img{width: 350px; height: 115px;}
.shop-nav .shop-banner .layui-carousel{height: 115px;}
.shop-nav .product-list{display: none;}
.shop-temp .temp-hot{padding-top: 30px;}
.temp-title-cn{margin-bottom: 30px; font-size: 20px;}
.temp-title-cn span{height: 2px; margin-left: -105px;}
.temp-title-cn span:last-child{margin-left: 55px;}
.store-list-box .store-list-cover{height: auto;}
.store-cat-item span{width: 80px;}
.store-cat-item ul{width: 60%;}
} }
/*login (以下是登录相关页面部分的样式设置) */
.login-content.login-bg{
width: 100%;
background: url(../images/load_bg.jpg) no-repeat; /* 设置背景图片,不重复显示 */
background-size: cover; /* 背景图片自适应铺满元素 */
}
.login-content.login-bg.login-cont{
height: 772px;
position: relative;
}
.login-content.login-bg.login-cont.form-box{
width: 300px;
height: 390px;
border:1px solid #d9dadc; /* 边框样式 */
background: #fff;
position: absolute;
top: 196px;
right: 90px;
padding:0 30px; /* 左右内边距设置 */
}
.login-content.login-bg.login-cont.form-box legend{
font-size: 20px;
color: #323232;
text-align: center;
padding:50px 0;
}
.login-content.login-bg.login-cont.layui-inline,.login-content.login-bg.login-cont.layui-input-inline{
width: 100%;
position: relative;
}
.login-content.login-bg.login-cont.layui-input-inline.iphone-icon{
position: absolute;
top: 8px;
left: 10px;
color: #d3d3d3;
font-size: 20px;
}
.login-content.login-bg.login-cont.iphone{
margin-bottom: 20px;
}
.login-content.login-bg.login-cont.iphone.layui-input{
padding-left: 40px; /* 输入框左边添加内边距,为图标预留空间 */
}
.login-content.login-bg.login-cont.veri-code.layui-btn{
width: 102px;
background: #eeeeee;
text-align: center;
color: #333;
height: 36px;
line-height: 36px;
display: inline-block;
border:none;
cursor: pointer;
position: absolute;
top: 1px;
right: 1px;
font-size: 12px;
padding:0 14px;
}
.login-content.login-bg.login-cont.login-btn.layui-input-block{
margin-left: 0;
padding-top: 25px;
}
.login-content.login-bg.login-cont.login-btn.layui-input-block button{
width: 100%;
background: #5e6eba;
font-size: 18px;
}
/*end-login (登录部分样式结束标记) */
@media screen and (min-width: 768px){
.shop-nav.shop-index{padding-bottom: 0;}
.shop-nav .input-search input/*,.shop-nav.shopdata .input-search input*/{width: 550px;} .shop-nav{
/*.shop-nav.shopdata .input-search button.layui-btn-shop{width: 80px;}*/ background-color: #fff; /* 导航栏背景颜色设置为白色 */
.shop-nav .input-search a.userBtn{width: 80px; font-size: 14px; margin-left: 20px;} }
.shop-nav .product-list dl dt{display: block;}
.shop-nav .product-list dl dd{display: block; width: 100%; margin: 0; line-height: 60px; border: none; border-radius: 0; border-bottom: 1px solid #f0f0f0;}
.shop-nav .product-list dl dd a{line-height: 65px;}
.shop-nav .product-list dl dd:last-child{border-bottom: none;}
.shopdata-intro .intro-txt #shopEvent a{width: 200px; line-height: 52px; font-size: 18px;}
.shopdata-intro .intro-txt #shopEvent a i{font-size: 26px;}
.shopdata-reply{padding: 40px 100px 20px;}
.shopdata-reply dd .reply-img + p span{margin-left: 40px;}
.shopdata-reply dd .reply-content + span{top: 80px; right: 20px;}
.store-cat-item .topbar-logo{
,.store-cat-item span i{font-size: 16px;} display: none; /* 初始状态下隐藏该元素 */
.store-cat-item ul li{margin-right: 27px;} }
.store-cat-item{padding-bottom: 15px;} .topbar-logo img{
.store-cat-item span{width: auto;} width: 82px; /* 图片宽度设置 */
}
.store-list-box .store-list-cover{height: 218px;} .shop-nav.input-search{
width: 100%;
padding: 30px 0 10px;
text-align: center;
background-color: #FFF;
}
.shop-nav.input-search > div{
position: relative;
display: inline-block;
}
.shop-nav.input-search input{
vertical-align: middle;
width: 500px;
height: 40px;
background: #eff4f5;
border: none;
outline: none; /* 去除输入框默认的聚焦边框效果 */
padding-left: 10px;
border-top-left-radius: 2px; /* 左上角圆角设置 */
border-bottom-left-radius: 2px; /* 左下角圆角设置 */
}
.shop-nav.input-search button.layui-btn-shop{
vertical-align: middle;
width: 80px;
height: 40px;
background: #5e6eba;
border-top-left-radius: 0px; /* 左上角圆角为0与输入框右侧衔接 */
border-bottom-left-radius: 0px;
}
.shop-nav.input-search button.layui-btn-shop i{
font-size: 22px;
line-height: 40px;
}
.shop-nav.input-search dl{
position: relative;
text-align: left;
font-size: 12px;
line-height: 30px;
top: 5px;
left: 10px;
}
.shop-nav.input-search dl dd,.shop-nav.input-search dl dt{
display: inline-block;
color: #9495a4;
}
.shop-nav.input-search dl dd a{
color: #b3b6b8;
margin-right: 10px;
}
.shop-nav.input-search dl dd a:hover{
color: #9495a4; /* 鼠标悬停时链接颜色改变 */
}
.shop-nav.input-search a.userBtn{
width: 60px;
padding: 0;
text-align: center;
height: 40px;
font-size: 12px;
margin-left: 20px;
}
.shop-nav.input-search.layui-container{
display: none; /* 初始隐藏该容器 */
}
.shop-nav.input-search.scroll{
position: fixed; /* 固定定位,滚动页面时保持在固定位置 */
top: 60px;
z-index: 999;
top: 0;
padding-top: 10px;
box-shadow: 0px 3px 3px rgba(0,0,0,0.15); /* 盒子阴影效果 */
}
.shop-nav.input-search.scroll.layui-container{
display: block; /* 滚动时显示该容器 */
}
.shop-nav.input-search.scroll.topbar-logo{
display: block;
position: absolute;
left: 15px;
bottom: 5px;
z-index: 10;
}
.shop-nav.input-search.scroll>div{
display: block;
}
.shop-nav.input-search.scroll>div>*{
display: inline-block;
}
.shop-nav.input-search.scroll input{
width: 350px; /* 滚动时输入框宽度改变 */
} }
@media screen and (min-width: 992px){
.shop-nav .input-search a.userBtn{width: 120px; font-size: 16px; margin-left: 80px;}
.shopdata-intro .intro-txt #introrate{margin-bottom: 15px;}
.shopdata-intro .intro-txt #shopEvent.scroll{width: 240px; height: 187px; position: fixed; top: 220px; right: 0; z-index: 999; border-radius: 2px; background-color: rgba(255,255,255, 0.45); }
.shopdata-intro .intro-txt #shopEvent.scroll a:first-child{position: absolute; top: 105px; left: 20px;}
.shopdata-intro .intro-txt #shopEvent.scroll a:last-child{position: absolute; top: 32px; left: 20px; margin-left: 0;}
.shopdata-intro .intro-txt.collect .collect-price{padding-top: 0; padding-bottom:0;}
.shopdata-intro .intro-txt.collect #introrate{margin-bottom: 0;}
.store-list-box .store-list-cover{height: 185px;} .shop-nav.shop-banner{
margin-top: 70px;
background: #677ee4;
text-align: center;
} }
.shop-nav.shop-banner.layui-carousel{
@media screen and (min-width: 992px) and (max-width: 1200px){ height: 460px;
.raise-detail{height: 388px;} background: #5694E9;
.raise-project .project-sup ul li img{margin-right: 5px;} }
.raise-project .project-sup ul li span{letter-spacing: 0;} .shop-nav.shop-banner.layui-carousel img{
.raise-project .project-sup ul li span:nth-child(3){right: 70px;} width: 100%; /* 轮播图图片宽度占满父元素 */
.shopdata-intro .intro-txt .title{font-size: 22px; line-height: 56px;}
.shopdata-intro .intro-txt .title span{font-size: 16px; line-height: 26px; margin-top: 14px;}
.shopdata-intro .intro-txt p + ul{padding: 10px 0 5px;}
.shopdata-intro .intro-txt.collect p + ul{padding: 5px 0;}
} }
@media screen and (min-width: 1200px){ .shop-nav.shop-banner.layui-carousel.layui-container{
.raise-detail > p{line-height: 122px;} width: 1900px!important; /* 重要样式声明,设置容器宽度 */
.raise-detail{height: 468px;} }
.raise-detail .detail-target{margin-bottom: 52px;} .shop-banner.layui-carousel>*[carousel-item] > *{
.shop-nav .shop-banner .layui-carousel img{margin-left: -15%;} background: none; /* 轮播项内部元素背景设置为空 */
}
.store-list-box .store-list-cover{height: 165px;} .shop-banner.layui-carousel>*[carousel-item]:before{
color: #fff;
color: rgba(255,255,255,.6); /* 轮播项前的元素颜色设置,带有透明度 */
} }
@media screen and (min-width: 1366px){ .shop-nav.product-list{
.layui-container{width: 1320px;} position: absolute;
.raise-detail{height: 480px;} left: 0;
width: 220px;
z-index: 100;
/* height: 520px; */
top: -60px;
background: #fff;
box-shadow: 0px 1px 5px rgba(0,0,0,0.15); /* 盒子阴影效果 */
}
.store-list-box .store-list-cover{height: 188px;} .shop-nav.product-list dl{
font-size: 0; /* 先将字体大小设为0方便后续对内部元素进行布局调整 */
}
.shop-nav.product-list dl dt{
display: none;
font-size: 16px;
background: #5e6eba;
line-height: 60px;
}
.shop-nav.product-list dl dt a{
color: #FFF;
}
.shop-nav.product-list dl dd{
display: inline-block;
font-size: 16px;
color: #666;
border: 1px solid #f0f0f0;
border-radius: 2px;
width: 30%;
margin-left: 1.5%;
margin-bottom: 10px;
}
.shop-nav.product-list dl dd a{
display: block;
line-height: 40px;
}
.shop-nav.product-list dl dd a:hover{
color: #5eba78;
background: #f0f0f0; /* 鼠标悬停时链接颜色和背景颜色改变 */
} }
@media screen and (min-width: 1440px){ /*鐑棬妯℃澘 (可能是热门商品展示相关部分的样式设置) */
.layui-container{width: 1350px;} .shop-temp.temp-hot{
.shopdata-intro .intro-txt #introrate{margin-bottom: 45px;} padding-top: 80px;
.shopdata-intro .intro-txt.collect #introrate{margin-bottom: 20px;} padding-bottom: 80px;
.shopdata-intro .intro-txt.collect .collect-price{padding-top: 15px; padding-bottom: 20px;} background: #FFF;
.shop-nav .shop-banner .layui-carousel img{margin-left: 0;} text-align: center;
}
.shop-temp.temp-hot p{
padding-bottom: 10px;
text-align: center;
font-size: 16px;
}
.temp-title-cn{
margin-bottom: 52px;
color: #333;
font-size: 28px!important;
line-height: 36px;
position: relative;
text-align: center;
font-weight: 300;
}
.temp-title-cn span{
width: 35px;
height: 2px;
background: #333;
display: inline-block;
position: absolute;
top: 16px;
left: 50%;
margin-left: -110px;
}
.temp-title-cn span:last-child{
margin-left: 70px;
}
.temp-title-en{
display: inline-block;
color: #6e6e6e;
font-size: 24px;
line-height: 60px;
margin-bottom: 52px;
}
.shop-temp.temp-hot.temp-img{
overflow: hidden; /* 超出部分隐藏,用于图片缩放效果时隐藏溢出部分 */
}
.shop-temp.temp-hot.temp-img img{
width: 100%;
transition: 2s; /* 设置过渡效果时长为2秒用于图片缩放动画 */
}
.shop-temp.temp-hot.temp-img img:hover{
transform: scale(1.1); /* 鼠标悬停时图片放大效果 */
transition: 2s;
}
.shop-temp.temp-hot.temp-img + p{
color: #333;
font-size: 18px;
line-height: 60px;
}
.shop-temp.temp-hot p.price span{
line-height: 14px;
color: #f44e2d;
margin-right: 15px;
}
.shop-temp.temp-hot p.price del{
line-height: 14px;
color: #9c9c9c;
}
.store-list-box .store-list-cover{height: 200px;} /*鎵�鏈夋ā鏈� (可能是普通商品展示相关部分的样式设置) */
.shop-temp.temp-normal{
padding-top: 60px;
padding-bottom:60px
}
.shop-temp.temp-normal.title{
font-size: 26px;
color: #333;
letter-spacing: 3px;
margin-bottom: 55px;
font-weight: 300;
}
.shop-temp.temp-normal.title a i{
font-size: 28px;
color: #5eba78;
}
.shop-temp.temp-normal.layui-btn-group{
position: absolute;
top: 0;
right: 0;
border: 1px solid #5eba78;
border-radius: 2px;
}
.shop-temp.temp-normal.layui-btn-group.layui-btn-shop-cost{
font-size: 16px;
color: #5eba78;
border-left: none;
background-color: transparent;
height: 34px;
line-height: 34px;
padding: 0 14px;
}
.shop-temp.temp-normal.layui-btn-group.layui-btn-shop-cost.active{
color: #f2f2f2;
background-color: #5eba78; /* 按钮激活状态时的样式改变 */
}
.store-list-box{
display: block;
background-color: #FFF;
transition: all.5s; /* 设置所有属性过渡效果时长0.5秒 */
-webkit-transition: all.5s;
padding-bottom: 6px;
}
.store-list-box:hover{
box-shadow: 0px 0px 5px 5px rgba(0,0,0,0.05); /* 鼠标悬停时添加盒子阴影效果 */
}
.store-list-box img{
max-width: 100%; /* 图片最大宽度为父元素宽度 */
} }
.store-list-box.store-list-cover{
width: 100%
}

File diff suppressed because it is too large Load Diff

@ -1,70 +1,133 @@
/*
* body
*
*/
body { body {
/* 设置页面内容距离浏览器窗口四周的外边距均为15px使内容不会紧贴边界 */
margin: 15px 15px 15px 15px; margin: 15px 15px 15px 15px;
/* 设置页面的背景颜色为浅灰色,营造出一种柔和的视觉背景效果 */
background: #f2f2f2; background: #f2f2f2;
} }
/*
* layuimini-container
* 使
*/
.layuimini-container { .layuimini-container {
/* 设置容器的边框为1px宽的实线颜色与页面背景色相同起到一种若有若无的边界感 */
border: 1px solid #f2f2f2; border: 1px solid #f2f2f2;
/* 给容器的四个角设置圆角效果使外观更圆润、美观这里圆角半径为5px */
border-radius: 5px; border-radius: 5px;
background-color: #ffffff /* 将容器的背景颜色设置为白色,与页面背景形成对比,突出内容区域 */
background-color: #ffffff;
} }
/*
* layuimini-main
* 使
*/
.layuimini-main { .layuimini-main {
/* 设置内容区域距离其所在容器四周的外边距均为10px */
margin: 10px 10px 10px 10px; margin: 10px 10px 10px 10px;
} }
/**必填红点 */ /*
.layuimini-form > .layui-form-item > .required:after { * layuimini-formlayui-form-itemrequired
* *使
*/
.layuimini-form >.layui-form-item >.required:after {
/* 利用伪元素:after来添加内容这里添加的内容为一个红色的星号* */
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 { /*
width: 120px !important; * layuimini-formlayui-form-itemlayui-form-label
*
*/
.layuimini-form >.layui-form-item >.layui-form-label {
/* 通过!important提高此样式的优先级强制将宽度设置为120px确保样式生效 */
width: 120px!important;
} }
.layuimini-form > .layui-form-item > .layui-input-block { /*
margin-left: 100px !important; * layuimini-formlayui-form-itemlayui-input-block
* 使
*/
.layuimini-form >.layui-form-item >.layui-input-block {
/* 通过!important提高此样式的优先级设置左边距为100px控制其在水平方向上的位置 */
margin-left: 100px!important;
} }
.layuimini-form > .layui-form-item > .layui-input-block > tip { /*
* layuimini-formlayui-form-itemlayui-input-blocktip
*
*/
.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;
/* 设置提示信息的颜色为一种偏灰色调,使其在视觉上与主要内容有所区分,作为辅助提示展示 */
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宽的实线颜色为浅灰色系营造出一定的边界感 */
border: 1px solid #e6e6e6; border: 1px solid #e6e6e6;
/* 设置搜索框区域内部的上下左右内边距分别为10px、20px、5px、20px合理分配内部空间 */
padding: 10px 20px 5px 20px; padding: 10px 20px 5px 20px;
/* 设置搜索框区域内文字的颜色为深灰色系,使其在背景上有较好的辨识度 */
color: #6b6b6b; color: #6b6b6b;
} }
/**自定义滚动条样式 */ /*
*
*
*/
::-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 {
/* 设置滚动条滑块(可拖动部分)的背景颜色为一种深灰色系,使其在轨道上能明显显示出来 */
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,95 +1,152 @@
/*头部右侧背景色 headerRightBg */ /*
.layui-layout-admin .layui-header { * headerRightBg
background-color: #ffffff !important; * !important
} */
.layui-layout-admin.layui-header {
/*头部右侧选中背景色 headerRightBgThis */ background-color: #ffffff!important;
.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover { }
background-color: #e4e4e4 !important;
} /*
* headerRightBgThis
/*头部右侧字体颜色 headerRightColor */ * 使!important
.layui-layout-admin .layui-header .layui-nav .layui-nav-item a { */
.layui-layout-admin.layui-header.layuimini-header-content > ul >.layui-nav-item.layui-this,.layuimini-tool i:hover {
background-color: #e4e4e4!important;
}
/*
* headerRightColor
* 使rgba使
*/
.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 */ /*
.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a { * headerRightChildColor
color: rgba(107, 107, 107, 0.7) !important; * !important
*/
.layui-layout-admin.layui-header.layui-nav.layui-nav-item.layui-nav-child a {
color: rgba(107, 107, 107, 0.7)!important;
} }
/*头部右侧鼠标选中 headerRightColorThis */ /*
.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a { * headerRightColorThis
color: #565656 !important; * 使!important使
*/
.layui-header.layuimini-menu-header-pc.layui-nav.layui-nav-item a:hover,.layui-header.layuimini-header-menu.layuimini-pc-show.layui-nav.layui-this a {
color: #565656!important;
} }
/*头部右侧更多下拉颜色 headerRightNavMore */ /*
.layui-header .layui-nav .layui-nav-more { * headerRightNavMore
border-top-color: rgba(160, 160, 160, 0.7) !important; * !important
*/
.layui-header.layui-nav.layui-nav-more {
border-top-color: rgba(160, 160, 160, 0.7)!important;
} }
/*头部右侧更多下拉颜色 headerRightNavMore */ /*
.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more { * headerRightNavMore
border-color: transparent transparent rgba(160, 160, 160, 0.7) !important; *
*/
.layui-header.layui-nav.layui-nav-mored,.layui-header.layui-nav-itemed > a.layui-nav-more {
border-color: transparent transparent rgba(160, 160, 160, 0.7)!important;
} }
/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */ /*
.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a { * headerRightNavMoreBg headerRightNavMoreColor
background-color: #1E9FFF !important; * !important
color: #ffffff !important; */
.layui-header.layui-nav.layui-nav-child dd.layui-this a,.layui-header.layui-nav-child dd.layui-this,.layui-layout-admin.layui-header.layui-nav.layui-nav-item.layui-nav-child.layui-this a {
background-color: #1E9FFF!important;
color: #ffffff!important;
} }
/*头部缩放按钮样式 headerRightToolColor */ /*
.layui-layout-admin .layui-header .layuimini-tool i { * headerRightToolColor
* 使
*/
.layui-layout-admin.layui-header.layuimini-tool i {
color: #565656; color: #565656;
} }
/*logo背景颜色 headerLogoBg */ /*
.layui-layout-admin .layuimini-logo { * logoheaderLogoBg
background-color: #192027 !important; * logo!important使
*/
.layui-layout-admin.layuimini-logo {
background-color: #192027!important;
} }
/*logo字体颜色 headerLogoColor */ /*
.layui-layout-admin .layuimini-logo h1 { * logoheaderLogoColor
* logo使logo
*/
.layui-layout-admin.layuimini-logo h1 {
color: rgb(191, 187, 187); color: rgb(191, 187, 187);
} }
/*左侧菜单更多下拉样式 leftMenuNavMore */ /*
.layuimini-menu-left .layui-nav .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-more { * leftMenuNavMore
*
*/
.layuimini-menu-left.layui-nav.layui-nav-more,.layuimini-menu-left-zoom.layui-nav.layui-nav-more {
border-top-color: rgb(191, 187, 187); border-top-color: rgb(191, 187, 187);
} }
/*左侧菜单更多下拉样式 leftMenuNavMore */ /*
.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more { * leftMenuNavMore
border-color: transparent transparent rgb(191, 187, 187) !important; * !important
*/
.layuimini-menu-left.layui-nav.layui-nav-mored,.layuimini-menu-left.layui-nav-itemed > a.layui-nav-more,.layuimini-menu-left-zoom.layui-nav.layui-nav-mored,.layuimini-menu-left-zoom.layui-nav-itemed > a.layui-nav-more {
border-color: transparent transparent rgb(191, 187, 187)!important;
} }
/*左侧菜单背景 leftMenuBg */ /*
.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul { * leftMenuBg
background-color: #28333E !important; * !important
*/
.layui-side.layui-bg-black,.layui-side.layui-bg-black >.layuimini-menu-left > ul,.layuimini-menu-left-zoom > ul {
background-color: #28333E!important;
} }
/*左侧菜单选中背景 leftMenuBgThis */ /*
.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a { * leftMenuBgThis
background-color: #1E9FFF !important * !important
*/
.layuimini-menu-left.layui-nav-tree.layui-this,.layuimini-menu-left.layui-nav-tree.layui-this > a,.layuimini-menu-left.layui-nav-tree.layui-nav-child dd.layui-this,.layuimini-menu-left.layui-nav-tree.layui-nav-child dd.layui-this a,.layuimini-menu-left-zoom.layui-nav-tree.layui-this,.layuimini-menu-left-zoom.layui-nav-tree.layui-this > a,.layuimini-menu-left-zoom.layui-nav-tree.layui-nav-child dd.layui-this,.layuimini-menu-left-zoom.layui-nav-tree.layui-nav-child dd.layui-this a {
background-color: #1E9FFF!important;
} }
/*左侧菜单子菜单背景 leftMenuChildBg */ /*
.layuimini-menu-left .layui-nav-itemed > .layui-nav-child { * leftMenuChildBg
background-color: #0c0f13 !important; * !important使
*/
.layuimini-menu-left.layui-nav-itemed >.layui-nav-child {
background-color: #0c0f13!important;
} }
/*左侧菜单字体颜色 leftMenuColor */ /*
.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a { * leftMenuColor
color: rgb(191, 187, 187) !important; * !important使
*/
.layuimini-menu-left.layui-nav.layui-nav-item a,.layuimini-menu-left-zoom.layui-nav.layui-nav-item a {
color: rgb(191, 187, 187)!important;
} }
/*左侧菜单选中字体颜色 leftMenuColorThis */ /*
.layuimini-menu-left .layui-nav .layui-nav-item a:hover, .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a:hover, .layuimini-menu-left-zoom.layui-nav .layui-this a { * leftMenuColorThis
color: #ffffff !important; * !important
*/
.layuimini-menu-left.layui-nav.layui-nav-item a:hover,.layuimini-menu-left.layui-nav.layui-this a,.layuimini-menu-left-zoom.layui-nav.layui-nav-item a:hover,.layuimini-menu-left-zoom.layui-nav.layui-this a {
color: #ffffff!important;
} }
/**tab选项卡选中颜色 tabActiveColor */ /*
.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active { * tabtabActiveColor
* tabtab
*/
.layuimini-tab.layui-tab-title.layui-this.layuimini-tab-active {
background-color: #1e9fff; background-color: #1e9fff;
} }

@ -1,113 +1,402 @@
/**************** 主题换肤 ****************/ /**************** 主题换肤 ****************/
/* 默认风格*/ /* 默认风格相关样式设置 */
.dtree-theme-item-this{background-color: #d2d2d2!important;width: 180px!important;} /* 当元素具有.dtree-theme-item-this类时设置其背景颜色、宽度并且!important用于提升此样式的优先级确保能覆盖其他可能冲突的样式 */
.dtree-theme-item:hover{background-color: #eaeceb!important;width: 180px!important;} .dtree-theme-item-this{
.dtree-theme-item cite{font-size:12px!important;} background-color: #d2d2d2!important;
.dtree-theme-item:hover cite{color:#fe7786!important;} width: 180px!important;
}
.dtree-theme-dtreefont{font-size: 16px!important;} /* 当鼠标悬停在.dtree-theme-item元素上时改变其背景颜色和宽度同样使用!important提升优先级 */
.dtree-theme-ficon{color:#000!important;} .dtree-theme-item:hover{
.dtree-theme-icon{color:orange!important;} background-color: #eaeceb!important;
.dtree-theme-checkbox:hover{color:#fe7786!important;} width: 180px!important;
.dtree-theme-choose{color:#fe7786!important;} }
/* 设置.dtree-theme-item元素内cite标签的字体大小使用!important确保样式生效 */
/* layui主题风格*/ .dtree-theme-item cite{
.dtree-layui-item-this{background: none!important;} font-size:12px!important;
.dtree-layui-item:hover{background: none!important;} }
.dtree-layui-item cite{font-size:14px!important;} /* 当鼠标悬停在.dtree-theme-item元素内的cite标签上时改变其文字颜色 */
.dtree-layui-item:hover cite{opacity:0.5;filter:Alpha(opacity=50);text-decoration: underline;} .dtree-theme-item:hover cite{
color:#fe7786!important;
.dtree-layui-dtreefont{font-size: 18px!important;} }
.dtree-layui-ficon{font-size: 18px!important;color:#393D49!important;}
.dtree-layui-icon{color:#666!important;} /* 设置.dtree-theme-dtreefont类元素的字体大小使用!important确保样式生效 */
.dtree-layui-checkbox:hover{color:#5FB878!important;} .dtree-theme-dtreefont{
.dtree-layui-choose{color:#5FB878!important;} font-size: 16px!important;
}
/* laySimple主题风格*/ /* 设置.dtree-theme-ficon类元素的文字颜色为黑色使用!important确保样式生效 */
.dtree-laySimple-item-this{background-color: #d2d2d2!important;} .dtree-theme-ficon{
.dtree-laySimple-item:hover{background-color: #eaeceb!important;} color:#000!important;
.dtree-laySimple-item cite{font-size:12px!important;} }
.dtree-laySimple-item:hover cite{color:#01AAED!important;} /* 设置.dtree-theme-icon类元素的文字颜色为橙色使用!important确保样式生效 */
.dtree-theme-icon{
.dtree-laySimple-dtreefont{font-size: 16px!important;} color:orange!important;
.dtree-laySimple-ficon{font-size: 14px!important;color:#393D49!important;} }
.dtree-laySimple-icon{color:#393D49!important;} /* 当鼠标悬停在.dtree-theme-checkbox元素上时改变其文字颜色 */
.dtree-laySimple-checkbox:hover{color:#01AAED!important;} .dtree-theme-checkbox:hover{
.dtree-laySimple-choose{color:#01AAED!important;} color:#fe7786!important;
}
/* 设置.dtree-theme-choose类元素的文字颜色 */
.dtree-theme-choose{
color:#fe7786!important;
}
/* layui主题风格相关样式设置 */
/* 当元素具有.dtree-layui-item-this类时设置其背景为无覆盖可能存在的其他背景样式 */
.dtree-layui-item-this{
background: none!important;
}
/* 当鼠标悬停在.dtree-layui-item元素上时设置其背景为无覆盖可能存在的其他背景样式 */
.dtree-layui-item:hover{
background: none!important;
}
/* 设置.dtree-layui-item元素内cite标签的字体大小使用!important确保样式生效 */
.dtree-layui-item cite{
font-size:14px!important;
}
/* 当鼠标悬停在.dtree-layui-item元素内的cite标签上时设置透明度、添加下划线等样式效果 */
.dtree-layui-item:hover cite{
opacity:0.5;
filter:Alpha(opacity=50);
text-decoration: underline;
}
/* 设置.dtree-layui-dtreefont类元素的字体大小使用!important确保样式生效 */
.dtree-layui-dtreefont{
font-size: 18px!important;
}
/* 设置.dtree-layui-ficon类元素的字体大小和文字颜色使用!important确保样式生效 */
.dtree-layui-ficon{
font-size: 18px!important;
color:#393D49!important;
}
/* 设置.dtree-layui-icon类元素的文字颜色使用!important确保样式生效 */
.dtree-layui-icon{
color:#666!important;
}
/* 当鼠标悬停在.dtree-layui-checkbox元素上时改变其文字颜色 */
.dtree-layui-checkbox:hover{
color:#5FB878!important;
}
/* 设置.dtree-layui-choose类元素的文字颜色 */
.dtree-layui-choose{
color:#5FB878!important;
}
/* laySimple主题风格相关样式设置 */
/* 当元素具有.dtree-laySimple-item-this类时设置其背景颜色使用!important确保样式生效 */
.dtree-laySimple-item-this{
background-color: #d2d2d2!important;
}
/* 当鼠标悬停在.dtree-laySimple-item元素上时改变其背景颜色使用!important确保样式生效 */
.dtree-laySimple-item:hover{
background-color: #eaeceb!important;
}
/* 设置.dtree-laySimple-item元素内cite标签的字体大小使用!important确保样式生效 */
.dtree-laySimple-item cite{
font-size:12px!important;
}
/* 当鼠标悬停在.dtree-laySimple-item元素内的cite标签上时改变其文字颜色 */
.dtree-laySimple-item:hover cite{
color:#01AAED!important;
}
/* 设置.dtree-laySimple-dtreefont类元素的字体大小使用!important确保样式生效 */
.dtree-laySimple-dtreefont{
font-size: 16px!important;
}
/* 设置.dtree-laySimple-ficon类元素的字体大小和文字颜色使用!important确保样式生效 */
.dtree-laySimple-ficon{
font-size: 14px!important;
color:#393D49!important;
}
/* 设置.dtree-laySimple-icon类元素的文字颜色使用!important确保样式生效 */
.dtree-laySimple-icon{
color:#393D49!important;
}
/* 当鼠标悬停在.dtree-laySimple-checkbox元素上时改变其文字颜色 */
.dtree-laySimple-checkbox:hover{
color:#01AAED!important;
}
/* 设置.dtree-laySimple-choose类元素的文字颜色 */
.dtree-laySimple-choose{
color:#01AAED!important;
}
/**************** 树基础 ****************/ /**************** 树基础 ****************/
/* 菜单栏*/ /* 菜单栏相关样式设置 */
.dtree-menubar {padding-left: 10px;} /* 设置.dtree-menubar元素的左内边距 */
.dtree-menubar .layui-btn-group .layui-btn-sm{height: 20px;line-height: 20px;padding: 0 5px;font-size: 12px;} .dtree-menubar {
.dtree-menubar .layui-btn-group .layui-btn-sm i{font-size: 12px!important;} padding-left: 10px;
}
/* 工具栏*/ /* 设置.dtree-menubar内.layui-btn-group下.layui-btn-sm类按钮的高度、行高、内边距以及字体大小 */
.dtree-toolbar{position: absolute;z-index: 940520;padding: 0;background-color: #eceaeb;} .dtree-menubar.layui-btn-group.layui-btn-sm{
.dtree-toolbar .layui-nav-child{position: static;} height: 20px;
.dtree-toolbar .layui-nav-child dd{cursor: pointer;} line-height: 20px;
.dtree-toolbar .layui-nav-child dd a i{font-size:16px;display: inline-block;margin: 0px 1px;color:#fe7786;} padding: 0 5px;
.dtree-toolbar .layui-nav-child dd a i:hover{font-weight: bold;} font-size: 12px;
.dtree-toolbar .layui-nav-bar{display: none!important;} }
.dtree-toolbar-tool{padding: 30px;} /* 设置.dtree-menubar内.layui-btn-group下.layui-btn-sm类按钮内i标签的字体大小 */
.dtree-menubar.layui-btn-group.layui-btn-sm i{
.dtree-toolbar-fixed{position: absolute;right: 5px;top: 2px;font-style: normal;transition: all .3s;-webkit-transition: all .3s;} font-size: 12px!important;
/*.dtree-toolbar-fixed a{border:1px solid #fe7786;}*/ }
.dtree-toolbar-fixed a i{font-size:14px;display: inline-block;margin: 0px 1px;color:#fe7786;}
.dtree-toolbar-fixed a i:hover{opacity:0.8;filter:Alpha(opacity=80);} /* 工具栏相关样式设置 */
/* 设置.dtree-toolbar的定位、层级以及背景颜色 */
/* 树基本*/ .dtree-toolbar{
.dtree{width:260px;} position: absolute;
.dtree-nav-item{line-height:33px;padding-left:16px;} z-index: 940520;
.dtree-nav-ul-sid{display: none;} padding: 0;
.dtree-none-text{font-size: 12px;text-align: center;color: gray;} background-color: #eceaeb;
}
/* 树线*/ /* 设置.dtree-toolbar内.layui-nav-child的定位为静态 */
.dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{position: relative;} .dtree-toolbar.layui-nav-child{
.dtree-nav-first-line:before{content:"";position: absolute;height: 0;border-left: 1px dotted #c0c4cc;} position: static;
.dtree-nav-first-line:after{content:"";position: absolute;height: 0;border-top: 1px dotted #c0c4cc;} }
/* 设置.dtree-toolbar内.layui-nav-child下的dd元素鼠标样式为指针 */
.dtree-nav-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 100%;border-left: 1px dotted #c0c4cc;} .dtree-toolbar.layui-nav-child dd{
.dtree-nav-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;} cursor: pointer;
}
.dtree-nav-last-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 17px;border-left: 1px dotted #c0c4cc;} /* 设置.dtree-toolbar内.layui-nav-child下的dd元素内a标签内i标签的字体大小、显示方式、外边距以及文字颜色 */
.dtree-nav-last-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;} .dtree-toolbar.layui-nav-child dd a i{
font-size:16px;
display: inline-block;
/* 图标及复选框*/ margin: 0px 1px;
.dtreefont{cursor: pointer;} color:#fe7786;
.dtreefont-special{margin: 0 4px;} }
.dtree-nav-checkbox-div{display: inline-block;} /* 当鼠标悬停在.dtree-toolbar内.layui-nav-child下的dd元素内a标签内i标签上时设置字体加粗 */
.dtree-nav-checkbox-div>i{display: inline-block;margin: 0px 1px;} .dtree-toolbar.layui-nav-child dd a i:hover{
.dtree-nav-checkbox-div>i:last-child{margin-right: 4px;} font-weight: bold;
.dtree-nav-checkbox-div>i:hover{opacity:0.8;filter:Alpha(opacity=80);} }
/* 隐藏.dtree-toolbar内的导航栏底部条 */
/* 行 文字*/ .dtree-toolbar.layui-nav-bar{
.dtree-nav-div{display:block;vertical-align:top;position:relative;} display: none!important;
.dtree-nav-div cite{font-style: normal;cursor: pointer;} }
.dtree-nav-div:hover cite{opacity:0.7;filter:Alpha(opacity=70);transition: all .3s;-webkit-transition: all .3s;} /* 设置.dtree-toolbar-tool的内边距 */
.dtree-toolbar-tool{
/* 规则属性*/ padding: 30px;
.dtree-nav-show {display: block!important;} }
.dtree-nav-hide {display: none!important;}
.dtree-nav-this {}
.dtree-icon-hide {opacity:0;filter:Alpha(opacity=0);}
.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{margin: 0 2px;}
.dtree-disabled{cursor: not-allowed; color:#c2c2c2!important;}
.dtree-disabled:hover{color:#c2c2c2!important;}
.dtree-nav-div cite.dtree-disabled{font-style: normal; cursor: not-allowed; color:#c2c2c2!important;}
.dtree-nav-div>cite.dtree-disabled:hover{color:#c2c2c2!important;}
/* 设置.dtree-toolbar-fixed的定位、字体样式以及过渡效果 */
.dtree-toolbar-fixed{
position: absolute;
right: 5px;
top: 2px;
font-style: normal;
transition: all.3s;
-webkit-transition: all.3s;
}
/*.dtree-toolbar-fixed a{
border:1px solid #fe7786;
}*/
/* 设置.dtree-toolbar-fixed内a标签内i标签的字体大小、显示方式、外边距以及文字颜色 */
.dtree-toolbar-fixed a i{
font-size:14px;
display: inline-block;
margin: 0px 1px;
color:#fe7786;
}
/* 当鼠标悬停在.dtree-toolbar-fixed内a标签内i标签上时设置透明度 */
.dtree-toolbar-fixed a i:hover{
opacity:0.8;
filter:Alpha(opacity=80);
}
/** 下拉树属性*/ /* 树基本样式设置 */
.dtree-select{position: absolute;max-height: 500px;height: 350px;overflow: auto;width: 99%;z-index: 123;display: none;border:1px solid silver;top: 42px;} /* 设置.dtree元素的宽度 */
.dtree-select-show{display: block!important;} .dtree{
.dtree-select-up{top: auto; bottom: 42px;} width:260px;
}
/* 设置.dtree-nav-item元素的行高和左内边距 */
.dtree-nav-item{
line-height:33px;
padding-left:16px;
}
/* 初始状态下隐藏.dtree-nav-ul-sid元素 */
.dtree-nav-ul-sid{
display: none;
}
/* 设置.dtree-none-text类元素的字体大小、文本对齐方式以及文字颜色 */
.dtree-none-text{
font-size: 12px;
text-align: center;
color: gray;
}
/* 简单适配*/ /* 树线相关样式设置 */
@media screen and (max-width:1700px) and (min-width:1300px){ .dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{
.dtree-nav-item {padding-left: 15px;} position: relative;
}
/* 设置.dtree-nav-first-line元素:before伪元素的样式创建一个垂直的左边框高度为0用虚线表示 */
.dtree-nav-first-line:before{
content:"";
position: absolute;
height: 0;
border-left: 1px dotted #c0c4cc;
}
/* 设置.dtree-nav-first-line元素:after伪元素的样式创建一个水平的上边框高度为0用虚线表示 */
.dtree-nav-first-line:after{
content:"";
position: absolute;
height: 0;
border-top: 1px dotted #c0c4cc;
} }
/* 设置.dtree-nav-line元素:before伪元素的样式创建一个垂直的左边框从顶部开始宽度为0用虚线表示 */
.dtree-nav-line:before{
content:"";
position: absolute;
top: 0;
left: 7px;
width: 0;
height: 100%;
border-left: 1px dotted #c0c4cc;
}
/* 设置.dtree-nav-line元素:after伪元素的样式创建一个水平的上边框从一定位置开始宽度和高度为特定值用虚线表示 */
.dtree-nav-line:after{
content:"";
position: absolute;
top: 16px;
left: 8px;
width: 9px;
height: 0;
border-top: 1px dotted #c0c4cc;
}
/* 设置.dtree-nav-last-line元素:before伪元素的样式创建一个垂直的左边框高度为特定值用虚线表示 */
.dtree-nav-last-line:before{
content:"";
position: absolute;
top: 0;
left: 7px;
width: 0;
height: 17px;
border-left: 1px dotted #c0c4cc;
}
/* 设置.dtree-nav-last-line元素:after伪元素的样式创建一个水平的上边框从一定位置开始宽度和高度为特定值用虚线表示 */
.dtree-nav-last-line:after{
content:"";
position: absolute;
top: 16px;
left: 8px;
width: 9px;
height: 0;
border-top: 1px dotted #c0c4cc;
}
/* 图标及复选框相关样式设置 */
/* 设置.dtreefont类元素鼠标样式为指针 */
.dtreefont{
cursor: pointer;
}
/* 设置.dtreefont-special类元素的左右外边距 */
.dtreefont-special{
margin: 0 4px;
}
/* 设置.dtree-nav-checkbox-div元素以行内块形式显示 */
.dtree-nav-checkbox-div{
display: inline-block;
}
/* 设置.dtree-nav-checkbox-div内i标签以行内块形式显示并设置外边距 */
.dtree-nav-checkbox-div>i{
display: inline-block;
margin: 0px 1px;
}
/* 设置.dtree-nav-checkbox-div内最后一个i标签的右边距 */
.dtree-nav-checkbox-div>i:last-child{
margin-right: 4px;
}
/* 当鼠标悬停在.dtree-nav-checkbox-div内i标签上时设置透明度 */
.dtree-nav-checkbox-div>i:hover{
opacity:0.8;
filter:Alpha(opacity=80);
}
/* 行 文字相关样式设置 */
/* 设置.dtree-nav-div元素以块级元素显示、垂直对齐方式以及相对定位 */
.dtree-nav-div{
display:block;
vertical-align:top;
position:relative;
}
/* 设置.dtree-nav-div内cite标签的字体样式为正常去除斜体效果鼠标样式为指针 */
.dtree-nav-div cite{
font-style: normal;
cursor: pointer;
}
/* 当鼠标悬停在.dtree-nav-div内cite标签上时设置透明度以及过渡效果 */
.dtree-nav-div:hover cite{
opacity:0.7;
filter:Alpha(opacity=70);
transition: all.3s;
-webkit-transition: all.3s;
}
/* 规则属性相关样式设置 */
/* 显示具有.dtree-nav-show类的元素 */
.dtree-nav-show {
display: block!important;
}
/* 隐藏具有.dtree-nav-hide类的元素 */
.dtree-nav-hide {
display: none!important;
}
.dtree-nav-this {}
/* 隐藏具有.dtree-icon-hide类的元素通过设置透明度为0 */
.dtree-icon-hide {
opacity:0;
filter:Alpha(opacity=0);
}
/* 设置.dtree-icon-null-open、.dtree-icon-null-close、.dtree-icon-null类元素的左右外边距 */
.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{
margin: 0 2px;
}
/* 设置.dtree-disabled类元素的鼠标样式为禁止文字颜色为特定灰色并且此样式优先级高 */
.dtree-disabled{
cursor: not-allowed;
color:#c2c2c2!important;
}
/* 当鼠标悬停在.dtree-disabled类元素上时保持文字颜色为特定灰色 */
.dtree-disabled:hover{
color:#c2c2c2!important;
}
/* 设置.dtree-nav-div内具有.dtree-disabled类的cite标签的字体样式、鼠标样式以及文字颜色 */
.dtree-nav-div cite.dtree-disabled{
font-style: normal;
cursor: not-allowed;
color:#c2c2c2!important;
}
/* 当鼠标悬停在.dtree-nav-div内具有.dtree-disabled类的cite标签上时保持文字颜色为特定灰色 */
.dtree-nav-div>cite.dtree-disabled:hover{
color:#c2c2c2!important;
}
/** 下拉树属性相关样式设置 */
/* 设置.dtree-select的定位、最大高度、高度、溢出处理、宽度、层级以及初始状态为隐藏同时设置距离顶部的距离 */
.dtree-select{
position: absolute;
max-height: 500px;
height: 350px;
overflow: auto;
width: 99%;
z-index: 123;
display: none;
border:1px solid silver;
top: 42px;
}
/* 显示具有.dtree-select-show类的元素 */
.dtree-select-show{
display: block!important;
}
/* 改变具有.dtree-select-up类元素的top属性为autobottom属性为特定值实现上下位置的调整 */
.dtree-select-up{
top: auto;
bottom: 42px;
}
/* 简单适配相关样式设置,当屏幕宽度在特定范围时,调整.dtree-nav-item元素的左内边距 */
@media screen and (max-width:1700px) and (min-width:1300px){
.dtree-nav-item {
padding-left: 15px;
}
}
Loading…
Cancel
Save