Quellcode durchsuchen

月用统计,最近6个月统计,近30天出入统计,人数统计,陌生人展示,宿舍出入人员信息,宿舍归寝率

liu vor 3 Jahren
Ursprung
Commit
eca02e57d6
100 geänderte Dateien mit 6037 neuen und 0 gelöschten Zeilen
  1. 8 0
      .idea/.gitignore
  2. 19 0
      .idea/compiler.xml
  3. 6 0
      .idea/encodings.xml
  4. 20 0
      .idea/jarRepositories.xml
  5. 12 0
      .idea/misc.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 6 0
      .idea/vcs.xml
  8. 222 0
      hs_err_pid5336.log
  9. 180 0
      pom.xml
  10. 163 0
      share_video.iml
  11. 110 0
      share_videos.iml
  12. 79 0
      src/main/java/com/studenthotel/AutoCode.java
  13. 21 0
      src/main/java/com/studenthotel/StudenthotelHoutai.java
  14. 12 0
      src/main/java/com/studenthotel/annotation/ControllerIsShow.java
  15. 28 0
      src/main/java/com/studenthotel/annotation/PassToken.java
  16. 14 0
      src/main/java/com/studenthotel/annotation/UserLoginCheck.java
  17. 45 0
      src/main/java/com/studenthotel/aop/LoginCheckAspect.java
  18. 15 0
      src/main/java/com/studenthotel/api/BuildTotalPeopleApi.java
  19. 19 0
      src/main/java/com/studenthotel/api/ColdWaterApi.java
  20. 16 0
      src/main/java/com/studenthotel/api/ContrastFailureApi.java
  21. 22 0
      src/main/java/com/studenthotel/api/FaceRecognitionApi.java
  22. 51 0
      src/main/java/com/studenthotel/config/MyBatisPlusConfig.java
  23. 20 0
      src/main/java/com/studenthotel/config/RestTemplastConfig.java
  24. 66 0
      src/main/java/com/studenthotel/controller/BuildTotalPeopleController.java
  25. 49 0
      src/main/java/com/studenthotel/controller/CircumferenceController.java
  26. 136 0
      src/main/java/com/studenthotel/controller/ColdWaterController.java
  27. 57 0
      src/main/java/com/studenthotel/controller/ContrastFailureController.java
  28. 21 0
      src/main/java/com/studenthotel/controller/DormController.java
  29. 21 0
      src/main/java/com/studenthotel/controller/ElectricController.java
  30. 181 0
      src/main/java/com/studenthotel/controller/FaceRecognitionController.java
  31. 21 0
      src/main/java/com/studenthotel/controller/SchoolUserController.java
  32. 27 0
      src/main/java/com/studenthotel/core/CORSConfiguration.java
  33. 95 0
      src/main/java/com/studenthotel/core/JwtAuthenticationInterceptor.java
  34. 25 0
      src/main/java/com/studenthotel/core/JwtlnterceptorConfig.java
  35. 74 0
      src/main/java/com/studenthotel/core/SwaggerConfiguration.java
  36. 26 0
      src/main/java/com/studenthotel/handle/NonStaticResourceHttpRequestHandler.java
  37. 45 0
      src/main/java/com/studenthotel/handler/MyMetaObjectHandler.java
  38. 9 0
      src/main/java/com/studenthotel/mapper/BuildTotalPeopleMapper.java
  39. 18 0
      src/main/java/com/studenthotel/mapper/ColdWaterMapper.java
  40. 18 0
      src/main/java/com/studenthotel/mapper/ContrastFailureMapper.java
  41. 18 0
      src/main/java/com/studenthotel/mapper/DormMapper.java
  42. 21 0
      src/main/java/com/studenthotel/mapper/ElectricMapper.java
  43. 18 0
      src/main/java/com/studenthotel/mapper/FaceRecognitionMapper.java
  44. 18 0
      src/main/java/com/studenthotel/mapper/SchoolUserMapper.java
  45. 10 0
      src/main/java/com/studenthotel/model/pojo/BuildTotalPeople.java
  46. 70 0
      src/main/java/com/studenthotel/model/pojo/ColdWater.java
  47. 68 0
      src/main/java/com/studenthotel/model/pojo/ContrastFailure.java
  48. 68 0
      src/main/java/com/studenthotel/model/pojo/Dorm.java
  49. 70 0
      src/main/java/com/studenthotel/model/pojo/Electric.java
  50. 68 0
      src/main/java/com/studenthotel/model/pojo/FaceRecognition.java
  51. 103 0
      src/main/java/com/studenthotel/model/pojo/SchoolUser.java
  52. 35 0
      src/main/java/com/studenthotel/model/utils/BaseResult.java
  53. 135 0
      src/main/java/com/studenthotel/model/utils/CommonResult.java
  54. 7 0
      src/main/java/com/studenthotel/services/BuildTotalPeopleService.java
  55. 16 0
      src/main/java/com/studenthotel/services/ColdWaterService.java
  56. 16 0
      src/main/java/com/studenthotel/services/ContrastFailureService.java
  57. 16 0
      src/main/java/com/studenthotel/services/DormService.java
  58. 16 0
      src/main/java/com/studenthotel/services/ElectricService.java
  59. 20 0
      src/main/java/com/studenthotel/services/FaceRecognitionService.java
  60. 16 0
      src/main/java/com/studenthotel/services/SchoolUserService.java
  61. 12 0
      src/main/java/com/studenthotel/services/impl/BuildTotalPeopleServiceImpl.java
  62. 159 0
      src/main/java/com/studenthotel/services/impl/ColdWaterServiceImpl.java
  63. 153 0
      src/main/java/com/studenthotel/services/impl/ContrastFailureServiceImpl.java
  64. 160 0
      src/main/java/com/studenthotel/services/impl/DormServiceImpl.java
  65. 179 0
      src/main/java/com/studenthotel/services/impl/ElectricServiceImpl.java
  66. 256 0
      src/main/java/com/studenthotel/services/impl/FaceRecognitionServiceImpl.java
  67. 20 0
      src/main/java/com/studenthotel/services/impl/SchoolUserServiceImpl.java
  68. 340 0
      src/main/java/com/studenthotel/yushi/BaseClass.java
  69. 236 0
      src/main/java/com/studenthotel/yushi/SubscriptionConfig.java
  70. 8 0
      src/main/java/com/studenthotel/yushi/utils/LibID.java
  71. 11 0
      src/main/java/com/studenthotel/yushi/utils/SubscribePersonCondition.java
  72. 13 0
      src/main/java/com/studenthotel/yushi/utils/SubscriptionVo.java
  73. 13 0
      src/main/java/common/dto/BuildTotalPeopleDto.java
  74. 15 0
      src/main/java/common/dto/FaceRecognitionDto.java
  75. 12 0
      src/main/java/common/dto/PersonnelAccessDto.java
  76. 16 0
      src/main/java/common/dto/TotalEnergyDto.java
  77. 15 0
      src/main/java/common/exception/EmsException.java
  78. 178 0
      src/main/java/common/exception/EmsExceptionHandler.java
  79. 29 0
      src/main/java/common/exception/MyCustomException.java
  80. 7 0
      src/main/java/common/result/Code.java
  81. 78 0
      src/main/java/common/result/ResponseStatusEnum.java
  82. 210 0
      src/main/java/common/utils/AesUtils.java
  83. 100 0
      src/main/java/common/utils/Base64Utils.java
  84. 173 0
      src/main/java/common/utils/CommonUtil.java
  85. 44 0
      src/main/java/common/utils/EncryptionUtil.java
  86. 74 0
      src/main/java/common/utils/FileUtil.java
  87. 58 0
      src/main/java/common/utils/HMAC.java
  88. 105 0
      src/main/java/common/utils/JWTUtil.java
  89. 196 0
      src/main/java/common/utils/RSAUtils.java
  90. 25 0
      src/main/java/common/utils/ValidateCode.java
  91. 32 0
      src/main/java/common/utils/smsUtil.java
  92. 61 0
      src/main/resources/application-dev.yml
  93. 57 0
      src/main/resources/application-prod.yml
  94. 57 0
      src/main/resources/application.yml
  95. 5 0
      src/main/resources/mapper/studenthotel/ColdWaterMapper.xml
  96. 5 0
      src/main/resources/mapper/studenthotel/ContrastFailureMapper.xml
  97. 5 0
      src/main/resources/mapper/studenthotel/DormMapper.xml
  98. 5 0
      src/main/resources/mapper/studenthotel/ElectricMapper.xml
  99. 5 0
      src/main/resources/mapper/studenthotel/FaceRecognitionMapper.xml
  100. 0 0
      src/main/resources/mapper/studenthotel/SchoolUserMapper.xml

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 19 - 0
.idea/compiler.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="studenthotel_houtai" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="studenthotel_houtai" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/encodings.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+  </component>
+</project>

+ 20 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/central/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>

+ 12 - 0
.idea/misc.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

Datei-Diff unterdrückt, da er zu groß ist
+ 222 - 0
hs_err_pid5336.log


+ 180 - 0
pom.xml

@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.chuanghai</groupId>
+    <artifactId>studenthotel_houtai</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>studenthotel_houtai</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <tencent.qcloudsms.version>1.0.6</tencent.qcloudsms.version>
+    </properties>
+
+    <dependencies>
+
+        <!--   读取excel数据     -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.12</version>
+        </dependency>
+
+        <!--引入JWT-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.qcloudsms</groupId>
+            <artifactId>qcloudsms</artifactId>
+            <version>${tencent.qcloudsms.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.742</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.7</version>
+        </dependency>
+        <!-- 数据库驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <!-- mybatis-plus -->
+        <!-- mybatis-plus 是自己开发,并非官方的! -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>5.3.22</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
+        <dependency>
+            <groupId>org.eclipse.jgit</groupId>
+            <artifactId>org.eclipse.jgit</artifactId>
+            <version>5.4.3.201909031940-r</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.lettuce</groupId>
+                    <artifactId>lettuce-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 163 - 0
share_video.iml

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration>
+        <fileset id="spring_boot_com.video.MybatisPlusApplication" profiles="dev" autodetected="true" />
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.10.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: com.github.qcloudsms:qcloudsms:1.0.6" level="project" />
+    <orderEntry type="library" name="Maven: org.json:json:20170516" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java:3.1.742" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.4.10" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.9" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:logging-interceptor:3.14.9" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.27" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.7" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.22" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.39" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.39" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.18.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.18" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.18" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.6.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.eclipse.jgit:org.eclipse.jgit:5.4.3.201909031940-r" level="project" />
+    <orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.55" level="project" />
+    <orderEntry type="library" name="Maven: com.jcraft:jzlib:1.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.googlecode.javaewah:JavaEWAH:1.1.6" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpg-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: redis.clients:jedis:3.3.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.velocity:velocity-engine-core:2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.11" level="project" />
+  </component>
+</module>

+ 110 - 0
share_videos.iml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.8" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.8" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.4.RELEASE" level="project" />
+  </component>
+</module>

+ 79 - 0
src/main/java/com/studenthotel/AutoCode.java

@@ -0,0 +1,79 @@
+package com.studenthotel;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableFill;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/30 星期四 15:46
+ * @Description: com.video
+ * @Version: 1.0
+ */
+public class AutoCode {
+    public static void main(String[] args) {
+// 需要构建一个 代码自动生成器 对象
+        AutoGenerator mpg = new AutoGenerator();
+// 配置策略
+// 1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath+"/src/main/java");
+        gc.setAuthor("liu");
+        gc.setOpen(false);
+        gc.setFileOverride(false); // 是否覆盖
+        gc.setServiceName("%sService"); // 去Service的I前缀
+        gc.setIdType(IdType.ID_WORKER);
+        gc.setDateType(DateType.ONLY_DATE);
+        gc.setSwagger2(true);
+        mpg.setGlobalConfig(gc);
+//2、设置数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.161.224:3306/studenthotel_houtai?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
+                dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+//3、包的配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName("auto");
+        pc.setParent("com.studenthotel");
+        pc.setEntity("model");
+        pc.setMapper("mapper");
+        pc.setService("services");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+//4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setInclude("school_user"); // 设置要映射的表名
+                strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setEntityLombokModel(true); // 自动lombok;
+        strategy.setLogicDeleteFieldName("deleted");
+        // 自动填充配置
+        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
+        TableFill gmtModified = new TableFill("gmt_modified",
+                FieldFill.INSERT_UPDATE);
+        ArrayList<TableFill> tableFills = new ArrayList<>();
+        tableFills.add(gmtCreate);
+        tableFills.add(gmtModified);
+        strategy.setTableFillList(tableFills);
+        // 乐观锁
+        strategy.setVersionFieldName("version");
+        strategy.setRestControllerStyle(true);
+        strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
+        mpg.setStrategy(strategy);
+        mpg.execute(); //执行
+    }
+}

+ 21 - 0
src/main/java/com/studenthotel/StudenthotelHoutai.java

@@ -0,0 +1,21 @@
+package com.studenthotel;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@EnableCaching//开启缓存
+@SpringBootApplication
+@EnableTransactionManagement //开启事务回滚
+@EnableScheduling//开启定时任务
+class StudenthotelHoutai {
+
+    public static void main(String[] args) {
+
+        SpringApplication.run(StudenthotelHoutai.class, args);
+    }
+}

+ 12 - 0
src/main/java/com/studenthotel/annotation/ControllerIsShow.java

@@ -0,0 +1,12 @@
+package com.studenthotel.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(value = {ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ControllerIsShow {
+    String value() default "";
+}

+ 28 - 0
src/main/java/com/studenthotel/annotation/PassToken.java

@@ -0,0 +1,28 @@
+package com.studenthotel.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/** 说明
+ * 在方法上加入本注解 即可接口拦截
+ * @interface:代表当前类是注解
+ * @Target:描述当前的注解可以定义在扫描资源上。
+ * 属性value:
+ *     定义具体的资源。包括:
+ *     ElementType.METHOD:可以定义在方法上
+ *     ElementType.TYPE:可以定义在类上
+ *     ElementType.FIELD:可以定义在属性上
+ *     ElementType.PARAMETER:可以定义在方法参数上
+ * @Retention:当前注解在什么时候有效
+ *     定义具体的生效标记
+ *     RetentionPolicy.RUNTIME:运行时有效
+ *     RetentionPolicy.SOURCE:源码中有效
+ *     RetentionPolicy.CLASS:字节码有效
+ *///说明 该注解要加在控制器中的方法上才会生效 加在api中无法生效
+@Target(value = {ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PassToken {
+    boolean requeired() default true;
+}

+ 14 - 0
src/main/java/com/studenthotel/annotation/UserLoginCheck.java

@@ -0,0 +1,14 @@
+package com.studenthotel.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/10 星期一 14:04
+ * @Description: com.video.services.annotation
+ * @Version: 1.0
+ */
+@Target(ElementType.METHOD)
+public @interface UserLoginCheck {
+}

+ 45 - 0
src/main/java/com/studenthotel/aop/LoginCheckAspect.java

@@ -0,0 +1,45 @@
+package com.studenthotel.aop;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/10 星期一 14:10
+ * @Description: com.video.aop
+ * @Version: 1.0
+ */
+@Aspect//把当前类标识作为一个切面供容器读取
+@Component//将此类标记为Spring容器中的一个Bean
+@Order(0)//order的值越小,优先级越高 order如果不标注数字,默认最低优先级,因为其默认值是int最大值
+public class LoginCheckAspect {
+
+    @Around("@annotation(com.studenthotel.annotation.UserLoginCheck)")
+    public Object userLoginCheck(ProceedingJoinPoint process) throws Throwable {
+        System.out.println("用户登录检测机制");
+        if(1 == 1){
+           //通过抛异常方式拦截
+           // throw new Exception("非法登录");
+        }
+
+        Object proceed;
+        proceed = process.proceed();//执行目标方法
+        return proceed;//将执行目标方法后的返回值返回出去
+    }
+
+    @After("@annotation(com.studenthotel.annotation.UserLoginCheck)")
+    public void test(){
+        System.out.println("测试After");
+    }
+
+    @Before("@annotation(com.studenthotel.annotation.UserLoginCheck)")
+    public void test1(){
+        System.out.println("测试Before");
+    }
+
+}

+ 15 - 0
src/main/java/com/studenthotel/api/BuildTotalPeopleApi.java

@@ -0,0 +1,15 @@
+package com.studenthotel.api;
+
+import com.studenthotel.model.utils.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/auto/build-total-people")
+public interface BuildTotalPeopleApi {
+
+    @ApiOperation(value = "计算总人数", notes = "楼栋的数字是中文的,例如:1栋;2栋", httpMethod = "GET")
+    @GetMapping("/peoples")
+    CommonResult peoples(String[] build);
+
+}

+ 19 - 0
src/main/java/com/studenthotel/api/ColdWaterApi.java

@@ -0,0 +1,19 @@
+package com.studenthotel.api;
+
+
+import com.studenthotel.controller.ColdWaterController;
+import com.studenthotel.model.utils.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+
+@RequestMapping("/auto/cold-water")
+public interface ColdWaterApi{
+
+    @ApiOperation(value = "统计能耗总和", notes = "楼栋的数字是中文的,例如:1栋;2栋", httpMethod = "GET")
+    @GetMapping("/all")
+    CommonResult totalEnergy(String[] build);
+
+}
+

+ 16 - 0
src/main/java/com/studenthotel/api/ContrastFailureApi.java

@@ -0,0 +1,16 @@
+package com.studenthotel.api;
+
+import com.studenthotel.model.utils.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/auto/contrast-failure")
+public interface ContrastFailureApi {
+
+    @ApiOperation(value = "展示图片", notes = "例如:1-2学生公寓", httpMethod = "GET")
+    @GetMapping("/list")
+    CommonResult list(String build,Integer page,Integer size);
+
+
+}

+ 22 - 0
src/main/java/com/studenthotel/api/FaceRecognitionApi.java

@@ -0,0 +1,22 @@
+package com.studenthotel.api;
+
+import com.studenthotel.model.utils.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/auto/face-recognition")
+public interface FaceRecognitionApi {
+
+    @ApiOperation(value = "近30天出归人员统计", notes = "没有确定,随便填即可", httpMethod = "GET")
+    @GetMapping("/statistics")
+     CommonResult personnelAccess(String build);
+
+    @ApiOperation(value = "宿舍出入人员信息", notes = "例如:1-2学生公寓进门", httpMethod = "GET")
+    @GetMapping("/list")
+    CommonResult list(String build,Integer page,Integer size);
+
+    @ApiOperation(value = "宿舍归寝率", notes = "楼栋的数字是中文的,例如:1栋;2栋", httpMethod = "GET")
+    @GetMapping("/returning")
+    CommonResult GetReturning(String[] build);
+}

+ 51 - 0
src/main/java/com/studenthotel/config/MyBatisPlusConfig.java

@@ -0,0 +1,51 @@
+package com.studenthotel.config;
+
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+// 扫描我们的 mapper 文件夹
+@MapperScan("com.video.mapper")
+@EnableTransactionManagement
+@Configuration // 配置类
+public class MyBatisPlusConfig {
+
+    // 注册乐观锁插件
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+    // 分页插件
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return  new PaginationInterceptor();
+    }
+
+    // 逻辑删除组件!
+    @Bean
+    public ISqlInjector sqlInjector() {
+        return new LogicSqlInjector();
+    }
+
+
+    /**
+     * SQL执行效率插件
+     */
+    @Bean
+    @Profile({"dev","test"})// 设置 dev test 环境开启,保证我们的效率
+    public PerformanceInterceptor performanceInterceptor() {
+        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
+        performanceInterceptor.setMaxTime(3000); //ms 设置sql执行的最大时间,如果超过了则不执行
+        performanceInterceptor.setFormat(true);
+        return performanceInterceptor;
+    }
+
+}

+ 20 - 0
src/main/java/com/studenthotel/config/RestTemplastConfig.java

@@ -0,0 +1,20 @@
+package com.studenthotel.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/9  9:32
+ * @Version 1.0
+ */
+@Configuration
+public class RestTemplastConfig {
+
+    @Bean
+    public RestTemplate restTemplate(){
+       return new RestTemplate();
+    }
+
+}

+ 66 - 0
src/main/java/com/studenthotel/controller/BuildTotalPeopleController.java

@@ -0,0 +1,66 @@
+package com.studenthotel.controller;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.studenthotel.api.BuildTotalPeopleApi;
+import com.studenthotel.model.pojo.BuildTotalPeople;
+import com.studenthotel.model.pojo.Dorm;
+import com.studenthotel.model.utils.CommonResult;
+import com.studenthotel.services.BuildTotalPeopleService;
+import com.studenthotel.services.DormService;
+import common.dto.BuildTotalPeopleDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+@RestController
+public class BuildTotalPeopleController implements BuildTotalPeopleApi {
+
+    @Autowired
+    BuildTotalPeopleService buildTotalPeopleService;
+
+    @Autowired
+    DormService dormService;
+
+
+    @Override
+    public CommonResult peoples(String[] build) {
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+
+        List<BuildTotalPeopleDto> buildTotalPeopleDtoList = new ArrayList<>();
+//计算入住总人数
+        LambdaQueryWrapper<BuildTotalPeople> wrapper=new LambdaQueryWrapper<>();
+        wrapper.in(BuildTotalPeople::getBuild,build);
+        List<BuildTotalPeople> buildTotalPeopleList = buildTotalPeopleService.list(wrapper);
+        int totalPeople=0;
+        for (BuildTotalPeople buildTotalPeople : buildTotalPeopleList) {
+            Integer headcount = buildTotalPeople.getHeadcount();
+            totalPeople=totalPeople+headcount;
+        }
+        BuildTotalPeopleDto totalPeopleDto = new BuildTotalPeopleDto("入住总人数", totalPeople);
+        buildTotalPeopleDtoList.add(totalPeopleDto);
+//计算房间总数
+        LambdaQueryWrapper<Dorm> dormWrapper=new LambdaQueryWrapper<>();
+        dormWrapper.in(Dorm::getBuild,build);
+        int count = dormService.count(dormWrapper);
+        BuildTotalPeopleDto dormTotal = new BuildTotalPeopleDto("房间数量", count);
+        buildTotalPeopleDtoList.add(dormTotal);
+
+//        todo 无法判断在宿舍人数和闭寝室未归人数,闭寝未归是昨天未归的
+        int i = new Random().nextInt(totalPeople-300);
+        int i1 = new Random().nextInt(50);
+        BuildTotalPeopleDto buildTotalPeopleDto = new BuildTotalPeopleDto("当前在宿人数", i+300);
+        BuildTotalPeopleDto buildTotalPeopleDto2 = new BuildTotalPeopleDto("闭寝未归人员", i1);
+        buildTotalPeopleDtoList.add(buildTotalPeopleDto);
+        buildTotalPeopleDtoList.add(buildTotalPeopleDto2);
+
+
+        return CommonResult.ok(buildTotalPeopleDtoList);
+    }
+}

+ 49 - 0
src/main/java/com/studenthotel/controller/CircumferenceController.java

@@ -0,0 +1,49 @@
+package com.studenthotel.controller;
+
+import com.studenthotel.services.FaceRecognitionService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+
+/**
+ * 宇视事件订阅
+ */
+@RestController
+@RequestMapping
+@Slf4j
+public class CircumferenceController {
+
+
+
+
+
+    @Autowired
+    FaceRecognitionService faceRecognitionService;
+
+    /**
+     * 不能有任何的前缀
+     * @param request
+     * @param response
+     * @param url
+     */
+    @PostMapping("/LAPI/V1.0/System/Event/Notification/{url}")
+    public void a(HttpServletRequest request, HttpServletResponse response, @PathVariable String url /*, @RequestBody Map<String, Object> params*/) {
+
+        faceRecognitionService.saveFaceContrast(request, response, url);
+    }
+
+
+
+}
+
+
+

+ 136 - 0
src/main/java/com/studenthotel/controller/ColdWaterController.java

@@ -0,0 +1,136 @@
+package com.studenthotel.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.studenthotel.api.ColdWaterApi;
+import com.studenthotel.model.pojo.ColdWater;
+import com.studenthotel.model.pojo.Electric;
+import com.studenthotel.model.utils.CommonResult;
+import com.studenthotel.services.ColdWaterService;
+import com.studenthotel.services.ElectricService;
+import common.dto.TotalEnergyDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@RestController
+public class ColdWaterController implements ColdWaterApi {
+
+    @Autowired
+    ColdWaterService coldWaterService;
+
+    @Autowired
+    ElectricService electricService;
+
+    @Override
+    public CommonResult totalEnergy(String[] build) {
+
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+        //        获取月份
+        ArrayList<TotalEnergyDto> totalEnergyDtos = new ArrayList<>();
+        for (int i = 5; i >= 0; i--) {
+            Date date = new Date();
+            Date firstMonthDay = getFirstMonthDay(date, i);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+            String format = sdf.format(firstMonthDay);
+            LambdaQueryWrapper<ColdWater> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(ColdWater::getDataTime, format)
+                    .in(ColdWater::getBuild, build);
+            List<ColdWater> coldWaterList = coldWaterService.list(wrapper);
+ //        每个月的水费总金额
+            Double coldWaterTotalMoney = 0.0;
+//        每个月水费总能耗
+            Double coldWaterTotalPower = 0.0;
+            for (ColdWater coldWater : coldWaterList) {
+                Double totalMoney = coldWater.getTotalMoney();
+                Double totalPower = coldWater.getTotalPower();
+//                通过科学计算法来计算总金额
+                BigDecimal money = new BigDecimal(coldWaterTotalMoney + "");
+                BigDecimal decimalM = new BigDecimal(totalMoney + "");
+                coldWaterTotalMoney = money.add(decimalM).doubleValue();
+//                 通过科学计算法来计算总能耗
+                BigDecimal power = new BigDecimal(coldWaterTotalPower + "");
+                BigDecimal decimalP = new BigDecimal(totalPower + "");
+                coldWaterTotalPower = power.add(decimalP).doubleValue();
+
+            }
+
+            LambdaQueryWrapper<Electric> electricWrapper=new LambdaQueryWrapper<>();
+            electricWrapper.in(Electric::getBuild,build);
+            electricWrapper.eq(Electric::getDateTime,format);
+
+            List<Electric> electricList = electricService.list(electricWrapper);
+//        每个月的水费总金额
+            Double electricTotalMoney = 0.0;
+//        每个月水费总能耗
+            Double electricTotalPower = 0.0;
+
+            for (Electric electric : electricList) {
+                Double totalMoney = electric.getTotalMoney();
+                Double totalPower = electric.getTotalPower();
+
+//                通过科学计算法来计算总金额
+                BigDecimal money = new BigDecimal(electricTotalMoney + "");
+                BigDecimal decimalM = new BigDecimal(totalMoney + "");
+                electricTotalMoney = money.add(decimalM).doubleValue();
+
+//                 通过科学计算法来计算总能耗
+                BigDecimal power = new BigDecimal(electricTotalPower + "");
+                BigDecimal decimalP = new BigDecimal(totalPower + "");
+                electricTotalPower = power.add(decimalP).doubleValue();
+
+            }
+
+            TotalEnergyDto totalEnergyDto = new TotalEnergyDto(coldWaterTotalMoney,coldWaterTotalPower,electricTotalMoney,electricTotalPower,format);
+            totalEnergyDtos.add(totalEnergyDto);
+
+        }
+
+
+        return CommonResult.ok(totalEnergyDtos);
+    }
+
+    public static Date getFirstMonthDay(Date dt, int i) {
+        //获取当前月第一天:
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(dt);
+//        正数添加,负数减
+        ca.add(Calendar.MONTH, i - 6); //此方法可以获取前n月或后n月
+        ca.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
+        ca.set(Calendar.HOUR, 0);
+        ca.set(Calendar.MINUTE, 0);
+        ca.set(Calendar.SECOND, 0);
+        return ca.getTime();
+    }
+
+    public static void main(String[] args) {
+        for (int i = 5; i >= 0; i--) {
+            Date date = new Date();
+            Date firstMonthDay = getFirstMonthDay(date, i);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+            String format = sdf.format(firstMonthDay);
+            System.out.println("format = " + format);
+        }
+    }
+}
+

+ 57 - 0
src/main/java/com/studenthotel/controller/ContrastFailureController.java

@@ -0,0 +1,57 @@
+package com.studenthotel.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.studenthotel.api.ContrastFailureApi;
+import com.studenthotel.model.pojo.ContrastFailure;
+import com.studenthotel.model.utils.CommonResult;
+import com.studenthotel.services.ContrastFailureService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-08
+ */
+@RestController
+public class ContrastFailureController implements ContrastFailureApi {
+
+
+    @Autowired
+    ContrastFailureService contrastFailureService;
+
+
+    @Override
+    public CommonResult list(String build, Integer page, Integer size) {
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+        if (ObjectUtils.isEmpty(page) || page <= 0) {
+            page = 1;
+        }
+        if (ObjectUtils.isEmpty(size) || size <= 0) {
+            size = 4;
+        }
+        LambdaQueryWrapper<ContrastFailure> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(ContrastFailure::getCaptureImg, ContrastFailure::getCmpTime, ContrastFailure::getDeviceName, ContrastFailure::getPersonnelType, ContrastFailure::getName)
+                .eq(ContrastFailure::getDeviceName, build)
+                .orderByDesc(ContrastFailure::getCmpTime);
+        IPage<ContrastFailure> page1 = contrastFailureService.page(new Page<>(page, size), wrapper);
+
+
+        return CommonResult.ok(page1);
+    }
+
+
+}
+

+ 21 - 0
src/main/java/com/studenthotel/controller/DormController.java

@@ -0,0 +1,21 @@
+package com.studenthotel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-06-07
+ */
+@RestController
+@RequestMapping("/auto/dorm")
+public class DormController {
+
+}
+

+ 21 - 0
src/main/java/com/studenthotel/controller/ElectricController.java

@@ -0,0 +1,21 @@
+package com.studenthotel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@RestController
+@RequestMapping("/auto/electric")
+public class ElectricController {
+
+}
+

+ 181 - 0
src/main/java/com/studenthotel/controller/FaceRecognitionController.java

@@ -0,0 +1,181 @@
+package com.studenthotel.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.studenthotel.api.FaceRecognitionApi;
+import com.studenthotel.model.pojo.Dorm;
+import com.studenthotel.model.pojo.FaceRecognition;
+import com.studenthotel.model.pojo.SchoolUser;
+import com.studenthotel.model.utils.CommonResult;
+import com.studenthotel.services.DormService;
+import com.studenthotel.services.FaceRecognitionService;
+import com.studenthotel.services.SchoolUserService;
+import common.dto.FaceRecognitionDto;
+import common.dto.PersonnelAccessDto;
+import org.aspectj.weaver.ast.Var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-09
+ */
+@RestController
+public class FaceRecognitionController implements FaceRecognitionApi {
+
+    @Autowired
+    FaceRecognitionService faceRecognitionService;
+
+    @Autowired
+    SchoolUserService schoolUserService;
+
+    @Autowired
+    DormService dormService;
+
+    /**
+     * todo 暂无数据用随机数代替次数
+     * @param build
+     * @return
+     */
+    @Override
+    public CommonResult personnelAccess(String build) {
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+
+        ArrayList<PersonnelAccessDto> personnelAccessDtos = new ArrayList<>();
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        for (int i = 1; i <= 30; i++) {
+//            一天的开始时间
+            LocalDateTime localStart = now.minusDays(i).withHour(0).withMinute(0).withSecond(0);
+//            一天的结束时间
+            LocalDateTime localEnd = localStart.plusDays(1);
+
+            PersonnelAccessDto personnelAccessDto = new PersonnelAccessDto();
+            personnelAccessDto.setDate(localStart.format(dateTimeFormatter));
+            int i1 = new Random().nextInt(100);
+            int i2 = new Random().nextInt(10);
+            personnelAccessDto.setCount(i1*i2);
+
+            personnelAccessDtos.add(personnelAccessDto);
+        }
+
+
+
+        return CommonResult.ok(personnelAccessDtos);
+    }
+
+    @Override
+    public CommonResult list(String build, Integer page, Integer size) {
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+        if (ObjectUtils.isEmpty(page) || page <= 0) {
+            page = 1;
+        }
+        if (ObjectUtils.isEmpty(size) || size <= 0) {
+            size = 5;
+        }
+
+        LambdaQueryWrapper<FaceRecognition> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(FaceRecognition::getChannelName,build);
+        wrapper.orderByDesc(FaceRecognition::getPassingTime);
+
+        IPage<FaceRecognition> page1 = faceRecognitionService.page(new Page<>(page, size), wrapper);
+
+        List<FaceRecognition> records = page1.getRecords();
+
+
+        ArrayList<FaceRecognitionDto> faceRecognitionDtoList = new ArrayList<>();
+        for (FaceRecognition record : records) {
+            FaceRecognitionDto faceRecognitionDto = new FaceRecognitionDto();
+
+            Date passingTime = record.getPassingTime();
+            faceRecognitionDto.setDateTime(passingTime);
+
+            String channelName = record.getChannelName();
+            faceRecognitionDto.setAddress(channelName);
+
+            String name = record.getName();
+            faceRecognitionDto.setName(name);
+
+            Long schoolUserId = record.getSchoolUserId();
+            if (ObjectUtils.isNotEmpty(schoolUserId)) {
+                SchoolUser schoolUser = schoolUserService.getById(schoolUserId);
+                faceRecognitionDto.setClazz(schoolUser.getClazz());
+            }
+
+            String picturePath = record.getPicturePath();
+            picturePath="http://192.168.161.224:12345/"+picturePath;
+            faceRecognitionDto.setPictureUrl(picturePath);
+
+            faceRecognitionDtoList.add(faceRecognitionDto);
+
+        }
+        IPage<FaceRecognitionDto> pageDto=new Page<>();
+        pageDto.setRecords(faceRecognitionDtoList);
+        pageDto.setTotal(page1.getTotal());
+        pageDto.setPages(page1.getPages());
+        pageDto.setSize(page1.getSize());
+        pageDto.setCurrent(page1.getCurrent());
+
+
+
+        return CommonResult.ok(pageDto);
+    }
+
+    @Override
+    public CommonResult GetReturning(String[] build) {
+        if (ObjectUtils.isEmpty(build)) {
+            return CommonResult.fail();
+        }
+
+        LambdaQueryWrapper<Dorm> wrapper=new LambdaQueryWrapper<>();
+        wrapper.in(Dorm::getBuild,build).select(Dorm::getDom);
+        List<Dorm> list = dormService.list(wrapper);
+        int i = new Random().nextInt(list.size() - 6);
+        List<Dorm> dormList = new ArrayList<>();
+        for (int j = 1; j <= 6; j++) {
+            Dorm dorm = list.get(i + j);
+            dormList.add(dorm);
+        }
+
+        return CommonResult.ok(dormList);
+    }
+
+    public static void main(String[] args) {
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        for (int i = 1; i <= 30; i++) {
+            LocalDateTime localDateTime = now.minusDays(i).withHour(0).withMinute(0).withSecond(0);
+            String format = localDateTime.format(dateTimeFormatter1);
+            System.out.println("format = " + format);
+        }
+    }
+
+
+
+}
+

+ 21 - 0
src/main/java/com/studenthotel/controller/SchoolUserController.java

@@ -0,0 +1,21 @@
+package com.studenthotel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-12
+ */
+@RestController
+@RequestMapping("/auto/school-user")
+public class SchoolUserController {
+
+}
+

+ 27 - 0
src/main/java/com/studenthotel/core/CORSConfiguration.java

@@ -0,0 +1,27 @@
+package com.studenthotel.core;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CORSConfiguration{
+    @Bean
+    public WebMvcConfigurer corsConfigurer() {
+        return new WebMvcConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**")
+                        //放行哪些原始域
+                        .allowedOrigins("*")
+                        //是否发送Cookie信息
+                        .allowCredentials(false)
+                        //放行哪些原始域(请求方式)
+                        .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
+                        //放行哪些原始域(头部信息)
+                        .allowedHeaders("*");
+            }
+        };
+    }
+}

+ 95 - 0
src/main/java/com/studenthotel/core/JwtAuthenticationInterceptor.java

@@ -0,0 +1,95 @@
+package com.studenthotel.core;
+
+import com.auth0.jwt.interfaces.Claim;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.studenthotel.annotation.PassToken;
+import common.exception.MyCustomException;
+import common.result.ResponseStatusEnum;
+import common.utils.JWTUtil;
+import org.springframework.boot.configurationprocessor.json.JSONObject;
+import org.springframework.util.StringUtils;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class JwtAuthenticationInterceptor implements HandlerInterceptor {
+
+    /**
+     * preHandle:进入到控制器方法之前执行的内容
+     *     boolean:
+     *         true:可以继续执行控制器方法
+     *         false:拦截
+     * posthandler:执行控制器方法之后执行的内容
+     * afterCompletion:响应结束之前执行的内容
+     *///说明
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+
+        //region 检查是否有passtoken注释,有则跳过认证
+        //PassToken注解用在方法上面
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        Method method = handlerMethod.getMethod();
+        if (method.isAnnotationPresent(PassToken.class)) {
+            PassToken passToken = method.getAnnotation(PassToken.class);
+            if (passToken.requeired()) {
+                return true;
+            }
+        }
+        //endregion
+
+        //region 获取url传递的参数 Query string传递的参数
+
+          //获取url参数 getParameter方法里的参数名和定义的参数名一致
+          String token = request.getHeader("token");
+        // 验证userToken
+        if (!StringUtils.hasText(token)) {
+            throw new MyCustomException(ResponseStatusEnum.SYSTEM_TOKEN_ERROR);
+        }
+
+        // 解析token
+        Map<String, Claim> stringClaimMap = JWTUtil.verifyToken(token);
+        if (ObjectUtils.isNotEmpty(stringClaimMap)) { // 登录
+            return true;
+        }
+        //endregion
+
+        //region 自定义返回响应的json格式
+        //加上这个可以让浏览器那里得到浏览器的401:response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        JSONObject res = new JSONObject();
+        res.put("code", 401);
+        res.put("message", "没有权限");
+        res.put("result", "error");
+        PrintWriter out = null;
+        out = response.getWriter();
+        out.write(res.toString());
+        out.flush();
+        out.close();
+        //endregion
+
+        //region 默认的响应提示信息
+        //上面的提示信息返回格式和下面的只能开启一个,否则应用日志系统会导致Idean抛出异常:
+        //java.lang.IllegalStateException: getWriter() has already been called for this response
+        //response.sendError(401, "无权限");
+        //endregion
+
+        return false;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+}

+ 25 - 0
src/main/java/com/studenthotel/core/JwtlnterceptorConfig.java

@@ -0,0 +1,25 @@
+package com.studenthotel.core;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class JwtlnterceptorConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //region
+        //目前测试下来 使用 /**所有的话,response.sendError浏览器获取不到响应的信息
+        //默认拦截所有路径
+        registry.addInterceptor(authenticationInterceptor())
+                .addPathPatterns("/api/**");
+        //endregion
+    }
+
+    @Bean
+    public HandlerInterceptor authenticationInterceptor() {
+        return new JwtAuthenticationInterceptor();
+    }
+}

+ 74 - 0
src/main/java/com/studenthotel/core/SwaggerConfiguration.java

@@ -0,0 +1,74 @@
+package com.studenthotel.core;
+
+import com.studenthotel.annotation.ControllerIsShow;
+import com.google.common.base.Predicates;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration//配置对象
+@EnableSwagger2//声明启动Swagger2
+/*
+* 两种方式控制生产环境是否显示swagger
+* */
+//@Profile("!prod")
+@Profile({"dev","test"})
+public class SwaggerConfiguration {
+    /**
+     * 创建Docket类型的对象。并使用spring容器管理。
+     * Docket是Swagger中的全局配置对象。
+     * 请求方式:http://ip地址:端口/项目名/swagger-ui.html#/
+     */
+    @Bean
+    public Docket createRestApi() {
+        ApiInfo apiInfo = new ApiInfoBuilder()
+                .version("1.1.0") //版本
+                .title("视频系统接口文档") //网站标题
+                .description("提供测试接口或前端查看对应参数以及返回参数使用") //网站描述
+                .contact(new Contact("创海", "https://www.baidu.com/", "a974264710@163.com"))
+                //region 在swagger中显示作用不是很大
+                /*
+                .license("The Apache License") //协议
+                .licenseUrl("http://www.baidu.com") //许可证链接地址
+                */
+                //endregion
+                .build();
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo)//参数为类对象,并且这个类对象是swagger版本
+                .select()//获取Docket中的选择器。返回ApiSelctorBuilder。构建选择器的。如:扫描什么包的注解。
+                .apis(
+                        //region 是否在swagger中进行展示对应控制器
+                        /*
+                         Predicates.not:取反 例如,false -> true
+                         withMethodAnnotation:当方法上有注解的时候返回true
+                         整体作用:启用该段代码之后如果在方法上使用的自定义的注解:ControllerIsShow
+                         则在swagger中不会显示该方法
+                        */
+                        Predicates.not(
+                                RequestHandlerSelectors.withMethodAnnotation(
+                                        ControllerIsShow.class
+                                )
+                        )
+                        //endregion
+                )
+                .apis(RequestHandlerSelectors.basePackage("com.studenthotel"))//设定扫描哪个包(包含子包)中的注解。 如果要匹配多个不同包下的控制器可以精确到多个包的统一父级
+                //region 匹配路由地址
+                /*
+                //用正则匹配显示路由地址为swagger开头的链接 即:范围匹配器 以此来控制在swagger中描述哪些控制器
+                .paths(
+                        PathSelectors.regex("/swagger/.*")
+                )
+                */
+                //endregion
+                .build();//重新构建Docket对象
+
+    }
+}

+ 26 - 0
src/main/java/com/studenthotel/handle/NonStaticResourceHttpRequestHandler.java

@@ -0,0 +1,26 @@
+package com.studenthotel.handle;
+
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.file.Path;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/27 星期一 8:49
+ * @Description: com.video.handle
+ * @Version: 1.0
+ */
+@Component
+public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
+    public final static String ATTR_FILE = "NON-STATIC-FILE";
+
+    @Override
+    protected Resource getResource(HttpServletRequest request) {
+        final Path filePath = (Path) request.getAttribute(ATTR_FILE);
+        return new FileSystemResource(filePath);
+    }
+}

+ 45 - 0
src/main/java/com/studenthotel/handler/MyMetaObjectHandler.java

@@ -0,0 +1,45 @@
+package com.studenthotel.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Slf4j
+@Component // 一定不要忘记把处理器加到IOC容器中!
+public class MyMetaObjectHandler implements MetaObjectHandler {
+    // 插入时的填充策略
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        //HttpServletRequest request = getHttpServletRequest();
+        Long user_id = 1L;//request.getHeader("user_id") == null ? "测试" : request.getHeader("user_id");
+        log.info("start insert fill.....");
+        // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject
+        this.setFieldValByName("createTime",new Date(),metaObject);
+        this.setFieldValByName("updateTime",new Date(),metaObject);
+        this.setFieldValByName("createUser",user_id,metaObject);
+        this.setFieldValByName("updateUser",user_id,metaObject);
+    }
+
+    // 更新时的填充策略
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        //HttpServletRequest request = getHttpServletRequest();
+        Long user_id = 1L;
+        log.info("start update fill.....");
+        this.setFieldValByName("updateTime",new Date(),metaObject);
+        this.setFieldValByName("updateUser",user_id,metaObject);
+    }
+
+    private HttpServletRequest getHttpServletRequest() {
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
+        return attributes.getRequest();
+    }
+}

+ 9 - 0
src/main/java/com/studenthotel/mapper/BuildTotalPeopleMapper.java

@@ -0,0 +1,9 @@
+package com.studenthotel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.studenthotel.model.pojo.BuildTotalPeople;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BuildTotalPeopleMapper extends BaseMapper<BuildTotalPeople> {
+}

+ 18 - 0
src/main/java/com/studenthotel/mapper/ColdWaterMapper.java

@@ -0,0 +1,18 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.ColdWater;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Mapper
+public interface ColdWaterMapper extends BaseMapper<ColdWater> {
+
+}

+ 18 - 0
src/main/java/com/studenthotel/mapper/ContrastFailureMapper.java

@@ -0,0 +1,18 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.ContrastFailure;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-08
+ */
+@Mapper
+public interface ContrastFailureMapper extends BaseMapper<ContrastFailure> {
+
+}

+ 18 - 0
src/main/java/com/studenthotel/mapper/DormMapper.java

@@ -0,0 +1,18 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.Dorm;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-06-07
+ */
+@Mapper
+public interface DormMapper extends BaseMapper<Dorm> {
+
+}

+ 21 - 0
src/main/java/com/studenthotel/mapper/ElectricMapper.java

@@ -0,0 +1,21 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.Electric;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Mapper
+public interface ElectricMapper extends BaseMapper<Electric> {
+
+
+
+
+}

+ 18 - 0
src/main/java/com/studenthotel/mapper/FaceRecognitionMapper.java

@@ -0,0 +1,18 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.FaceRecognition;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-09
+ */
+@Mapper
+public interface FaceRecognitionMapper extends BaseMapper<FaceRecognition> {
+
+}

+ 18 - 0
src/main/java/com/studenthotel/mapper/SchoolUserMapper.java

@@ -0,0 +1,18 @@
+package com.studenthotel.mapper;
+
+import com.studenthotel.model.pojo.SchoolUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-12
+ */
+@Mapper
+public interface SchoolUserMapper extends BaseMapper<SchoolUser> {
+
+}

+ 10 - 0
src/main/java/com/studenthotel/model/pojo/BuildTotalPeople.java

@@ -0,0 +1,10 @@
+package com.studenthotel.model.pojo;
+
+import lombok.Data;
+
+@Data
+public class BuildTotalPeople {
+    private Integer id;
+    private String build;
+    private Integer headcount;
+}

+ 70 - 0
src/main/java/com/studenthotel/model/pojo/ColdWater.java

@@ -0,0 +1,70 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ColdWater对象", description="")
+public class ColdWater implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "楼栋")
+    private String build;
+
+    @ApiModelProperty(value = "房间号")
+    private String dom;
+
+    @ApiModelProperty(value = "时间")
+    private String dataTime;
+
+    @ApiModelProperty(value = "总金额")
+    @TableField("totalMoney")
+    private Double totalMoney;
+
+    @ApiModelProperty(value = "总能耗")
+    @TableField("totalPower")
+    private Double totalPower;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 68 - 0
src/main/java/com/studenthotel/model/pojo/ContrastFailure.java

@@ -0,0 +1,68 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ContrastFailure对象", description="")
+public class ContrastFailure implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "现场抓拍照片")
+    private String captureImg;
+
+    @ApiModelProperty(value = "比对时间")
+    private String cmpTime;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "人员类型")
+    private String personnelType;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 68 - 0
src/main/java/com/studenthotel/model/pojo/Dorm.java

@@ -0,0 +1,68 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-06-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Dorm对象", description="")
+public class Dorm implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "校区")
+    private String school;
+
+    @ApiModelProperty(value = "楼栋")
+    private String build;
+
+    @ApiModelProperty(value = "层数")
+    private String floors;
+
+    @ApiModelProperty(value = "房间号")
+    private String dom;
+
+    @ApiModelProperty(value = "表记编码")
+    private String pointid;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 70 - 0
src/main/java/com/studenthotel/model/pojo/Electric.java

@@ -0,0 +1,70 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Electric对象", description="")
+public class Electric implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "楼栋")
+    private String build;
+
+    @ApiModelProperty(value = "房间号")
+    private String dom;
+
+    @ApiModelProperty(value = "时间")
+    private String dateTime;
+
+    @ApiModelProperty(value = "总金额")
+    @TableField("totalMoney")
+    private Double totalMoney;
+
+    @ApiModelProperty(value = "总能耗")
+    @TableField("totalPower")
+    private Double totalPower;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 68 - 0
src/main/java/com/studenthotel/model/pojo/FaceRecognition.java

@@ -0,0 +1,68 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="FaceRecognition对象", description="")
+public class FaceRecognition implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "时间")
+    private Date passingTime;
+
+    @ApiModelProperty(value = "通道名称")
+    private String channelName;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "抓拍图片路径")
+    private String picturePath;
+
+    @ApiModelProperty(value = "school_user表的id")
+    private Long schoolUserId;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 103 - 0
src/main/java/com/studenthotel/model/pojo/SchoolUser.java

@@ -0,0 +1,103 @@
+package com.studenthotel.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SchoolUser对象", description="")
+public class SchoolUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "头像")
+    private String headImage;
+
+    @ApiModelProperty(value = "电子卡号")
+    private String cardNumber;
+
+    @ApiModelProperty(value = "学号")
+    private String studentId;
+
+    @ApiModelProperty(value = "身份证号")
+    private String idCard;
+
+    @ApiModelProperty(value = "名字")
+    private String name;
+
+    @ApiModelProperty(value = "性别(0为未知,1为男,2为女)")
+    private String gender;
+
+    @ApiModelProperty(value = "年级")
+    private byte[] grade;
+
+    @ApiModelProperty(value = "身份类型,1为其他,2为学生,3为教职工,4为校友")
+    private String identityType;
+
+    @ApiModelProperty(value = "生日")
+    private String birthday;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    @ApiModelProperty(value = "生源地")
+    private String originPlace;
+
+    @ApiModelProperty(value = "毕业学校")
+    private String graduatedSchool;
+
+    @ApiModelProperty(value = "学院")
+    private String college;
+
+    @ApiModelProperty(value = "专业")
+    private String profession;
+
+    @ApiModelProperty(value = "班级")
+    private String clazz;
+
+    @ApiModelProperty(value = "名族")
+    private String nation;
+
+    @ApiModelProperty(value = "栋")
+    private String build;
+
+    @ApiModelProperty(value = "层")
+    private String floors;
+
+    @ApiModelProperty(value = "宿舍号")
+    private String dormNumber;
+
+    @ApiModelProperty(value = "准考证号")
+    private String studentNts;
+
+    @ApiModelProperty(value = "距离")
+    private String distance;
+
+
+}

+ 35 - 0
src/main/java/com/studenthotel/model/utils/BaseResult.java

@@ -0,0 +1,35 @@
+package com.studenthotel.model.utils;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author: codingliang
+ * @Description: 接口统一返回基类
+ * @Date: 2021-04-29 12:09
+ * @Version: V1.0
+ **/
+@Data
+public abstract class BaseResult<T> implements Serializable {
+
+    /**
+     * 接口调用结果标识
+     */
+    private boolean success = false;
+
+    /**
+     * 接口调用结果信息
+     */
+    private String message;
+
+    /**
+     * 接口调用业务码
+     */
+    private String code;
+
+    /**
+     * 接口调用返回数据
+     */
+    private T data;
+}

+ 135 - 0
src/main/java/com/studenthotel/model/utils/CommonResult.java

@@ -0,0 +1,135 @@
+package com.studenthotel.model.utils;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import common.result.Code;
+import common.result.ResponseStatusEnum;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @Author: codingliang
+ * @Description: 接口统一返回
+ * @Date: 2021-04-29 12:10
+ * @Version: V1.0
+ **/
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CommonResult<T> extends BaseResult implements Serializable {
+
+
+    private Integer status;
+    // 调用是否成功
+    private Boolean success;
+    // 响应消息,可以为成功或者失败的消息
+    private String msg;
+
+    private T data;
+
+    private static final long serialVersionUID = 3616484754899974346L;
+
+
+    public static CommonResult ok() {
+        return ok(Integer.toString(ResponseStatusEnum.SUCCESS.getStatus()), ResponseStatusEnum.SUCCESS.getMsg());
+    }
+
+    public static <T> CommonResult<T> ok(T data) {
+        CommonResult<T> result = new CommonResult<T>(data);
+        return result;
+    }
+
+    public static <T> CommonResult<T> ok(String code, String msg) {
+        return baseCreate(code, msg, true);
+    }
+
+    public static CommonResult fail() {
+        return fail(Integer.toString(ResponseStatusEnum.FAILED.getStatus()), ResponseStatusEnum.FAILED.getMsg());
+    }
+
+    public static CommonResult fail(String code, String msg) {
+        return baseCreate(code, msg, false);
+    }
+
+    public static CommonResult fail(ResponseStatusEnum EnumCode){
+        return baseCreate(Integer.toString(EnumCode.getStatus()), EnumCode.getMsg(), false);
+    }
+
+    public CommonResult() {}
+
+    /**
+     * 用Code自定义返回信息
+     * 并把数据返回
+     */
+    public CommonResult(Code code, T data) {
+        this.status = code.getStatus();
+        this.msg = code.getMsg();
+        this.success = code.getSuccess();
+        this.data = data;
+    }
+
+    /**
+     * 成功的返回信息
+     */
+    public CommonResult(T data) {
+        this.setCode(Integer.toString(ResponseStatusEnum.SUCCESS.status()));
+        this.setMessage(ResponseStatusEnum.SUCCESS.msg());
+        this.setSuccess(ResponseStatusEnum.SUCCESS.success());
+        this.setData(data);
+    }
+
+
+
+    /**
+     * 自定义错误返回信息
+     * @param EnumCode 枚举错误信息
+     * @return
+     */
+    public CommonResult(ResponseStatusEnum EnumCode) {
+        this.setCode(Integer.toString(EnumCode.status()));
+        this.setMessage(EnumCode.msg());
+        this.setSuccess(EnumCode.success());
+    }
+
+
+    private static <T> CommonResult<T> baseCreate(String code, String msg, boolean success) {
+        CommonResult result = new CommonResult();
+        result.setCode(code);
+        result.setSuccess(success);
+        result.setMessage(msg);
+        return result;
+    }
+
+    public static CommonResult resultValue(ResponseStatusEnum responseStatus) {
+        return new CommonResult(responseStatus);
+    }
+
+    /**
+     * 错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去
+     *
+     * @param map
+     * @return
+     */
+    public static CommonResult errorMap(Map map) {
+        return new CommonResult(ResponseStatusEnum.FAILED, map);
+    }
+
+    /**
+     * 错误返回,直接返回错误的消息
+     *
+     * @param msg 提示信息
+     * @return
+     */
+    public static CommonResult errorMsg(String msg) {
+        return new CommonResult(ResponseStatusEnum.FAILED, msg);
+    }
+
+    public CommonResult<T> setResult(T data) {
+        this.setData(data);
+        return this;
+    }
+
+    @Override
+    public T getData() {
+        return (T) super.getData();
+    }
+}

+ 7 - 0
src/main/java/com/studenthotel/services/BuildTotalPeopleService.java

@@ -0,0 +1,7 @@
+package com.studenthotel.services;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.studenthotel.model.pojo.BuildTotalPeople;
+
+public interface BuildTotalPeopleService extends IService<BuildTotalPeople> {
+}

+ 16 - 0
src/main/java/com/studenthotel/services/ColdWaterService.java

@@ -0,0 +1,16 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.ColdWater;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+public interface ColdWaterService extends IService<ColdWater> {
+
+}

+ 16 - 0
src/main/java/com/studenthotel/services/ContrastFailureService.java

@@ -0,0 +1,16 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.ContrastFailure;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-08
+ */
+public interface ContrastFailureService extends IService<ContrastFailure> {
+
+}

+ 16 - 0
src/main/java/com/studenthotel/services/DormService.java

@@ -0,0 +1,16 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.Dorm;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-06-07
+ */
+public interface DormService extends IService<Dorm> {
+
+}

+ 16 - 0
src/main/java/com/studenthotel/services/ElectricService.java

@@ -0,0 +1,16 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.Electric;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+public interface ElectricService extends IService<Electric> {
+
+}

+ 20 - 0
src/main/java/com/studenthotel/services/FaceRecognitionService.java

@@ -0,0 +1,20 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.FaceRecognition;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-09
+ */
+public interface FaceRecognitionService extends IService<FaceRecognition> {
+
+    void saveFaceContrast(HttpServletRequest request, HttpServletResponse response, String url);
+}

+ 16 - 0
src/main/java/com/studenthotel/services/SchoolUserService.java

@@ -0,0 +1,16 @@
+package com.studenthotel.services;
+
+import com.studenthotel.model.pojo.SchoolUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-12
+ */
+public interface SchoolUserService extends IService<SchoolUser> {
+
+}

+ 12 - 0
src/main/java/com/studenthotel/services/impl/BuildTotalPeopleServiceImpl.java

@@ -0,0 +1,12 @@
+package com.studenthotel.services.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.studenthotel.mapper.BuildTotalPeopleMapper;
+import com.studenthotel.model.pojo.BuildTotalPeople;
+import com.studenthotel.services.BuildTotalPeopleService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BuildTotalPeopleServiceImpl extends ServiceImpl<BuildTotalPeopleMapper,BuildTotalPeople> implements BuildTotalPeopleService {
+}

+ 159 - 0
src/main/java/com/studenthotel/services/impl/ColdWaterServiceImpl.java

@@ -0,0 +1,159 @@
+package com.studenthotel.services.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mysql.cj.util.LogUtils;
+import com.studenthotel.model.pojo.ColdWater;
+import com.studenthotel.mapper.ColdWaterMapper;
+import com.studenthotel.model.pojo.Dorm;
+import com.studenthotel.services.ColdWaterService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.studenthotel.services.DormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Service
+public class ColdWaterServiceImpl extends ServiceImpl<ColdWaterMapper, ColdWater> implements ColdWaterService {
+    @Autowired
+    DormService dormService;
+
+
+    private static String url = "https://jtishfw.ncjti.edu.cn/jxch-smartmp/HotWaters/cwaterMonthlist.action";
+    private Integer page = 1;
+    private Integer size = 8;
+
+    //    每月1号每20分钟运行一次
+//    @Scheduled(cron = "0/20 * * 1 * ? ")
+    @Scheduled(cron = "0 0/1 * * * ? ")
+    public void autoQueryOrder() {
+        Page<Dorm> dPage = new Page<>(page, size);
+        LambdaQueryWrapper<Dorm> wrapper=new LambdaQueryWrapper<>();
+        IPage<Dorm> dormPage = dormService.page(dPage,wrapper);
+        List<Dorm> records = dormPage.getRecords();
+        long pages = dormPage.getPages();
+        for (Dorm dorm : records) {
+            if (dorm.getDom() != null) {
+                try {
+                    this.getColdWater(dorm.getDom());
+                } catch (Exception e) {
+
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (page <= pages) {
+            //将当前计数器的页码信息赋值给page
+            page += 1;
+        } else {
+            page -= 1;
+        }
+
+    }
+
+
+    public void getColdWater(String dormNumber) {
+        String token="AqwxcdAxs4212pomk231qsxssaz";
+        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
+//        dormNumber="墨轩湖校区"+dormNumber;
+        map.add("dom", dormNumber);
+        map.add("page", 1);
+        map.add("rows", 10);
+//        map.add("token",token);
+        RestTemplate restTemplate = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("token",token);
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        JSONObject jsonObj = JSON.parseObject(responseEntity.getBody());
+
+//        rows为数组
+        JSONArray jsonArray = jsonObj.getJSONArray("rows");
+
+        if (ObjectUtils.isNotEmpty(jsonArray)) {
+
+//           0 2 4 6 7 8
+            JSONObject jsonMap = jsonArray.getJSONObject(8);
+            if (jsonMap != null) {
+                ColdWater coldWater = new ColdWater();
+                String dom = jsonMap.get("dom").toString();
+                coldWater.setDom(dom);
+
+
+                String build = jsonMap.getString("build");
+                coldWater.setBuild(build);
+
+                Double totalMoney = Double.valueOf(jsonMap.get("totalMoney").toString());
+                Double totalPower = Double.valueOf(jsonMap.get("totalPower").toString());
+                BigDecimal bg = new BigDecimal(totalMoney);
+                BigDecimal bg2 = new BigDecimal(totalPower);
+                /**
+                 * 参数:
+                 newScale - 要返回的 BigDecimal 值的标度。
+                 roundingMode - 要应用的舍入模式。
+                 返回:
+                 一个 BigDecimal,其标度为指定值,其非标度值可以通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定。
+                 */
+                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                double f2 = bg2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+                coldWater.setTotalMoney(f1);
+                coldWater.setTotalPower(f2);
+                String dateTime = jsonMap.get("dataTime").toString();
+                coldWater.setDataTime(dateTime);
+
+
+                Boolean exists = chackColdWaterActive(dom, dateTime);
+                if (!exists) {
+                    coldWater.setDeleted(0L);
+                    this.save(coldWater);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 通过宿舍号和时间判断该数据是否已添加
+     *
+     * @param dom
+     * @param dateTime
+     * @return
+     */
+    public Boolean chackColdWaterActive(String dom, String dateTime) {
+        LambdaQueryWrapper<ColdWater> query = new LambdaQueryWrapper<>();
+        query.eq(ColdWater::getDataTime, dateTime)
+                .eq(ColdWater::getDom, dom);
+        int count = this.count(query);
+        if (count>0) {
+            return true;
+        }
+        return false;
+    }
+
+}

+ 153 - 0
src/main/java/com/studenthotel/services/impl/ContrastFailureServiceImpl.java

@@ -0,0 +1,153 @@
+package com.studenthotel.services.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.studenthotel.model.pojo.ContrastFailure;
+import com.studenthotel.mapper.ContrastFailureMapper;
+import com.studenthotel.services.ContrastFailureService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import common.utils.HMAC;
+import org.springframework.http.*;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-08
+ */
+@Service
+public class ContrastFailureServiceImpl extends ServiceImpl<ContrastFailureMapper, ContrastFailure> implements ContrastFailureService {
+
+    //用于记录查询百胜门禁机的页数
+    private Integer page = 1;
+
+    //百胜云平台接口的 api_id,用于请求接口
+    private String api_id = "389f11a7-bddb-3d16-9480-e5da2bafe799";
+
+    //百胜云平台接口的 api_key,用于请求接口
+    private String api_key = "5C78D964F6C534DFA918EAC7854F4529";
+
+
+    @Scheduled(cron = "0 0/10 * * * ? ")
+    public void autoQueryOnline() {
+        if (page > 1) {
+            page -= 1;
+        } else {
+            page = 20;
+        }
+        online();
+    }
+
+
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+    public void online() {
+        try {
+            HMAC hmac = new HMAC();
+            String method = "GET";
+            String request_url = "/record/stranger/info?page=";
+            //发送请求的请求地址
+            String getUrl = "http://39.108.175.59:9090/record/stranger/info?page=" + page;
+            hmac.HMACSHA256(method, api_key, request_url, page);
+
+            RestTemplate restTemplate = new RestTemplate();
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            headers.add("JLINK-ACCESS-TIMESTAMP", hmac.getStamp());
+            headers.add("JLINK-ACCESS-PARTNER-ID", api_id);
+            headers.add("JLINK-ACCESS-SIGN", hmac.getSign());
+
+            HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
+            ResponseEntity<String> responseEntity = restTemplate.exchange(getUrl, HttpMethod.GET, requestEntity, String.class);
+            JSONObject jsonObj = JSON.parseObject(responseEntity.getBody());
+            if (jsonObj.containsKey("data")) {
+                JSONObject data = jsonObj.getJSONObject("data");
+                JSONArray strangers = data.getJSONArray("strangers");
+                for (int i = 0; i < strangers.size(); i++) {
+                    JSONObject jsonObject = JSONObject.parseObject(strangers.getString(i));
+//                    实时图片
+                    String captureImg = jsonObject.getString("captureImg");
+                    System.out.println("captureImg = " + captureImg);
+//                    时间
+                    String cmpTime = jsonObject.getString("cmpTime");
+                    System.out.println("cmpTime = " + cmpTime);
+//                    地点
+                    String deviceName = jsonObject.getString("deviceName");
+                    System.out.println("deviceName = " + deviceName);
+                    if (equivalence(deviceName)&&saveBoolean(deviceName,cmpTime)) {
+                        ContrastFailure contrastFailure = new ContrastFailure();
+                        contrastFailure.setDeleted(0L);
+                        contrastFailure.setCaptureImg(captureImg);
+                        contrastFailure.setCmpTime(cmpTime);
+                        contrastFailure.setDeviceName(deviceName);
+                        contrastFailure.setPersonnelType("陌生人");
+                        contrastFailure.setName("未知");
+
+                        this.save(contrastFailure);
+
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+
+        }
+        
+    }
+
+    /**
+     * 判断地址是否为宿舍
+     * @param deviceName
+     * @return
+     */
+    public static Boolean equivalence(String deviceName){
+
+        String[] deviceNames={"1-2学生公寓","3-4学生公寓","5-6学生公寓","7-8学生公寓","9-10学生公寓","11-12学生公寓","13-14学生公寓","15-16学生公寓"};
+
+        if (Arrays.asList(deviceNames).contains(deviceName)) {
+            return true;
+        }
+
+        return false;
+    }
+
+
+    /**
+     * 判断数据是否已添加
+     * @param deviceName
+     * @param cmpTime
+     * @return
+     */
+    public Boolean saveBoolean(String deviceName,String cmpTime){
+        LambdaQueryWrapper<ContrastFailure> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(ContrastFailure::getDeviceName,deviceName)
+                .eq(ContrastFailure::getCmpTime,cmpTime);
+
+        if (this.count(wrapper)>0) {
+            return false;
+        }
+        return true;
+    }
+
+
+
+
+    public static void main(String[] args) {
+       String s = "11-10学生公寓";
+        Boolean equivalence = equivalence(s);
+        System.out.println("equivalence = " + equivalence);
+    }
+
+
+
+}

+ 160 - 0
src/main/java/com/studenthotel/services/impl/DormServiceImpl.java

@@ -0,0 +1,160 @@
+package com.studenthotel.services.impl;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.studenthotel.config.RestTemplastConfig;
+import com.studenthotel.model.pojo.Dorm;
+import com.studenthotel.mapper.DormMapper;
+import com.studenthotel.services.DormService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-06-07
+ */
+@Service
+public class DormServiceImpl extends ServiceImpl<DormMapper, Dorm> implements DormService {
+
+    private String token="AqwxcdAxs4212pomk231qsxssaz";
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    Integer i = 0;
+
+//    @Scheduled(cron = "0 0/1 * * * ?  ")
+    public void save() throws JsonProcessingException {
+        List<Dorm> dorms = this.saveDorm();
+        i=i+1;
+    }
+
+//    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Dorm> saveDorm() throws JsonProcessingException {
+        List<Map<String, String>> doms = this.getDoms();
+        ArrayList<Dorm> dorms = new ArrayList<>();
+        for (Map<String, String> dom : doms) {
+            String school = dom.get("school");
+            String build = dom.get("build");
+            String floors = dom.get("floors");
+            String dom1 = dom.get("dom");
+            String pointid = dom.get("pointid");
+            Dorm dorm = new Dorm();
+            dorm.setSchool(school);
+            dorm.setBuild(build);
+            dorm.setFloors(floors);
+            dorm.setDom(dom1);
+            dorm.setPointid(pointid);
+            dorm.setDeleted(0L);
+            dorms.add(dorm);
+        }
+        boolean b = this.saveBatch(dorms);
+        return dorms;
+    }
+    //获取楼栋的信息
+
+    public List<Map<String, String>> getbuild() throws JsonProcessingException {
+        String url = "https://jtishfw.ncjti.edu.cn/jxch-smartmp/HotWaters/buildbuilds.action?school=墨轩湖校区";
+
+        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
+        multiValueMap.add("token",token);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(multiValueMap, headers);
+
+        ResponseEntity<String> getbuild = restTemplate.postForEntity(url, request,String.class);
+        JSONObject jsonObject = JSONObject.parseObject(getbuild.getBody());
+        JSONArray data = jsonObject.getJSONArray("data");
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayList<Map<String, String>> maps = new ArrayList<>();
+        for (Object datum : data) {
+            Map<String, String> map = mapper.readValue(datum.toString(), new TypeReference<Map<String, String>>() {
+            });
+            maps.add(map);
+        }
+        return maps;
+    }
+
+    //    获取楼层的信息
+    public List<Map<String, String>> getFloors() throws JsonProcessingException {
+        List<Map<String, String>> builds = this.getbuild();
+        Map<String, String> stringStringMap = builds.get(i);
+        String school = stringStringMap.get("school");
+        String build = stringStringMap.get("build");
+        String url = "https://jtishfw.ncjti.edu.cn/jxch-smartmp/HotWaters/buildFloors.action?school=" + school + "&build=" + build;
+
+        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
+        multiValueMap.add("token",token);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(multiValueMap, headers);
+
+        ResponseEntity<String> getbuild = restTemplate.postForEntity(url,request,String.class);
+        JSONObject jsonObject = JSONObject.parseObject(getbuild.getBody());
+        JSONArray data = jsonObject.getJSONArray("data");
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayList<Map<String, String>> maps = new ArrayList<>();
+        for (Object datum : data) {
+            Map<String, String> map = mapper.readValue(datum.toString(), new TypeReference<Map<String, String>>() {
+            });
+            maps.add(map);
+        }
+
+        return maps;
+    }
+
+    //    获取房间号的信息
+    public List<Map<String, String>> getDoms() throws JsonProcessingException {
+        List<Map<String, String>> floorss = this.getFloors();
+        ArrayList<Map<String, String>> maps = new ArrayList<>();
+        for (Map<String, String> stringStringMap : floorss) {
+            String school = stringStringMap.get("school");
+            String build = stringStringMap.get("build");
+            String floors = stringStringMap.get("floors");
+            String url = "https://jtishfw.ncjti.edu.cn/jxch-smartmp/HotWaters/builddoms.action?school=" + school + "&build=" + build + "&floors=" + floors;
+
+            MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
+            multiValueMap.add("token",token);
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(multiValueMap, headers);
+
+            ResponseEntity<String> getbuild = restTemplate.postForEntity(url,request, String.class);
+            JSONObject jsonObject = JSONObject.parseObject(getbuild.getBody());
+            JSONArray data = jsonObject.getJSONArray("data");
+            ObjectMapper mapper = new ObjectMapper();
+            for (Object datum : data) {
+                Map<String, String> map = mapper.readValue(datum.toString(), new TypeReference<Map<String, String>>() {
+                });
+                maps.add(map);
+            }
+        }
+        return maps;
+    }
+
+
+
+
+}

+ 179 - 0
src/main/java/com/studenthotel/services/impl/ElectricServiceImpl.java

@@ -0,0 +1,179 @@
+package com.studenthotel.services.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mysql.cj.util.LogUtils;
+import com.studenthotel.model.pojo.Dorm;
+import com.studenthotel.model.pojo.Electric;
+import com.studenthotel.mapper.ElectricMapper;
+import com.studenthotel.services.ColdWaterService;
+import com.studenthotel.services.DormService;
+import com.studenthotel.services.ElectricService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-07
+ */
+@Service
+@Slf4j
+public class ElectricServiceImpl extends ServiceImpl<ElectricMapper, Electric> implements ElectricService {
+    @Autowired
+    private DormService dormService;
+
+
+
+    private static String url = "http://192.168.1.34:8080/HotWaters/elMonthlist.action";
+
+    private Integer page = 1;
+
+    private Integer size = 8;
+
+
+
+
+    public static String getDateTime(int i) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        LocalDateTime now = LocalDateTime.now();
+        String format = now.minusMonths(i).format(formatter);
+        return format;
+    }
+
+
+//        每月1号每20分钟运行一次
+//    @Scheduled(cron = "0/20 * * 1 * ?")
+    @Scheduled(cron = "0 0/1 * * * ? ")
+    public void autoQueryOrder() {
+        Page<Dorm> dPage = new Page<>(page, size);
+        LambdaQueryWrapper<Dorm> wrapper=new LambdaQueryWrapper<>();
+        IPage<Dorm> dormPage = dormService.page(dPage, wrapper);
+        List<Dorm> records = dormPage.getRecords();
+        long pages = dormPage.getPages();
+        for (Dorm dorm : records) {
+            if (dorm.getDom() != null) {
+                try {
+                    this.getElectrucity(dorm.getDom());
+                } catch (Exception e) {
+
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (page <= pages) {
+            //将当前计数器的页码信息赋值给page
+            page += 1;
+        } else {
+            page -= 1;
+        }
+
+    }
+
+
+    public void getElectrucity(String dormNumber) {
+        String token="AqwxcdAxs4212pomk231qsxssaz";
+        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
+        map.add("dom", dormNumber);
+        map.add("page", 1);
+        map.add("rows", 10);
+        map.add("token",token);
+        RestTemplate restTemplate = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        JSONObject jsonObj = JSON.parseObject(responseEntity.getBody());
+
+        JSONArray jsonArray = jsonObj.getJSONArray("rows");
+        if (ObjectUtils.isNotEmpty(jsonArray)) {
+
+//           0 2 4 6 7 8
+            JSONObject jsonMap = jsonArray.getJSONObject(8);
+            if (jsonMap != null) {
+                Electric electricity = new Electric();
+                String dom = jsonMap.get("dom").toString();
+                electricity.setDom(dom);
+
+                String build = jsonMap.getString("build");
+                electricity.setBuild(build);
+
+                Double totalMoney = Double.valueOf(jsonMap.get("totalMoney").toString());
+                Double totalPower = Double.valueOf(jsonMap.get("totalPower").toString());
+                BigDecimal bg = new BigDecimal(totalMoney);
+                BigDecimal bg2 = new BigDecimal(totalPower);
+                /**
+                 * 参数:
+                 newScale - 要返回的 BigDecimal 值的标度。
+                 roundingMode - 要应用的舍入模式。
+                 返回:
+                 一个 BigDecimal,其标度为指定值,其非标度值可以通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定。
+                 */
+                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                double f2 = bg2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+                electricity.setTotalMoney(f1);
+                electricity.setTotalPower(f2);
+
+                String dateTime = jsonMap.get("dataTime").toString();
+                electricity.setDateTime(dateTime);
+
+                Boolean exists = chackElectricityActive(dom, dateTime);
+                if (!exists) {
+                    electricity.setDeleted(0L);
+                    this.save(electricity);
+                }
+            }
+        }
+
+
+    }
+
+
+
+
+
+    /**
+     * 通过宿舍号和时间判断该数据是否已添加
+     *
+     * @param dom
+     * @param dateTime
+     * @return
+     */
+    public Boolean chackElectricityActive(String dom, String dateTime) {
+        LambdaQueryWrapper<Electric> query = new LambdaQueryWrapper<>();
+        query.eq(Electric::getDateTime, dateTime)
+                .eq(Electric::getDom, dom);
+        int count = this.count(query);
+        if (count>0) {
+            return true;
+        }
+        return false;
+
+    }
+}

+ 256 - 0
src/main/java/com/studenthotel/services/impl/FaceRecognitionServiceImpl.java

@@ -0,0 +1,256 @@
+package com.studenthotel.services.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.studenthotel.model.pojo.FaceRecognition;
+import com.studenthotel.mapper.FaceRecognitionMapper;
+import com.studenthotel.model.pojo.SchoolUser;
+import com.studenthotel.services.FaceRecognitionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.studenthotel.services.SchoolUserService;
+import com.studenthotel.yushi.SubscriptionConfig;
+import com.studenthotel.yushi.utils.SubscribePersonCondition;
+import com.studenthotel.yushi.utils.SubscriptionVo;
+import common.utils.Base64Utils;
+import common.utils.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.weaver.ast.Var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-09
+ */
+@Service
+@Slf4j
+public class FaceRecognitionServiceImpl extends ServiceImpl<FaceRecognitionMapper, FaceRecognition> implements FaceRecognitionService {
+
+
+    @Autowired
+    SchoolUserService schoolUserService;
+
+    String id = "";
+
+    @Scheduled(cron = "0 0 0/1 * * ? ")
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+    public void getSubscription() {
+        log.info("开始事件订阅");
+        SubscribePersonCondition subscribePersonCondition = new SubscribePersonCondition();
+        subscribePersonCondition.setLibIDNum(0);
+        JSONObject map = new JSONObject();
+        map.put("AddressType", 0);
+        map.put("IPAddress", "192.168.161.224");
+        map.put("Port", 5555);
+        map.put("Duration", 3600);
+        map.put("SubscribePersonCondition", subscribePersonCondition);
+        String jsonString = map.toJSONString();
+        SubscriptionVo subscriptionVo = new SubscriptionVo();
+        SubscriptionVo vo = SubscriptionConfig.subscriptionRecord(subscriptionVo, "POST", jsonString, "/LAPI/V1.0/System/Event/Subscription");
+        log.info("事件订阅得到的值: " + vo);
+        id = vo.getID();
+
+
+
+    }
+
+
+    @Override
+    public void saveFaceContrast(HttpServletRequest request, HttpServletResponse response, String url) {
+        if ("PersonInfo".equals(url)) {
+            log.info("进入人脸对比预警接口");
+            FaceRecognition faceRecognition = new FaceRecognition();
+
+            try {
+                BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
+                StringBuilder responseStrBuilder = new StringBuilder();
+                String inputStr;
+                while ((inputStr = streamReader.readLine()) != null) {
+                    responseStrBuilder.append(inputStr);
+                }
+
+//                人脸对比上报预警
+                JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
+                JSONObject personEventInfo = jsonObject.getJSONObject("PersonEventInfo");
+
+//              人员报警信息
+                JSONArray faceInfoList = personEventInfo.getJSONArray("FaceInfoList");
+
+                for (int i = 0; i < faceInfoList.size(); i++) {
+                    JSONObject faceInfoListJSONObject = faceInfoList.getJSONObject(i);
+
+                    //                    通道名称
+                    String channelName = faceInfoListJSONObject.getString("ChannelName");
+                    System.out.println("channelName = " + channelName);
+                    if (compareName(channelName)) {
+
+                        faceRecognition.setChannelName(exchangeName(channelName));
+
+                        //                    过人时间
+                        String passingTime = faceInfoListJSONObject.getString("PassingTime");
+//                    单位秒
+                        Long aLong = Long.valueOf(passingTime);
+                        faceRecognition.setPassingTime(new Date(aLong * 1000));
+
+                        JSONObject compareInfo = JSONObject.parseObject(faceInfoList.getJSONObject(i).get("CompareInfo").toString());
+                        //对比信息
+                        JSONObject personInfo = JSONObject.parseObject(compareInfo.getString("PersonInfo"));
+//                    名字
+                        String personName = personInfo.getString("PersonName");
+
+                        faceRecognition.setName(personName);
+
+//                    获取证件号
+                        JSONArray identificationList = JSONArray.parseArray(personInfo.getString("IdentificationList"));
+                        for (int j = 0; j < identificationList.size(); j++) {
+                            JSONObject identification = JSONObject.parseObject(identificationList.get(j).toString());
+//                        证件号
+                            String number = identification.getString("Number");
+                            LambdaQueryWrapper<SchoolUser> wrapper=new LambdaQueryWrapper<>();
+                            wrapper.eq(SchoolUser::getIdCard,number)
+                                    .or()
+                                    .eq(SchoolUser::getStudentId,number);
+
+
+                            SchoolUser newSchooluser = schoolUserService.getOne(wrapper);
+                            if (ObjectUtils.isNotEmpty(newSchooluser)) {
+                                //                            用户标识
+                                faceRecognition.setSchoolUserId(newSchooluser.getId());
+                            }
+//                    图片
+                                JSONObject snapshotImage = JSONObject.parseObject(compareInfo.getString("SnapshotImage"));
+                                JSONObject bigImage = JSONObject.parseObject(snapshotImage.getString("BigImage"));
+
+//                    获取base64为编码,并下载
+                                String dataBase = "data:image/jpeg;base64," + bigImage.getString("Data");
+
+                                String fileNameWithPath = FileUtil.getFileNameWithPath() + ".jpg";
+//                                FileUtil.makeDirs(fileNameWithPath, "/home/nginx/html/image");
+//                                String imgFilePath = "/home/nginx/html/image/" + fileNameWithPath;
+                                FileUtil.makeDirs(fileNameWithPath, "E:\\image3");
+                                String imgFilePath = "E:\\image3\\" + fileNameWithPath;
+                                try {
+                                    Base64Utils.GenerateImage(dataBase, imgFilePath);
+                                } catch (IOException e) {
+                                    log.error("下载图片出问题");
+                                }
+//                            图片
+                                faceRecognition.setPicturePath(fileNameWithPath);
+
+
+                                if (!exists(faceRecognition.getName(), aLong * 1000)) {
+                                    faceRecognition.setDeleted(0L);
+                                    this.save(faceRecognition);
+                                }
+
+
+                            }
+
+
+                    }
+
+                }
+
+
+            } catch (UnsupportedEncodingException e) {
+                log.error("订阅人脸对比上报解析出问题" + e);
+            } catch (IOException e) {
+                log.error("订阅人脸对比上报解析出问题" + e);
+            } catch (Exception e) {
+                log.error("订阅人脸对比上报解析时间出问题" + e);
+            }
+        }
+    }
+
+
+    /**
+     * 同一个人一分钟不能出现2次
+     * @param name
+     * @param timeLong
+     * @return
+     */
+    public Boolean exists(String name, Long timeLong) {
+        QueryWrapper<FaceRecognition> wrapper = new QueryWrapper<>();
+
+        wrapper.eq("name", name).eq("passing_time", new Date(timeLong));
+        int count = this.count(wrapper);
+        if (count>0) {
+            return true;
+        }
+        return false;
+    }
+
+
+    public Boolean compareName(String channelName) {
+        if ("1-2#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("3-4#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("5-6#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("7-8#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("9-10#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("11-12#学生公寓进门".equals(channelName)) {
+            return true;
+        } else if ("13-14#学生公寓进门".equals(channelName)) {
+            return true;
+        } else {
+            return "15-16#学生公寓进门".equals(channelName);
+        }
+    }
+
+    /**
+     * 去掉#
+     * @param channelName
+     * @return
+     */
+    public String exchangeName(String channelName) {
+
+        if ("1-2#学生公寓进门".equals(channelName)) {
+            return "1-2学生公寓进门";
+
+        } else if ("3-4#学生公寓进门".equals(channelName)) {
+            return "3-4学生公寓进门";
+
+        } else if ("5-6#学生公寓进门".equals(channelName)) {
+            return "5-6学生公寓进门";
+
+        } else if ("7-8#学生公寓进门".equals(channelName)) {
+            return "7-8学生公寓进门";
+
+        } else if ("9-10#学生公寓进门".equals(channelName)) {
+            return "9-10学生公寓进门";
+
+        } else if ("11-12#学生公寓进门".equals(channelName)) {
+            return "11-12学生公寓进门";
+
+        } else if ("13-14#学生公寓进门".equals(channelName)) {
+            return "13-14学生公寓进门";
+
+        } else {
+            return "15-16学生公寓进门";
+        }
+
+    }
+
+
+}

+ 20 - 0
src/main/java/com/studenthotel/services/impl/SchoolUserServiceImpl.java

@@ -0,0 +1,20 @@
+package com.studenthotel.services.impl;
+
+import com.studenthotel.model.pojo.SchoolUser;
+import com.studenthotel.mapper.SchoolUserMapper;
+import com.studenthotel.services.SchoolUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author liu
+ * @since 2023-06-12
+ */
+@Service
+public class SchoolUserServiceImpl extends ServiceImpl<SchoolUserMapper, SchoolUser> implements SchoolUserService {
+
+}

+ 340 - 0
src/main/java/com/studenthotel/yushi/BaseClass.java

@@ -0,0 +1,340 @@
+package com.studenthotel.yushi;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.*;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.util.DigestUtils;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class BaseClass {
+
+    //NVR基本信息
+    //private static String nvrip = "192.168.0.101";//nvr 地址
+    private static String nvrip = "172.22.45.25";//nvr 地址
+
+    private static String nvrport = "80";//nvr端口
+    private static String nvruname = "admin";//登录用户名
+    private static String nvrpwd = "ncjtxy@2021";//登录密码
+    //登录NVR使用的url,三方所有接口调用都需要用到
+    private static String urlString = "/LAPI/V1.0/System/Security/Login";
+
+
+    //报文头相关字段默认值,目前这些值都是写死的,可不用关注;
+    private static String UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
+    private static String ContentType = "application/json";
+    private static String AcceptEncoding = "gzip, deflate";
+    private static String AcceptLanguage = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
+    private static String Connection = "Close";
+
+
+    public static String getNvrUrl() {
+        return "http://" + nvrip + ":" + nvrport;
+    }
+
+    public static String getNvrName() {
+        return nvruname;
+    }
+
+    public static String getNvrPwd() {
+        return nvrpwd;
+    }
+
+    public static String getLoginUrl() {
+        return "http://" + nvrip + ":" + nvrport + urlString;
+    }
+
+    //拼装报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+    public static Map getHeadInfo() {
+        Map<String, String> headinfo = new HashMap<String, String>();
+        headinfo.put("User-Agent", UserAgent);
+        headinfo.put("Content-Type", ContentType);
+        headinfo.put("Accept-Encoding", AcceptEncoding);
+        headinfo.put("Accept-Language", AcceptLanguage);
+        headinfo.put("Host", nvrip);
+        headinfo.put("Connection", Connection);
+
+        //三方登录时无需加cookie字段,只有web登录时,需要带
+        //headinfo.put("Cookie", "len=0; WebLoginHandle=10081124");
+
+        return headinfo;
+    }
+
+    //put方法,不带鉴权信息时Authorization参数使用“”(空字符串),不带body时jsonBody使用“”(空字符串)
+    public static CloseableHttpResponse doPut(CloseableHttpClient httpClient, String url, String Authorization, String jsonBody) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpPut httpPut = new HttpPut(url);
+        for (String s : headinfo.keySet()) {
+            httpPut.addHeader(s, headinfo.get(s));
+        }
+
+        if (!jsonBody.equals("")) {
+            //给httppost对象设置json字符串参数
+            StringEntity httpEntity = new StringEntity(jsonBody, "utf-8");
+
+            //传参
+            httpPut.setEntity(httpEntity);
+        }
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpPut实例设置配置
+            httpPut.setConfig(requestConfig);
+            // 执行Put请求得到返回对象
+            httpResponse = httpClient.execute(httpPut);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+    //post方法,Authorization必填
+    public static CloseableHttpResponse doPost(CloseableHttpClient httpClient, String url, String Authorization, String json) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpPost httpPost = new HttpPost(url);
+        for (String s : headinfo.keySet()) {
+            httpPost.addHeader(s, headinfo.get(s));
+        }
+
+//        // 创建cookie store的本地实例
+//         BasicCookieStore basicCookieStore = new BasicCookieStore();
+//        Cookie c = new Cookie("","");
+//        //设置cookie的最大生存时间为零
+//        c.setMaxAge(0);//项目所有目录均有效,这句很关键,否则不敢保证删除
+//        basicCookieStore.addCookie((org.apache.http.cookie.Cookie) c);
+//        HttpClient httpclient = HttpClientBuilder.create().setDefaultCookieStore(basicCookieStore).build();
+
+
+        //给httppost对象设置json字符串参数
+        StringEntity httpEntity = new StringEntity(json, "utf-8");
+
+        //传参
+        httpPost.setEntity(httpEntity);
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpPost实例设置配置
+            httpPost.setConfig(requestConfig);
+            // 执行Post请求得到返回对象
+            httpResponse = httpClient.execute(httpPost);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+    //get方法,Authorization必填
+    public static CloseableHttpResponse doGet(CloseableHttpClient httpClient, String url, String Authorization) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpGet httpGet = new HttpGet(url);
+        for (String s : headinfo.keySet()) {
+            httpGet.addHeader(s, headinfo.get(s));
+        }
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpGet实例设置配置
+            httpGet.setConfig(requestConfig);
+            // 执行Get请求得到返回对象
+            httpResponse = httpClient.execute(httpGet);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+
+    public static CloseableHttpResponse doDelete(CloseableHttpClient httpClient, String url, String Authorization, String jsonBody) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpDelete httpDelete = new HttpDelete(url);
+        for (String s : headinfo.keySet()) {
+            httpDelete.addHeader(s, headinfo.get(s));
+        }
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpPut实例设置配置
+            httpDelete.setConfig(requestConfig);
+            // 执行Put请求得到返回对象
+            httpResponse = httpClient.execute(httpDelete);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+
+
+    //计算cnonce值,cnonce用于鉴权
+    public static String getCnonce() {
+        double d = Math.random();
+//        double d1 = new Date().getTime() / 1000;
+        double d1 = System.currentTimeMillis()/ 1000;
+        double x = d * d1;
+        DecimalFormat df = new DecimalFormat("#");//四舍五入取整
+        return df.format(x);
+    }
+
+    //计算登录报文头中鉴权信息中的response值
+    public static String getAuthRespInfo(String uname, String upwd, String url, String nonce, String cnonce, String reqmode) {
+
+        //计算HA1
+        String str1 = uname + ":" + "NVRDVR" + ":" + upwd;
+        String ha1 = DigestUtils.md5DigestAsHex(str1.getBytes()).toLowerCase();
+        //String ha1 = md5.toMd5(str1).toLowerCase();
+        //计算HA2
+        String str2 = reqmode + ":" + url;
+        String ha2 = DigestUtils.md5DigestAsHex(str2.getBytes()).toLowerCase();
+        //String ha2 = md5.toMd5(str2).toLowerCase();
+        //计算HA3
+        String str3 = ha1 + ":" + nonce + ":" + "00000001" + ":" + cnonce + ":" + "auth" + ":" + ha2;
+        String ha3 = DigestUtils.md5DigestAsHex(str3.getBytes()).toLowerCase();
+        //String ha3 = md5.toMd5(str3).toLowerCase();
+
+        //拼接报文头中的鉴权信息
+        String Authorization = String.format("Digest username=\"%s\", realm=\"NVRDVR\", qop=auth,nonce=\"%s\""
+                + ",algorithm=MD5,cnonce=\"%s\", nc=00000001,uri=\"%s\", response=\"%s\"", uname, nonce, cnonce, url, ha3);
+        return Authorization;
+    }
+
+
+    //正则表达式提取字符串
+    public static String getMatch(String regex, String source) {
+        String rel = "";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(source);
+        while (matcher.find()) {
+            rel = matcher.group(1);
+        }
+        return rel;
+    }
+
+    //获取response中header中字段的值,例如getHeaderinfo(resp,"WWW-Authenticate")从一个resp的报文头中获取WWW-Authenticate的值
+    public static String getHeaderinfo(HttpResponse resp, String keyword) {
+        return resp.getFirstHeader(keyword).getValue();
+
+    }
+
+    //运行,用于测试类正确行用,可以不用关注。
+    public static void main(String[] args) {
+        String cururl = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().build();
+
+        //不带鉴权信息发送请求,获取nonce
+        CloseableHttpResponse resp = doPut(httpClient, cururl, "", "");
+
+        //从返回中获取nonce值
+        String nonce = getMatch("nonce=\"(.*)\",stale", getHeaderinfo(resp, "WWW-Authenticate"));
+
+        //生成cnonce
+        String cnonce = getCnonce();
+
+        //生成报文头中Authorization字段的值
+        String curAuthorization = getAuthRespInfo(nvruname, nvrpwd, urlString, nonce, cnonce, "PUT");
+        System.out.println("curAuthorization = " + curAuthorization);
+
+        //带鉴权信息再次调用接口
+        CloseableHttpResponse resp2 = doPut(httpClient, cururl, curAuthorization, "");
+        System.out.println("resp2 = " + resp2);
+        HttpEntity entity = resp2.getEntity();
+
+        try {
+            String responString = EntityUtils.toString(entity);
+            //body中返回信息为Succeed,code为0即为登录成功
+            System.out.println(responString);
+        } catch (ParseException | IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            // 关闭相关资源
+            if (null != resp) {
+                try {
+                    resp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != resp2) {
+                try {
+                    resp2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != httpClient) {
+                try {
+                    httpClient.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        }
+
+    }
+
+
+}

+ 236 - 0
src/main/java/com/studenthotel/yushi/SubscriptionConfig.java

@@ -0,0 +1,236 @@
+package com.studenthotel.yushi;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.studenthotel.yushi.utils.SubscriptionVo;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class SubscriptionConfig extends BaseClass {
+
+
+    /**
+     * 调用宇视接口查询人脸识别记录
+     *
+     * @param subscriptionVo
+     * @param requestMode
+     * @param reqBody
+     * @return
+     */
+    public static SubscriptionVo subscriptionRecord(SubscriptionVo subscriptionVo, String requestMode, String reqBody, String urlString) {
+        String url = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().disableCookieManagement().build();
+
+        JSONObject jsonOParam = JSONObject.parseObject(reqBody);
+
+        //不带鉴权信息调用login,获取nonce;调用接口时必须调用/LAPI/V1.0/System/Security/Login
+        CloseableHttpResponse resp = doPut(httpClient, getLoginUrl(), "", "");
+
+        //从第一次调用中获取nonce值
+        String nonce = getMatch("nonce=\"(.*)\",stale", getHeaderinfo(resp, "WWW-Authenticate"));
+        //生成cnonce
+        String cnonce = getCnonce();
+
+        //计算报文头中Authorization字段信息
+        String curAuthorization = getAuthRespInfo(getNvrName(), getNvrPwd(), urlString, nonce, cnonce, requestMode);
+
+        //System.out.println(curAuthorization);
+
+        CloseableHttpResponse resp2;
+        //带鉴权信息调用业务接口
+        if (requestMode.equals("POST")) {
+            resp2 = doPost(httpClient, url, curAuthorization, reqBody);
+        } else {
+            resp2 = doPut(httpClient, url, curAuthorization, reqBody);
+        }
+
+        HttpEntity entity = resp2.getEntity();
+        try {
+            String responString = EntityUtils.toString(entity);
+            //解析response中body,获取相关字段的值
+            JSONObject body = JSONObject.parseObject(responString);
+            JSONObject response = JSONObject.parseObject(body.getString("Response"));
+            String ResponseString = response.getString("ResponseString");
+            String data = response.getString("Data");
+
+            if (ResponseString.equals("Succeed")) {
+                JSONObject jsonData = JSONObject.parseObject(data);
+
+                if (ObjectUtils.isNotEmpty(jsonData.get("ID").toString())) {
+                    subscriptionVo.setID(jsonData.get("ID").toString());
+                }
+
+                if (ObjectUtils.isNotEmpty(jsonData.get("Reference").toString())) {
+                    subscriptionVo.setReference(jsonData.get("Reference").toString());
+                }
+
+                if (ObjectUtils.isNotEmpty(jsonData.get("CurrentTime").toString())) {
+                    subscriptionVo.setCurrentTime(jsonData.get("CurrentTime").toString());
+                }
+
+                if (ObjectUtils.isNotEmpty(jsonData.get("TerminationTime").toString())) {
+                    subscriptionVo.setTerminationTime(jsonData.get("TerminationTime").toString());
+                }
+
+            }
+
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            // 关闭相关资源
+            if (null != resp) {
+                try {
+                    resp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != resp2) {
+                try {
+                    resp2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return subscriptionVo;
+    }
+
+
+
+    public static Map<String, Object> commonRecord(Map<String, Object> dateMap, String requestMode, String reqBody, String urlString) {
+        String url = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().disableCookieManagement().build();
+
+        JSONObject jsonOParam = JSONObject.parseObject(reqBody);
+
+        //不带鉴权信息调用login,获取nonce;调用接口时必须调用/LAPI/V1.0/System/Security/Login
+        CloseableHttpResponse resp = doPut(httpClient, getLoginUrl(), "", "");
+
+        //从第一次调用中获取nonce值
+        String nonce = getMatch("nonce=\"(.*)\",stale", getHeaderinfo(resp, "WWW-Authenticate"));
+        //生成cnonce
+        String cnonce = getCnonce();
+
+        //计算报文头中Authorization字段信息
+        String curAuthorization = getAuthRespInfo(getNvrName(), getNvrPwd(), urlString, nonce, cnonce, requestMode);
+
+        //System.out.println(curAuthorization);
+
+        CloseableHttpResponse resp2;
+        //带鉴权信息调用业务接口
+        if (requestMode.equals("POST")) {
+            resp2 = doPost(httpClient, url, curAuthorization, reqBody);
+        } else {
+            resp2 = doPut(httpClient, url, curAuthorization, reqBody);
+        }
+        HttpEntity entity = resp2.getEntity();
+
+        try {
+            String responString = EntityUtils.toString(entity);
+            //解析response中body,获取相关字段的值
+            JSONObject body = JSONObject.parseObject(responString);
+
+            Map response = JSONObject.parseObject(body.getString("Response"), Map.class);
+
+            dateMap.put("Response", response);
+
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            // 关闭相关资源
+            if (null != resp) {
+                try {
+                    resp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != resp2) {
+                try {
+                    resp2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return dateMap;
+    }
+
+
+    public static Map<String, Object> alarmSubscription(Map<String, Object> dateMap, String requestMode, String reqBody, String urlString) {
+        String url = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().build();
+
+        JSONObject jsonOParam = JSONObject.parseObject(reqBody);
+
+        //不带鉴权信息调用login,获取nonce;调用接口时必须调用/LAPI/V1.0/System/Security/Login
+        CloseableHttpResponse resp = doPut(httpClient, getLoginUrl(), "", "");
+
+        //从第一次调用中获取nonce值
+        String nonce = getMatch("nonce=\"(.*)\",stale", getHeaderinfo(resp, "WWW-Authenticate"));
+        //生成cnonce
+        String cnonce = getCnonce();
+
+        //计算报文头中Authorization字段信息
+        String curAuthorization = getAuthRespInfo(getNvrName(), getNvrPwd(), urlString, nonce, cnonce, requestMode);
+
+        //System.out.println(curAuthorization);
+
+        CloseableHttpResponse resp2 = null;
+        //带鉴权信息调用业务接口
+        if (requestMode.equals("POST")) {
+            resp2 = doPost(httpClient, url, curAuthorization, reqBody);
+        } else if ("DELETE".equals(requestMode)){
+            resp2=doDelete(httpClient, url, curAuthorization, reqBody);
+        }else {
+            resp2 = doPut(httpClient, url, curAuthorization, reqBody);
+        }
+        HttpEntity entity = resp2.getEntity();
+
+        try {
+            String responString = EntityUtils.toString(entity);
+            //解析response中body,获取相关字段的值
+            JSONObject body = JSONObject.parseObject(responString);
+            JSONObject response = JSONObject.parseObject(body.getString("Response"));
+            String ResponseString = response.getString("ResponseString");
+            String data = response.getString("Data");
+            JSONObject jsonObject = JSONObject.parseObject(data);
+            if ("Succeed".equals(ResponseString)) {
+                dateMap = JSONObject.parseObject(jsonObject.toString(),new TypeReference<Map<String, String>>(){});
+            }
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            // 关闭相关资源
+            if (null != resp) {
+                try {
+                    resp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != resp2) {
+                try {
+                    resp2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return dateMap;
+    }
+
+
+}

+ 8 - 0
src/main/java/com/studenthotel/yushi/utils/LibID.java

@@ -0,0 +1,8 @@
+package com.studenthotel.yushi.utils;
+
+import lombok.Data;
+
+@Data
+public class LibID {
+    private Integer LibID;
+}

+ 11 - 0
src/main/java/com/studenthotel/yushi/utils/SubscribePersonCondition.java

@@ -0,0 +1,11 @@
+package com.studenthotel.yushi.utils;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SubscribePersonCondition {
+    private Integer LibIDNum;
+    private List<LibID> LibIDList;
+}

+ 13 - 0
src/main/java/com/studenthotel/yushi/utils/SubscriptionVo.java

@@ -0,0 +1,13 @@
+package com.studenthotel.yushi.utils;
+
+
+import lombok.Data;
+
+@Data
+public class SubscriptionVo {
+    private String ID;
+    private String Reference;
+    private String CurrentTime;
+    private String TerminationTime;
+
+}

+ 13 - 0
src/main/java/common/dto/BuildTotalPeopleDto.java

@@ -0,0 +1,13 @@
+package common.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BuildTotalPeopleDto {
+    private String name;
+    private Integer people;
+}

+ 15 - 0
src/main/java/common/dto/FaceRecognitionDto.java

@@ -0,0 +1,15 @@
+package common.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FaceRecognitionDto {
+    private String pictureUrl;
+    private String name;
+    private String address;
+    private Date dateTime;
+    private String clazz;
+
+}

+ 12 - 0
src/main/java/common/dto/PersonnelAccessDto.java

@@ -0,0 +1,12 @@
+package common.dto;
+
+import lombok.Data;
+
+@Data
+public class PersonnelAccessDto {
+    private String date;
+    private Integer count;
+
+
+
+}

+ 16 - 0
src/main/java/common/dto/TotalEnergyDto.java

@@ -0,0 +1,16 @@
+package common.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TotalEnergyDto {
+    private Double coldWaterTotalMoney;
+    private Double coldWaterTotalPower;
+    private Double electricTotalMoney;
+    private Double electricTotalPower;
+    private String dateTime;
+}

+ 15 - 0
src/main/java/common/exception/EmsException.java

@@ -0,0 +1,15 @@
+package common.exception;
+
+import common.exception.MyCustomException;
+import common.result.ResponseStatusEnum;
+
+/**
+ * 处理异常,统一封装
+ */
+public class EmsException {
+
+    public static void display(ResponseStatusEnum responseStatusEnum) {
+        throw new MyCustomException(responseStatusEnum);
+    }
+
+}

+ 178 - 0
src/main/java/common/exception/EmsExceptionHandler.java

@@ -0,0 +1,178 @@
+package common.exception;
+
+import com.studenthotel.model.utils.CommonResult;
+import com.fasterxml.jackson.core.JsonParseException;
+import common.result.ResponseStatusEnum;
+import org.mybatis.spring.MyBatisSystemException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+
+import java.util.*;
+
+/**
+ * 统一异常拦截处理
+ * 可以针对异常的类型进行捕获,然后返回json信息到前端
+ */
+@ControllerAdvice
+public class EmsExceptionHandler {
+
+    //org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
+    final static Logger logger=LoggerFactory.getLogger(EmsExceptionHandler.class);
+
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public CommonResult exception(Exception e) {
+        e.printStackTrace();
+        //String error=e.getFieldError().getDefaultMessage();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_ERROR);
+    }
+
+    //mysql连接超时
+    @ExceptionHandler(MyBatisSystemException.class)
+    @ResponseBody
+    public CommonResult exception(MyBatisSystemException e) {
+        e.printStackTrace();
+        //String error=e.getFieldError().getDefaultMessage();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_MYSQL_TIMEOUT_ERROR);
+    }
+
+//    //mysql连接超时
+//    @ExceptionHandler(MySQLNonTransientConnectionException.class)
+//    @ResponseBody
+//    public GraceJSONResult exception(MySQLNonTransientConnectionException e) {
+//        e.printStackTrace();
+//        //String error=e.getFieldError().getDefaultMessage();
+//        logger.error("错误信息",e.fillInStackTrace());
+//        return GraceJSONResult.exception(ResponseStatusEnum.SYSTEM_MYSQL_TIMEOUT_ERROR);
+//    }
+
+    //请求方式错误
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseBody
+    public CommonResult httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        e.printStackTrace();
+        logger.error("错误信息",e.fillInStackTrace());
+        //String error=e.getFieldError().getDefaultMessage();
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_REQUEST_METHOD_ERROR);
+    }
+
+    //传参空异常
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    @ResponseBody
+    public CommonResult missingServletRequestParameterException(MissingServletRequestParameterException e) {
+        String name=  e.getParameterName();
+        logger.error("错误信息",e.fillInStackTrace());
+
+        //String error=e.getFieldError().getDefaultMessage();
+        return CommonResult.errorMsg(name+"不能为空");
+    }
+
+    @ExceptionHandler(MyCustomException.class)
+    @ResponseBody
+    public CommonResult returnMyException(MyCustomException e) {
+        e.printStackTrace();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(e.getResponseStatusEnum());
+    }
+
+    /**
+     * 传入JSON数据格式错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(JsonParseException.class)
+    @ResponseBody
+    public CommonResult returnMyException(JsonParseException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        e.printStackTrace();
+        return CommonResult.resultValue(ResponseStatusEnum.SEND_PARAMS);
+    }
+
+
+    /**
+     * 传入JSON数据格式转换错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    @ResponseBody
+    public CommonResult httpMessageNotReadableException(HttpMessageNotReadableException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        e.printStackTrace();//
+        if(e.getCause() instanceof  InvalidFormatException){
+            InvalidFormatException e1=   (InvalidFormatException)e.getCause();
+            Object erro1= e1.getValue();
+            Object erro2=e1.getTargetType().getSimpleName();
+            System.out.print(erro1);
+            System.out.print(erro2);
+        }
+
+        String error=e.getMessage();
+        return CommonResult.resultValue(ResponseStatusEnum.SEND_PARAMS_TYPE);
+    }
+
+
+
+
+
+
+
+    /**
+     * 参数验证错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseBody
+    public CommonResult returnException(MethodArgumentNotValidException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        BindingResult result = e.getBindingResult();
+        Map<String, String> map = getErrors(result);
+        return CommonResult.errorMap(map);
+    }
+
+    /**
+     * 参数验证错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
+    @ResponseBody
+    public CommonResult returnException(MethodArgumentTypeMismatchException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        String value=e.getValue().toString();
+        String paraType=e.getRequiredType().getName().toString();
+
+        return CommonResult.errorMsg(e.getName()+"数据格式转换错误");
+    }
+
+
+    public Map<String, String> getErrors(BindingResult result) {
+        Map<String, String> map = new HashMap<>();
+        List<FieldError> errorList = result.getFieldErrors();
+        for (FieldError error : errorList) {
+            // 发送验证错误的时候所对应的某个属性
+            String field = error.getField();
+            // 验证的错误消息
+            String msg = error.getDefaultMessage();
+            map.put(field, msg);
+        }
+        return map;
+    }
+
+
+}

+ 29 - 0
src/main/java/common/exception/MyCustomException.java

@@ -0,0 +1,29 @@
+package common.exception;
+
+import common.result.ResponseStatusEnum;
+
+/**
+ * 自定义异常
+ * 目的:统一处理异常信息
+ *      便于解耦,service与controller错误的解耦,不会被service返回的类型而限制
+ */
+public class MyCustomException extends RuntimeException {
+
+    private ResponseStatusEnum responseStatusEnum;
+
+    public MyCustomException(ResponseStatusEnum responseStatusEnum) {
+        super("异常状态码为:" + responseStatusEnum.status()
+                + ";具体异常信息为:" + responseStatusEnum.msg());
+        this.responseStatusEnum = responseStatusEnum;
+    }
+
+    public ResponseStatusEnum getResponseStatusEnum() {
+        return responseStatusEnum;
+    }
+
+    public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
+        this.responseStatusEnum = responseStatusEnum;
+    }
+
+
+}

+ 7 - 0
src/main/java/common/result/Code.java

@@ -0,0 +1,7 @@
+package common.result;
+
+public interface Code {
+    Integer getStatus();
+    Boolean getSuccess();
+    String getMsg();
+}

+ 78 - 0
src/main/java/common/result/ResponseStatusEnum.java

@@ -0,0 +1,78 @@
+package common.result;
+
+/**
+ * 响应结果枚举,用于提供给GraceJSONResult返回给前端的
+ * 本枚举类中包含了很多的不同的状态码供使用,可以自定义
+ * 便于更优雅的对状态码进行管理,一目了然
+ */
+public enum ResponseStatusEnum implements Code{
+
+    EXISTS(999,false,"已存在"),
+    SUCCESS(200, true, "操作成功!"),
+    FAILED(500, false, "操作失败!"),
+    SEND_PARAMS(501,false,"传入参数数据结构错误"),
+    SEND_PARAMS_TYPE(502,false,"传入参数数据数据类型错误"),
+    UN_SERVICES_ERROR(505,false,"操作失败,请联系管理员"),
+
+    // 自定义系统级别异常 54x
+    SYSTEM_ERROR(540, false, "系统错误,错误未知!"),
+    SYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"),
+    SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"),
+    SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"),
+    SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"),
+    SYSTEM_PARSE(545, false, "系统错误,解析异常!"),
+    SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"),
+    SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"),
+    SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"),
+    SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"),
+    SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"),
+    SYSTEM_ERROR_GLOBAL(551, false, "系统繁忙,请稍后再试!"),
+    SYSTEM_ERROR_ZUUL(552, false, "请求系统过于繁忙,请稍后再试!"),
+    SYSTEM_REQUEST_METHOD_ERROR(553, false, "请求类型错误"),
+    SYSTEM_MYSQL_TIMEOUT_ERROR(554, false, "Mysql连接超时"),
+    SYSTEM_MONGO_TIMEOUT_ERROR(555, false, "Mongo连接超时"),
+    SYSTEM_PHONE_ERROR(556,false,"手机号格式错误"),
+    SYSTEM_SEND_PHONE_ERROR(557,false,"发送验证码失败"),
+    SYSTEM_TOKEN_ERROR(558,false,"token为空"),
+    SYSTEM_LOGIN_ERROR(559,false,"无效token");
+
+    // 响应业务状态
+    private Integer status;
+    // 调用是否成功
+    private Boolean success;
+    // 响应消息,可以为成功或者失败的消息
+    private String msg;
+
+    ResponseStatusEnum(Integer status, Boolean success, String msg) {
+        this.status = status;
+        this.success = success;
+        this.msg = msg;
+    }
+
+    public Integer status() {
+        return status;
+    }
+    public Boolean success() {
+        return success;
+    }
+    public String msg() {
+        return msg;
+    }
+
+    @Override
+    public Integer getStatus() {
+        return status;
+    }
+
+    @Override
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+
+}

+ 210 - 0
src/main/java/common/utils/AesUtils.java

@@ -0,0 +1,210 @@
+package common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.util.encoders.Base64;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @Author: liujun
+ * @Description: Aes 加解密算法
+ * @Date Create in 上午 9:38$ 2017/12/26 0026$
+ * @Modify By:
+ */
+@Slf4j
+public class AesUtils {
+    /**
+     * @Author liujun
+     * @Description:
+     * @params: * @param content 需要加密的内容
+     * @param password  加密密码
+     * @Date 上午 9:41 2017/12/26 0026
+     */
+
+    public static String encrypt(String content, String password) {
+        //数据为空,不需要进行加解密,否则会出现空指针异常
+//        if(StringUtil.isEmpty(content)) {
+//            return null;
+//        }
+
+        if(password.length()<16) {
+            password = password + "0000000000000000".substring(0, 16-password.length());
+        }
+        else if(password.length()>16) {
+            password = password.substring(0, 16);
+        }
+
+        return bytes2HexString(encryptAES(content.getBytes(), password.getBytes()));
+    }
+
+
+    /**
+     * @Author liujun
+     * @Description:
+     * @params: * @param content 待解密内容
+     * @param password 解密密钥
+     * @Date 上午 9:40 2017/12/26 0026
+     */
+    public static String decrypt(String content, String password) {
+        //数据为空,不需要进行加解密,否则会出现空指针异常
+//        if(StringUtil.isEmpty(content)) {
+//            return null;
+//        }
+
+        if(password.length()<16) {
+            password = password + "0000000000000000".substring(0, 16-password.length());
+        }
+        else if(password.length()>16) {
+            password = password.substring(0, 16);
+        }
+
+        return new String(decryptAES(hexString2Bytes(content), password.getBytes()));
+    }
+
+    /**
+     * AES 加密
+     *
+     * @param data 明文
+     * @param key  16、24、32 字节秘钥
+     * @return 密文
+     */
+    public static byte[] encryptAES(final byte[] data,
+                                    final byte[] key) {
+
+        try {
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            byte[] byteContent = data;
+            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);// 初始化
+            byte[] result = cipher.doFinal(byteContent);
+            return result; // 加密
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(),e);
+        } catch (NoSuchPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (InvalidKeyException e) {
+            log.error(e.getMessage(),e);
+        } catch (IllegalBlockSizeException e) {
+            log.error(e.getMessage(),e);
+        } catch (BadPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
+
+    /**
+     * AES 解密
+     *
+     * @param data 密文
+     * @param key  16、24、32 字节秘钥
+     * @return 明文
+     */
+    public static byte[] decryptAES(final byte[] data,
+                                    final byte[] key) {
+
+        try {
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// 初始化
+            byte[] result = cipher.doFinal(data);
+            return result; // 加密
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(),e);
+        } catch (NoSuchPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (InvalidKeyException e) {
+            log.error(e.getMessage(),e);
+        } catch (IllegalBlockSizeException e) {
+            log.error(e.getMessage(),e);
+        } catch (BadPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
+
+    public static String bytes2HexString(final byte[] bytes) {
+        if (bytes == null) return null;
+        int len = bytes.length;
+        if (len <= 0) return null;
+        char[] ret = new char[len << 1];
+        for (int i = 0, j = 0; i < len; i++) {
+            ret[j++] = hexDigits[bytes[i] >>> 4 & 0x0f];
+            ret[j++] = hexDigits[bytes[i] & 0x0f];
+        }
+        return new String(ret);
+    }
+
+    private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    public static byte[] hexString2Bytes(String hexString) {
+        if (isSpace(hexString)) return null;
+        int len = hexString.length();
+        if (len % 2 != 0) {
+            hexString = "0" + hexString;
+            len = len + 1;
+        }
+        char[] hexBytes = hexString.toUpperCase().toCharArray();
+        byte[] ret = new byte[len >> 1];
+        for (int i = 0; i < len; i += 2) {
+            ret[i >> 1] = (byte) (hex2Dec(hexBytes[i]) << 4 | hex2Dec(hexBytes[i + 1]));
+        }
+        return ret;
+    }
+
+    private static int hex2Dec(final char hexChar) {
+        if (hexChar >= '0' && hexChar <= '9') {
+            return hexChar - '0';
+        } else if (hexChar >= 'A' && hexChar <= 'F') {
+            return hexChar - 'A' + 10;
+        } else {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    public static byte[] base64Encode(final byte[] input) {
+        return Base64.encode(input);
+    }
+
+    public static byte[] base64Decode(final byte[] input) {
+
+        return Base64.decode(input);
+    }
+
+    private static boolean isSpace(final String s) {
+        if (s == null) return true;
+        for (int i = 0, len = s.length(); i < len; ++i) {
+            if (!Character.isWhitespace(s.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static void main(String[] args) {
+        String s="{\n" +
+                "  \"categoryId\": \"72cf28a8789643bbbbb62d08ee91f17e\",\n" +
+                "     \"luid\": \"80A036D93CFB\",\n" +
+                "     \"type\":\"4\",\n" +
+                "     \"userName\":\"13097286670\",\n" +
+                "     \"startTime\":\"1682389484000\",\n" +
+                "     \"endTime\":\"1684981484000\",\n" +
+                "     \"password\":\"A08E87B5E777EBEE2C6EF3262F069D5A\"\n" +
+                "}";
+        //加密
+        String encryptString = AesUtils.encrypt("548903", "80A036D93CFB");
+        System.out.println("加密后字符串:"+encryptString);
+        //解密
+        String decryptString = AesUtils.decrypt(encryptString, "80A036D93CFB");
+        System.out.println("解密后字符串:"+decryptString);
+    }
+}

+ 100 - 0
src/main/java/common/utils/Base64Utils.java

@@ -0,0 +1,100 @@
+package common.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.*;
+
+public class Base64Utils {
+    /**
+     * 图片转化成base64字符串
+     * @param imgPath
+     * @return
+     */
+    public static String GetImageStr(String imgPath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+
+
+        String imgFile = imgPath;// 待处理的图片
+        InputStream in = null;
+        byte[] data = null;
+        String encode ="data:image/jpeg;base64,"; // 返回Base64编码过的字节数组字符串
+        // 对字节数组Base64编码
+        BASE64Encoder encoder = new BASE64Encoder();
+        try {
+            // 读取图片字节数组
+            in = new FileInputStream(imgFile);
+            data = new byte[in.available()];
+            in.read(data);
+            encode = encode+encoder.encode(data);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                in.close();
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+
+        return encode;
+
+
+    }
+
+
+
+    /**
+     * base64字符串转化成图片
+     *
+     * @param imgData
+     *            图片编码
+     * @param imgFilePath
+     *            存放到本地路径
+     * @return
+     * @throws IOException
+     */
+
+    public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片
+        if (imgData == null|| StringUtils.isBlank(imgFilePath)) // 图像数据为空
+        {
+            return false;
+        }
+        BASE64Decoder decoder = new BASE64Decoder();
+//        将空格转成+
+        imgData = imgData.replaceAll(" ", "+").split("base64,")[1];
+        OutputStream out = null;
+        try {
+            out = new FileOutputStream(imgFilePath);
+            // Base64解码
+            byte[] b = decoder.decodeBuffer(imgData);
+            for (int i = 0; i < b.length; ++i) {
+                if (b[i] < 0) {// 调整异常数据
+                    b[i] += 256;
+                }
+            }
+            out.write(b);
+        } catch (FileNotFoundException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            out.flush();
+            out.close();
+            return true;
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        String imageStr = Base64Utils.GetImageStr("E:\\image\\e/f/1/ef16308f92fb47ee92b7e0350aaefe08.jpg");
+        System.out.println(imageStr);
+//        Base64Utils.GenerateImage(imageStr, "F://2.jpg");
+    }
+
+}
+
+

+ 173 - 0
src/main/java/common/utils/CommonUtil.java

@@ -0,0 +1,173 @@
+package common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.MessageDigest;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
+
+/**
+ * 公共工具类
+ **/
+@Slf4j
+public class CommonUtil {
+    /**
+     * 获取ip
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ipAddress = null;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            System.out.println("x-forwarded-for="+ipAddress);
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+                System.out.println("Proxy-Client-IP="+ipAddress);
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+                System.out.println("WL-Proxy-Client-IP="+ipAddress);
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                System.out.println("getRemoteAddr="+ipAddress);
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inet = null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (UnknownHostException e) {
+                        e.printStackTrace();
+                    }
+                    ipAddress = inet.getHostAddress();
+                    System.out.println("getHostAddress="+ipAddress);
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) {
+                // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress = "";
+        }
+        return ipAddress;
+    }
+
+
+    /**
+     * 获取全部请求头
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getAllRequestHeader(HttpServletRequest request) {
+        Enumeration<String> headerNames = request.getHeaderNames();
+        Map<String, String> map = new HashMap<>();
+        while (headerNames.hasMoreElements()) {
+            String key = headerNames.nextElement();
+            //根据名称获取请求头的值
+            String value = request.getHeader(key);
+            map.put(key, value);
+        }
+
+        return map;
+    }
+
+
+    /**
+     * MD5加密
+     *
+     * @param data
+     * @return
+     */
+    public static String MD5(String data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+
+            return sb.toString().toUpperCase();
+        } catch (Exception exception) {
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取验证码随机数
+     *
+     * @param length
+     * @return
+     */
+    public static String getRandomCode(int length) {
+        String sources = "0123456789";
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder();
+        for (int j = 0; j < length; j++) {
+            sb.append(sources.charAt(random.nextInt(9)));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 获取当前时间戳
+     *
+     * @return
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * 生成uuid
+     *
+     * @return
+     */
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+    /**
+     * 获取随机长度的串
+     *
+     * @param length
+     * @return
+     */
+    private static final String ALL_CHAR_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+    public static String getStringNumRandom(int length) {
+        //生成随机数字和字母,
+        Random random = new Random();
+        StringBuilder saltString = new StringBuilder(length);
+        for (int i = 1; i <= length; ++i) {
+            saltString.append(ALL_CHAR_NUM.charAt(random.nextInt(ALL_CHAR_NUM.length())));
+        }
+        return saltString.toString();
+    }
+
+    /**
+     * LocalDate 拼接时间转成 LocalDateTime
+     * @param localDate
+     * @param timeStr HH:mm:ss
+     * @return
+     */
+    public static LocalDateTime localDateToTime(LocalDate localDate, String timeStr) {
+        LocalTime time = LocalTime.parse(timeStr);
+        return LocalDateTime.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth(),
+                time.getHour(), time.getMinute(), time.getSecond());
+    }
+}

+ 44 - 0
src/main/java/common/utils/EncryptionUtil.java

@@ -0,0 +1,44 @@
+package common.utils;
+
+
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class EncryptionUtil {
+
+
+    private static final int MAX_JSON_STRING = 40;
+
+    /**
+     * 将需要加密的字段分批加密
+     *
+     * @param jsonString
+     * @param publicKey
+     * @return
+     * @throws Exception
+     */
+    public Map<Object, Object> encryption(String jsonString, String publicKey) throws Exception {
+        int length = jsonString.length();
+        int offset = 0;
+        int i = 0;
+        HashMap<Object, Object> map = new HashMap<>();
+//        判断字符串长度是否大于40,大于就截取前40位,分批加密
+        while (length - offset > 0) {
+            if (length - offset > MAX_JSON_STRING) {
+                String substring = jsonString.substring(offset, offset + MAX_JSON_STRING);
+                String encrypt = RSAUtils.encrypt(substring, RSAUtils.getPublicKey(publicKey));
+                map.put(i, encrypt);
+            } else {
+                String substring = jsonString.substring(offset,length);
+                String encrypt = RSAUtils.encrypt(substring, RSAUtils.getPublicKey(publicKey));
+                map.put(i, encrypt);
+            }
+            i++;
+            offset = i * MAX_JSON_STRING;
+        }
+        return map;
+    }
+}

+ 74 - 0
src/main/java/common/utils/FileUtil.java

@@ -0,0 +1,74 @@
+package common.utils;
+
+
+import java.io.File;
+import java.util.UUID;
+
+public class FileUtil {
+
+    /*
+        upload
+            36字符串  ----  4aeb1da864af42a58bd7aeee7e3ac63a
+            4
+             a
+              e
+                4aeb1da864af42a58bd7aeee7e3ac63a
+     */
+
+    /**
+     * 生成包含三级目录和随机文件名
+     *
+     * @return 数组,元素分别是:文件路径、文件名
+     */
+    public static String[] getFileNameAndPath() {
+        // 生成一个唯一的文件名
+        String fineName = UUID.randomUUID().toString();
+        fineName = fineName.replaceAll("-", "");
+
+        // 获取前三个字符作为目录名
+        char c1 = fineName.charAt(0);
+        char c2 = fineName.charAt(1);
+        char c3 = fineName.charAt(2);
+
+        StringBuilder filePath = new StringBuilder().append(c1).append("/").append(c2).append("/").append(c3).append("/");
+
+        return new String[]{filePath.toString(), fineName};
+    }
+
+    /**
+     * 生成包含三级目录的随机文件名
+     *
+     * @return 文件名,包含三级目录
+     */
+    public static String getFileNameWithPath() {
+        // 生成一个唯一的文件名
+        String fineName = UUID.randomUUID().toString();
+        fineName = fineName.replaceAll("-", "");
+
+        // 获取前三个字符作为目录名
+        char c1 = fineName.charAt(0);
+        char c2 = fineName.charAt(1);
+        char c3 = fineName.charAt(2);
+
+        StringBuilder filePath = new StringBuilder().append(c1).append("/").append(c2).append("/").append(c3).append("/");
+
+        return filePath.append(fineName).toString();
+    }
+
+    /**
+     * 判断三级目录是否存在
+     *
+     * @param fileNameWithPath
+     * @param uploadRealPath
+     */
+    public static void makeDirs(String fileNameWithPath, String uploadRealPath) {
+        //截取目录,判断是否存在,不存在就创建
+        String filePath = fileNameWithPath.substring(0, fileNameWithPath.lastIndexOf("/"));
+
+        // 如果不存在,就创建
+        if (!new File(uploadRealPath, filePath).exists()) {
+            new File(uploadRealPath, filePath).mkdirs();
+        }
+    }
+
+}

+ 58 - 0
src/main/java/common/utils/HMAC.java

@@ -0,0 +1,58 @@
+package common.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class HMAC {
+
+    /**
+     * UTC时间戳
+     */
+    private String stamp;
+    /**
+     *账号签名
+     */
+    private String sign;
+
+
+    public static void main(String[] args) throws Exception {
+        HMAC hmac = new HMAC();
+        hmac.HMACSHA256("POST","5C78D964F6C534DFA918EAC7854F4529","/record/info?page=",1);
+
+        System.out.println(hmac.getStamp()+"----"+hmac.getSign());
+
+    }
+
+    /**
+     * 通过HMACSHA256加密 由UTC的时间戳+请求方式+app_key+page组成的字符串
+     *      再由base64加密输出得到百胜云平台请求接口的签名
+     * @param method
+     * @param app_key
+     * @param request_url
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    public void HMACSHA256(String method, String app_key, String request_url, Integer page) throws Exception {
+        stamp = String.valueOf(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.of("+8")).toEpochMilli());
+        String url = stamp + method + request_url + page;
+        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+        SecretKeySpec secretKey = new SecretKeySpec(app_key.getBytes("utf-8"), "HmacSHA256");
+        sha256_HMAC.init(secretKey);
+        byte[] hash = sha256_HMAC.doFinal(url.getBytes("utf-8"));
+        sign = Base64.encodeBase64String(hash);
+    }
+
+}

+ 105 - 0
src/main/java/common/utils/JWTUtil.java

@@ -0,0 +1,105 @@
+package common.utils;
+
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * jwt 工具
+ **/
+@Slf4j
+public class JWTUtil {
+
+    private static String SIGNATURE = "token!@#$%^7890";
+
+    /**
+     * token过期时间,7天
+     */
+//    private static final long EXPIRED = 1000 * 60 * 60 * 24 * 7;
+    private static final long EXPIRED = 1000 * 60 * 60 * 24;
+
+    /**
+     * 生成token 有过期时间
+     * @return 返回token
+     */
+//    public static String getToken(SystemUser user){
+//
+//        // 签发时间
+//        Date iatDate = new Date();
+//
+////        // 过期时间
+////        Calendar nowTime = Calendar.getInstance();
+////        nowTime.add(Calendar.DAY_OF_WEEK, 3);
+////        Date expiresDate = nowTime.getTime();
+//
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("alg", "HMAC256");
+//        map.put("typ", "JWT");
+//        String token = JWT.create()
+//                .withHeader(map) // header
+//                .withClaim("phone", user.getPhoneNumber()) // payload
+//                .withClaim("roleId", user.getRoleId())
+//                .withExpiresAt(new Date(CommonUtil.getCurrentTimestamp() + EXPIRED)) // 设置过期时间。过期时间要大于签发时间
+//                .withIssuedAt(iatDate) // 设置签发时间
+//                .sign(Algorithm.HMAC256(SIGNATURE)); // 加密
+
+//        return token;
+
+//
+//        JWTCreator.Builder builder = JWT.create();
+//        map.forEach((k,v)->{
+//            builder.withClaim(k,v);
+//        });
+//        Calendar instance = Calendar.getInstance();
+//        instance.add(Calendar.SECOND,7);
+//        builder.withExpiresAt(instance.getTime());
+//        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
+//    }
+
+    public static long getExpired() {
+        return EXPIRED;
+    }
+
+
+    /**
+     * 验证token
+     * @param token
+     */
+    public static void verify(String token){
+        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
+    }
+
+    /**
+     * 获取token中payload
+     * @param token
+     * @return
+     */
+    public static DecodedJWT getToken(String token){
+        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
+    }
+
+
+
+    /*
+     * 解密Token
+     * */
+    public static Map<String, Claim> verifyToken(String token)  {
+        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SIGNATURE)).build();
+        DecodedJWT jwt = null;
+        try {
+            jwt = verifier.verify(token);
+        } catch (Exception e) {
+            throw new RuntimeException("登录凭证已过去,请重新登录");
+        }
+
+        return jwt.getClaims();
+    }
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 196 - 0
src/main/java/common/utils/RSAUtils.java


+ 25 - 0
src/main/java/common/utils/ValidateCode.java

@@ -0,0 +1,25 @@
+package common.utils;
+
+import java.util.Random;
+
+//验证码随机数
+public  class  ValidateCode {
+
+   public static Integer generateValidateCode(int length){
+       Integer code =null;
+       if(length == 4){
+           code = new Random().nextInt(9999);//生成随机数,最大为9999
+           if(code < 1000){
+               code = code + 1000;//保证随机数为4位数字
+           }
+       }else if(length == 6){
+           code = new Random().nextInt(999999);//生成随机数,最大为999999
+           if(code < 100000){
+               code = code + 100000;//保证随机数为6位数字
+           }
+       }else{
+           throw new RuntimeException("只能生成4位或6位数字验证码");
+       }
+       return code;
+   }
+}

+ 32 - 0
src/main/java/common/utils/smsUtil.java

@@ -0,0 +1,32 @@
+package common.utils;
+
+import com.github.qcloudsms.SmsSingleSender;
+import com.github.qcloudsms.SmsSingleSenderResult;
+import com.github.qcloudsms.httpclient.HTTPException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/20 星期四 8:26
+ * @Description: common
+ * @Version: 1.0
+ */
+public class smsUtil {
+//    @Autowired
+//    private static smsConfig smsConfig;
+//
+//    /**
+//     * 发送单条短信验证码
+//     * @param smmCode 短信验证码
+//     * @param phoneNumber 手机号
+//     * @return
+//     */
+//    public static void sendSingleMessage(String smmCode, String phoneNumber) throws HTTPException, IOException {
+//        String[] params = {smmCode,Integer.toString(smsConfig.getSmsMin())};
+//        SmsSingleSender ssender = new SmsSingleSender(smsConfig.getSdkAppid(), smsConfig.getAppKey());
+//        SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumber, smsConfig.getTemplateId(), params, smsConfig.getSmsSign(), "", "");
+//        System.out.println(result);
+//    };
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 61 - 0
src/main/resources/application-dev.yml


Datei-Diff unterdrückt, da er zu groß ist
+ 57 - 0
src/main/resources/application-prod.yml


Datei-Diff unterdrückt, da er zu groß ist
+ 57 - 0
src/main/resources/application.yml


+ 5 - 0
src/main/resources/mapper/studenthotel/ColdWaterMapper.xml

@@ -0,0 +1,5 @@
+<?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">
+<mapper namespace="com.studenthotel.mapper.ColdWaterMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/studenthotel/ContrastFailureMapper.xml

@@ -0,0 +1,5 @@
+<?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">
+<mapper namespace="com.studenthotel.mapper.ContrastFailureMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/studenthotel/DormMapper.xml

@@ -0,0 +1,5 @@
+<?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">
+<mapper namespace="com.studenthotel.mapper.DormMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/studenthotel/ElectricMapper.xml

@@ -0,0 +1,5 @@
+<?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">
+<mapper namespace="com.studenthotel.mapper.ElectricMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/studenthotel/FaceRecognitionMapper.xml

@@ -0,0 +1,5 @@
+<?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">
+<mapper namespace="com.studenthotel.mapper.FaceRecognitionMapper">
+
+</mapper>

+ 0 - 0
src/main/resources/mapper/studenthotel/SchoolUserMapper.xml


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.