3
0

24 Commity 57be204a47 ... 4c2d008a55

Autor SHA1 Správa Dátum
  liu 4c2d008a55 合并历史:迁移自 Coding.net 2 mesiacov pred
  liu 3250243742 Merge branch 'master' of https://mx.jqmoyan.com/ch-校园卡/student_portraits_api 2 mesiacov pred
  liu 4a5966bf61 更新 1 rok pred
  liu 24faa4dcab 更新 1 rok pred
  liu 5770a8ecbb 更新最新代码 2 rokov pred
  liu 96d985f855 添加数据库表结构 2 rokov pred
  liu 21dd84a5b2 版本迭代 2 rokov pred
  liu 904b30e1ed 最新代码 2 rokov pred
  liu 8bdae939b8 add:根据微校推送信息自动更改信息 3 rokov pred
  liu b6523da6e9 新增登录接口 3 rokov pred
  liu 9500681dad 新增登录接口 3 rokov pred
  liu cd53dd5eef 新增登录接口 3 rokov pred
  liu 39492af892 修改bug后的版本 3 rokov pred
  liu f414654c89 学生肖像添加一个坐标显示在该坐标的所有事件 3 rokov pred
  liu f9e0b383c6 学生肖像修改后整体代码 3 rokov pred
  liu fe5cf96d6f 添加日志 3 rokov pred
  liu 16f14fc5ce 添加日志文件 3 rokov pred
  liu 752f4c6cb9 解决单个学生索引越界bug 3 rokov pred
  liu d11d908677 优化消费能力功能 3 rokov pred
  liu b09a959642 全校学生能力功能 3 rokov pred
  liu 3e0828589e 个人学生能力功能 3 rokov pred
  liu f20530506b 亲密度汇总统计功能 3 rokov pred
  Admin c649c99abe 项目 3 rokov pred
  陈志斌 aac6149eb0 Initial Commit 3 rokov pred
100 zmenil súbory, kde vykonal 5225 pridanie a 0 odobranie
  1. 8 0
      .idea/.gitignore
  2. 15 0
      .idea/compiler.xml
  3. 7 0
      .idea/encodings.xml
  4. 25 0
      .idea/jarRepositories.xml
  5. 12 0
      .idea/misc.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 6 0
      .idea/vcs.xml
  8. 290 0
      pom.xml
  9. 24 0
      src/main/java/com/chuanghai/student_portrait/StudentPortraitApplication.java
  10. 28 0
      src/main/java/com/chuanghai/student_portrait/annotation/PassToken.java
  11. 347 0
      src/main/java/com/chuanghai/student_portrait/config/BaseClass.java
  12. 106 0
      src/main/java/com/chuanghai/student_portrait/config/ChannelDetailInfos.java
  13. 154 0
      src/main/java/com/chuanghai/student_portrait/config/FacePassRecord.java
  14. 74 0
      src/main/java/com/chuanghai/student_portrait/config/JedisUtil.java
  15. 21 0
      src/main/java/com/chuanghai/student_portrait/config/PageConfig.java
  16. 22 0
      src/main/java/com/chuanghai/student_portrait/config/RedisConfig.java
  17. 20 0
      src/main/java/com/chuanghai/student_portrait/config/RestTemplastConfig.java
  18. 39 0
      src/main/java/com/chuanghai/student_portrait/config/ScheduleConfig.java
  19. 22 0
      src/main/java/com/chuanghai/student_portrait/config/ScheduledTaskConfig.java
  20. 236 0
      src/main/java/com/chuanghai/student_portrait/config/SubscriptionConfig.java
  21. 82 0
      src/main/java/com/chuanghai/student_portrait/config/SwaggerConfig.java
  22. 54 0
      src/main/java/com/chuanghai/student_portrait/config/TokenConfig.java
  23. 21 0
      src/main/java/com/chuanghai/student_portrait/controller/AffinityScoreController.java
  24. 25 0
      src/main/java/com/chuanghai/student_portrait/controller/AirConditioningController.java
  25. 29 0
      src/main/java/com/chuanghai/student_portrait/controller/CapacityController.java
  26. 97 0
      src/main/java/com/chuanghai/student_portrait/controller/CircumferenceController.java
  27. 47 0
      src/main/java/com/chuanghai/student_portrait/controller/ConsumeController.java
  28. 259 0
      src/main/java/com/chuanghai/student_portrait/controller/CountController.java
  29. 29 0
      src/main/java/com/chuanghai/student_portrait/controller/DormController.java
  30. 29 0
      src/main/java/com/chuanghai/student_portrait/controller/ElectricityController.java
  31. 67 0
      src/main/java/com/chuanghai/student_portrait/controller/FaceDiscernController.java
  32. 63 0
      src/main/java/com/chuanghai/student_portrait/controller/ForeWarningReportFormController.java
  33. 32 0
      src/main/java/com/chuanghai/student_portrait/controller/ForewarningController.java
  34. 361 0
      src/main/java/com/chuanghai/student_portrait/controller/GetSchoolUserController.java
  35. 30 0
      src/main/java/com/chuanghai/student_portrait/controller/HotWaterController.java
  36. 26 0
      src/main/java/com/chuanghai/student_portrait/controller/LoginController.java
  37. 60 0
      src/main/java/com/chuanghai/student_portrait/controller/NewSchooluserController.java
  38. 28 0
      src/main/java/com/chuanghai/student_portrait/controller/OldSchooluserController.java
  39. 286 0
      src/main/java/com/chuanghai/student_portrait/controller/ReceiveController.java
  40. 22 0
      src/main/java/com/chuanghai/student_portrait/controller/StructOfPeopleInSchoolController.java
  41. 47 0
      src/main/java/com/chuanghai/student_portrait/controller/TbCourseSchedulingController.java
  42. 26 0
      src/main/java/com/chuanghai/student_portrait/controller/TbCourseSelectionController.java
  43. 107 0
      src/main/java/com/chuanghai/student_portrait/cron/JwtAuthenticationInterceptor.java
  44. 25 0
      src/main/java/com/chuanghai/student_portrait/cron/JwtlnterceptorConfig.java
  45. 60 0
      src/main/java/com/chuanghai/student_portrait/entity/Access.java
  46. 26 0
      src/main/java/com/chuanghai/student_portrait/entity/AffinityScore.java
  47. 35 0
      src/main/java/com/chuanghai/student_portrait/entity/AirConditioning.java
  48. 14 0
      src/main/java/com/chuanghai/student_portrait/entity/Capacity.java
  49. 10 0
      src/main/java/com/chuanghai/student_portrait/entity/City.java
  50. 12 0
      src/main/java/com/chuanghai/student_portrait/entity/ColdWater.java
  51. 12 0
      src/main/java/com/chuanghai/student_portrait/entity/CollegesInfo.java
  52. 64 0
      src/main/java/com/chuanghai/student_portrait/entity/Consume.java
  53. 12 0
      src/main/java/com/chuanghai/student_portrait/entity/Coord.java
  54. 42 0
      src/main/java/com/chuanghai/student_portrait/entity/Dorm.java
  55. 18 0
      src/main/java/com/chuanghai/student_portrait/entity/DormRx.java
  56. 16 0
      src/main/java/com/chuanghai/student_portrait/entity/Electricity.java
  57. 49 0
      src/main/java/com/chuanghai/student_portrait/entity/Equipment.java
  58. 19 0
      src/main/java/com/chuanghai/student_portrait/entity/EventOrg.java
  59. 42 0
      src/main/java/com/chuanghai/student_portrait/entity/EventUser.java
  60. 76 0
      src/main/java/com/chuanghai/student_portrait/entity/FaceDiscern.java
  61. 78 0
      src/main/java/com/chuanghai/student_portrait/entity/ForeWarningEntity.java
  62. 26 0
      src/main/java/com/chuanghai/student_portrait/entity/Forewarning.java
  63. 62 0
      src/main/java/com/chuanghai/student_portrait/entity/HotWater.java
  64. 9 0
      src/main/java/com/chuanghai/student_portrait/entity/LoginUser.java
  65. 70 0
      src/main/java/com/chuanghai/student_portrait/entity/NewSchooluser.java
  66. 46 0
      src/main/java/com/chuanghai/student_portrait/entity/OldSchooluser.java
  67. 10 0
      src/main/java/com/chuanghai/student_portrait/entity/Province.java
  68. 20 0
      src/main/java/com/chuanghai/student_portrait/entity/SecondFloorCanteen.java
  69. 12 0
      src/main/java/com/chuanghai/student_portrait/entity/SecondFloorShopName.java
  70. 16 0
      src/main/java/com/chuanghai/student_portrait/entity/Stall.java
  71. 13 0
      src/main/java/com/chuanghai/student_portrait/entity/StructOfPeopleInSchool.java
  72. 59 0
      src/main/java/com/chuanghai/student_portrait/entity/Student.java
  73. 16 0
      src/main/java/com/chuanghai/student_portrait/entity/TbConfig.java
  74. 104 0
      src/main/java/com/chuanghai/student_portrait/entity/TbCourseScheduling.java
  75. 77 0
      src/main/java/com/chuanghai/student_portrait/entity/TbCourseSelection.java
  76. 58 0
      src/main/java/com/chuanghai/student_portrait/entity/User.java
  77. 21 0
      src/main/java/com/chuanghai/student_portrait/entity/VDzxxzlb.java
  78. 21 0
      src/main/java/com/chuanghai/student_portrait/entity/VJyls.java
  79. 44 0
      src/main/java/com/chuanghai/student_portrait/entity/Warning.java
  80. 18 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/AccessCountDto.java
  81. 13 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/CapacityAllDto.java
  82. 11 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/CapacityDto.java
  83. 15 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/ClasDto.java
  84. 17 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/ConsumeDto.java
  85. 13 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/ConsumeTotalMoneyDto.java
  86. 11 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/DistrictDto.java
  87. 13 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/EnergyDto.java
  88. 11 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/FaceDisernDto.java
  89. 26 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/ForewarningDto.java
  90. 13 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/PersonConsumDto.java
  91. 24 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/PersonalTrackDto.java
  92. 17 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/TbCourseSchedulingDto.java
  93. 9 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/UserLoginDTO.java
  94. 43 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/WeixiaoPushDTO.java
  95. 14 0
      src/main/java/com/chuanghai/student_portrait/entity/dto/XqDto.java
  96. 20 0
      src/main/java/com/chuanghai/student_portrait/exception/BaseErrorInfoInterface.java
  97. 86 0
      src/main/java/com/chuanghai/student_portrait/exception/BizException.java
  98. 44 0
      src/main/java/com/chuanghai/student_portrait/exception/CommonEnum.java
  99. 106 0
      src/main/java/com/chuanghai/student_portrait/exception/GlobalExceptionHandler.java
  100. 0 0
      src/main/java/com/chuanghai/student_portrait/exception/ResultValue.java

+ 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

+ 15 - 0
.idea/compiler.xml

@@ -0,0 +1,15 @@
+<?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="student_portraits_api" />
+        <module name="student_portrait" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>

+ 7 - 0
.idea/encodings.xml

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

+ 25 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,25 @@
+<?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="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <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>

+ 290 - 0
pom.xml

@@ -0,0 +1,290 @@
+<?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>
+    <groupId>com.chuanghai</groupId>
+    <artifactId>student_portrait</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>student_portrait</name>
+    <description>student_portrait</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+
+
+        <!--压缩base64的依赖-->
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
+
+
+
+
+        <!-- 多数据源 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.6.0</version>
+        </dependency>
+
+
+        <!--redis的起步依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <!-- SpringBootweb开发起步依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <!--<scope>compile</scope>-->
+        </dependency>
+
+        <!-- Mybatis-plus起步依赖 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.24</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.12</version>
+        </dependency>
+
+        <!-- commons工具组件 -->
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+        <!-- MySQL数据库连接驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.17</version>
+        </dependency>
+
+        <!-- druid起步依赖 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+
+        <!--    集成easypoi组件 .导出excel http://easypoi.mydoc.io/ -->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-base</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-web</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-annotation</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.1.6</version>
+        </dependency>
+
+
+        <!--  用于执行python脚本-->
+        <dependency>
+            <groupId>org.python</groupId>
+            <artifactId>jython-standalone</artifactId>
+            <version>2.7.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-alpn-client</artifactId>
+        </dependency>
+
+        <!-- swagger -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-spring-web</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+
+        <!--    log4j-->
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.12</version>
+        </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>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.2.3.Final</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>
+
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.3.7.RELEASE</version>
+                <configuration>
+                    <mainClass>com.chuanghai.student_portrait.StudentPortraitApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+        <!--        &lt;!&ndash; 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 &ndash;&gt;-->
+        <!--        <resources>-->
+        <!--            <resource>-->
+        <!--                <directory>src/main/java</directory>-->
+        <!--                <includes>-->
+        <!--                    <include>**/*.properties</include>-->
+        <!--                    <include>**/*.xml</include>-->
+        <!--                </includes>-->
+        <!--                <filtering>false</filtering>-->
+        <!--            </resource>-->
+        <!--            <resource>-->
+        <!--                <directory>src/main/resources</directory>-->
+        <!--                <includes>-->
+        <!--                    <include>**/*.properties</include>-->
+        <!--                    <include>**/*.xml</include>-->
+        <!--                </includes>-->
+        <!--                <filtering>false</filtering>-->
+        <!--            </resource>-->
+        <!--        </resources>-->
+
+
+    </build>
+
+</project>

+ 24 - 0
src/main/java/com/chuanghai/student_portrait/StudentPortraitApplication.java

@@ -0,0 +1,24 @@
+package com.chuanghai.student_portrait;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.event.TransactionalEventListener;
+
+@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
+@EnableScheduling//开启定时任务
+@MapperScan(basePackages = "com.chuanghai.student_portrait.mapper")
+@EnableCaching
+@EnableAsync
+public class StudentPortraitApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(StudentPortraitApplication.class, args);
+
+    }
+
+}

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

@@ -0,0 +1,28 @@
+package com.chuanghai.student_portrait.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;
+}

+ 347 - 0
src/main/java/com/chuanghai/student_portrait/config/BaseClass.java

@@ -0,0 +1,347 @@
+package com.chuanghai.student_portrait.config;
+
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.HttpClient;
+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.BasicCookieStore;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.springframework.util.DigestUtils;
+
+import javax.servlet.http.Cookie;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.Date;
+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 != null && 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 != null && 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 != null && 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 != null && 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();
+                }
+            }
+
+        }
+
+    }
+
+
+}

+ 106 - 0
src/main/java/com/chuanghai/student_portrait/config/ChannelDetailInfos.java

@@ -0,0 +1,106 @@
+package com.chuanghai.student_portrait.config;
+
+/**
+ * @Author: bingo
+ * @Date: 2022/4/28 星期四 16:56
+ * @Description: com.chuanghai.recognition.config
+ * @version: 1.0
+ */
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.ParseException;
+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;
+
+public class ChannelDetailInfos extends BaseClass {
+
+    //ChannelDetailInfo接口信息
+    private static String urlString = "/LAPI/V1.0/Channels/System/ChannelDetailInfos";
+    private static String requestMode = "GET";
+
+    public static String channelDetailInfos() {
+        String cururl = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().build();
+
+        String channeID = "";
+
+        //不带鉴权信息调用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);
+
+        //带鉴权信息调用业务接口
+        CloseableHttpResponse resp2 = doGet(httpClient, cururl, curAuthorization);
+        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);
+                //获取查询记录的总条数
+                String nums = jsonData.get("Nums").toString();
+
+                JSONArray jsonArray = jsonData.getJSONArray("DetailInfos");
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    channeID += jsonArray.getJSONObject(i).get("ID").toString() + ",";
+                }
+            }
+            channeID = channeID.substring(0, channeID.lastIndexOf(","));
+
+            //body中返回信息为Succeed,code为0即为调用成功
+        } 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();
+                }
+            }
+
+        }
+        return channeID;
+    }
+
+
+    public static void main(String[] args) {
+        String s = ChannelDetailInfos.channelDetailInfos();
+        System.out.println(s);
+    }
+
+}

+ 154 - 0
src/main/java/com/chuanghai/student_portrait/config/FacePassRecord.java

@@ -0,0 +1,154 @@
+package com.chuanghai.student_portrait.config;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.chuanghai.student_portrait.utils.DateUtils;
+import com.chuanghai.student_portrait.utils.Imageys;
+import com.chuanghai.student_portrait.utils.vo.UniviewVO;
+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.Date;
+import java.util.List;
+
+
+
+
+public class FacePassRecord extends BaseClass {
+
+    //人脸识别接口信息
+    private static String urlString = "/LAPI/V1.0/Smart/Face/PassRecord";
+    private static String requestMode = "POST";
+
+
+    /**
+     * 调用宇视接口查询人脸识别记录
+     *
+     * @param univiewVOList
+     * @param requestMode
+     * @param reqBody
+     * @return
+     */
+    public static List<UniviewVO> passRecord(List<UniviewVO> univiewVOList, String requestMode, String reqBody) {
+        String url = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().build();
+        JSONObject jsonOParam = JSONObject.parseObject(reqBody);
+        int offset = Integer.parseInt(jsonOParam.get("Offset").toString());
+        int total = 0;
+        int num = 0;
+
+
+        //不带鉴权信息调用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);
+                //获取查询记录的总条数及每页记录数计算总页数
+                total = Integer.parseInt(jsonData.getString("Total"));
+                num = Integer.parseInt(jsonData.getString("Num"));
+                JSONArray jsonArray = jsonData.getJSONArray("FacePassRecordInfoList");
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    String type = jsonArray.getJSONObject(i).get("Type").toString();
+                    String passingTime = jsonArray.getJSONObject(i).get("PassingTime").toString();
+                    Date date = DateUtils.stringToDate(DateUtils.stampToTime2(passingTime));
+                    String channelName = jsonArray.getJSONObject(i).get("ChannelName").toString();
+
+                    JSONObject compareInfo = JSONObject.parseObject(jsonArray.getJSONObject(i).get("CompareInfo").toString());
+                    JSONObject snapshotImage = JSONObject.parseObject(compareInfo.get("SnapshotImage").toString());
+                    JSONObject bigImage = JSONObject.parseObject(snapshotImage.get("BigImage").toString());
+
+                    String data1 = bigImage.getString("Data");
+//                    System.out.println("data1.length() = " + data1.length());
+//                    压碎图片
+                    Imageys imageys = new Imageys();
+                    String s = imageys.resizeImageTo40K(data1);
+//                    System.out.println("s.length() = " + s.length());
+
+                    StringBuilder builder = new StringBuilder();
+                    builder.append("data:image/jpeg;base64,");
+                    builder.append(s);
+//                    String dataBase = builder.toString();
+//                    String s1 = imageys.resizeImageTo40K(dataBase);
+//                    System.out.println("s1.length() = " + s1.length());
+
+
+                    JSONObject personInfo = JSONObject.parseObject(compareInfo.get("PersonInfo").toString());
+                    String personName = personInfo.getString("PersonName");
+                    JSONArray identificationArray = personInfo.getJSONArray("IdentificationList");
+                    JSONObject identification = JSONObject.parseObject(identificationArray.get(0).toString());
+                    String IDnumber = identification.get("Number").toString();
+
+                    UniviewVO univiewVO = new UniviewVO();
+//                    univiewVO.setPictureScene(s1);
+                    univiewVO.setPictureScene(builder.toString());
+                    univiewVO.setActiveEvent("人脸识别");
+                    univiewVO.setActivePlace(channelName);
+                    univiewVO.setActiveTime(date);
+                    univiewVO.setCardNumber(IDnumber);
+                    univiewVO.setPersonName(personName);
+                    univiewVO.setTotal(total);
+                    univiewVO.setOffset(offset);
+                    univiewVO.setNum(num);
+                    univiewVO.setRecordType(type);
+
+
+                    univiewVOList.add(univiewVO);
+                }
+            }
+
+        } 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 univiewVOList;
+    }
+
+
+}

+ 74 - 0
src/main/java/com/chuanghai/student_portrait/config/JedisUtil.java

@@ -0,0 +1,74 @@
+package com.chuanghai.student_portrait.config;
+
+import org.springframework.context.annotation.Configuration;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+import java.util.Random;
+
+@Configuration
+public class JedisUtil {
+    private JedisPool jedisPool;
+
+    public void setJedisPool(JedisPool jedisPool) {
+        this.jedisPool = jedisPool;
+    }
+
+    public JedisPool getJedisPool() {
+        return jedisPool;
+    }
+
+//    获取一个jedis连接
+    public  Jedis getJedis(){
+        //本机地址,端口号
+        Jedis jedis=new Jedis("127.0.0.1",6379);
+        //认证密码
+//        jedis.auth("chuanghai_2023.");
+        return jedis;
+    }
+    //获取一个jedis连接
+//    public Jedis getJedis() {
+//        return jedisPool.getResource();
+//    }
+
+
+    //键
+
+    public boolean exists(String key) {     //查询键是否存在
+        Jedis jedis = getJedis();
+        boolean exis = jedis.exists(key);
+        jedis.close();
+        return exis;
+    }
+
+    //清除键值对
+    public long del(String... keys) {
+        Jedis jedis = getJedis();
+        long count = jedis.del(keys);
+        jedis.close();
+        return count;
+    }
+
+
+    //字符串类型
+
+    public String get(String key) {     //根据键获取值
+        Jedis jedis = getJedis();
+        String value = jedis.get(key);
+        jedis.close();
+        return value;
+    }
+
+    public long setnx(String key, String value) {   //设置键值对
+        Random rand = new Random();
+        int i = rand.nextInt(1000)+3600;
+        Jedis jedis = getJedis();
+        long num = jedis.setnx(key, value);
+        jedis.expire(key,i);
+        jedis.close();
+        return num;
+    }
+
+
+
+}

+ 21 - 0
src/main/java/com/chuanghai/student_portrait/config/PageConfig.java

@@ -0,0 +1,21 @@
+package com.chuanghai.student_portrait.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/6  14:37
+ * @Version 1.0
+ */
+@Configuration
+public class PageConfig {
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor(){
+        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        return mybatisPlusInterceptor;
+    }
+}

+ 22 - 0
src/main/java/com/chuanghai/student_portrait/config/RedisConfig.java

@@ -0,0 +1,22 @@
+package com.chuanghai.student_portrait.config;
+
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport {
+    @Bean
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
+        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
+        //默认的Key序列化器为:JdkSerializationRedisSerializer
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setConnectionFactory(connectionFactory);
+        return redisTemplate;
+    }
+
+
+}

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

@@ -0,0 +1,20 @@
+package com.chuanghai.student_portrait.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();
+    }
+
+}

+ 39 - 0
src/main/java/com/chuanghai/student_portrait/config/ScheduleConfig.java

@@ -0,0 +1,39 @@
+package com.chuanghai.student_portrait.config;
+
+import org.apache.tomcat.util.threads.ThreadPoolExecutor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+import java.util.concurrent.Executor;
+
+@Configuration
+@EnableAsync
+public class ScheduleConfig {
+
+    @Bean("myAsync")
+    public Executor myAsync() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        // 最大线程数
+        executor.setMaxPoolSize(10);
+        // 核心线程数
+        executor.setCorePoolSize(10);
+        // 任务队列的大小
+        executor.setQueueCapacity(10);
+        // 线程前缀名
+        executor.setThreadNamePrefix("New-Thread-");
+        // 线程存活时间
+        executor.setKeepAliveSeconds(60);
+        // 拒绝处理策略:丢弃队列中最老的任务。
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy() {
+        });
+        // 线程初始化
+        executor.initialize();
+        return executor;
+    }
+
+
+}

+ 22 - 0
src/main/java/com/chuanghai/student_portrait/config/ScheduledTaskConfig.java

@@ -0,0 +1,22 @@
+package com.chuanghai.student_portrait.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+/**
+ * @Description : scheduler配置类
+ * @Version : V1.0.0
+ * @Date : 2021/12/1 14:00
+ */
+@Configuration
+public class ScheduledTaskConfig implements SchedulingConfigurer {
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+        taskScheduler.setPoolSize(3);
+        taskScheduler.initialize();
+        taskRegistrar.setTaskScheduler(taskScheduler);
+    }
+}

+ 236 - 0
src/main/java/com/chuanghai/student_portrait/config/SubscriptionConfig.java

@@ -0,0 +1,236 @@
+package com.chuanghai.student_portrait.config;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.chuanghai.student_portrait.utils.vo.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;
+    }
+
+
+}

+ 82 - 0
src/main/java/com/chuanghai/student_portrait/config/SwaggerConfig.java

@@ -0,0 +1,82 @@
+package com.chuanghai.student_portrait.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.Profiles;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+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 的自动配置
+public class SwaggerConfig {
+//    @Bean
+//    public Docket docket() {
+//        // 创建一个 swagger 的 bean 实例
+//        return new Docket(DocumentationType.SWAGGER_2)
+//                // 配置基本信息
+//                .apiInfo(apiInfo());
+//    }
+
+    // 基本信息设置
+    private ApiInfo apiInfo() {
+//        Contact contact = new Contact(
+//                "Liu" ,// 作者姓名
+//                "http://localhost:8086/swagger-ui.html#/", // 作者网址
+//                "15779633758@163.com"); // 作者邮箱
+        return new ApiInfoBuilder()
+                .title("学生肖像-接口文档") // 标题
+                .description("学生肖像接口规范") // 描述
+//                .termsOfServiceUrl("https://www.baidu.com") // 跳转连接
+//                .version("1.0") // 版本
+//                .license("Swagger-的使用(详细教程)")
+//                .licenseUrl("https://blog.csdn.net/xhmico/article/details/125353535")
+//                .contact(contact)
+                .build();
+    }
+
+    @Bean
+    public Docket docket(Environment environment) {
+        // 设置环境范围
+        Profiles profiles = Profiles.of("dev","test");
+        // 如果在该环境返回内则返回:true,反之返回 false
+        boolean flag = environment.acceptsProfiles(profiles);
+
+        // 创建一个 swagger 的 bean 实例
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(flag) // 是否开启 swagger:true -> 开启,false -> 关闭
+                // 配置基本信息
+                .apiInfo(apiInfo())
+                // 配置接口信息
+                .select() // 设置扫描接口
+                // 配置如何扫描接口
+                .apis(RequestHandlerSelectors
+                                //.any() // 扫描全部的接口,默认
+                                //.none() // 全部不扫描
+                                .basePackage("com.chuanghai.student_portrait.controller") // 扫描指定包下的接口,最为常用
+                        //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
+                        //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口
+
+                )
+                .paths(PathSelectors
+                                .any() // 满足条件的路径,该断言总为true
+                        //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
+                        //.ant("/user/**") // 满足字符串表达式路径
+                        //.regex("") // 符合正则的路径
+                )
+
+                .build();
+    }
+
+
+
+
+
+
+}

+ 54 - 0
src/main/java/com/chuanghai/student_portrait/config/TokenConfig.java

@@ -0,0 +1,54 @@
+package com.chuanghai.student_portrait.config;
+
+import com.alibaba.fastjson2.JSON;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/27  16:45
+ * @Version 1.0
+ */
+@Component
+public class TokenConfig {
+
+    @Bean
+    public String getToken() {
+        String access_token = "";
+        String grant_type = "authorization_code";
+        String redirect_uri = "http://5d519a3d.cpolar.top/warning/getCardNumber";
+//            String redirect_uri = "http://binguo.vaiwan.com/wx/getCardNumber";
+        String url = "https://open.wecard.qq.com/cgi-bin/oauth2/token"; //用于用户 获取基础的access_token
+        Map<String, String> param = new HashMap<>();
+//        param.put("wxcode", wxcode);
+        param.put("app_key", "DB60250B489345ED");
+        param.put("app_secret", "68ED5D4B98DD8817C1558A8FCAF9D1BF");
+        param.put("grant_type", "client_credentials");
+        param.put("scope", "base");
+        param.put("ocode", "1015730314");
+        param.put("redirect_uri", redirect_uri);
+        try {
+            RestTemplate restTemplate = new RestTemplate();
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Map<String, String>> request = new HttpEntity<>(param, headers);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+            String body = responseEntity.getBody();
+//            System.out.println("body = " + body);
+            HashMap<String, String> parse = JSON.parseObject(body, HashMap.class);
+            String token = parse.get("access_token");
+            access_token = token;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return access_token;
+    }
+}

+ 21 - 0
src/main/java/com/chuanghai/student_portrait/controller/AffinityScoreController.java

@@ -0,0 +1,21 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.AffinityScoreService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/affinityScore")
+public class AffinityScoreController {
+    @Autowired
+    AffinityScoreService affinityScoreService;
+    @GetMapping("/get")
+    @ApiOperation(value = "亲密度汇总,id为学生序号")
+    public BaseResponse getAffinityScore(String id){
+        return affinityScoreService.getAffinityScore(id);
+    }
+}

+ 25 - 0
src/main/java/com/chuanghai/student_portrait/controller/AirConditioningController.java

@@ -0,0 +1,25 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.service.AirConditioningService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/20  10:41
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/api/airConditioning")
+public class AirConditioningController {
+    @Autowired
+    AirConditioningService airConditioningService;
+
+//    @PostMapping("/getAirConditioning/message")
+//    public BaseResponse getAirConditioning(){
+//
+//        return BaseResponse.error(StatusEnum.SUCCESS);
+//    }
+
+}

+ 29 - 0
src/main/java/com/chuanghai/student_portrait/controller/CapacityController.java

@@ -0,0 +1,29 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.CapacityService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/capacity")
+public class CapacityController {
+    @Autowired
+    CapacityService capacityService;
+
+    @GetMapping("/one/student")
+    @ApiOperation(value = "单个学生能力,参数为该学生序号")
+    public BaseResponse getOneStudent(String id){
+        return capacityService.getOneStudent(id);
+    }
+
+    @GetMapping("/all/students")
+    @ApiOperation(value = "全校学生能力")
+    public BaseResponse getAllStudents(){
+        return capacityService.getAllStudents();
+    }
+
+}

+ 97 - 0
src/main/java/com/chuanghai/student_portrait/controller/CircumferenceController.java

@@ -0,0 +1,97 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.chuanghai.student_portrait.config.SubscriptionConfig;
+import com.chuanghai.student_portrait.service.FaceDiscernService;
+import com.chuanghai.student_portrait.utils.Base64Utils;
+import com.chuanghai.student_portrait.utils.FileUtil;
+import com.chuanghai.student_portrait.utils.LogUtils;
+import com.chuanghai.student_portrait.utils.vo.SubscribePersonCondition;
+import com.chuanghai.student_portrait.utils.vo.SubscriptionVo;
+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.*;
+
+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.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 宇视事件订阅
+ */
+@RestController
+@RequestMapping
+@Slf4j
+public class CircumferenceController {
+
+    @Autowired
+    FaceDiscernService faceDiscernService;
+
+
+    String id = "";
+
+    /**
+     * 预警订阅
+     *
+     * @return
+     */
+    @PostMapping("/post/getSubscription")
+    @Scheduled(cron = "0 0 0/1 * * ? ")
+    public SubscriptionVo getSubscription() {
+        LogUtils.logInfo("开始事件订阅");
+        SubscribePersonCondition subscribePersonCondition = new SubscribePersonCondition();
+        subscribePersonCondition.setLibIDNum(0);
+        JSONObject map = new JSONObject();
+        map.put("AddressType", 0);
+        map.put("IPAddress", "172.16.20.69");
+//        map.put("IPAddress", "192.168.161.100");
+        map.put("Port", 8086);
+        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");
+        LogUtils.logWarn("事件订阅得到的值: "+vo);
+        id = vo.getID();
+
+        return vo;
+
+    }
+
+
+    //    刷新订阅
+//        @Scheduled(cron = "0 0 0/2 * * ? ")
+//    @Scheduled(cron = "0 0 0/1 * * ? ")
+    public void refresh() {
+        if (ObjectUtils.isEmpty(id)||"".equals(id)) {
+            getSubscription();
+        }
+        JSONObject map = new JSONObject();
+        map.put("Duration", 3600);
+        String jsonString = map.toJSONString();
+        HashMap<String, Object> dateMap = new HashMap<>();
+        String url = "/LAPI/V1.0/System/Event/Subscription/"+id;
+        SubscriptionConfig.commonRecord(dateMap, "PUT", jsonString, url);
+            System.out.println("dateMap = " + dateMap);
+    }
+
+    @PostMapping("/LAPI/V1.0/System/Event/Notification/{url}")
+    public void a(HttpServletRequest request, HttpServletResponse response , @PathVariable String url /*, @RequestBody Map<String, Object> params*/) {
+
+       faceDiscernService.saveFaceContrast(request,response,url);
+    }
+
+
+}
+
+
+

+ 47 - 0
src/main/java/com/chuanghai/student_portrait/controller/ConsumeController.java

@@ -0,0 +1,47 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.ConsumeService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/20  9:46
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/api/consume")
+public class  ConsumeController {
+
+    @Autowired
+    ConsumeService consumeService;
+
+    @GetMapping("/group/addressCount")
+    @ApiOperation(value = "查询档口排名,idCard为学生的id标识,不填默认查询全校所有人的")
+    public BaseResponse groupCount(String startTime, String endTime,String idCard){
+        return consumeService.getAddress(startTime,endTime,idCard);
+    }
+
+    @GetMapping("/consume/provinceRanking")
+    @ApiOperation(value = "查询微校省份消费排名")
+    public BaseResponse provinceRanking(){
+        return consumeService.consumeProvinceRanking();
+    }
+
+    @GetMapping("/person/personConsum")
+    @ApiOperation(value = "个人消费能力,id为学生序号,时间格式:yyyy-MM-dd HH:mm:ss")
+    public BaseResponse personConsum(String id,String startTime,String endTime){
+        return consumeService.personConsum(id,startTime,endTime);
+    }
+
+    @GetMapping("/getPosDetail")
+    @ApiOperation(value = "查询档口排名,idCard为学生的id标识,不填默认查询全校所有人的")
+    public BaseResponse getPosDetail(@RequestParam String time){
+       return consumeService.getPosDetail(time);
+    }
+}

+ 259 - 0
src/main/java/com/chuanghai/student_portrait/controller/CountController.java

@@ -0,0 +1,259 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.chuanghai.student_portrait.entity.City;
+import com.chuanghai.student_portrait.entity.Forewarning;
+import com.chuanghai.student_portrait.entity.NewSchooluser;
+import com.chuanghai.student_portrait.entity.Province;
+import com.chuanghai.student_portrait.entity.dto.DistrictDto;
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.response.enums.StatusEnum;
+import com.chuanghai.student_portrait.service.CityService;
+import com.chuanghai.student_portrait.service.ForewarningService;
+import com.chuanghai.student_portrait.service.NewSchooluserService;
+import com.chuanghai.student_portrait.service.ProvinceService;
+import com.chuanghai.student_portrait.config.JedisUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiOperation;
+import org.python.antlr.ast.If;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+@RestController
+@RequestMapping("/api")
+public class CountController {
+
+    @Autowired
+    NewSchooluserService newSchooluserService;
+
+    @Autowired
+    ForewarningService forewarningService;
+
+    @Autowired
+    ProvinceService provinceService;
+
+    @Autowired
+    CityService cityService;
+
+    @Autowired
+    JedisUtil jedisUtil;
+
+
+
+    @GetMapping("/count")
+    @ApiOperation(value = "查询院系数量,在校学生,预警数量")
+    public BaseResponse count() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        //        redis 缓存
+        if (jedisUtil.exists("count")) {
+            String count = jedisUtil.get("count");
+            Map map = JSON.parseObject(count,Map.class);
+            return BaseResponse.ok(StatusEnum.SUCCESS, map);
+        }
+        Calendar calendar = Calendar.getInstance();
+        // 获取当前年
+        int year = calendar.get(Calendar.YEAR);
+// 获取当前月
+        int month = calendar.get(Calendar.MONTH) + 1;
+        int oldYear = 0;
+
+        if (month >= 7) {
+            oldYear = year - 3;
+        } else {
+            oldYear = year - 4;
+        }
+
+        HashMap<String, Object> mapCount = new HashMap<>();
+
+//查询在校人数
+        long countSchoolUser = newSchooluserService.count(Wrappers.<NewSchooluser>lambdaQuery()
+                .between(NewSchooluser::getGrade, oldYear, year)
+        );
+//查询所有预警数据次数
+//        获取前30天
+        String firstMonthDay = getFirstMonthDay();
+//        获取当天
+        String lastMonthDay = getLastMonthDay();
+
+        long countForewarning = forewarningService.count(Wrappers.<Forewarning>lambdaQuery().between(Forewarning::getDateTime, firstMonthDay, lastMonthDay));
+
+        mapCount.put("facultyCount", "09");
+        mapCount.put("studentCount", countSchoolUser);
+        mapCount.put("ForewarningCount", countForewarning);
+        String jsonStr = null;
+        try {
+            jsonStr = objectMapper.writeValueAsString(mapCount);	//areaList序列化为json字符串
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        jedisUtil.setnx("count", jsonStr);
+        return BaseResponse.ok(StatusEnum.SUCCESS, mapCount);
+    }
+
+
+    @GetMapping("/provinceCount")
+    @ApiOperation(value = "查询各省份人数")
+    public BaseResponse provinceCount() {
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        //        redis 缓存
+//        if (jedisUtil.exists("provinceCount")) {
+//            String count = jedisUtil.get("provinceCount");
+//            List<DistrictDto> districtDtos = com.alibaba.fastjson.JSON.parseArray(count, DistrictDto.class);
+//            return BaseResponse.ok(StatusEnum.SUCCESS, districtDtos);
+//        }
+        List<DistrictDto> districtDtos = new ArrayList<>();
+        Calendar calendar = Calendar.getInstance();
+        // 获取当前年
+        int year = calendar.get(Calendar.YEAR);
+// 获取当前月
+        int month = calendar.get(Calendar.MONTH) + 1;
+        int oldYear = 0;
+
+        if (month >= 7) {
+            oldYear = year - 3;
+        } else {
+            oldYear = year - 4;
+        }
+        List<NewSchooluser> list = newSchooluserService.list(Wrappers.<NewSchooluser>lambdaQuery()
+                .select(NewSchooluser::getProvince)
+                .groupBy(NewSchooluser::getProvince)
+        );
+        if (ObjectUtils.isNotEmpty(list) && list.size() > 0) {
+            for (NewSchooluser newSchooluser : list) {
+                if (ObjectUtils.isNotEmpty(newSchooluser)) {
+                DistrictDto districtDto = new DistrictDto();
+//                省份
+
+                    String province = newSchooluser.getProvince();
+                    long count = newSchooluserService.count(Wrappers.<NewSchooluser>lambdaQuery()
+                            .between(NewSchooluser::getGrade, oldYear, year)
+                            .eq(NewSchooluser::getProvince, province)
+                    );
+                    districtDto.setCount(count);
+                    Province one = provinceService.getOne(Wrappers.<Province>lambdaQuery().eq(Province::getProvinceCode, province));
+
+                    if (ObjectUtils.isNotEmpty(one)) {
+                        String provinceName = one.getProvinceName();
+                        districtDto.setProvince(provinceName);
+                        districtDtos.add(districtDto);
+                    }
+
+                }
+            }
+        }
+//        String jsonStr = null;
+//        try {
+//            jsonStr = objectMapper.writeValueAsString(districtDtos);	//areaList序列化为json字符串
+//        } catch (JsonProcessingException e) {
+//            e.printStackTrace();
+//        }
+//        jedisUtil.setnx("provinceCount", jsonStr);
+        return BaseResponse.ok(StatusEnum.SUCCESS, districtDtos);
+    }
+
+
+    @GetMapping("/cityCount")
+    @ApiOperation(value = "查询各市人数,name为中文,key为英文")
+    public BaseResponse cityCount(String name,String key) {
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        //        redis 缓存
+        if (jedisUtil.exists("cityCount"+key)) {
+            String capacityAll = jedisUtil.get("cityCount"+key);
+            Map map = JSON.parseObject(capacityAll,Map.class);
+            return BaseResponse.ok(StatusEnum.SUCCESS,map);
+        }
+        if (ObjectUtils.isEmpty(name)) {
+            return BaseResponse.error(StatusEnum.FAIL, "参数异常");
+        }
+        City one = cityService.getOne(Wrappers.<City>lambdaQuery().eq(City::getCityName, name));
+        if (ObjectUtils.isEmpty(one)) {
+            return BaseResponse.error(StatusEnum.FAIL, "参数异常");
+        }
+        String cityCode = one.getCityCode();
+        String provinceCode = one.getProvinceCode() + "";
+
+        Calendar calendar = Calendar.getInstance();
+        // 获取当前年
+        int year = calendar.get(Calendar.YEAR);
+// 获取当前月
+        int month = calendar.get(Calendar.MONTH) + 1;
+        int oldYear = 0;
+
+        if (month >= 7) {
+            oldYear = year - 3;
+        } else {
+            oldYear = year - 4;
+        }
+        HashMap<String, Object> mapCount = new HashMap<>();
+
+        long countSchoolUser = newSchooluserService.count(Wrappers.<NewSchooluser>lambdaQuery()
+                .between(NewSchooluser::getGrade, oldYear, year)
+                .eq(NewSchooluser::getProvince, provinceCode)
+                .eq(NewSchooluser::getCity, cityCode)
+        );
+
+
+//        获取前30天
+        String firstMonthDay = getFirstMonthDay();
+//        获取当天
+        String lastMonthDay = getLastMonthDay();
+
+        int countForewarning = 0;
+        List<Forewarning> list = forewarningService.list(Wrappers.<Forewarning>lambdaQuery().between(Forewarning::getDateTime, firstMonthDay, lastMonthDay));
+        for (Forewarning forewarning : list) {
+            String schooluserId = forewarning.getSchooluserId();
+            if (ObjectUtils.isNotEmpty(schooluserId)) {
+                NewSchooluser byId = newSchooluserService.getById(schooluserId);
+                if (ObjectUtils.isNotEmpty(byId)) {
+                    String city = byId.getCity();
+                    String province = byId.getProvince();
+                    if (city.equals(cityCode) && province.equals(provinceCode)) {
+                        countForewarning = countForewarning + 1;
+                    }
+                }
+
+            }
+        }
+        mapCount.put("studentCount", countSchoolUser);
+        mapCount.put("ForewarningCount", countForewarning);
+
+        String jsonStr = null;
+        try {
+            jsonStr = objectMapper.writeValueAsString(mapCount);	//areaList序列化为json字符串
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        jedisUtil.setnx("cityCount"+key, jsonStr);
+
+        return BaseResponse.ok(StatusEnum.SUCCESS, mapCount);
+
+    }
+
+    public static String getFirstMonthDay() {
+        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime start = now.minusDays(30).withHour(0).withMinute(0).withSecond(0);
+        return start.format(pattern);
+    }
+
+
+    public static String getLastMonthDay() {
+        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime end = now.withHour(23).withMinute(59).withSecond(59);
+        return end.format(pattern);
+    }
+
+
+
+}

+ 29 - 0
src/main/java/com/chuanghai/student_portrait/controller/DormController.java

@@ -0,0 +1,29 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.service.DormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/21  15:44
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/dorm")
+public class DormController {
+
+    @Autowired
+    private DormService dormService;
+
+//    @GetMapping("/save")
+//    public List<Dorm> saveDorm(){
+//        try {
+//            return dormService.saveDorm();
+//        } catch (JsonProcessingException e) {
+//            throw new RuntimeException(e);
+//        }
+//    }
+
+}

+ 29 - 0
src/main/java/com/chuanghai/student_portrait/controller/ElectricityController.java

@@ -0,0 +1,29 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.exception.ResultValue;
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.ElectricityService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping
+public class ElectricityController {
+    @Autowired
+    ElectricityService electricityService;
+
+//    @PostMapping("/getElectrucity")
+//     public ResultValue getElectrucity(String dormNumber){
+//         return electricityService.getElectrucity(dormNumber);
+//     }
+
+//    @GetMapping("person/energy")
+//    @ApiOperation(value = "全校水电能耗统计")
+//    public BaseResponse coldWaterAndElectricityEnergy(){
+//        return electricityService.coldWaterAndElectricityEnergy();
+//    }
+}

+ 67 - 0
src/main/java/com/chuanghai/student_portrait/controller/FaceDiscernController.java

@@ -0,0 +1,67 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.FaceDiscernService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+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;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/28  17:33
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/api/access")
+@Slf4j
+public class FaceDiscernController {
+
+    @Autowired
+    private FaceDiscernService faceDiscernService;
+
+    @GetMapping("/group/accessCount")
+    @ApiOperation(value = "查询全校门禁出入次数/日")
+    public BaseResponse shoolAccessCount(String startTime, String endTime) {
+        return faceDiscernService.shoolAccessCount(startTime,endTime);
+    }
+
+    @GetMapping("/unit/accessCount")
+    @ApiOperation(value = "查询个人门禁出入次数/月,id参数为该学生的id")
+    public BaseResponse unitAccessCount(String startTime, String endTime,String id) {
+        return faceDiscernService.unitAccessCount(startTime,endTime,id);
+    }
+
+    @GetMapping("/personal/track")
+    @ApiOperation(value = "个人轨迹,id为个人序号")
+    public BaseResponse personalTrack(String id){
+        return faceDiscernService.personalTrack(id);
+    }
+    @GetMapping("/repetition/coordinate")
+    @ApiOperation(value = "重复坐标,id为个人序号")
+    public BaseResponse repetitionCoordinate(String id){
+        return faceDiscernService.repetitionCoordinate(id);
+    }
+
+    @GetMapping("/single/coords")
+    @ApiOperation(value = "坐标出现的次数")
+    public BaseResponse coords(String id,String longitude,String latitude){
+        return faceDiscernService.getCoords(id,longitude,latitude);
+    }
+
+
+
+
+
+
+
+}

+ 63 - 0
src/main/java/com/chuanghai/student_portrait/controller/ForeWarningReportFormController.java

@@ -0,0 +1,63 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.chuanghai.student_portrait.entity.ForeWarningEntity;
+import com.chuanghai.student_portrait.entity.Forewarning;
+import com.chuanghai.student_portrait.service.ForewarningService;
+import com.chuanghai.student_portrait.utils.ExcelUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api")
+public class ForeWarningReportFormController {
+    @Autowired
+    ForewarningService forewarningService;
+
+    @GetMapping("/load")
+    @ApiOperation(value = "报表导出")
+    public void downloadReportData(HttpServletResponse response, String start, String end,String keyWord) {
+        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String fileName = "Forewarning.xls";
+        List<ForeWarningEntity> foreWarningEntities = new ArrayList<>();
+        List<Forewarning> forewarnings = forewarningService.list(Wrappers.<Forewarning>lambdaQuery()
+                .between(ObjectUtils.isNotEmpty(start) && ObjectUtils.isNotEmpty(end), Forewarning::getDateTime, start, end)
+                .like(ObjectUtils.isNotEmpty(keyWord), Forewarning::getName, keyWord)
+                .or()
+                .like(ObjectUtils.isNotEmpty(keyWord), Forewarning::getStudentId, keyWord)
+                .or()
+                .like(ObjectUtils.isNotEmpty(keyWord), Forewarning::getProfessionName, keyWord)
+                .or()
+                .like(ObjectUtils.isNotEmpty(keyWord), Forewarning::getClazz, keyWord)
+                .or()
+                .like(ObjectUtils.isNotEmpty(keyWord), Forewarning::getWarningReason, keyWord)
+        );
+        for (Forewarning forewarning : forewarnings) {
+            ForeWarningEntity foreWarningEntity = new ForeWarningEntity();
+            foreWarningEntity.setName(forewarning.getName());
+            foreWarningEntity.setStudentId(forewarning.getStudentId());
+            foreWarningEntity.setProfession(forewarning.getProfessionName());
+            foreWarningEntity.setClazz(forewarning.getClazz());
+            foreWarningEntity.setDateTime(sdf.format(forewarning.getDateTime()));
+            foreWarningEntity.setWarningReason(forewarning.getWarningReason());
+            foreWarningEntity.setRemark(forewarning.getRemark());
+            foreWarningEntities.add(foreWarningEntity);
+        }
+        try {
+            ExcelUtil.process(fileName, foreWarningEntities, ForeWarningEntity.class, response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 32 - 0
src/main/java/com/chuanghai/student_portrait/controller/ForewarningController.java

@@ -0,0 +1,32 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.ForewarningService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/forewarning")
+public class ForewarningController {
+    @Autowired
+    ForewarningService forewarningService;
+
+    @GetMapping("/getForewarning")
+    @ApiOperation(value = "查询每日预警数据")
+    public BaseResponse getForewarning(String keyWord, String startTime, String endTime, Integer page, Integer size) {
+        return forewarningService.getgetForewarning(keyWord, startTime, endTime,page,size);
+    }
+
+    @GetMapping("/getEarlyWarning")
+    @ApiOperation(value = "个人预警")
+    public BaseResponse getEarlyWarning(@RequestParam("id") String id, Integer page, Integer size) {
+        return forewarningService.getEarlyWarning(id,page,size);
+    }
+
+
+}
+

+ 361 - 0
src/main/java/com/chuanghai/student_portrait/controller/GetSchoolUserController.java

@@ -0,0 +1,361 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.chuanghai.student_portrait.entity.OldSchooluser;
+import com.chuanghai.student_portrait.service.FaceDiscernService;
+import com.chuanghai.student_portrait.service.OldSchooluserService;
+import com.chuanghai.student_portrait.utils.LogUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.*;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/6  9:47
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/api/warning")
+public class GetSchoolUserController {
+
+    @Autowired
+    RestTemplate restTemplate;
+
+    @Value("${weixiao.app_key}")
+    private String key;
+
+    @Value("${weixiao.response_type}")
+    private String type;
+
+    @Value("${weixiao.scope}")
+    private String scope;
+
+    @Value("${weixiao.ocode}")
+    private String ocode;
+
+    @Autowired
+    OldSchooluserService oldSchooluserService;
+
+    @Autowired
+    FaceDiscernService faceDiscernService;
+
+
+    public String getCardNumber() {
+        String access_token = "";
+        String grant_type = "authorization_code";
+        String redirect_uri = "http://5d519a3d.cpolar.top/warning/getCardNumber";
+//            String redirect_uri = "http://binguo.vaiwan.com/wx/getCardNumber";
+        String url = "https://open.wecard.qq.com/cgi-bin/oauth2/token"; //用于用户 获取基础的access_token
+        Map<String, String> param = new HashMap<>();
+//        param.put("wxcode", wxcode);
+        param.put("app_key", "DB60250B489345ED");
+        param.put("app_secret", "68ED5D4B98DD8817C1558A8FCAF9D1BF");
+        param.put("grant_type", "client_credentials");
+        param.put("scope", "base");
+        param.put("ocode", "1015730314");
+        param.put("redirect_uri", redirect_uri);
+        try {
+            RestTemplate restTemplate = new RestTemplate();
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Map<String, String>> request = new HttpEntity<>(param, headers);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+            String body = responseEntity.getBody();
+//            System.out.println("body = " + body);
+            HashMap<String, String> parse = JSON.parseObject(body, HashMap.class);
+            String token = parse.get("access_token");
+            access_token = token;
+        } catch (Exception e) {
+            e.printStackTrace();
+            LogUtils.logError(e);
+        }
+        return access_token;
+    }
+
+    //现在不需要获取微校数据
+//    @Scheduled(cron = "0 0 0/2 * * ? ")   //从0时开始,每2小时运行一次
+    public String token() {
+        String cardNumber = getCardNumber();
+        return cardNumber;
+    }
+
+//    获取组织架构
+    @GetMapping("/get")
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+    public Map get() {
+        String token = token();
+        System.out.println("token = " + token);
+        String url = "https://open.wecard.qq.com/cgi-bin/user/org-edu-list";
+        Map<String, String> param = new HashMap<>();
+        param.put("access_token", token);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, String>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        System.out.println("body = " + body);
+        HashMap<String, String> parse = JSON.parseObject(body, HashMap.class);
+
+        return parse;
+    }
+
+    public static void main(String[] args) throws UnsupportedEncodingException {
+        String encodeName = URLEncoder.encode("\u5b66\u751f","utf-8");
+        System.out.println("encodeName = " + encodeName);
+    }
+
+    //获取组织架构成员
+    @GetMapping("/list")
+    @DSTransactional
+    public List<String> getMessong(Integer page) throws JsonProcessingException {
+        String token = token();
+        String url = "https://open.wecard.qq.com/cgi-bin/user/get-org-users";
+        Map<String, Object> param = new HashMap<>();
+        ObjectMapper mapper = new ObjectMapper();
+        param.put("access_token", token);
+        param.put("org_id", 578692);
+        param.put("fetch_child", 1);
+        param.put("page", page);
+//        param.put("page", 2);
+        param.put("page_size", 1000);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, Object>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        JSONObject jsonObject = JSON.parseObject(body);
+        JSONArray userlist = jsonObject.getJSONArray("userlist");
+        ArrayList<String> strings = new ArrayList<>();
+        for (Object o : userlist) {
+            Map<String, Object> stringObjectMap = mapper.readValue(o.toString(), new TypeReference<Map<String, Object>>() {
+            });
+            if (stringObjectMap.get("card_number") != null) {
+                String card_number = stringObjectMap.get("card_number").toString();
+                strings.add(card_number);
+            }
+        }
+        return strings;
+    }
+
+    @GetMapping
+    public Boolean a(Integer page) throws JsonProcessingException {
+        List<String> messong = getMessong(page);
+        String token = this.token();
+        System.out.println("token = " + token);
+        String url = "https://open.wecard.qq.com/cgi-bin/user/get-user-by-card-numbers";
+        Map<String, Object> param = new HashMap<>();
+        param.put("access_token", token);
+        param.put("card_numbers", messong);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, Object>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        JSONObject jsonObject = JSON.parseObject(body);
+        JSONArray userlist = jsonObject.getJSONArray("userlist");
+        ArrayList<OldSchooluser> addOldSchoolUsers = new ArrayList<>();
+        ArrayList<OldSchooluser> updatOldSchoolUsers = new ArrayList<>();
+        ObjectMapper mapper = new ObjectMapper();
+        for (Object o : userlist) {
+            Map<String, Object> stringObjectMap = mapper.readValue(o.toString(), new TypeReference<Map<String, Object>>() {
+            });
+            if (ObjectUtils.isNotEmpty(stringObjectMap)) {
+                OldSchooluser oldSchooluser1 = new OldSchooluser();
+                String head_image = stringObjectMap.get("head_image").toString();
+                oldSchooluser1.setHeadImage(head_image);
+
+                oldSchooluser1.setCardNumber(stringObjectMap.get("card_number").toString());
+                oldSchooluser1.setName(stringObjectMap.get("name").toString());
+                oldSchooluser1.setGender(stringObjectMap.get("gender").toString());
+                oldSchooluser1.setIdentityType(stringObjectMap.get("identity_type").toString());
+                oldSchooluser1.setGrade(stringObjectMap.get("grade").toString());
+                oldSchooluser1.setCampus(stringObjectMap.get("campus").toString());
+                oldSchooluser1.setDormNumber(stringObjectMap.get("dorm_number").toString());
+                oldSchooluser1.setPhysicalChipNumber(stringObjectMap.get("physical_chip_number").toString());
+                oldSchooluser1.setPhysicalCardNumber(stringObjectMap.get("physical_card_number").toString());
+                oldSchooluser1.setNation(stringObjectMap.get("nation").toString());
+                oldSchooluser1.setOriginPlace(stringObjectMap.get("origin_place").toString());
+                oldSchooluser1.setGraduatedSchool(stringObjectMap.get("graduated_school").toString());
+                oldSchooluser1.setAddress(stringObjectMap.get("address").toString());
+                oldSchooluser1.setQq(stringObjectMap.get("qq").toString());
+                oldSchooluser1.setEmail(stringObjectMap.get("email").toString());
+                oldSchooluser1.setCardType(stringObjectMap.get("card_type").toString());
+                oldSchooluser1.setIdentityTitle(stringObjectMap.get("identity_title").toString());
+                oldSchooluser1.setCollege(stringObjectMap.get("college").toString());
+                oldSchooluser1.setProfession(stringObjectMap.get("profession").toString());
+                oldSchooluser1.setClazz(stringObjectMap.get("class").toString());
+                oldSchooluser1.setIdCard(stringObjectMap.get("id_card").toString());
+                oldSchooluser1.setCountry(stringObjectMap.get("country").toString());
+                oldSchooluser1.setTelephone(stringObjectMap.get("telephone").toString());
+                oldSchooluser1.setDataSource(stringObjectMap.get("data_source").toString());
+                oldSchooluser1.setStartAt(stringObjectMap.get("start_at").toString());
+                oldSchooluser1.setExpireAt(stringObjectMap.get("expire_at").toString());
+                if (stringObjectMap.containsKey("serial_number")) {
+                    String serial_number = stringObjectMap.get("serial_number").toString();
+                    oldSchooluser1.setSerialNumber(serial_number);
+                }
+                if (stringObjectMap.containsKey("job_title")) {
+                    oldSchooluser1.setJobTitle(stringObjectMap.get("job_title").toString());
+                }
+                if (stringObjectMap.containsKey("school_period")) {
+                    oldSchooluser1.setSchoolPeriod(stringObjectMap.get("school_period").toString());
+                }
+                if (stringObjectMap.containsKey("register_year")) {
+                    oldSchooluser1.setRegisterYear(stringObjectMap.get("register_year").toString());
+                }
+                oldSchooluser1.setOrganization(stringObjectMap.get("organization").toString());
+                oldSchooluser1.setDepartment(stringObjectMap.get("department").toString());
+//判断该学生信息是否存在数据库中
+                OldSchooluser oldSchooluser = queryOldSchoolUser(oldSchooluser1.getIdCard());
+                if (ObjectUtils.isNotEmpty(oldSchooluser)) {
+//                oldSchooluser1.setId(oldSchooluser.getId());
+                    oldSchooluser1.setId(oldSchooluser.getId());
+
+                    updatOldSchoolUsers.add(oldSchooluser1);
+                oldSchooluserService.update(oldSchooluser1, Wrappers.<OldSchooluser>lambdaUpdate().eq(OldSchooluser::getId, oldSchooluser.getId()));
+                } else {
+                    addOldSchoolUsers.add(oldSchooluser1);
+                }
+            }
+        }
+        boolean b = oldSchooluserService.saveBatch(addOldSchoolUsers);
+        oldSchooluserService.updateBatchById(updatOldSchoolUsers);
+        return b;
+//        return JSONObject.parseObject(body,Map.class);
+    }
+
+ //    定时获取微校数据
+//
+    Integer i = 0;
+
+    //
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+//    @Scheduled(cron = "0 1 12 * * ? ")
+    public void getSchoolUser() {
+//        i = i + 1;
+//        try {
+//            boolean a = this.a(i);
+//            System.out.println("a = " + a);
+//        } catch (JsonProcessingException e) {
+//            throw new RuntimeException(e);
+//        }
+//        System.out.println(i);
+        String token = token();
+        String url = "https://open.wecard.qq.com/cgi-bin/user/get-org-users";
+        Map<String, Object> param = new HashMap<>();
+        ObjectMapper mapper = new ObjectMapper();
+        param.put("access_token", token);
+        param.put("org_id", 578692);
+        param.put("fetch_child", 1);
+        param.put("page", 0);
+//        param.put("page", 2);
+        param.put("page_size", 1000);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, Object>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        JSONObject jsonObject = JSON.parseObject(body);
+//        总数量
+        String total = jsonObject.getString("total");
+        System.out.println("total = " + total);
+        int pageSize=Integer.parseInt(total) /1000;
+//        获取总页数
+        pageSize=pageSize+1;
+        System.out.println("pageSize = " + pageSize);
+
+        for (int j = 0; j <= pageSize; j++) {
+            try {
+                boolean a = a(j);
+                System.out.println("a = " + a);
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+
+
+    }
+
+    /**
+     * 通过身份证号判断该用户是否存在于数据库OldSchoolUser表当中
+     *
+     * @param idCard
+     * @param
+     * @return
+     */
+    public OldSchooluser queryOldSchoolUser(String idCard) {
+        OldSchooluser oldSchooluser = null;
+        try {
+             oldSchooluser = oldSchooluserService.list(Wrappers.<OldSchooluser>lambdaQuery().eq(OldSchooluser::getIdCard, idCard)).get(0);
+        }catch (Exception e){
+
+
+        }
+
+        return oldSchooluser;
+    }
+
+
+//通过card_numbers获取图片
+    public String getHeadImage(List<String> messong) throws JsonProcessingException {
+        String token = this.token();
+        System.out.println("token = " + token);
+        String url = "https://open.wecard.qq.com/cgi-bin/user/get-user-by-card-numbers";
+        Map<String, Object> param = new HashMap<>();
+        param.put("access_token", token);
+        param.put("card_numbers", messong);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, Object>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        JSONObject jsonObject = JSON.parseObject(body);
+        JSONArray userlist = jsonObject.getJSONArray("userlist");
+        ObjectMapper mapper = new ObjectMapper();
+        String headImage="";
+        for (Object o : userlist) {
+            Map<String, Object> stringObjectMap = mapper.readValue(o.toString(), new TypeReference<Map<String, Object>>() {
+            });
+            if (ObjectUtils.isNotEmpty(stringObjectMap)) {
+                headImage= stringObjectMap.get("head_image").toString();
+
+            }
+        }
+        return headImage;
+    }
+
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+    public Boolean b() throws JsonProcessingException {
+        String token = token();
+        String url = "https://open.wecard.qq.com/cgi-bin/user/search";
+        Map<String, Object> param = new HashMap<>();
+        param.put("access_token", token);
+        param.put("keywords", "360102200406033352");
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Map<String, Object>> request = new HttpEntity<>(param, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+        String body = responseEntity.getBody();
+        JSONObject jsonObject = JSON.parseObject(body);
+        System.out.println("jsonObject = " + jsonObject);
+        return null;
+    }
+}

+ 30 - 0
src/main/java/com/chuanghai/student_portrait/controller/HotWaterController.java

@@ -0,0 +1,30 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.HotWaterService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/hotWater")
+public class HotWaterController {
+
+    @Autowired
+    HotWaterService hotWaterService;
+
+    @GetMapping("/all/energy")
+    @ApiOperation(value = "全校热水和水电能耗")
+    public BaseResponse allHotWaterEnergy(){
+        return hotWaterService.hotWaterEnergy();
+    }
+
+    @GetMapping("/person/energy")
+    @ApiOperation(value = "个人热水和水电能耗,参数为该学生序号")
+    public BaseResponse personHotwaterEnergy(String id){
+        return hotWaterService.personHotwaterEnergy(id);
+    }
+
+}

+ 26 - 0
src/main/java/com/chuanghai/student_portrait/controller/LoginController.java

@@ -0,0 +1,26 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.annotation.PassToken;
+import com.chuanghai.student_portrait.entity.dto.UserLoginDTO;
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.LoginService;
+import org.omg.CORBA.SystemException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api")
+public class LoginController {
+    @Autowired
+    LoginService loginService;
+
+    @PostMapping("/login")
+    @PassToken
+    public BaseResponse login(@RequestBody UserLoginDTO userLoginDTO) throws SystemException {
+        return loginService.dengru(userLoginDTO);
+    }
+
+}

+ 60 - 0
src/main/java/com/chuanghai/student_portrait/controller/NewSchooluserController.java

@@ -0,0 +1,60 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.service.NewSchooluserService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/16  9:35
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/api/schoolUser")
+public class NewSchooluserController {
+
+    @Autowired
+    private NewSchooluserService newSchooluserService;
+
+    /**
+     * 获取全校
+     * @param page
+     * @param size
+     * @return
+     */
+    @GetMapping("/group/listSchoolUser")
+    @ApiOperation(value = "查询所有学生信息")
+    public BaseResponse listSchoolUser(Integer page, Integer size,String keyWord) {
+        return newSchooluserService.listSchoolUser(page,size,keyWord);
+    }
+
+    /**
+     * 获取单个
+     * @param id
+     * @return
+     */
+    @GetMapping("/unit/getSchoolUser")
+    @ApiOperation(value = "查询单个学生信息")
+    public BaseResponse getSchoolUser(String id) {
+        return newSchooluserService.getSchoolUser(id);
+    }
+    @GetMapping("/exercise/getSchoolUsers")
+    @ApiOperation(value = "查询出现次数最多的")
+    public BaseResponse getTenStudent(){
+        return newSchooluserService.getTenStudent();
+    }
+
+
+    @GetMapping("/getXq")
+    @ApiOperation(value = "每节课的学情情况")
+    public BaseResponse getXq(String id,String dateTime,String jcTime,Integer count){
+        return newSchooluserService.getXq(id,dateTime,jcTime,count);
+    }
+
+
+
+}

+ 28 - 0
src/main/java/com/chuanghai/student_portrait/controller/OldSchooluserController.java

@@ -0,0 +1,28 @@
+package com.chuanghai.student_portrait.controller;
+
+
+import com.chuanghai.student_portrait.service.OldSchooluserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/16  10:37
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/OldSchoolUser")
+public class OldSchooluserController {
+
+    @Autowired
+    OldSchooluserService oldSchooluserService;
+
+//    @PostMapping("/add")
+//    public Boolean addNewSchoolUser(Integer i){
+//        return oldSchooluserService.addNewSchooluser(i);
+//    }
+
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 286 - 0
src/main/java/com/chuanghai/student_portrait/controller/ReceiveController.java


+ 22 - 0
src/main/java/com/chuanghai/student_portrait/controller/StructOfPeopleInSchoolController.java

@@ -0,0 +1,22 @@
+package com.chuanghai.student_portrait.controller;
+
+import com.chuanghai.student_portrait.entity.StructOfPeopleInSchool;
+import com.chuanghai.student_portrait.service.StructOfPeopleInSchoolService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/struct/of/people/in/school")
+public class StructOfPeopleInSchoolController {
+    @Autowired
+    StructOfPeopleInSchoolService structOfPeopleInSchoolService;
+
+    @PostMapping("/get")
+    public StructOfPeopleInSchool get(Integer id) {
+        StructOfPeopleInSchool struct = structOfPeopleInSchoolService.getId(id);
+        return struct;
+    }
+
+}

+ 47 - 0
src/main/java/com/chuanghai/student_portrait/controller/TbCourseSchedulingController.java

@@ -0,0 +1,47 @@
+package com.chuanghai.student_portrait.controller;
+
+
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.response.enums.StatusEnum;
+import com.chuanghai.student_portrait.service.TbCourseSchedulingService;
+import com.chuanghai.student_portrait.service.TbCourseSelectionService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 课程安排 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-04-26
+ */
+@RestController
+@RequestMapping("/api/tbCourseScheduling")
+public class TbCourseSchedulingController {
+
+    @Autowired
+    TbCourseSchedulingService tbCourseSchedulingService;
+
+    @GetMapping("/getClas")
+    @ApiOperation(value = "最近5天课表展示")
+    public BaseResponse getClasScheduling(@RequestParam("studentId") String studentId) {
+        if (ObjectUtils.isEmpty(studentId)) {
+            return BaseResponse.error(StatusEnum.FAIL, "参数异常");
+        }
+        List<Map> maps = tbCourseSchedulingService.getClasScheduling(studentId);
+        return BaseResponse.ok(StatusEnum.SUCCESS_SELECT, maps);
+    }
+
+
+}
+

+ 26 - 0
src/main/java/com/chuanghai/student_portrait/controller/TbCourseSelectionController.java

@@ -0,0 +1,26 @@
+package com.chuanghai.student_portrait.controller;
+
+
+import com.chuanghai.student_portrait.utils.DateTimeUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 选课表 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-04-26
+ */
+@RestController
+@RequestMapping("/api/auto/tb-course-selection")
+public class TbCourseSelectionController {
+    public static void main(String[] args) {
+        Map<String, Integer> dateTime = DateTimeUtil.getDateTime("2024-2-26");
+        System.out.println("dateTime = " + dateTime);
+    }
+}
+

+ 107 - 0
src/main/java/com/chuanghai/student_portrait/cron/JwtAuthenticationInterceptor.java

@@ -0,0 +1,107 @@
+package com.chuanghai.student_portrait.cron;
+
+import com.alibaba.fastjson.JSONObject;
+import com.auth0.jwt.interfaces.Claim;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.chuanghai.student_portrait.annotation.PassToken;
+import com.chuanghai.student_portrait.response.BaseResponse;
+import com.chuanghai.student_portrait.response.enums.StatusEnum;
+import com.chuanghai.student_portrait.utils.JWTUtils;
+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;
+            }
+        }
+
+
+        //region 获取url传递的参数 Query string传递的参数
+        //获取url参数 getParameter方法里的参数名和定义的参数名一致
+        String token = request.getHeader("token");
+        // 验证userToken
+        if (!StringUtils.hasText(token)) {
+//            throw new Exception(StatusEnum.SYSTEM_TOKEN_ERROR);
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            JSONObject res = new JSONObject();
+            res.put("code", StatusEnum.SYSTEM_TOKEN_ERROR.getStatus());
+            res.put("message", StatusEnum.SYSTEM_TOKEN_ERROR.getDesc());
+            PrintWriter out = null;
+            out = response.getWriter();
+            out.write(res.toString());
+            out.flush();
+            out.close();
+            return false;
+        }
+
+        // 解析token
+        try {
+            Map<String, Claim> stringClaimMap = JWTUtils.verifyToken(token);
+            if (ObjectUtils.isNotEmpty(stringClaimMap)) { // 登录
+                return true;
+            }
+        }catch (Exception e){
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            JSONObject res = new JSONObject();
+            res.put("code", StatusEnum.SYSTEM_LOGIN_ERROR.getStatus());
+            res.put("message", StatusEnum.SYSTEM_LOGIN_ERROR.getDesc());
+            PrintWriter out = null;
+            out = response.getWriter();
+            out.write(res.toString());
+            out.flush();
+            out.close();
+            return false;
+        }
+
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        JSONObject res = new JSONObject();
+        res.put("code", StatusEnum.SYSTEM_LOGIN_ERROR.getStatus());
+        res.put("message", StatusEnum.SYSTEM_LOGIN_ERROR.getDesc());
+        PrintWriter out = null;
+        out = response.getWriter();
+        out.write(res.toString());
+        out.flush();
+        out.close();
+        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/chuanghai/student_portrait/cron/JwtlnterceptorConfig.java

@@ -0,0 +1,25 @@
+package com.chuanghai.student_portrait.cron;
+
+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();
+    }
+}

+ 60 - 0
src/main/java/com/chuanghai/student_portrait/entity/Access.java

@@ -0,0 +1,60 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName(value = "access")
+public class Access {
+    /**
+     * 门禁记录ID主键
+     */
+    @TableId(value = "access_id")
+    @NotEmpty(message = "门禁记录ID格式错误!")
+    private Long accessId;
+
+    /**
+     * 门禁记录地址
+     */
+    @TableField(value = "access_address")
+    @NotBlank(message = "门禁记录地址不能为空!")
+    private String accessAddress;
+
+    /**
+     * 门禁记录时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "access_time")
+    private Date accessTime;
+
+    /**
+     * 门禁记录事项
+     */
+    @TableField(value = "access_event")
+    private String accessEvent;
+
+    /**
+     * 门禁记录用户标识
+     */
+    @TableField(value = "card_number")
+    private String cardNumber;
+
+
+
+    @TableField(value = "group_name")
+    private String groupName;
+}

+ 26 - 0
src/main/java/com/chuanghai/student_portrait/entity/AffinityScore.java

@@ -0,0 +1,26 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AffinityScore {
+    private Integer id;
+//    触发学生的id
+    private String schooluserId;
+//    触发时间
+    private Date dateTime;
+//    关系人名字
+    private String name;
+//    学号
+    private String studentId;
+//    专业
+    private String profession;
+//    班级
+    private String clazz;
+//    触发次数
+    private Integer count;
+//    关系人名字id
+    private String nameSchooluserId;
+}

+ 35 - 0
src/main/java/com/chuanghai/student_portrait/entity/AirConditioning.java

@@ -0,0 +1,35 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/20  10:26
+ * @Version 1.0
+ */
+@Data
+public class AirConditioning {
+
+
+    private String id;
+    private String consumeDuration;
+    //    消费时长
+    private String consumeMoney;
+    //    消费金额
+    private String consumeLocus;
+    //    消费地点
+    private String airConditioningType;
+    //    空调类型
+    private String name;
+    //    姓名
+    private String gender;
+    //    性别
+    private String idCard;
+    //    身份证
+    private String studentId;
+    //    学号
+    private String identityType;
+    //    人员类型
+
+
+}

+ 14 - 0
src/main/java/com/chuanghai/student_portrait/entity/Capacity.java

@@ -0,0 +1,14 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Capacity {
+    private Integer id;
+    private String capacityName;
+    private String units;
+    private Date dateTime;
+    private String schooluserId;
+}

+ 10 - 0
src/main/java/com/chuanghai/student_portrait/entity/City.java

@@ -0,0 +1,10 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class City {
+    private Integer provinceCode;
+    private  String cityCode;
+    private  String cityName;
+}

+ 12 - 0
src/main/java/com/chuanghai/student_portrait/entity/ColdWater.java

@@ -0,0 +1,12 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class ColdWater {
+    private Integer id;
+    private String dataTime;
+    private String dom;
+    private Double totalMoney;
+    private Double totalPower;
+}

+ 12 - 0
src/main/java/com/chuanghai/student_portrait/entity/CollegesInfo.java

@@ -0,0 +1,12 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class CollegesInfo {
+    private Integer id;
+    private String collegesName;
+    private String collegesAddr;
+    private String collegesDesc;
+    private Integer studentName;
+}

+ 64 - 0
src/main/java/com/chuanghai/student_portrait/entity/Consume.java

@@ -0,0 +1,64 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "consume")
+public class Consume {
+    /**
+     * 消费记录ID主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 消费记录地点
+     */
+    @TableField(value = "consume_address")
+    private String consumeAddress;
+
+    /**
+     * 消费记录时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "consume_time")
+    private Date consumeTime;
+
+    /**
+     * 消费记录事项
+     */
+    @TableField(value = "consume_event")
+    private String consumeEvent;
+
+    /**
+     * 消费记录用户标识
+     */
+    @TableField(value = "id_card")
+    private String idCard;
+
+    /**
+     * 消费金额
+     */
+    @TableField(value = "consume_amount")
+    private String consumeAmount;
+
+    @TableField(value = "org_name")
+    private String orgName;
+
+//    /**
+//     * 总收益
+//     */
+//    @TableField(exist = false)
+//    private Double sumAll;
+
+}

+ 12 - 0
src/main/java/com/chuanghai/student_portrait/entity/Coord.java

@@ -0,0 +1,12 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class Coord {
+    private Integer id;
+    private String buildingName;
+    private String longitude;
+    private String latitude;
+    private String remarks;
+}

+ 42 - 0
src/main/java/com/chuanghai/student_portrait/entity/Dorm.java

@@ -0,0 +1,42 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/21  15:34
+ * @Version 1.0
+ */
+@Data
+public class Dorm {
+    private Integer id;
+//    校区
+    private String school;
+//    楼
+    private String build;
+//    层
+    private String floors;
+//    宿舍号
+    private String dom;
+
+    @ApiModelProperty(value = "表具主键")
+    private String electricMeterId;
+
+    @ApiModelProperty(value = "房间主键")
+    private String electricRoomId;
+
+    @ApiModelProperty(value = "表具名称")
+    private String electricMeterName;
+
+    @ApiModelProperty(value = "表具主键")
+    private String waterMeterId;
+
+    @ApiModelProperty(value = "房间主键")
+    private String waterRoomId;
+
+    @ApiModelProperty(value = "表具名称")
+    private String waterMeterName;
+
+}

+ 18 - 0
src/main/java/com/chuanghai/student_portrait/entity/DormRx.java

@@ -0,0 +1,18 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class DormRx {
+
+    private Integer id;
+
+    private String build;
+
+    private String floors;
+
+    private String  dom;
+
+    private String  addrId;
+
+}

+ 16 - 0
src/main/java/com/chuanghai/student_portrait/entity/Electricity.java

@@ -0,0 +1,16 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class Electricity {
+    private Integer id;
+//    时间
+    private String dateTime;
+//    宿舍号
+    private String dom;
+//    消费总金额
+    private Double totalMoney;
+//    消费总功率
+    private Double totalPower;
+}

+ 49 - 0
src/main/java/com/chuanghai/student_portrait/entity/Equipment.java

@@ -0,0 +1,49 @@
+package com.chuanghai.student_portrait.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName(value = "equipment")
+public class Equipment {
+    /**
+     * 设备编号
+     */
+    @TableId(value = "equipment_id")
+    private String equipmentId;
+
+    /**
+     * 设备名称
+     */
+    @TableField(value = "equipment_name")
+    private String equipmentName;
+
+    /**
+     * 设备型号
+     */
+    @TableField(value = "equipment_type")
+    private String equipmentType;
+
+    /**
+     * 设备状态1(使用中)0(未使用)
+     */
+    @TableField(value = "equipment_statu")
+    private String equipmentStatu;
+
+    /**
+     * 设备安装地址
+     */
+    @TableField(value = "equipment_address")
+    private String equipmentAddress;
+
+
+}

+ 19 - 0
src/main/java/com/chuanghai/student_portrait/entity/EventOrg.java

@@ -0,0 +1,19 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class EventOrg {
+//    "id":738777,"parent_id":560291,"name":"\u6d4b\u8bd5\u63a8\u9001","org_type":"","type":0,"province":"","city":"","area":"","updated_at":"2022-12-29 10:57:20"
+
+    private Integer id;
+    private Integer parentId;
+    private String name;
+    private String orgType;
+    private String type;
+    private String province;
+    private String city;
+    private String area;
+    private String updateAt;
+
+}

+ 42 - 0
src/main/java/com/chuanghai/student_portrait/entity/EventUser.java

@@ -0,0 +1,42 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class EventUser {
+    private String cardNumber;
+    private String name;
+    private Integer gender;
+    private String headImage;
+    private Integer identityType;
+    private String grade;
+    private String campus;
+    private String dormNumber;
+    private String physicalChipNumber;
+    private String physicalCardNumber;
+    private String nation;
+    private String originPlace;
+    private String graduatedSchool;
+    private String address;
+    private String qq;
+    private String email;
+    private String cardType;
+    private String identityTitle;
+    private String college;
+    private String profession;
+    private String clazz;
+    private String idCard;
+    private String country;
+    private String telephone;
+    private String dateSource;
+    private Date startAt;
+    private Date expireAt;
+    private String jobTitle;
+    private String registerYear;
+    private String schoolPeriod;
+    private String serialNumber;
+    private String organization;
+
+}

+ 76 - 0
src/main/java/com/chuanghai/student_portrait/entity/FaceDiscern.java

@@ -0,0 +1,76 @@
+package com.chuanghai.student_portrait.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.util.Date;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName(value = "facediscern")
+public class FaceDiscern {
+
+    /**
+     * 人脸识别记录ID主键
+     */
+    @TableId(value = "faceDiscern_id")
+    private Long facediscernId;
+
+    /**
+     * 人脸识别记录地点
+     */
+    @TableField(value = "faceDiscern_address")
+    private String facediscernAddress;
+
+    /**
+     * 人脸识别记录时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "faceDiscern_time")
+    private Date facediscernTime;
+
+    /**
+     * 人脸识别记录事项
+     */
+    @TableField(value = "faceDiscern_event")
+    private String facediscernEvent;
+
+    /**
+     * 人脸识别记录用户标识
+     */
+    @TableField(value = "shooluser_id")
+    private String shooluserId;
+
+    /**
+     * 人脸识别机类型Y(百胜)U(宇视)
+     */
+    @TableField(value = "faceDiscern_type")
+    private String facediscernType;
+
+
+    /**
+     * 人脸识别比对记录 1(成功)2(失败)
+     */
+    @TableField(value = "faceRecord_type")
+    private String faceRecordType;
+
+    @TableField(value = "dorm_number")
+    private String dormNumber;
+
+    @TableField(value = "name")
+    private String name;
+
+//    抓拍的现场图片
+    @TableField(value = "picture_scene")
+    private String pictureScene;
+}

+ 78 - 0
src/main/java/com/chuanghai/student_portrait/entity/ForeWarningEntity.java

@@ -0,0 +1,78 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+
+
+public class ForeWarningEntity {
+
+    @ExcelProperty("姓名")
+    private String name;
+    @ExcelProperty("学号")
+    private String studentId;
+    @ExcelProperty("专业")
+    private String profession;
+    @ExcelProperty("班级")
+    private String clazz;
+    @ExcelProperty("时间")
+    private String dateTime;
+    @ExcelProperty("预警原因")
+    private String warningReason;
+    @ExcelProperty("备注")
+    private String remark;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getStudentId() {
+        return studentId;
+    }
+
+    public String getProfession() {
+        return profession;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public String getDateTime() {
+        return dateTime;
+    }
+
+    public String getWarningReason() {
+        return warningReason;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setStudentId(String studentId) {
+        this.studentId = studentId;
+    }
+
+    public void setProfession(String profession) {
+        this.profession = profession;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+
+    public void setDateTime(String dateTime) {
+        this.dateTime = dateTime;
+    }
+
+    public void setWarningReason(String warningReason) {
+        this.warningReason = warningReason;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 26 - 0
src/main/java/com/chuanghai/student_portrait/entity/Forewarning.java

@@ -0,0 +1,26 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Forewarning {
+    private Integer id;
+//    学生姓名
+    private String name;
+//    学号
+    private String studentId;
+//    专业名称
+    private String professionName;
+//    班级
+    private String clazz;
+//    时间日期
+    private Date dateTime;
+//    预警原因(1是大门门禁未关,2是水电消费异常,3单次食堂消费过高,4宿舍门禁异常)
+    private String warningReason;
+//    备注
+    private String remark;
+
+    private String schooluserId;
+}

+ 62 - 0
src/main/java/com/chuanghai/student_portrait/entity/HotWater.java

@@ -0,0 +1,62 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.util.Date;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName(value = "hotwater")
+public class HotWater {
+    /**
+     * 热水记录ID主键
+     */
+    @TableId(value = "hotWater_id")
+    private Long hotwaterId;
+
+    /**
+     * 热水记录地点
+     */
+    @TableField(value = "hotWater_address")
+    private String hotwaterAddress;
+
+    /**
+     * 热水记录时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "hotWater_time")
+    private Date hotwaterTime;
+
+    /**
+     * 热水记录事项
+     */
+    @TableField(value = "hotWater_event")
+    private String hotwaterEvent;
+
+    /**
+     * 热水记录用户标识
+     */
+    @TableField(value = "card_number")
+    private String cardNumber;
+
+
+    /**
+     * 热水记录消费金额
+     */
+    @TableField(value = "hotwater_amount")
+    private String hotwaterAmount;
+
+
+
+
+}

+ 9 - 0
src/main/java/com/chuanghai/student_portrait/entity/LoginUser.java

@@ -0,0 +1,9 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class LoginUser {
+    private String UserName;
+    private String PassWord;
+}

+ 70 - 0
src/main/java/com/chuanghai/student_portrait/entity/NewSchooluser.java

@@ -0,0 +1,70 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/16  9:26
+ * @Version 1.0
+ */
+@Data
+public class NewSchooluser {
+
+
+    private String id;
+
+    private String cardNumber;
+    //           电子卡号',
+    private String studentId;
+    //    '学号',
+    private String idCard;
+    //    '身份证号',
+    private String name;
+    //    '名字',
+    private String gender;
+//    '性别(0为未知,1为男,2为女)',
+    private String grade;
+//    '年级',
+    private String identityType;
+//    身份类型,1为其他,2为学生,3为教职工,4为校友',
+    private String build;
+//    楼栋
+    private String floors;
+//    楼层
+private String dormNumber;
+//    宿舍号
+    private String birthday;
+//    生日',
+    private String address;
+//    地址',
+    private String province;
+//    '省',
+    private String city;
+//    市',
+    private String originPlace;
+//    生源地',
+    private String graduatedSchool;
+//    毕业学校',
+    private String college;
+//    学院',
+    private String profession;
+//    专业',
+    private String clazz;
+//    班级',
+    private String distance;
+//    距离',
+    private String nation;
+//    名族',
+    private String studentNts;
+//    准考证号
+    private String headImage;
+
+
+    @TableField(exist = false)
+    private String[] label;
+
+    @TableField(exist = false)
+    private String[] affinityScoreName;
+
+}

+ 46 - 0
src/main/java/com/chuanghai/student_portrait/entity/OldSchooluser.java

@@ -0,0 +1,46 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/15  9:48
+ * @Version 1.0
+ */
+@Data
+public class OldSchooluser   {
+    private String id;
+    private String cardNumber;
+    private String name;
+    private String gender;
+    private String headImage;
+    private String identityType;
+    private String grade;
+    private String campus;
+    private String dormNumber;
+    private String physicalChipNumber;
+    private String physicalCardNumber;
+    private String nation;
+    private String originPlace;
+    private String graduatedSchool;
+    private String address;
+    private String qq;
+    private String email;
+    private String cardType;
+    private String identityTitle;
+    private String college;
+    private String profession;
+    private String clazz;
+    private String idCard;
+    private String country;
+    private String telephone;
+    private String dataSource;
+    private String startAt;
+    private String expireAt;
+    private String jobTitle;
+    private String serialNumber;
+    private String schoolPeriod;
+    private String registerYear;
+    private String organization;
+    private String department;
+}

+ 10 - 0
src/main/java/com/chuanghai/student_portrait/entity/Province.java

@@ -0,0 +1,10 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class Province {
+    private Integer id;
+    private String provinceCode;
+    private String provinceName;
+}

+ 20 - 0
src/main/java/com/chuanghai/student_portrait/entity/SecondFloorCanteen.java

@@ -0,0 +1,20 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class SecondFloorCanteen {
+    private  Integer id;
+//    订单号
+    private String orderId;
+//    窗口号
+    private String windowNumber;
+//    支付金额
+    private Double paymentAmount;
+//    支付时间
+    private String timePayment;
+//    支付状态
+    private String statePayment;
+//    支付方式
+    private String modePayment;
+}

+ 12 - 0
src/main/java/com/chuanghai/student_portrait/entity/SecondFloorShopName.java

@@ -0,0 +1,12 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class SecondFloorShopName {
+    private Integer id;
+//    窗口编号
+    private String windowNumber;
+//    店铺名称
+    private String shopName;
+}

+ 16 - 0
src/main/java/com/chuanghai/student_portrait/entity/Stall.java

@@ -0,0 +1,16 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/23  10:45
+ * @Version 1.0
+ */
+@Data
+public class Stall {
+    private Integer id;
+    private String address;
+    private String name;
+
+}

+ 13 - 0
src/main/java/com/chuanghai/student_portrait/entity/StructOfPeopleInSchool.java

@@ -0,0 +1,13 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class StructOfPeopleInSchool {
+    private Integer id;
+    private Integer totalNum;
+    private Integer staffNum;
+    private Integer sutdentNum;
+    private Integer otherStaffNum;
+    private Integer otherNum;
+}

+ 59 - 0
src/main/java/com/chuanghai/student_portrait/entity/Student.java

@@ -0,0 +1,59 @@
+package com.chuanghai.student_portrait.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * @Author: bingo
+ * @Date: 2022/5/16 星期一 16:09
+ * @Description: 通过execl导入学员的准考证信息,将准考证信息与schoolUser总表相关联
+ * @version: 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+@ToString
+@TableName("student")
+public class Student implements Serializable {
+
+    private static final long serialVersionUID = 6654802207729407762L;
+
+    /**
+     * 用户编号
+     */
+    @TableId("studentid")
+    private Integer studentId;
+    /**
+     * 用户的姓名
+     */
+    @Excel(name = "姓名", width = 25)
+    @TableField("studentname")
+    @NotEmpty(message = "姓名不能为空")
+    private String studentName;
+
+    /**
+     * 用户的准考证号
+     */
+    @Excel(name = "准考证号", width = 35)
+    @TableField("studentnts")
+    @NotEmpty(message = "准考证号不能为空")
+    private String studentNTS;
+
+    /**
+     * 用户的身份证号
+     */
+    @Excel(name = "身份证号", width = 35)
+    @TableField("studentidcard")
+    @NotEmpty(message = "身份证号不能为空")
+    private String studentIdCard;
+
+
+}

+ 16 - 0
src/main/java/com/chuanghai/student_portrait/entity/TbConfig.java

@@ -0,0 +1,16 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class TbConfig {
+//    开学日期表
+
+//    id
+    private Integer id;
+
+    private String cfgKey;
+//    开学时间
+    private String cfgValue;
+
+}

+ 104 - 0
src/main/java/com/chuanghai/student_portrait/entity/TbCourseScheduling.java

@@ -0,0 +1,104 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 课程安排
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-04-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TbCourseScheduling对象", description="课程安排")
+public class TbCourseScheduling implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id,优化查询用,无需推送")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "序号")
+    private String pushId;
+
+    @ApiModelProperty(value = "课程编号")
+    private String pushKcbh;
+
+    @ApiModelProperty(value = "课程名称")
+    private String pushKcmc;
+
+    @ApiModelProperty(value = "教学班id")
+    private String pushJxbid;
+
+    @ApiModelProperty(value = "教学班名称")
+    private String pushJxbmc;
+
+    @ApiModelProperty(value = "教师工号")
+    private String pushJsgh;
+
+    @ApiModelProperty(value = "教师姓名")
+    private String pushJsxm;
+
+    @ApiModelProperty(value = "学年")
+    private String pushXn;
+
+    @ApiModelProperty(value = "学期")
+    private String pushXq;
+
+    @ApiModelProperty(value = "第几周")
+    private String pushDjz;
+
+    @ApiModelProperty(value = "周几")
+    private String pushZj;
+
+    @ApiModelProperty(value = "节次")
+    private String pushJc;
+
+    @ApiModelProperty(value = "上课地点")
+    private String pushSkdd;
+
+    @ApiModelProperty(value = "教学班组成")
+    private String pushJxbzc;
+
+    @ApiModelProperty(value = "课程类型(课设、实验、临时课程相关)")
+    private String pushCourseType;
+
+    @ApiModelProperty(value = "上课开始时间(课设、实验、临时课程相关)")
+    private Date pushStartTime;
+
+    @ApiModelProperty(value = "上课结束时间(课设、实验、临时课程相关)")
+    private Date pushEndTime;
+
+    @ApiModelProperty(value = "校区(课设、实验、临时课程相关)")
+    private String pushCampus;
+
+    @ApiModelProperty(value = "楼栋(课设、实验、临时课程相关)")
+    private String pushBuilding;
+
+    @ApiModelProperty(value = "教学班人数(课设、实验、临时课程相关)")
+    private Integer pushStudentNum;
+
+    @ApiModelProperty(value = "操作类型:new、changed、deleted")
+    @TableField("OPERATION_TYPE")
+    private String operationType;
+
+    @ApiModelProperty(value = "操作时间")
+    @TableField("OPERATION_TIME")
+    private Date operationTime;
+
+
+}

+ 77 - 0
src/main/java/com/chuanghai/student_portrait/entity/TbCourseSelection.java

@@ -0,0 +1,77 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 选课表
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-04-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TbCourseSelection对象", description="选课表")
+public class TbCourseSelection implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id,优化查询用的,无需推送")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "序号")
+    private String pushId;
+
+    @ApiModelProperty(value = "学号")
+    private String pushXh;
+
+    @ApiModelProperty(value = "姓名")
+    private String pushXm;
+
+    @ApiModelProperty(value = "课程编号")
+    private String pushKcbh;
+
+    @ApiModelProperty(value = "课程名称")
+    private String pushKcmc;
+
+    @ApiModelProperty(value = "教学班id(选课课号)")
+    private String pushJxbid;
+
+    @ApiModelProperty(value = "教学班名称")
+    private String pushJxbmc;
+
+    @ApiModelProperty(value = "学年")
+    private String pushXn;
+
+    @ApiModelProperty(value = "学期")
+    private String pushXq;
+
+    @ApiModelProperty(value = "老师工号")
+    private String pushJsgh;
+
+    @ApiModelProperty(value = "老师姓名")
+    private String pushJsxm;
+
+    @ApiModelProperty(value = "操作类型:new、changed、deleted")
+    @TableField("OPERATION_TYPE")
+    private String operationType;
+
+    @ApiModelProperty(value = "操作时间")
+    @TableField("OPERATION_TIME")
+    private Date operationTime;
+
+
+}

+ 58 - 0
src/main/java/com/chuanghai/student_portrait/entity/User.java

@@ -0,0 +1,58 @@
+package com.chuanghai.student_portrait.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName(value = "activeuser")
+public class User {
+    /**
+     * 用户标识主键
+     */
+
+    @TableId(value = "card_number")
+    @NotEmpty(message = "用户ID格式错误!")
+    private String cardNumber;
+
+    /**
+     * 用户名称
+     */
+    @TableField(value = "user_name")
+    @NotEmpty(message = "用户名称格式错误!")
+    private String userName;
+
+    /**
+     * 用户身份0(学生)1(教师)2(职工)3(访客)4(其他)
+     */
+    @TableField(value = "user_type")
+    @Pattern(regexp = "[0-4]{1}", message = "用户身份0(学生)1(教师)2(职工)3(访客)4(其他)")
+    private String userType;
+
+    /**
+     * 用户宿舍
+     */
+    @TableField(value = "user_dorm")
+    @NotEmpty(message = "用户宿舍格式错误!")
+    private String userDorm;
+
+    /**
+     * 用户部门班级
+     */
+    @TableField(value = "user_sectionClass")
+    @NotEmpty(message = "用户部门班级格式错误!")
+    private String userSectionclass;
+
+
+}

+ 21 - 0
src/main/java/com/chuanghai/student_portrait/entity/VDzxxzlb.java

@@ -0,0 +1,21 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+@Data
+public class VDzxxzlb {
+    private String dzbh  ; // | 读者编号
+    private String dzzh  ; // | 读者账号
+    private String dzzhangh; //  | 读者证号
+    private String dzxm  ; // | 读者姓名
+    private Integer xb    ; // | 性别(0=男 1=女)
+    private String dwmc  ; // | 单位名称
+    private String yxmc  ; // | 院系名称
+    private String bjmc  ; // | 班级名称
+    private String zymc  ; // | 专业名称
+    private Integer dzlx  ; // | 读者类型
+    private String bzrq  ; // | 办证日期
+    private Integer dzzt  ; // | 读者状态(0注销, 1 正常, 2 挂失)
+    private String gxri  ; //  | 读者信息更新日期
+    private String zy    ;  // 职业
+}

+ 21 - 0
src/main/java/com/chuanghai/student_portrait/entity/VJyls.java

@@ -0,0 +1,21 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *读者借阅历史 mysql3
+ */
+@Data
+public class VJyls {
+    public String dzbh;   //    读者编号
+    public Integer tsbh;   //   图书编号
+    public Date jcsk;   //    借出时间
+    public Date yhsk;  //     应还时间
+    public Date shsk;  //     实还时间
+    public Date xjrq;  //     续借日期
+    public Integer dzlxdm; //   读者类型代码
+    public Integer gcd;    //   馆藏地代码
+    public Integer jyid;  //    借阅记录唯一标识id
+}

+ 44 - 0
src/main/java/com/chuanghai/student_portrait/entity/Warning.java

@@ -0,0 +1,44 @@
+package com.chuanghai.student_portrait.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/6  9:51
+ * @Version 1.0
+ */
+@Data
+public class Warning {
+    /**
+     * 用户姓名
+     */
+    private String name;
+
+    /**
+     * 用户学号
+     */
+    private String studentNo;
+
+    /**
+     * 用户专业
+     */
+    private String profession;
+
+    /**
+     * 用户班级
+     */
+    private String clazz;
+
+    /**
+     * 门禁记录时间
+     */
+    private Date facediscernTime;
+
+    /**
+     * 预警信息
+     */
+    private String warning;
+
+}

+ 18 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/AccessCountDto.java

@@ -0,0 +1,18 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/26  9:35
+ * @Version 1.0
+ */
+@Data
+public class AccessCountDto implements Serializable {
+    private String address;
+    private Integer count;
+    private String startTime;
+    private String endTime;
+}

+ 13 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/CapacityAllDto.java

@@ -0,0 +1,13 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CapacityAllDto implements Serializable {
+    private String name;
+    private long threshold;
+    private long truth;
+
+}

+ 11 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/CapacityDto.java

@@ -0,0 +1,11 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CapacityDto implements Serializable {
+    private String name;
+    private Double max;
+}

+ 15 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/ClasDto.java

@@ -0,0 +1,15 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+@Data
+public class ClasDto {
+    private Integer jc;
+
+    private String kcmc;
+
+    private String jcTime;
+
+    private Integer count;
+
+}

+ 17 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/ConsumeDto.java

@@ -0,0 +1,17 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author:liu
+ * @Date: 2022/9/20  17:02
+ * @Version 1.0
+ */
+@Data
+public class ConsumeDto implements Serializable {
+    private Integer count;
+    private String name;
+}

+ 13 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/ConsumeTotalMoneyDto.java

@@ -0,0 +1,13 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ConsumeTotalMoneyDto implements Serializable {
+//    省份
+    private String province;
+//    总金额
+    private Integer totalMoney;
+}

+ 11 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/DistrictDto.java

@@ -0,0 +1,11 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DistrictDto implements Serializable {
+    private String province;
+    private Long Count;
+}

+ 13 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/EnergyDto.java

@@ -0,0 +1,13 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EnergyDto implements Serializable {
+    private String genderDrom;
+    private Double totalMoney;
+    private Object date;
+    private String name;
+}

+ 11 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/FaceDisernDto.java

@@ -0,0 +1,11 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FaceDisernDto implements Serializable {
+    private String schoolUserID;
+    private Integer count;
+}

+ 26 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/ForewarningDto.java

@@ -0,0 +1,26 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ForewarningDto {
+    private Integer id;
+    //    学生姓名
+    private String name;
+    //    学号
+    private String studentId;
+    //    专业名称
+    private String professionName;
+    //    班级
+    private String clazz;
+    //    时间日期
+    private String time;
+    //    预警原因(1是大门门禁未关,2是水电消费异常,3单次食堂消费过高,4宿舍门禁异常)
+    private String warningReason;
+    //    备注
+    private String remark;
+
+    private String schooluserId;
+}

+ 13 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/PersonConsumDto.java

@@ -0,0 +1,13 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PersonConsumDto implements Serializable {
+    private String name;
+    private Object money;
+    private String percentage;
+}
+

+ 24 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/PersonalTrackDto.java

@@ -0,0 +1,24 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class PersonalTrackDto  implements Serializable {
+//    时间
+    private Date dateTime;
+//    图片
+    private String image;
+//    事件
+    private String affair;
+//   名字
+    private String name;
+//    总名称
+    private String totalName;
+//    坐标--经度
+    private String longitude;
+//    坐标--纬度
+    private String latitude;
+}

+ 17 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/TbCourseSchedulingDto.java

@@ -0,0 +1,17 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+@Data
+public class TbCourseSchedulingDto {
+//    名字
+    private String pushXm;
+//    课程节次
+    private String pushJc;
+//     课程名称
+    private String pushKcmc;
+//    周几
+    private String pushZj;
+
+
+}

+ 9 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/UserLoginDTO.java

@@ -0,0 +1,9 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+@Data
+public class UserLoginDTO {
+    private String passWord;
+    private String userName;
+}

+ 43 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/WeixiaoPushDTO.java

@@ -0,0 +1,43 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+/**
+ * @Author: binguo
+ * @Date: 2022/12/29 星期四 16:03
+ * @Description: 用于接收微校推送的数据
+ * @Version: 1.0
+ */
+@Data
+public class WeixiaoPushDTO {
+    /**
+     * 应用appKey
+     */
+    private String app_key;
+    /**
+     * 应用appSecret
+     */
+    private String app_secret;
+    /**
+     * 学校主体代码
+     */
+    private String school_code;
+    /**
+     * 推送事件类型
+     *  addUser 新增用户信息事件
+     *  updateUser  修改用户信息事件
+     *  deleteUser  删除用户信息事件
+     *  addOrg  新增组织架构事件
+     *  updateOrg  修改组织架构事件
+     *  deleteOrg  删除组织架构事件
+     */
+    private String event;
+    /**
+     * 推送加密后数据
+     */
+    private String raw_data;
+
+
+
+
+}

+ 14 - 0
src/main/java/com/chuanghai/student_portrait/entity/dto/XqDto.java

@@ -0,0 +1,14 @@
+package com.chuanghai.student_portrait.entity.dto;
+
+import lombok.Data;
+
+
+@Data
+public class XqDto {
+    private String type;
+
+    private String name;
+
+    private String time;
+
+}

+ 20 - 0
src/main/java/com/chuanghai/student_portrait/exception/BaseErrorInfoInterface.java

@@ -0,0 +1,20 @@
+package com.chuanghai.student_portrait.exception;
+
+/**
+ * @Title: BaseErrorInfoInterface
+ * @Description: 基础接口
+ * 自定义的错误描述枚举类需实现该接口
+ * @Version:1.0.0
+ * @Date: 2022/4/11 星期一 19:20
+ */
+public interface BaseErrorInfoInterface {
+    /**
+     * 错误码
+     */
+    String getResultCode();
+
+    /**
+     * 错误描述
+     */
+    String getResultMsg();
+}

+ 86 - 0
src/main/java/com/chuanghai/student_portrait/exception/BizException.java

@@ -0,0 +1,86 @@
+package com.chuanghai.student_portrait.exception;
+
+/**
+ * @Title: BizException
+ * @Description: 业务异常类
+ * @Version:1.0.0
+ * @Author: bingo
+ * @Date: 2022/4/11 星期一 19:20
+ */
+public class BizException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    protected String errorCode;
+    /**
+     * 错误信息
+     */
+    protected String errorMsg;
+
+    public BizException() {
+        super();
+    }
+
+    public BizException(BaseErrorInfoInterface errorInfoInterface) {
+        super(errorInfoInterface.getResultCode());
+        this.errorCode = errorInfoInterface.getResultCode();
+        this.errorMsg = errorInfoInterface.getResultMsg();
+    }
+
+    public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
+        super(errorInfoInterface.getResultCode(), cause);
+        this.errorCode = errorInfoInterface.getResultCode();
+        this.errorMsg = errorInfoInterface.getResultMsg();
+    }
+
+    public BizException(String errorMsg) {
+        super(errorMsg);
+        this.errorMsg = errorMsg;
+    }
+
+    public BizException(String errorCode, String errorMsg) {
+        super(errorCode);
+        this.errorCode = errorCode;
+        this.errorMsg = errorMsg;
+    }
+
+    public BizException(String errorCode, String errorMsg, Throwable cause) {
+        super(errorCode, cause);
+        this.errorCode = errorCode;
+        this.errorMsg = errorMsg;
+    }
+
+
+    public String getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    @Override
+    public String getMessage() {
+        return errorMsg;
+    }
+
+    /**
+     *
+     */
+    @Override
+    public Throwable fillInStackTrace() {
+        return this;
+    }
+
+}

+ 44 - 0
src/main/java/com/chuanghai/student_portrait/exception/CommonEnum.java

@@ -0,0 +1,44 @@
+package com.chuanghai.student_portrait.exception;
+
+/**
+ * @Author: bingo
+ * @Date: 2022/4/11 星期一 19:20
+ * @Description: com.chuanghai.recognition.exception
+ * @version: 1.0
+ */
+public enum CommonEnum implements BaseErrorInfoInterface {
+    // 数据操作错误定义
+    SUCCESS("200", "成功!"),
+    BODY_NOT_MATCH("400", "请求的数据格式不符!"),
+    SIGNATURE_NOT_MATCH("401", "请求的数字签名不匹配!"),
+    NOT_FOUND("404", "未找到该资源!"),
+    INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),
+    SERVER_BUSY("503", "服务器正忙,请稍后再试!");
+
+    /**
+     * 错误码
+     */
+    private String resultCode;
+
+    /**
+     * 错误描述
+     */
+    private String resultMsg;
+
+    CommonEnum(String resultCode, String resultMsg) {
+        this.resultCode = resultCode;
+        this.resultMsg = resultMsg;
+    }
+
+    @Override
+    public String getResultCode() {
+        return resultCode;
+    }
+
+    @Override
+    public String getResultMsg() {
+        return resultMsg;
+    }
+
+}
+

+ 106 - 0
src/main/java/com/chuanghai/student_portrait/exception/GlobalExceptionHandler.java

@@ -0,0 +1,106 @@
+package com.chuanghai.student_portrait.exception;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.BindException;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * @Title: GlobalExceptionHandler
+ * @Description: 全局异常处理
+ * 如果使用@RestControllerAdvice 注解
+ * 则会将返回的数据类型转换成JSON格式
+ * @Version:1.0.0
+ * @Author: bingo
+ * @Date: 2022/4/11 星期一 19:20
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+    /**
+     * 处理自定义的业务异常
+     *
+     * @param req
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(value = BizException.class)   //自定义业务异常
+    @ResponseBody
+    public ResultValue bizExceptionHandler(HttpServletRequest req, BizException e) {
+//    	logger.error("发生业务异常!原因是:{}",e.getErrorMsg());
+        logger.error("发生业务异常!原因是:", e);  //没有打印异常调用栈,不知道是哪一行异常?
+        return ResultValue.error(e.getErrorCode(), e.getErrorMsg());
+    }
+
+    /**
+     * 处理空指针的异常
+     *
+     * @param req
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(value = NullPointerException.class) //空指针异常
+    @ResponseBody
+    public ResultValue exceptionHandler(HttpServletRequest req, NullPointerException e) {
+        logger.error("发生空指针异常!原因是:", e); //会打印异常调用栈
+        return ResultValue.error(CommonEnum.BODY_NOT_MATCH);
+    }
+
+
+    /**
+     * 处理其他异常
+     *
+     * @param req
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(value = Exception.class) //其他异常
+    @ResponseBody
+    public ResultValue exceptionHandler(HttpServletRequest req, Exception e) {
+        logger.error("未知异常!原因是:", e);
+        return ResultValue.error(CommonEnum.INTERNAL_SERVER_ERROR);
+    }
+
+    /**
+     * 校验参数是否合法
+     *
+     * @param exception
+     * @return
+     */
+    @ExceptionHandler({BindException.class})
+    public ResultValue validationException(BindException exception) {
+        List<ObjectError> errors = exception.getAllErrors();
+        if (!CollectionUtils.isEmpty(errors)) {
+            StringBuilder sb = new StringBuilder();
+            errors.forEach(e -> sb.append(e.getDefaultMessage()).append(" "));
+            return new ResultValue().error("400", sb.toString());
+        }
+        return new ResultValue().error("500", exception.getLocalizedMessage());
+    }
+
+    @ExceptionHandler({ConstraintViolationException.class})
+    public ResultValue constraintViolationException(ConstraintViolationException exception) {
+        Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
+        if (!CollectionUtils.isEmpty(constraintViolations)) {
+            StringBuilder sb = new StringBuilder();
+            constraintViolations.forEach(e -> sb.append(e.getMessage()).append(" "));
+            new ResultValue().error("400", sb.toString());
+
+        }
+        return new ResultValue().error("500", exception.getLocalizedMessage());
+    }
+
+
+}

+ 0 - 0
src/main/java/com/chuanghai/student_portrait/exception/ResultValue.java


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov