Browse Source

初始版本

JX.Li 1 year ago
commit
2b72bb49cc
100 changed files with 1207202 additions and 0 deletions
  1. 29 0
      .idea/compiler.xml
  2. 49 0
      .idea/encodings.xml
  3. 35 0
      .idea/jarRepositories.xml
  4. 13 0
      .idea/misc.xml
  5. 22 0
      .idea/modules.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 6 0
      .idea/vcs.xml
  8. 388 0
      .idea/workspace.xml
  9. 152 0
      README.md
  10. 2523 0
      dbBaseBackupFile/2021-12-16_17-58-31.sql
  11. BIN
      dbSupport/dbProgram/linux/lib/libmysqlclient.a
  12. 1 0
      dbSupport/dbProgram/linux/lib/libmysqlclient.so
  13. 1 0
      dbSupport/dbProgram/linux/lib/libmysqlclient.so.21
  14. BIN
      dbSupport/dbProgram/linux/lib/libmysqlclient.so.21.1.22
  15. 1 0
      dbSupport/dbProgram/linux/lib/private/libcrypto.so
  16. BIN
      dbSupport/dbProgram/linux/lib/private/libcrypto.so.1.1
  17. BIN
      dbSupport/dbProgram/linux/lib/private/libprotobuf-lite.so.3.11.4
  18. BIN
      dbSupport/dbProgram/linux/lib/private/libprotobuf.so.3.11.4
  19. 1 0
      dbSupport/dbProgram/linux/lib/private/libssl.so
  20. BIN
      dbSupport/dbProgram/linux/lib/private/libssl.so.1.1
  21. BIN
      dbSupport/dbProgram/linux/mysql5.x/mysql
  22. BIN
      dbSupport/dbProgram/linux/mysql5.x/mysqldump
  23. BIN
      dbSupport/dbProgram/linux/mysql5.x/mysqlimport
  24. BIN
      dbSupport/dbProgram/linux/mysql8.x/mysql
  25. BIN
      dbSupport/dbProgram/linux/mysql8.x/mysqldump
  26. BIN
      dbSupport/dbProgram/linux/mysql8.x/mysqlimport
  27. BIN
      dbSupport/dbProgram/windows/mysql5.x/mysql.exe
  28. BIN
      dbSupport/dbProgram/windows/mysql5.x/mysqldump.exe
  29. BIN
      dbSupport/dbProgram/windows/mysql5.x/mysqlimport.exe
  30. BIN
      dbSupport/dbProgram/windows/mysql8.x/harness-library.dll
  31. BIN
      dbSupport/dbProgram/windows/mysql8.x/libeay32.dll
  32. BIN
      dbSupport/dbProgram/windows/mysql8.x/libmecab.dll
  33. BIN
      dbSupport/dbProgram/windows/mysql8.x/mysql.exe
  34. BIN
      dbSupport/dbProgram/windows/mysql8.x/mysqldump.exe
  35. BIN
      dbSupport/dbProgram/windows/mysql8.x/mysqlimport.exe
  36. BIN
      dbSupport/dbProgram/windows/mysql8.x/ssleay32.dll
  37. BIN
      dbSupport/mx_db_backup.mv.db
  38. 3 0
      dbSupport/mx_db_backup.trace.db
  39. 40772 0
      logs/ruoyi-xxl-job-admin.2023-10-20.log
  40. 386054 0
      logs/ruoyi-xxl-job-admin.2023-10-21.log
  41. 503819 0
      logs/ruoyi-xxl-job-admin.2023-10-22.log
  42. 79730 0
      logs/ruoyi-xxl-job-admin.2023-10-23.log
  43. 154897 0
      logs/ruoyi-xxl-job-admin.log
  44. 3672 0
      logs/sys-console.2023-10-23.log
  45. 3090 0
      logs/sys-console.log
  46. 14385 0
      logs/sys-error.2023-10-20.log
  47. 2300 0
      logs/sys-error.2023-10-21.log
  48. 3123 0
      logs/sys-error.2023-10-23.log
  49. 1257 0
      logs/sys-error.log
  50. 1397 0
      logs/sys-info.2023-10-20.log
  51. 3459 0
      logs/sys-info.2023-10-21.log
  52. 478 0
      logs/sys-info.2023-10-23.log
  53. 1350 0
      logs/sys-info.log
  54. 2 0
      logs/sys-user.2023-10-20.log
  55. 21 0
      logs/sys-user.2023-10-21.log
  56. 1 0
      logs/sys-user.2023-10-23.log
  57. 12 0
      logs/sys-user.log
  58. 435 0
      pom.xml
  59. 14 0
      ruoyi-admin/Dockerfile
  60. BIN
      ruoyi-admin/lib/mx-db-backup-1.0.0.jar
  61. 141 0
      ruoyi-admin/pom.xml
  62. 8 0
      ruoyi-admin/ruoyi-admin.iml
  63. 89 0
      ruoyi-admin/src/main/docker/docker-compose.yml
  64. 1 0
      ruoyi-admin/src/main/docker/mysql/mysql.env
  65. 27 0
      ruoyi-admin/src/main/docker/nginx/cert/jy.cxcloudsci.com.key
  66. 63 0
      ruoyi-admin/src/main/docker/nginx/cert/jy.cxcloudsci.com.pem
  67. 36 0
      ruoyi-admin/src/main/docker/nginx/default.conf
  68. 7 0
      ruoyi-admin/src/main/docker/server/Dockerfile
  69. 22 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  70. 18 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
  71. 87 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
  72. 51 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/ObsController.java
  73. 122 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAboutUsController.java
  74. 134 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAreaController.java
  75. 120 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GBuildingController.java
  76. 113 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GEmergencyRepairController.java
  77. 122 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GExplainController.java
  78. 113 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GNoticeController.java
  79. 113 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GRotationController.java
  80. 121 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUnitController.java
  81. 186 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUserController.java
  82. 57 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
  83. 68 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
  84. 68 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
  85. 80 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
  86. 128 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
  87. 146 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
  88. 112 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
  89. 124 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
  90. 35 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
  91. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  92. 132 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
  93. 84 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
  94. 110 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
  95. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java
  96. 118 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
  97. 138 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
  98. 41 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
  99. 216 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  100. 0 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

+ 29 - 0
.idea/compiler.xml

@@ -0,0 +1,29 @@
+<?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="ruoyi-job" />
+        <module name="ruoyi-system" />
+        <module name="ruoyi-mobile" />
+        <module name="ruoyi-monitor-admin" />
+        <module name="ruoyi-gas" />
+        <module name="ruoyi-generator" />
+        <module name="ruoyi-xxl-job-admin" />
+        <module name="ruoyi-framework" />
+        <module name="ruoyi-oss" />
+        <module name="ruoyi-demo" />
+        <module name="ruoyi-common" />
+        <module name="ruoyi-quartz" />
+        <module name="ruoyi-admin" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="zdsz_java" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+</project>

+ 49 - 0
.idea/encodings.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-admin" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-common" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-demo" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-demo/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-demo/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-monitor-admin" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-monitor-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-monitor-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-xxl-job-admin" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-extend/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-framework" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-gas" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-gas/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-gas/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-generator" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-generator/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-generator/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-job" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-job/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-job/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-mobile" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-mobile/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-mobile/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-oss" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-oss/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-oss/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-quartz" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-quartz/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-quartz/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-system" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 35 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
+    </remote-repository>
+    <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="public" />
+      <option name="name" value="aliyun nexus" />
+      <option name="url" value="https://maven.aliyun.com/repository/public/" />
+    </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="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
+    </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>

+ 13 - 0
.idea/misc.xml

@@ -0,0 +1,13 @@
+<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">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 22 - 0
.idea/modules.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-admin/ruoyi-admin.iml" filepath="$PROJECT_DIR$/ruoyi-admin/ruoyi-admin.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-common/ruoyi-common.iml" filepath="$PROJECT_DIR$/ruoyi-common/ruoyi-common.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-demo/ruoyi-demo.iml" filepath="$PROJECT_DIR$/ruoyi-demo/ruoyi-demo.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-extend.iml" filepath="$PROJECT_DIR$/ruoyi-extend/ruoyi-extend.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-framework/ruoyi-framework.iml" filepath="$PROJECT_DIR$/ruoyi-framework/ruoyi-framework.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-gas/ruoyi-gas.iml" filepath="$PROJECT_DIR$/ruoyi-gas/ruoyi-gas.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-generator/ruoyi-generator.iml" filepath="$PROJECT_DIR$/ruoyi-generator/ruoyi-generator.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-job/ruoyi-job.iml" filepath="$PROJECT_DIR$/ruoyi-job/ruoyi-job.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-mobile/ruoyi-mobile.iml" filepath="$PROJECT_DIR$/ruoyi-mobile/ruoyi-mobile.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-monitor-admin/ruoyi-monitor-admin.iml" filepath="$PROJECT_DIR$/ruoyi-extend/ruoyi-monitor-admin/ruoyi-monitor-admin.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-oss/ruoyi-oss.iml" filepath="$PROJECT_DIR$/ruoyi-oss/ruoyi-oss.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-quartz/ruoyi-quartz.iml" filepath="$PROJECT_DIR$/ruoyi-quartz/ruoyi-quartz.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-system/ruoyi-system.iml" filepath="$PROJECT_DIR$/ruoyi-system/ruoyi-system.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-vue-plus.iml" filepath="$PROJECT_DIR$/ruoyi-vue-plus.iml" />
+      <module fileurl="file://$PROJECT_DIR$/ruoyi-extend/ruoyi-xxl-job-admin/ruoyi-xxl-job-admin.iml" filepath="$PROJECT_DIR$/ruoyi-extend/ruoyi-xxl-job-admin/ruoyi-xxl-job-admin.iml" />
+    </modules>
+  </component>
+</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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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.png" 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>

+ 388 - 0
.idea/workspace.xml

@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="b5706414-aab4-4b84-9189-e0bf939b95e1" name="Changes" comment="">
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GEmergencyRepairController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GEmergencyRepair.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GEmergencyRepairBo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GEmergencyRepairVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GAreaPhotoMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GEmergencyRepairMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGAreaPhotoService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGEmergencyRepairService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GEmergencyRepairMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/jarRepositories.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/Backup.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAreaController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAreaController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GBuildingController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GBuildingController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GEnginePhotoController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GHouseController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GOrderController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GOrderPhotoController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GOtherEngineController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GParameterController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GPipeLengthController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GPipeTypeController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUnitController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUnitController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GValveController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MAboutUsController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MAreaController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MBuildingController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MEnginePhotoController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MExplainController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MHouseController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MNoticeController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MOrderController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MOrderPhotoController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MOtherEngineController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MPipeLengthController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MPipeTypeController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MRotationController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MUnitController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MUserController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mobile/MValveController.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/application-dev.yml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/application-dev.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-extend/ruoyi-extend.iml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-extend/ruoyi-extend.iml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GArea.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GArea.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GBuilding.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GBuilding.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GEnginePhoto.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GAreaPhoto.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GHouse.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GOrder.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GOrderPhoto.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GOtherEngine.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GParameter.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GPipeLength.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GPipeType.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GUnit.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GUnit.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/GValve.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GAreaBo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GAreaBo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GBuildingBo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GBuildingBo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GEnginePhotoBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GHouseBo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GAreaPhotoBo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GOrderBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GOrderPhotoBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GOtherEngineBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GParameterBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GPipeLengthBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GPipeTypeBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GUnitBo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GUnitBo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/bo/GValveBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GAreaExportVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GAreaVo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GAreaVo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GBuildingVo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GBuildingVo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GDownloadVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GEnginePhotoVo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GAreaPhotoVo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GExportVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GExportsVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GHouseVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GImportVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GOrderExportVoAnJian.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GOrderExportVoWeiXiu.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GOrderPhotoVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GOrderVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GOtherEngineVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GParameterVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GPipeLengthVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GPipeTypeVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GUnitVo.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GUnitVo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/domain/vo/GValveVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GAreaMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GAreaMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GBuildingMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GBuildingMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GEnginePhotoMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GHouseMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GOrderMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GOrderPhotoMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GOtherEngineMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GParameterMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GPipeLengthMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GPipeTypeMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GUnitMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GUnitMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GUserMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GUserMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/mapper/GValveMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGAreaService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGAreaService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGBuildingService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGBuildingService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGEnginePhotoService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGHouseService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGOrderPhotoService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGOrderService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGOtherEngineService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGParameterService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGPipeLengthService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGPipeTypeService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGUnitService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGUnitService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGUserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGUserService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/IGValveService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GAboutUsServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GAboutUsServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GAreaServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GAreaServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GBuildingServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GBuildingServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GEnginePhotoServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GAreaPhotoServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GHouseServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GOrderPhotoServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GOrderServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GOtherEngineServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GParameterServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GPipeLengthServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GEmergencyRepairServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GPipeTypeServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GUnitServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GUnitServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GUserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GUserServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/java/com/ruoyi/gas/service/impl/GValveServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GAreaMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GAreaMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GBuildingMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GBuildingMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GEnginePhotoMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GHouseMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GOrderMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GOrderPhotoMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GOtherEngineMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GParameterMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GPipeLengthMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GPipeTypeMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GAreaPhotoMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GUnitMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GUnitMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-gas/src/main/resources/mapper/GValveMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MAboutUs.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MArea.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MBuilding.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MEnginePhoto.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MExplain.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MHouse.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MNotice.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MOrder.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MOrderPhoto.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MOtherEngine.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MPipeLength.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MPipeType.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MRotation.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MUnit.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/MValve.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MAboutUsBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MAreaBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MBuildingBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MEnginePhotoBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MExplainBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MHouseBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MNoticeBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MOrderBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MOrderPhotoBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MOtherEngineBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MPipeLengthBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MPipeTypeBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MRotationBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MUnitBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MUserBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/bo/MValveBo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MAboutUsVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MAreaVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MBuildingVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MCensusVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MDicVO.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MDownloadVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MEnginePhotoVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MExplainVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MHouseVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MNoticeVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MOrderPhotoVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MOrderVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MOtherEngineVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MPipeLengthVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MPipeTypeVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MRotationVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MUnitVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MUserForemanVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MUserVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/domain/vo/MValveVo.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MAboutUsMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MAreaMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MBuildingMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MEnginePhotoMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MExplainMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MHouseMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MNoticeMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MOrderMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MOrderPhotoMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MOtherEngineMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MPipeLengthMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MPipeTypeMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MRotationMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MUnitMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MUserMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/mapper/MValveMapper.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMAboutUsService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMAreaService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMBuildingService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMEnginePhotoService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMExplainService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMHouseService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMNoticeService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMOrderPhotoService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMOrderService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMOtherEngineService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMPipeLengthService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMPipeTypeService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMRotationService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMUnitService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMUserService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/IMValveService.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MAboutUsServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MAreaServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MBuildingServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MEnginePhotoServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MExplainServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MHouseServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MNoticeServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MOrderPhotoServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MOrderServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MOtherEngineServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MPipeLengthServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MPipeTypeServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MRotationServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MUnitServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MUserServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/java/com/ruoyi/mobile/service/impl/MValveServiceImpl.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MAboutUsMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MAreaMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MBuildingMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MEnginePhotoMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MExplainMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MHouseMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MNoticeMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MOrderMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MOrderPhotoMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MOtherEngineMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MPipeLengthMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MPipeTypeMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MRotationMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MUnitMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MUserMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-mobile/src/main/resources/mapper/mobile/MValveMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-vue-plus.iml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-vue-plus.iml" afterDir="false" />
+    </list>
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="CodeInsightWorkspaceSettings">
+    <option name="optimizeImportsOnTheFly" value="true" />
+  </component>
+  <component name="CompilerWorkspaceConfiguration">
+    <option name="MAKE_PROJECT_ON_SAVE" value="true" />
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="JRebelWorkspace">
+    <option name="jrebelEnabledAutocompile" value="true" />
+  </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="mavenHome" value="$PROJECT_DIR$/../../../apache-maven-3.9.5" />
+        <option name="userSettingsFile" value="D:\apache-maven-3.9.5\conf\settings.xml" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="ProjectColorInfo">{
+  &quot;associatedIndex&quot;: 8
+}</component>
+  <component name="ProjectId" id="2X0Ut6U1qBnv9dFdRoDzFZHm0TN" />
+  <component name="ProjectLevelVcsManager">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;RequestMappingsPanelOrder0&quot;: &quot;0&quot;,
+    &quot;RequestMappingsPanelOrder1&quot;: &quot;1&quot;,
+    &quot;RequestMappingsPanelWidth0&quot;: &quot;75&quot;,
+    &quot;RequestMappingsPanelWidth1&quot;: &quot;75&quot;,
+    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
+    &quot;git-widget-placeholder&quot;: &quot;master&quot;,
+    &quot;last_opened_file_path&quot;: &quot;D:/project/java/zhendashizheng/ruoyi-gas/src/main/resources/mapper&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;com.zeroturnaround.javarebel.idea.plugin.settings.AdvancedConfigurable&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  }
+}</component>
+  <component name="ReactorSettings">
+    <option name="notificationShown" value="true" />
+  </component>
+  <component name="RebelAgentSelection">
+    <selection>jr</selection>
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\project\java\zhendashizheng\ruoyi-gas\src\main\resources\mapper" />
+      <recent name="D:\project\java\zhendashizheng\ruoyi-admin\src\main\java\com\ruoyi\web\controller\gas" />
+      <recent name="D:\project\java\zhendashizheng\ruoyi-gas\src\main\java\com\ruoyi\gas" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="configurationTypes">
+      <set>
+        <option value="SpringBootApplicationConfigurationType" />
+      </set>
+    </option>
+  </component>
+  <component name="RunManager" selected="Spring Boot.RuoYiApplication">
+    <configuration name="MonitorAdminApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" nameIsGenerated="true">
+      <module name="ruoyi-monitor-admin" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.ruoyi.monitor.admin.MonitorAdminApplication" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="RuoYiApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" nameIsGenerated="true">
+      <option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" />
+      <module name="ruoyi-admin" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.ruoyi.RuoYiApplication" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="XxlJobAdminApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" nameIsGenerated="true">
+      <module name="ruoyi-xxl-job-admin" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.xxl.job.admin.XxlJobAdminApplication" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="b5706414-aab4-4b84-9189-e0bf939b95e1" name="Changes" comment="" />
+      <created>1697765703025</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1697765703025</updated>
+      <workItem from="1697765704027" duration="34000" />
+      <workItem from="1697765814615" duration="7272000" />
+      <workItem from="1697850178669" duration="9364000" />
+      <workItem from="1697865465408" duration="10564000" />
+      <workItem from="1698023956889" duration="286000" />
+      <workItem from="1698041358897" duration="5107000" />
+      <workItem from="1698108724618" duration="7941000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+</project>

+ 152 - 0
README.md

@@ -0,0 +1,152 @@
+## 平台简介
+[![码云Gitee](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
+[![GitHub](https://img.shields.io/github/stars/JavaLionLi/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/JavaLionLi/RuoYi-Vue-Plus)
+[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
+[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
+<br>
+[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.3.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
+[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]()
+[![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]()
+[![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]()
+[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
+
+RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级(不兼容原框架)
+
+| 功能介绍 | 使用技术 | 文档地址 | 特性注意事项 |
+|---|---|---|---|
+| 当前框架 | RuoYi-Vue-Plus | [RuoYi-Vue-Plus文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) | 重写RuoYi-Vue全方位升级(不兼容原框架) |
+| satoken分支 | RuoYi-Vue-Plus-satoken | [satoken分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) | 使用satoken重构权限鉴权(仅供学习不推荐上生产) |
+| 单体分支 | RuoYi-Vue-Plus-fast | [fast分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) | 单体应用结构 |
+| 原框架 | RuoYi-Vue | [RuoYi-Vue官网](http://ruoyi.vip/) | 定期同步需要的功能 |
+| 前端开发框架 | Vue、Element UI | [Element UI官网](https://element.eleme.cn/#/zh-CN) | |
+| 后端开发框架 | SpringBoot | [SpringBoot官网](https://spring.io/projects/spring-boot/#learn) | |
+| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 Netty 的高性能容器 |
+| 权限认证框架 | Spring Security、Jwt | [SpringSecurity官网](https://spring.io/projects/spring-security#learn) | 支持多终端认证系统 |
+| 关系数据库 | MySQL | [MySQL官网](https://dev.mysql.com/) | 适配 8.X 最低 5.7 |
+| 缓存数据库 | Redis | [Redis官网](https://redis.io/) | 适配 6.X 最低 4.X |
+| 数据库框架 | Mybatis-Plus | [Mybatis-Plus文档](https://baomidou.com/guide/) | 快速 CRUD 增加开发效率 |
+| 数据库框架 | p6spy | [p6spy官网](https://p6spy.readthedocs.io/) | 更强劲的 SQL 分析 |
+| 多数据源框架 | dynamic-datasource | [dynamic-ds文档](https://www.kancloud.cn/tracy5546/dynamic-datasource/content) | 支持主从与多种类数据库异构 |
+| 序列化框架 | Jackson | [Jackson官网](https://github.com/FasterXML/jackson) | 统一使用 jackson 高效可靠 |
+| 网络框架 | Feign、OkHttp3 | [Feign官网](https://github.com/OpenFeign/feign) | 接口化管理 HTTP 请求 |
+| Redis客户端 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 支持单机、集群配置 |
+| 分布式限流 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 全局、请求IP、集群ID 多种限流 |
+| 分布式锁 | Lock4j | [Lock4j官网](https://gitee.com/baomidou/lock4j) | 注解锁、工具锁 多种多样 |
+| 分布式幂等 | Lock4j | [Lock4j文档](https://gitee.com/baomidou/lock4j) | 基于分布式锁实现 |
+| 分布式日志 | TLog | [TLog文档](https://yomahub.com/tlog/docs) | 支持跟踪链路日志记录、性能分析、链路排查 |
+| 分布式任务调度 | Xxl-Job | [Xxl-Job官网](https://www.xuxueli.com/xxl-job/) | 高性能 高可靠 易扩展 |
+| 文件存储 | Minio | [Minio文档](https://docs.min.io/) | 本地存储 |
+| 文件存储 | 七牛、阿里、腾讯 | [OSS使用文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4359146&doc_id=1469725) | 云存储 |
+| 监控框架 | SpringBoot-Admin | [SpringBoot-Admin文档](https://codecentric.github.io/spring-boot-admin/current/) | 全方位服务监控 |
+| 校验框架 | Validation | [Validation文档](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/) | 增强接口安全性、严谨性 |
+| Excel框架 | Alibaba EasyExcel | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel) | 性能优异 扩展性强 |
+| 文档框架 | Knife4j | [Knife4j文档](https://doc.xiaominfo.com/knife4j/documentation/) | 美化接口文档 |
+| 工具类框架 | Hutool、Lombok | [Hutool文档](https://www.hutool.cn/docs/) | 减少代码冗余 增加安全性 |
+| 代码生成器 | 适配MP、Knife4j规范化代码 | [Hutool文档](https://www.hutool.cn/docs/) | 一键生成前后端代码 |
+| 部署方式 | Docker | [Docker文档](https://docs.docker.com/) | 容器编排 一键部署业务集群 |
+| 国际化 | SpringMessage | [SpringMVC文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc) | Spring标准国际化方案 |
+
+## 参考文档
+
+使用框架前请仔细阅读文档重点注意事项
+<br>
+>[初始化项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117)
+> 
+>[部署项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382)
+> 
+>[参考文档 Wiki](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages)
+
+## 软件架构图
+
+![Plus部署架构图](https://images.gitee.com/uploads/images/2021/0729/112230_4295e5ce_1766278.png "Plus部署架构图.png")
+
+## 贡献代码
+
+欢迎各路英雄豪杰 `PR` 代码 请提交到 `dev` 开发分支 统一测试发版
+
+框架定位为 `通用后台管理系统(分布式集群强化)` 原则上不接受业务 `PR`
+
+### 其他
+
+* 同步升级 RuoYi-Vue
+* GitHub 地址 [RuoYi-Vue-Plus-github](https://github.com/JavaLionLi/RuoYi-Vue-Plus)
+* 单模块 fast 分支 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/)
+* satoken 分支 [RuoYi-Vue-Plus-satoken](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/)
+* 用户扩展项目 [扩展项目列表](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4478302&doc_id=1469725)
+
+## 加群与捐献
+>[加群与捐献](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598)
+
+## 捐献作者
+作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭  
+<img src="https://images.gitee.com/uploads/images/2021/0525/101654_451e4523_1766278.jpeg" width="300px" height="450px" />
+<img src="https://images.gitee.com/uploads/images/2021/0525/101713_3d18b119_1766278.jpeg" width="300px" height="450px" />
+
+## 业务功能
+
+| 功能 | 介绍 |
+|---|---|
+| 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置。 |
+| 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 |
+| 岗位管理 | 配置系统用户所属担任职务。 |
+| 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等。 |
+| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分。 |
+| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护。 |
+| 参数管理 | 对系统动态配置常用参数。 |
+| 通知公告 | 系统通知公告信息发布维护。 |
+| 操作日志 | 系统正常操作日志记录和查询;系统异常信息日志记录和查询。 |
+| 登录日志 | 系统登录日志记录查询包含登录异常。 |
+| 文件管理 | 系统文件上传、下载等管理。 |
+| 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志。 |
+| 代码生成 | 前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 |
+| 系统接口 | 根据业务代码自动生成相关的api接口文档。 |
+| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等。 |
+| 缓存监控 | 对系统的缓存信息查询,命令统计等。 |
+| 在线构建器 | 拖动表单元素生成相应的HTML代码。 |
+| 连接池监视 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 |
+| 使用案例 | 系统的一些功能案例 |
+
+## 演示图例
+
+<table border="1" cellpadding="1" cellspacing="1" style="width:500px">
+	<tbody>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-972235bcbe3518dedd351ff0e2ee7d1031c.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-5e0097702fa91e2e36391de8127676a7fa1.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td>
+			<p><img src="https://oscimg.oschina.net/oscnet/up-e56e3828f48cd9886d88731766f06d5f3c1.png" width="1920" /></p>
+			</td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-0715990ea1a9f254ec2138fcd063c1f556a.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-eaf5417ccf921bb64abb959e3d8e290467f.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-fc285cf33095ebf8318de6999af0f473861.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-60c83fd8bd61c29df6dbf47c88355e9c272.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-7f731948c8b73c7d90f67f9e1c7a534d5c3.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-e4de89b5e2d20c52d3c3a47f9eb88eb8526.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-8791d823a508eb90e67c604f36f57491a67.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-4589afd99982ead331785299b894174feb6.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-8ea177cdacaea20995daf2f596b15232561.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-32d1d04c55c11f74c9129fbbc58399728c4.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-04fa118f7631b7ae6fd72299ca0a1430a63.png" width="1920" /></td>
+		</tr>
+		<tr>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-fe7e85b65827802bfaadf3acd42568b58c7.png" width="1920" /></td>
+			<td><img src="https://oscimg.oschina.net/oscnet/up-eff2b02a54f8188022d8498cfe6af6fcc06.png" width="1920" /></td>
+		</tr>
+	</tbody>
+</table>

File diff suppressed because it is too large
+ 2523 - 0
dbBaseBackupFile/2021-12-16_17-58-31.sql


BIN
dbSupport/dbProgram/linux/lib/libmysqlclient.a


+ 1 - 0
dbSupport/dbProgram/linux/lib/libmysqlclient.so

@@ -0,0 +1 @@
+libmysqlclient.so.21

+ 1 - 0
dbSupport/dbProgram/linux/lib/libmysqlclient.so.21

@@ -0,0 +1 @@
+libmysqlclient.so.21.1.22

BIN
dbSupport/dbProgram/linux/lib/libmysqlclient.so.21.1.22


+ 1 - 0
dbSupport/dbProgram/linux/lib/private/libcrypto.so

@@ -0,0 +1 @@
+libcrypto.so.1.1

BIN
dbSupport/dbProgram/linux/lib/private/libcrypto.so.1.1


BIN
dbSupport/dbProgram/linux/lib/private/libprotobuf-lite.so.3.11.4


BIN
dbSupport/dbProgram/linux/lib/private/libprotobuf.so.3.11.4


+ 1 - 0
dbSupport/dbProgram/linux/lib/private/libssl.so

@@ -0,0 +1 @@
+libssl.so.1.1

BIN
dbSupport/dbProgram/linux/lib/private/libssl.so.1.1


BIN
dbSupport/dbProgram/linux/mysql5.x/mysql


BIN
dbSupport/dbProgram/linux/mysql5.x/mysqldump


BIN
dbSupport/dbProgram/linux/mysql5.x/mysqlimport


BIN
dbSupport/dbProgram/linux/mysql8.x/mysql


BIN
dbSupport/dbProgram/linux/mysql8.x/mysqldump


BIN
dbSupport/dbProgram/linux/mysql8.x/mysqlimport


BIN
dbSupport/dbProgram/windows/mysql5.x/mysql.exe


BIN
dbSupport/dbProgram/windows/mysql5.x/mysqldump.exe


BIN
dbSupport/dbProgram/windows/mysql5.x/mysqlimport.exe


BIN
dbSupport/dbProgram/windows/mysql8.x/harness-library.dll


BIN
dbSupport/dbProgram/windows/mysql8.x/libeay32.dll


BIN
dbSupport/dbProgram/windows/mysql8.x/libmecab.dll


BIN
dbSupport/dbProgram/windows/mysql8.x/mysql.exe


BIN
dbSupport/dbProgram/windows/mysql8.x/mysqldump.exe


BIN
dbSupport/dbProgram/windows/mysql8.x/mysqlimport.exe


BIN
dbSupport/dbProgram/windows/mysql8.x/ssleay32.dll


BIN
dbSupport/mx_db_backup.mv.db


+ 3 - 0
dbSupport/mx_db_backup.trace.db

@@ -0,0 +1,3 @@
+2021-12-14 23:28:16 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "DB_TYPE" not found; SQL statement:
+SELECT * FROM DB_TYPE DB_TYPE [42102-200]

File diff suppressed because it is too large
+ 40772 - 0
logs/ruoyi-xxl-job-admin.2023-10-20.log


File diff suppressed because it is too large
+ 386054 - 0
logs/ruoyi-xxl-job-admin.2023-10-21.log


File diff suppressed because it is too large
+ 503819 - 0
logs/ruoyi-xxl-job-admin.2023-10-22.log


File diff suppressed because it is too large
+ 79730 - 0
logs/ruoyi-xxl-job-admin.2023-10-23.log


File diff suppressed because it is too large
+ 154897 - 0
logs/ruoyi-xxl-job-admin.log


File diff suppressed because it is too large
+ 3672 - 0
logs/sys-console.2023-10-23.log


File diff suppressed because it is too large
+ 3090 - 0
logs/sys-console.log


File diff suppressed because it is too large
+ 14385 - 0
logs/sys-error.2023-10-20.log


File diff suppressed because it is too large
+ 2300 - 0
logs/sys-error.2023-10-21.log


File diff suppressed because it is too large
+ 3123 - 0
logs/sys-error.2023-10-23.log


File diff suppressed because it is too large
+ 1257 - 0
logs/sys-error.log


File diff suppressed because it is too large
+ 1397 - 0
logs/sys-info.2023-10-20.log


File diff suppressed because it is too large
+ 3459 - 0
logs/sys-info.2023-10-21.log


File diff suppressed because it is too large
+ 478 - 0
logs/sys-info.2023-10-23.log


File diff suppressed because it is too large
+ 1350 - 0
logs/sys-info.log


+ 2 - 0
logs/sys-user.2023-10-20.log

@@ -0,0 +1,2 @@
+2023-10-20 14:23:22 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-20 16:51:32 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====

+ 21 - 0
logs/sys-user.2023-10-21.log

@@ -0,0 +1,21 @@
+2023-10-21 10:17:49 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 11:03:29 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 11:07:25 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 13:02:07 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 13:16:13 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 13:24:57 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 13:49:13 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:03:42 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:09:46 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:20:03 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:23:31 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:45:34 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 14:50:13 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:03:19 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:06:06 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:33:12 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:43:46 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:49:06 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:54:13 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 15:56:23 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-21 16:01:29 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====

+ 1 - 0
logs/sys-user.2023-10-23.log

@@ -0,0 +1 @@
+2023-10-23 14:42:46 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====

+ 12 - 0
logs/sys-user.log

@@ -0,0 +1,12 @@
+2023-10-24 10:41:24 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 10:52:38 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 13:10:55 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 13:13:16 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 13:51:06 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:07:03 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:09:50 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:15:09 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:17:39 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:19:09 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:22:09 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====
+2023-10-24 14:41:09 [SpringApplicationShutdownHook] INFO  sys-user - ====关闭后台任务任务线程池====

+ 435 - 0
pom.xml

@@ -0,0 +1,435 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.ruoyi</groupId>
+    <artifactId>ruoyi-vue-plus</artifactId>
+    <version>3.3.0</version>
+
+    <name>RuoYi-Vue-Plus</name>
+    <url>https://gitee.com/JavaLionLi/RuoYi-Vue-Plus</url>
+    <description>RuoYi-Vue-Plus后台管理系统</description>
+
+    <properties>
+        <ruoyi-vue-plus.version>3.3.0</ruoyi-vue-plus.version>
+        <spring-boot.version>2.5.6</spring-boot.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
+        <druid.version>1.2.8</druid.version>
+        <knife4j.version>3.0.3</knife4j.version>
+        <swagger-annotations.version>1.5.22</swagger-annotations.version>
+        <poi.version>4.1.2</poi.version>
+        <easyexcel.version>2.2.11</easyexcel.version>
+        <velocity.version>1.7</velocity.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <jwt.version>0.9.1</jwt.version>
+        <mybatis-plus.version>3.4.3.4</mybatis-plus.version>
+        <p6spy.version>3.9.1</p6spy.version>
+        <hutool.version>5.7.15</hutool.version>
+        <feign.version>3.0.3</feign.version>
+        <feign-okhttp.version>11.6</feign-okhttp.version>
+        <okhttp.version>4.9.1</okhttp.version>
+        <spring-boot-admin.version>2.5.2</spring-boot-admin.version>
+        <redisson.version>3.16.3</redisson.version>
+        <lock4j.version>2.2.1</lock4j.version>
+        <dynamic-ds.version>3.4.1</dynamic-ds.version>
+        <tlog.version>1.3.3</tlog.version>
+        <xxl-job.version>2.3.0</xxl-job.version>
+
+        <!-- jdk11 缺失依赖 jaxb-->
+        <jaxb.version>3.0.1</jaxb.version>
+
+        <!-- OSS 配置 -->
+        <qiniu.version>7.8.0</qiniu.version>
+        <aliyun.oss.version>3.13.1</aliyun.oss.version>
+        <qcloud.cos.version>5.6.58</qcloud.cos.version>
+        <minio.version>8.3.3</minio.version>
+
+        <!-- docker 配置 -->
+        <docker.registry.url>123.249.30.140</docker.registry.url>
+        <docker.registry.host>http://${docker.registry.url}:2375</docker.registry.host>
+        <docker.namespace>ruoyi</docker.namespace>
+        <docker.plugin.version>1.2.2</docker.plugin.version>
+
+    </properties>
+
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+
+            <!-- SpringBoot的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- 阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-boot-starter</artifactId>
+                <version>${knife4j.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>swagger-annotations</artifactId>
+                        <groupId>io.swagger</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <dependency>
+                <groupId>io.swagger</groupId>
+                <artifactId>swagger-annotations</artifactId>
+                <version>${swagger-annotations.version}</version>
+            </dependency>
+
+            <!-- excel工具 -->
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.poi</groupId>
+                        <artifactId>poi</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.apache.poi</groupId>
+                        <artifactId>poi-ooxml-schemas</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <!-- 阿里JSON解析器 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!-- velocity代码生成使用模板 -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+
+            <!-- Token生成与解析-->
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+
+            <!-- jdk11 缺失依赖 jaxb-->
+            <dependency>
+                <groupId>com.sun.xml.bind</groupId>
+                <artifactId>jaxb-impl</artifactId>
+                <version>${jaxb.version}</version>
+            </dependency>
+
+            <!-- dynamic-datasource 多数据源-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+                <version>${dynamic-ds.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-extension</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <!-- sql性能分析插件 -->
+            <dependency>
+                <groupId>p6spy</groupId>
+                <artifactId>p6spy</artifactId>
+                <version>${p6spy.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
+            <!-- @deprecated 由于使用人数较少 决定与 3.4.0 版本移除 -->
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-starter-openfeign</artifactId>
+                <version>${feign.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>feign-core</artifactId>
+                        <groupId>io.github.openfeign</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <!-- @deprecated 由于使用人数较少 决定与 3.4.0 版本移除 -->
+            <dependency>
+                <groupId>io.github.openfeign</groupId>
+                <artifactId>feign-okhttp</artifactId>
+                <version>${feign-okhttp.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.squareup.okhttp3</groupId>
+                <artifactId>okhttp</artifactId>
+                <version>${okhttp.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>de.codecentric</groupId>
+                <artifactId>spring-boot-admin-starter-server</artifactId>
+                <version>${spring-boot-admin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>de.codecentric</groupId>
+                <artifactId>spring-boot-admin-starter-client</artifactId>
+                <version>${spring-boot-admin.version}</version>
+            </dependency>
+
+            <!--redisson-->
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson-spring-boot-starter</artifactId>
+                <version>${redisson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
+                <version>${lock4j.version}</version>
+            </dependency>
+
+            <!-- xxl-job-core -->
+            <dependency>
+                <groupId>com.xuxueli</groupId>
+                <artifactId>xxl-job-core</artifactId>
+                <version>${xxl-job.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-spring-boot-configuration</artifactId>
+                <version>${tlog.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-webroot</artifactId>
+                <version>${tlog.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>javassist</artifactId>
+                        <groupId>org.javassist</groupId>
+                    </exclusion>
+                    <exclusion>
+                        <artifactId>guava</artifactId>
+                        <groupId>com.google.guava</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-feign</artifactId>
+                <version>${tlog.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-xxl-job</artifactId>
+                <version>${tlog.version}</version>
+            </dependency>
+
+            <!-- 定时任务 @deprecated 3.4.0删除 迁移至xxl-job -->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-quartz</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- 定时任务 -->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-job</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- 代码生成-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-generator</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- 核心模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-framework</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- 系统模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-system</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- 通用工具-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-common</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- OSS对象存储模块 -->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-oss</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <!-- demo模块 -->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-demo</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-gas</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-mobile</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>ruoyi-admin</module>
+        <module>ruoyi-framework</module>
+        <module>ruoyi-system</module>
+        <module>ruoyi-quartz</module>
+        <module>ruoyi-job</module>
+        <module>ruoyi-generator</module>
+        <module>ruoyi-common</module>
+        <module>ruoyi-demo</module>
+        <module>ruoyi-extend</module>
+        <module>ruoyi-oss</module>
+        <module>ruoyi-gas</module>
+        <module>ruoyi-mobile</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <!--打包该目录下的 application.yml -->
+                <directory>src/main/resources</directory>
+                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <profiles>
+        <profile>
+            <id>local</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>local</profiles.active>
+                <logging.level>debug</logging.level>
+                <endpoints.include>'*'</endpoints.include>
+            </properties>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>dev</profiles.active>
+                <logging.level>debug</logging.level>
+                <endpoints.include>'*'</endpoints.include>
+            </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <profiles.active>prod</profiles.active>
+                <logging.level>warn</logging.level>
+                <endpoints.include>health, info, logfile</endpoints.include>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

+ 14 - 0
ruoyi-admin/Dockerfile

@@ -0,0 +1,14 @@
+FROM anapsix/alpine-java:8_server-jre_unlimited
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/server
+RUN mkdir -p /ruoyi/server/logs
+
+WORKDIR /ruoyi/server
+
+EXPOSE 8080
+
+ADD ./target/ruoyi-admin.jar ./app.jar
+
+ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]

BIN
ruoyi-admin/lib/mx-db-backup-1.0.0.jar


+ 141 - 0
ruoyi-admin/pom.xml

@@ -0,0 +1,141 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi-vue-plus</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.3.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+
+        <!-- spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <!-- 定时任务 @deprecated 3.4.0删除 迁移至xxl-job -->
+<!--        <dependency>-->
+<!--            <groupId>com.ruoyi</groupId>-->
+<!--            <artifactId>ruoyi-quartz</artifactId>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-job</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-oss</artifactId>
+        </dependency>
+
+        <!-- 代码生成-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-generator</artifactId>
+        </dependency>
+
+        <!--  demo模块  -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-demo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-gas</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-mobile</artifactId>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>com.mx-sky</groupId>-->
+<!--            <artifactId>mx-db-backup</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--            <scope>system</scope>-->
+<!--            <systemPath>${basedir}/lib/mx-db-backup-1.0.0.jar</systemPath>-->
+<!--        </dependency>-->
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.2.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>${docker.plugin.version}</version>
+                <configuration>
+                    <imageName>${docker.namespace}/ruoyi-server:${project.version}</imageName>
+                    <dockerDirectory>${project.basedir}</dockerDirectory>
+                    <dockerHost>${docker.registry.host}</dockerHost>
+                    <registryUrl>${docker.registry.url}</registryUrl>
+                    <serverId>${docker.registry.url}</serverId>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 8 - 0
ruoyi-admin/ruoyi-admin.iml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+</module>

+ 89 - 0
ruoyi-admin/src/main/docker/docker-compose.yml

@@ -0,0 +1,89 @@
+version: "3"
+
+services:
+  server:
+    build:
+      context: ./server
+      dockerfile: Dockerfile
+    container_name: sz-server
+    networks:
+      - sz
+    ports:
+      - "8080:8080"
+    depends_on:
+      - mysql
+      - redis
+      - nginx
+    volumes:
+      - /docker/server/temporary/:/temporary
+      - /docker/server/uploadPath/:/home/ruoyi/uploadPath
+
+  # 服务名
+  mysql:
+    container_name: mysql
+    image: mysql:5.7
+    ports:
+      - "3307:3306"
+    volumes:
+      - mysql_data:/var/lib/mysql
+      - mysql_config:/etc/mysql
+    env_file:
+      - ./mysql/mysql.env
+    networks:
+      - sz
+    command:
+      --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
+  redis:
+    container_name: redis
+    image:
+      redis:5.0.10
+    ports:
+      - "6379:6379"
+    volumes:
+      - redis_config:/usr/local/etc/redis/redis.conf
+      - redis_data:/data
+    networks:
+      - sz
+    command:
+      # 执行的命令
+      redis-server /usr/local/etc/redis/redis.conf --requirepass szrqwx123
+
+  nginx:
+    container_name: nginx
+    image:
+      nginx:1.18.0
+    restart: always
+    ports:
+      - "80:80"
+      - "443:443"
+    volumes:
+      - nginx_conf:/etc/nginx
+      - /docker/vue/dist:/usr/share/nginx/html
+      - ./nginx/cert:/cert
+    # - nginxlog:/var/log/nginx nginx
+    networks:
+      - sz
+# 自定义服务用到桥
+networks:
+  # 定义上面得服务用到的网桥名称  默认创建就是 bridge
+  sz:
+    # 使用外部指定网桥  注意:网桥必须存在
+    external:
+      true
+volumes:
+  mysql_data:
+    external:
+      true
+  mysql_config:
+    external:
+      true
+  redis_config:
+    external:
+      true
+  redis_data:
+    external:
+      true
+  nginx_conf:
+    external:
+      true
+

+ 1 - 0
ruoyi-admin/src/main/docker/mysql/mysql.env

@@ -0,0 +1 @@
+MYSQL_ROOT_PASSWORD=szrqwx123456

+ 27 - 0
ruoyi-admin/src/main/docker/nginx/cert/jy.cxcloudsci.com.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAwXQV9q+iE5Ex10fVyFV110E41Sr6bB6AZxJWSEHHnrG7Siqi
+ubGISdxlcS6Fp6QC38U7b9EDUJ2tuIrSiWS4PUGFk5uxJ5u5gIGfj8IxpK4WQbE7
+4h9k465Gu7aVTzarRUMUkWsYXITyDCZESZO5zAULHuiThfSzV/zqdop8Q+VdanED
+isphQR3oI7QR7nT2RDdyMBGv2+Kryog513YS2vdbIOVBK5qd0LpT97BLfrH1WMYu
+eZ7yCKdCMdx8KNlWXGvLEB2niMD/wStRH4gvWt7KjuqUV1sqpP3fZzMJ1p5HIsII
+Rdq+X09Wd+8rhktJbKRZ29Y9m+Q4z5rpV3W1eQIDAQABAoIBABbkkWrRavksz/yd
+bB+aeWkBN2QGg38C9wf7hAll+2T8vGCw/fPCnhG7iqejrT5i6tInSXrYfa9vEW1K
+xFJtAF6DX/bRUFwTEhcyf7rn7K8DyO96NU9zjqFg8M7q8u1eV1NJdmglB8t/EhO8
+/YzFdhG+MQw10qtiA00wyWBA0CbKi3XwLwQwW+SplNq8UguSanGJsP9xuzy7kY0m
+do9pYQ9Agy8xbuABynQ+3AIJ39al6ZC9lQpBFwVgRyWsqqjzY0TKEHLjKcb8sKga
+GP9euvNpgZeuMnjj9PhgrxTmyCszyxKOZ1jmqaE769K5StmzHa8kKur/HZwQNEkr
+SnJU0vkCgYEA8R6pwjJ1V62BX1Z3oZ3zeDb4zHpDgYRGbuh3Hb5IIPbNz7vvjQyQ
+TnI89Z+9Pcp0S6K3ms0li73W2FIJjK7jNkMeSzzo1JfhudFxakyccXHkJWs0xUNA
+f2zJQDr5NtlNEJmfYk6rcNJvtkUpCr6cgDGImKNw4Sj0TegSw3yEewUCgYEAzWRd
+et39MrzoBmgGdcO1O7ScjmbGUaV30dg/CNu8S+Kw5jpXbIsnvRsTSUmLgkYl7Ctd
+jsb+FgQQ+mN4Jm6ngfKa+s0QIRWYdulyNAQhJ/I9TmcSWBhlzTDsCWRxxZak/zOL
+Uo8Ga6Qo2p6Czdh4BzrADeT3Csd6m/OT2H65IuUCgYEA4BMG35nUwq5TVC4e7urC
+oC01+ZCFu48ZhWgzikiS709s5GharlHGqaAwVnMkgo/qk3+b8RhElCDP0CgtB7hf
+HsYxGOp51VdwRicFpyubFzIoOz3txIRDJCgMvswPXZGDtLGPFOTXHfnyJwkOoxWQ
+ivF9Z5w8AoL0xpGtHk5RL6ECgYEAngcyxW43eepOu18eWU2TC7UTH52DyR3+6r3v
+AenPHrP0V69bxG/sy1sho6mqZTmDxAo5mbkRle7bAUu3DhrlVt5Kz90nI81x2UwU
+SmFDAXEoKkKzooRjD1Usxq05vEUD/jayY3sX/Yn4xPxgt/BtqWJSkl4wlWKVu5fV
+kSUvXOECgYBSsSdNC1WdnKCsAGTyWh4SyFnOTuA7rtorMjFtis5AXyg3iR9QCq83
+V6o/89ifYRvSSP75KHv4VoA+MHs46TNjBV5lmxp3gnO5zUgaoFHSKBA52P6ST868
+H/Lj//0TL5U56Bfb0hnEjHbLfH4Esx6hAwKai3jxTm1hQoQLFBhseQ==
+-----END RSA PRIVATE KEY-----

+ 63 - 0
ruoyi-admin/src/main/docker/nginx/cert/jy.cxcloudsci.com.pem

@@ -0,0 +1,63 @@
+-----BEGIN CERTIFICATE-----
+MIIGDDCCBPSgAwIBAgIQD6z4s/bpoL1OB5TjzPsY3DANBgkqhkiG9w0BAQsFADBy
+MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
+SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
+dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMTEwODAwMDAwMFoXDTIyMTEwNzIzNTk1
+OVowHDEaMBgGA1UEAxMRankuY3hjbG91ZHNjaS5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDBdBX2r6ITkTHXR9XIVXXXQTjVKvpsHoBnElZIQcee
+sbtKKqK5sYhJ3GVxLoWnpALfxTtv0QNQna24itKJZLg9QYWTm7Enm7mAgZ+PwjGk
+rhZBsTviH2Tjrka7tpVPNqtFQxSRaxhchPIMJkRJk7nMBQse6JOF9LNX/Op2inxD
+5V1qcQOKymFBHegjtBHudPZEN3IwEa/b4qvKiDnXdhLa91sg5UErmp3QulP3sEt+
+sfVYxi55nvIIp0Ix3Hwo2VZca8sQHaeIwP/BK1EfiC9a3sqO6pRXWyqk/d9nMwnW
+nkciwghF2r5fT1Z37yuGS0lspFnb1j2b5DjPmulXdbV5AgMBAAGjggLyMIIC7jAf
+BgNVHSMEGDAWgBR/05nzoEcOMQBWViKOt8ye3coBijAdBgNVHQ4EFgQUL3ZA+NZw
+Lr3kCEmsPQNV/fePaZ0wHAYDVR0RBBUwE4IRankuY3hjbG91ZHNjaS5jb20wDgYD
+VR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjA+BgNV
+HSAENzA1MDMGBmeBDAECATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2lj
+ZXJ0LmNvbS9DUFMwgZIGCCsGAQUFBwEBBIGFMIGCMDQGCCsGAQUFBzABhihodHRw
+Oi8vc3RhdHVzZS5kaWdpdGFsY2VydHZhbGlkYXRpb24uY29tMEoGCCsGAQUFBzAC
+hj5odHRwOi8vY2FjZXJ0cy5kaWdpdGFsY2VydHZhbGlkYXRpb24uY29tL1RydXN0
+QXNpYVRMU1JTQUNBLmNydDAJBgNVHRMEAjAAMIIBfQYKKwYBBAHWeQIEAgSCAW0E
+ggFpAWcAdgApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXz/ALXq
+AAAEAwBHMEUCIQC+NwIpjeCH1AGPh0j30szQuSaySMGy1mbvhTsYpE6SAQIgdjMh
+vmm6/XSHWL5w4LFtGWp7qXpY+5wdKO4CsWUn6b8AdQBRo7D1/QF5nFZtuDd4jwyk
+eswbJ8v3nohCmg3+1IsF5QAAAXz/ALXLAAAEAwBGMEQCIFLAzPlBU4uo6LT0+jzJ
+fXLVcjDHRltS7vqI7uBx15mBAiBB+ZKhjoeG2VhyPwpmVcvVL7lSNoMYYqCyxue4
+lGTiYAB2AEHIyrHfIkZKEMahOglCh15OMYsbA+vrS8do8JBilgb2AAABfP8AtU0A
+AAQDAEcwRQIhALDKO+xzqPpcT6NwKCG0iw+2rpfZ9JSjNGcnQ4GMnn83AiBhrJNg
+bICzZ+XlOSk1sYdrH5fr60/m49rTVLrhBO5D5zANBgkqhkiG9w0BAQsFAAOCAQEA
+EYB8Ubl/FxGoxDNWiA4+CQFC4BEb6fYWD1Ri6szqicm1JfjyJapIBfUE5cKuEcdN
+Kc/F5RwGz7ooms5tW6w6sUB4TpCBwBVe5sY6BrW3gJhrnegEPxXcQi2m5dHieACl
+/ggg3SKuZ2IjU2Fr0LXIQPbnYFZbagrAO45IVqd//RXvFpzB81zrwlLpnv8UXnPm
+I5aCLMLlPevm5/y/EYFpplOim9+rMoehhoVm9+Ln9x3TDclK/l1r53iYLWYGLN+F
+q01EQSUsn388aGS4xs4ZQo6GOVsCjVAOnX2vdVwJjTlakmpVp3pP3zqGcKdzGKsA
+p//b8X98Zl3CWhjZEB1K/g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
+MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
+ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
+U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
+Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
+e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
+JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
+zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
+ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
+3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
+AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
+AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
+AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
+ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
+ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
+hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
+L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
+lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
+DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
+ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
+UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
+qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
+RmE=
+-----END CERTIFICATE-----

+ 36 - 0
ruoyi-admin/src/main/docker/nginx/default.conf

@@ -0,0 +1,36 @@
+server {
+    listen       80;
+    server_name jy.cxcloudsci.com;
+    rewrite ^(.*)$  https://$host$1 permanent;
+}
+
+server {
+    listen       443 ssl;
+    server_name  jy.cxcloudsci.com;
+
+    ssl_certificate /cert/jy.cxcloudsci.com.pem;
+    ssl_certificate_key /cert/jy.cxcloudsci.com.key;
+    ssl_session_timeout 5m;
+    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
+    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+    ssl_prefer_server_ciphers on;
+
+    location / {
+        root   /usr/share/nginx/html;
+        try_files $uri $uri/ /index.html;
+        index  index.html index.htm;
+    }
+
+    location /prod-api/{
+  			proxy_set_header Host $http_host;
+  			proxy_set_header X-Real-IP $remote_addr;
+  			proxy_set_header REMOTE-HOST $remote_addr;
+  			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+  			proxy_pass http://175.24.97.4:8080/;
+		}
+
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+}

+ 7 - 0
ruoyi-admin/src/main/docker/server/Dockerfile

@@ -0,0 +1,7 @@
+FROM openjdk:8-jdk
+ADD ruoyi-admin.jar ruoyi-admin.jar
+EXPOSE 8080
+# 设置环境编码UTF-8
+ENV LANG C.UTF-8
+ENTRYPOINT ["java","-jar"]
+CMD ["ruoyi-admin.jar"]

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -0,0 +1,22 @@
+package com.ruoyi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * 启动程序
+ *
+ * @author ruoyi
+ */
+@EnableAsync
+@SpringBootApplication
+public class RuoYiApplication {
+
+    public static void main(String[] args) {
+        System.setProperty("spring.devtools.restart.enabled", "false");
+        SpringApplication.run(RuoYiApplication.class, args);
+        System.out.println("(♥◠‿◠)ノ゙  RuoYi-Vue-Plus启动成功   ლ(´ڡ`ლ)゙");
+    }
+
+}

+ 18 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java

@@ -0,0 +1,18 @@
+package com.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author ruoyi
+ */
+public class RuoYiServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(RuoYiApplication.class);
+    }
+
+}

+ 87 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

@@ -0,0 +1,87 @@
+package com.ruoyi.web.controller.common;
+
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.IdUtil;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.CaptchaType;
+import com.ruoyi.common.utils.RedisUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import com.ruoyi.framework.config.properties.CaptchaProperties;
+import com.ruoyi.system.service.ISysConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 验证码操作处理
+ *
+ * @author Lion Li
+ */
+@Api(value = "验证码操作处理", tags = {"验证码管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+public class CaptchaController {
+
+    private final CaptchaProperties captchaProperties;
+    private final ISysConfigService configService;
+
+    /**
+     * 生成验证码
+     */
+    @ApiOperation("生成验证码")
+    @GetMapping("/captchaImage")
+    public AjaxResult<Map<String, Object>> getCode() {
+        Map<String, Object> ajax = new HashMap<>();
+        boolean captchaOnOff = configService.selectCaptchaOnOff();
+        ajax.put("captchaOnOff", captchaOnOff);
+        if (!captchaOnOff) {
+            return AjaxResult.success(ajax);
+        }
+        // 保存验证码信息
+        String uuid = IdUtil.simpleUUID();
+        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+        // 生成验证码
+        CaptchaType captchaType = captchaProperties.getType();
+        boolean isMath = CaptchaType.MATH == captchaType;
+        Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
+        CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
+        AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
+        captcha.setGenerator(codeGenerator);
+        captcha.createCode();
+        String code = isMath ? getCodeResult(captcha.getCode()) : captcha.getCode();
+        RedisUtils.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+        ajax.put("uuid", uuid);
+        ajax.put("img", captcha.getImageBase64());
+        return AjaxResult.success(ajax);
+    }
+
+    private String getCodeResult(String capStr) {
+        int numberLength = captchaProperties.getNumberLength();
+        int a = Convert.toInt(StringUtils.substring(capStr, 0, numberLength).trim());
+        char operator = capStr.charAt(numberLength);
+        int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
+        switch (operator) {
+            case '*':
+                return Convert.toStr(a * b);
+            case '+':
+                return Convert.toStr(a + b);
+            case '-':
+                return Convert.toStr(a - b);
+            default:
+                return StringUtils.EMPTY;
+        }
+    }
+
+}

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/ObsController.java

@@ -0,0 +1,51 @@
+package com.ruoyi.web.controller.common;
+
+import com.aliyuncs.http.HttpRequest;
+import com.aliyuncs.http.HttpResponse;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.obs.ObsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 华为obs
+ *
+ * @date 2021-11-24
+ */
+@Validated
+@Api(value = "华为obs", tags = {"华为obs"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/obs")
+public class ObsController extends BaseController {
+    private final ObsService obsService;
+
+    /**
+     * 上传文件
+     */
+    @ApiOperation("上传文件")
+    @PostMapping
+    public AjaxResult uploadFile(@RequestBody MultipartFile file) throws Exception {
+        return AjaxResult.success(obsService.uploadFile(file));
+    }
+
+    /**
+     * 删除文件
+     */
+    @ApiOperation("删除文件")
+    @DeleteMapping("/{objectKey}")
+    public AjaxResult deleteFile(@PathVariable String objectKey) throws Exception {
+        obsService.deleteFile(objectKey);
+        return AjaxResult.success();
+    }
+
+}

+ 122 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAboutUsController.java

@@ -0,0 +1,122 @@
+package com.ruoyi.web.controller.gas;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.vo.GAboutUsVo;
+import com.ruoyi.gas.domain.bo.GAboutUsBo;
+import com.ruoyi.gas.service.IGAboutUsService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 关于我们Controller
+ *
+ * @author ruoyi
+ * @date 2021-11-16
+ */
+@Validated
+@Api(value = "关于我们控制器", tags = {"关于我们管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/aboutUs")
+public class GAboutUsController extends BaseController {
+
+    private final IGAboutUsService iGAboutUsService;
+
+    /**
+     * 查询关于我们列表
+     */
+    @ApiOperation("查询关于我们列表")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GAboutUsVo> list(@Validated(QueryGroup.class) GAboutUsBo bo) {
+        return iGAboutUsService.queryPageList(bo);
+    }
+
+    /**
+     * 导出关于我们列表
+     */
+    @ApiOperation("导出关于我们列表")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:export')")
+    @Log(title = "关于我们", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GAboutUsBo bo, HttpServletResponse response) {
+        List<GAboutUsVo> list = iGAboutUsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "关于我们", GAboutUsVo.class, response);
+    }
+
+    /**
+     * 获取关于我们详细信息
+     */
+    @ApiOperation("获取关于我们详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GAboutUsVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGAboutUsService.queryById(id));
+    }
+
+    /**
+     * 新增关于我们
+     */
+    @ApiOperation("新增关于我们")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:add')")
+    @Log(title = "关于我们", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GAboutUsBo bo) {
+        return toAjax(iGAboutUsService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改关于我们
+     */
+    @ApiOperation("修改关于我们")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:edit')")
+    @Log(title = "关于我们", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GAboutUsBo bo) {
+        if (bo.getId()!=null){
+            return toAjax(iGAboutUsService.updateByBo(bo));
+        }else {
+            return toAjax(iGAboutUsService.insertByBo(bo));
+        }
+    }
+
+    /**
+     * 删除关于我们
+     */
+    @ApiOperation("删除关于我们")
+    @PreAuthorize("@ss.hasPermi('gas:aboutUs:remove')")
+    @Log(title = "关于我们" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGAboutUsService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+
+    @GetMapping(value = "/getOne")
+    public AjaxResult getOne() {
+        return AjaxResult.success(iGAboutUsService.getOne());
+    }
+}

+ 134 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GAreaController.java

@@ -0,0 +1,134 @@
+package com.ruoyi.web.controller.gas;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.obs.ObsService;
+import com.ruoyi.gas.domain.bo.GAreaBo;
+import com.ruoyi.gas.domain.vo.GAreaVo;
+import com.ruoyi.gas.service.IGAreaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 小区Controller
+ *
+ * @author JX.Li
+ * @date 2023-10-21
+ */
+@Validated
+@Api(value = "小区控制器", tags = {"小区管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/area")
+public class GAreaController extends BaseController {
+
+    private final IGAreaService iGAreaService;
+    private final ObsService obsService;
+    /**
+     * 小区下拉
+     * @return
+     */
+    @GetMapping("/getArea")
+    public AjaxResult getArea() {
+        return AjaxResult.success(iGAreaService.getArea());
+    }
+
+
+    @GetMapping("/releaseIs")
+    public AjaxResult releaseIs(Long id) {
+        iGAreaService.releaseIs(id);
+        // 小区下所有照片
+        List<String> list = iGAreaService.getPhoto(id);
+        obsService.deleteFiles(list);
+        iGAreaService.deleteDirectory(iGAreaService.getById(id).getName());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 查询小区列表
+     */
+    @ApiOperation("查询小区列表")
+    @PreAuthorize("@ss.hasPermi('gas:area:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GAreaVo> list(@Validated(QueryGroup.class) GAreaBo bo) {
+        return iGAreaService.queryPageList(bo);
+    }
+
+    /**
+     * 导出小区列表
+     */
+    @ApiOperation("导出小区列表")
+    @PreAuthorize("@ss.hasPermi('gas:area:export')")
+    @Log(title = "小区", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GAreaBo bo, HttpServletResponse response) {
+        List<GAreaVo> list = iGAreaService.queryList(bo);
+        ExcelUtil.exportExcel(list, "小区", GAreaVo.class, response);
+    }
+
+    /**
+     * 获取小区详细信息
+     */
+    @ApiOperation("获取小区详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:area:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GAreaVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGAreaService.queryById(id));
+    }
+
+    /**
+     * 新增小区
+     */
+    @ApiOperation("新增小区")
+    @PreAuthorize("@ss.hasPermi('gas:area:add')")
+    @Log(title = "小区", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GAreaBo bo) {
+        return toAjax(iGAreaService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改小区
+     */
+    @ApiOperation("修改小区")
+    @PreAuthorize("@ss.hasPermi('gas:area:edit')")
+    @Log(title = "小区", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GAreaBo bo) {
+        return toAjax(iGAreaService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除小区
+     */
+    @ApiOperation("删除小区")
+    @PreAuthorize("@ss.hasPermi('gas:area:remove')")
+    @Log(title = "小区" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGAreaService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 120 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GBuildingController.java

@@ -0,0 +1,120 @@
+package com.ruoyi.web.controller.gas;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.bo.GBuildingBo;
+import com.ruoyi.gas.domain.vo.GBuildingVo;
+import com.ruoyi.gas.service.IGBuildingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 楼宇管理Controller
+ *
+ * @author JX.Li
+ * @date 2023-10-21
+ */
+@Validated
+@Api(value = "楼宇管理控制器", tags = {"楼宇管理管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/building")
+public class GBuildingController extends BaseController {
+
+    private final IGBuildingService iGBuildingService;
+    /**
+     * 楼宇下拉
+     * @return
+     */
+    @GetMapping("/getBuilding")
+    public AjaxResult getBuilding(Long areaId) {
+        return AjaxResult.success(iGBuildingService.getBuilding(areaId));
+    }
+    /**
+     * 查询楼宇管理列表
+     */
+    @ApiOperation("查询楼宇管理列表")
+    @PreAuthorize("@ss.hasPermi('gas:building:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GBuildingVo> list(@Validated(QueryGroup.class) GBuildingBo bo) {
+        return iGBuildingService.queryPageList(bo);
+    }
+
+    /**
+     * 导出楼宇管理列表
+     */
+    @ApiOperation("导出楼宇管理列表")
+    @PreAuthorize("@ss.hasPermi('gas:building:export')")
+    @Log(title = "楼宇管理", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GBuildingBo bo, HttpServletResponse response) {
+        List<GBuildingVo> list = iGBuildingService.queryList(bo);
+        ExcelUtil.exportExcel(list, "楼宇管理", GBuildingVo.class, response);
+    }
+
+    /**
+     * 获取楼宇管理详细信息
+     */
+    @ApiOperation("获取楼宇管理详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:building:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GBuildingVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGBuildingService.queryById(id));
+    }
+
+    /**
+     * 新增楼宇管理
+     */
+    @ApiOperation("新增楼宇管理")
+    @PreAuthorize("@ss.hasPermi('gas:building:add')")
+    @Log(title = "楼宇管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GBuildingBo bo) {
+        return toAjax(iGBuildingService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改楼宇管理
+     */
+    @ApiOperation("修改楼宇管理")
+    @PreAuthorize("@ss.hasPermi('gas:building:edit')")
+    @Log(title = "楼宇管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GBuildingBo bo) {
+        return toAjax(iGBuildingService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除楼宇管理
+     */
+    @ApiOperation("删除楼宇管理")
+    @PreAuthorize("@ss.hasPermi('gas:building:remove')")
+    @Log(title = "楼宇管理" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGBuildingService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 113 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GEmergencyRepairController.java

@@ -0,0 +1,113 @@
+package com.ruoyi.web.controller.gas;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.bo.GEmergencyRepairBo;
+import com.ruoyi.gas.domain.vo.GEmergencyRepairVo;
+import com.ruoyi.gas.service.IGEmergencyRepairService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 抢险维修Controller
+ *
+ * @author JX.Li
+ * @date 2023-10-23
+ */
+@Validated
+@Api(value = "抢险维修控制器", tags = {"抢险维修管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/emergencyRepair")
+public class GEmergencyRepairController extends BaseController {
+
+    private final IGEmergencyRepairService iGEmergencyRepairService;
+
+    /**
+     * 查询抢险维修列表
+     */
+    @ApiOperation("查询抢险维修列表")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GEmergencyRepairVo> list(@Validated(QueryGroup.class) GEmergencyRepairBo bo) {
+        return iGEmergencyRepairService.queryPageList(bo);
+    }
+
+    /**
+     * 导出抢险维修列表
+     */
+    @ApiOperation("导出抢险维修列表")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:export')")
+    @Log(title = "抢险维修", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GEmergencyRepairBo bo, HttpServletResponse response) {
+        List<GEmergencyRepairVo> list = iGEmergencyRepairService.queryList(bo);
+        ExcelUtil.exportExcel(list, "抢险维修", GEmergencyRepairVo.class, response);
+    }
+
+    /**
+     * 获取抢险维修详细信息
+     */
+    @ApiOperation("获取抢险维修详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GEmergencyRepairVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGEmergencyRepairService.queryById(id));
+    }
+
+    /**
+     * 新增抢险维修
+     */
+    @ApiOperation("新增抢险维修")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:add')")
+    @Log(title = "抢险维修", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GEmergencyRepairBo bo) {
+        return toAjax(iGEmergencyRepairService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改抢险维修
+     */
+    @ApiOperation("修改抢险维修")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:edit')")
+    @Log(title = "抢险维修", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GEmergencyRepairBo bo) {
+        return toAjax(iGEmergencyRepairService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除抢险维修
+     */
+    @ApiOperation("删除抢险维修")
+    @PreAuthorize("@ss.hasPermi('gas:emergencyRepair:remove')")
+    @Log(title = "抢险维修" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGEmergencyRepairService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 122 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GExplainController.java

@@ -0,0 +1,122 @@
+package com.ruoyi.web.controller.gas;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.vo.GExplainVo;
+import com.ruoyi.gas.domain.bo.GExplainBo;
+import com.ruoyi.gas.service.IGExplainService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 服务说明Controller
+ *
+ * @author ruoyi
+ * @date 2021-11-16
+ */
+@Validated
+@Api(value = "服务说明控制器", tags = {"服务说明管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/explain")
+public class GExplainController extends BaseController {
+
+    private final IGExplainService iGExplainService;
+
+    /**
+     * 查询服务说明列表
+     */
+    @ApiOperation("查询服务说明列表")
+    @PreAuthorize("@ss.hasPermi('gas:explain:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GExplainVo> list(@Validated(QueryGroup.class) GExplainBo bo) {
+        return iGExplainService.queryPageList(bo);
+    }
+
+    /**
+     * 导出服务说明列表
+     */
+    @ApiOperation("导出服务说明列表")
+    @PreAuthorize("@ss.hasPermi('gas:explain:export')")
+    @Log(title = "服务说明", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GExplainBo bo, HttpServletResponse response) {
+        List<GExplainVo> list = iGExplainService.queryList(bo);
+        ExcelUtil.exportExcel(list, "服务说明", GExplainVo.class, response);
+    }
+
+    /**
+     * 获取服务说明详细信息
+     */
+    @ApiOperation("获取服务说明详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:explain:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GExplainVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGExplainService.queryById(id));
+    }
+
+    /**
+     * 新增服务说明
+     */
+    @ApiOperation("新增服务说明")
+    @PreAuthorize("@ss.hasPermi('gas:explain:add')")
+    @Log(title = "服务说明", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GExplainBo bo) {
+        return toAjax(iGExplainService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改服务说明
+     */
+    @ApiOperation("修改服务说明")
+    @PreAuthorize("@ss.hasPermi('gas:explain:edit')")
+    @Log(title = "服务说明", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GExplainBo bo) {
+        if (bo.getId()!=null){
+            return toAjax(iGExplainService.updateByBo(bo));
+        }else {
+            return toAjax(iGExplainService.insertByBo(bo));
+        }
+    }
+
+    /**
+     * 删除服务说明
+     */
+    @ApiOperation("删除服务说明")
+    @PreAuthorize("@ss.hasPermi('gas:explain:remove')")
+    @Log(title = "服务说明" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGExplainService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+
+    @GetMapping(value = "/getOne")
+    public AjaxResult getOne() {
+        return AjaxResult.success(iGExplainService.getOne());
+    }
+}

+ 113 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GNoticeController.java

@@ -0,0 +1,113 @@
+package com.ruoyi.web.controller.gas;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.vo.GNoticeVo;
+import com.ruoyi.gas.domain.bo.GNoticeBo;
+import com.ruoyi.gas.service.IGNoticeService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 公告管理Controller
+ *
+ * @author ruoyi
+ * @date 2021-11-16
+ */
+@Validated
+@Api(value = "公告管理控制器", tags = {"公告管理管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/notice")
+public class GNoticeController extends BaseController {
+
+    private final IGNoticeService iGNoticeService;
+
+    /**
+     * 查询公告管理列表
+     */
+    @ApiOperation("查询公告管理列表")
+    @PreAuthorize("@ss.hasPermi('gas:notice:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GNoticeVo> list(@Validated(QueryGroup.class) GNoticeBo bo) {
+        return iGNoticeService.queryPageList(bo);
+    }
+
+    /**
+     * 导出公告管理列表
+     */
+    @ApiOperation("导出公告管理列表")
+    @PreAuthorize("@ss.hasPermi('gas:notice:export')")
+    @Log(title = "公告管理", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GNoticeBo bo, HttpServletResponse response) {
+        List<GNoticeVo> list = iGNoticeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "公告管理", GNoticeVo.class, response);
+    }
+
+    /**
+     * 获取公告管理详细信息
+     */
+    @ApiOperation("获取公告管理详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:notice:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GNoticeVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGNoticeService.queryById(id));
+    }
+
+    /**
+     * 新增公告管理
+     */
+    @ApiOperation("新增公告管理")
+    @PreAuthorize("@ss.hasPermi('gas:notice:add')")
+    @Log(title = "公告管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GNoticeBo bo) {
+        return toAjax(iGNoticeService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改公告管理
+     */
+    @ApiOperation("修改公告管理")
+    @PreAuthorize("@ss.hasPermi('gas:notice:edit')")
+    @Log(title = "公告管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GNoticeBo bo) {
+        return toAjax(iGNoticeService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除公告管理
+     */
+    @ApiOperation("删除公告管理")
+    @PreAuthorize("@ss.hasPermi('gas:notice:remove')")
+    @Log(title = "公告管理" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGNoticeService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 113 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GRotationController.java

@@ -0,0 +1,113 @@
+package com.ruoyi.web.controller.gas;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.vo.GRotationVo;
+import com.ruoyi.gas.domain.bo.GRotationBo;
+import com.ruoyi.gas.service.IGRotationService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 首页轮播图Controller
+ *
+ * @author ruoyi
+ * @date 2021-11-16
+ */
+@Validated
+@Api(value = "首页轮播图控制器", tags = {"首页轮播图管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/rotation")
+public class GRotationController extends BaseController {
+
+    private final IGRotationService iGRotationService;
+
+    /**
+     * 查询首页轮播图列表
+     */
+    @ApiOperation("查询首页轮播图列表")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GRotationVo> list(@Validated(QueryGroup.class) GRotationBo bo) {
+        return iGRotationService.queryPageList(bo);
+    }
+
+    /**
+     * 导出首页轮播图列表
+     */
+    @ApiOperation("导出首页轮播图列表")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:export')")
+    @Log(title = "首页轮播图", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GRotationBo bo, HttpServletResponse response) {
+        List<GRotationVo> list = iGRotationService.queryList(bo);
+        ExcelUtil.exportExcel(list, "首页轮播图", GRotationVo.class, response);
+    }
+
+    /**
+     * 获取首页轮播图详细信息
+     */
+    @ApiOperation("获取首页轮播图详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GRotationVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGRotationService.queryById(id));
+    }
+
+    /**
+     * 新增首页轮播图
+     */
+    @ApiOperation("新增首页轮播图")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:add')")
+    @Log(title = "首页轮播图", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GRotationBo bo) {
+        return toAjax(iGRotationService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改首页轮播图
+     */
+    @ApiOperation("修改首页轮播图")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:edit')")
+    @Log(title = "首页轮播图", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GRotationBo bo) {
+        return toAjax(iGRotationService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除首页轮播图
+     */
+    @ApiOperation("删除首页轮播图")
+    @PreAuthorize("@ss.hasPermi('gas:rotation:remove')")
+    @Log(title = "首页轮播图" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGRotationService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 121 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUnitController.java

@@ -0,0 +1,121 @@
+package com.ruoyi.web.controller.gas;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.bo.GUnitBo;
+import com.ruoyi.gas.domain.vo.GUnitVo;
+import com.ruoyi.gas.service.IGUnitService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 单元Controller
+ *
+ * @author JX.Li
+ * @date 2023-10-21
+ */
+@Validated
+@Api(value = "单元控制器", tags = {"单元管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/unit")
+public class GUnitController extends BaseController {
+
+    private final IGUnitService iGUnitService;
+
+    /**
+     * 查询单元列表
+     */
+    @ApiOperation("查询单元列表")
+    @PreAuthorize("@ss.hasPermi('gas:unit:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GUnitVo> list(@Validated(QueryGroup.class) GUnitBo bo) {
+        return iGUnitService.getList(bo);
+    }
+
+    /**
+     * 导出单元列表
+     */
+    @ApiOperation("导出单元列表")
+    @PreAuthorize("@ss.hasPermi('gas:unit:export')")
+    @Log(title = "单元", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GUnitBo bo, HttpServletResponse response) {
+        List<GUnitVo> list = iGUnitService.queryList(bo);
+        ExcelUtil.exportExcel(list, "单元", GUnitVo.class, response);
+    }
+
+    /**
+     * 获取单元详细信息
+     */
+    @ApiOperation("获取单元详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:unit:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GUnitVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGUnitService.queryById(id));
+    }
+
+    /**
+     * 楼宇下拉
+     * @return
+     */
+    @GetMapping("/getUnit")
+    public AjaxResult getUnit(Long buildingId) {
+        return AjaxResult.success(iGUnitService.getUnit(buildingId));
+    }
+    /**
+     * 新增单元
+     */
+    @ApiOperation("新增单元")
+    @PreAuthorize("@ss.hasPermi('gas:unit:add')")
+    @Log(title = "单元", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GUnitBo bo) {
+        return toAjax(iGUnitService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改单元
+     */
+    @ApiOperation("修改单元")
+    @PreAuthorize("@ss.hasPermi('gas:unit:edit')")
+    @Log(title = "单元", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GUnitBo bo) {
+        return toAjax(iGUnitService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除单元
+     */
+    @ApiOperation("删除单元")
+    @PreAuthorize("@ss.hasPermi('gas:unit:remove')")
+    @Log(title = "单元" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGUnitService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 186 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GUserController.java

@@ -0,0 +1,186 @@
+package com.ruoyi.web.controller.gas;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.gas.domain.vo.GUserForemanVo;
+import com.ruoyi.system.aspect.annotation.DataDictClass;
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.gas.domain.vo.GUserVo;
+import com.ruoyi.gas.domain.bo.GUserBo;
+import com.ruoyi.gas.service.IGUserService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 用户Controller
+ *
+ * @author ruoyi
+ * @date 2021-11-12
+ */
+@Validated
+@Api(value = "用户控制器", tags = {"用户管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/gas/user")
+public class GUserController extends BaseController {
+
+    private final IGUserService iGUserService;
+
+    /**
+     * 查询用户列表
+     */
+    @ApiOperation("查询用户列表")
+    @PreAuthorize("@ss.hasPermi('gas:user:list')")
+    @GetMapping("/list")
+    public TableDataInfo<GUserVo> list(@Validated(QueryGroup.class) GUserBo bo) {
+        return iGUserService.queryPageList(bo);
+    }
+
+    /**
+     * 导出用户列表
+     */
+    @ApiOperation("导出用户列表")
+    @PreAuthorize("@ss.hasPermi('gas:user:export')")
+    @Log(title = "用户", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated GUserBo bo, HttpServletResponse response) {
+        List<GUserVo> list = iGUserService.queryList(bo);
+        ExcelUtil.exportExcel(list, "用户", GUserVo.class, response);
+    }
+
+    /**
+     * 获取用户详细信息
+     */
+    @ApiOperation("获取用户详细信息")
+    @PreAuthorize("@ss.hasPermi('gas:user:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<GUserVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iGUserService.queryById(id));
+    }
+
+    /**
+     * 新增用户
+     */
+    @ApiOperation("新增用户")
+    @PreAuthorize("@ss.hasPermi('gas:user:add')")
+    @Log(title = "用户", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody GUserBo bo) {
+        return toAjax(iGUserService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改用户
+     */
+    @ApiOperation("修改用户")
+    @PreAuthorize("@ss.hasPermi('gas:user:edit')")
+    @Log(title = "用户", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody GUserBo bo) {
+        return toAjax(iGUserService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除用户
+     */
+    @ApiOperation("删除用户")
+    @PreAuthorize("@ss.hasPermi('gas:user:remove')")
+    @Log(title = "用户" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iGUserService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+
+    /**
+     * 列表查询
+     * @param bo
+     * @return
+     */
+    @GetMapping("/getList")
+    public TableDataInfo<GUserVo> getList(@Validated(QueryGroup.class) GUserBo bo) {
+        return iGUserService.getList(bo);
+    }
+
+    /**
+     * 工人下拉
+     * @return
+     */
+    @GetMapping("/getWorker")
+    public AjaxResult getWorker() {
+        return AjaxResult.success(iGUserService.getWorker());
+    }
+
+    /**
+     * 黑名单列表
+     * @param bo
+     * @return
+     */
+    @GetMapping("/getBlacklist")
+    public TableDataInfo<GUserVo> getBlacklist(@Validated(QueryGroup.class) GUserBo bo) {
+        return iGUserService.getBlacklist(bo);
+    }
+
+    /**
+     * 合格/不合格统计-工长
+     * @param id
+     * @return
+     */
+    @GetMapping("/getExamineForeman")
+    public AjaxResult getExamineForeman(Long foremanId) {
+        return AjaxResult.success(iGUserService.getExamineForeman(foremanId));
+    }
+
+    /**
+     * 合格/不合格统计-工人
+     * @param id
+     * @return
+     */
+    @GetMapping("/getExamineWorker")
+    public AjaxResult getExamineWorker(Long workerId) {
+        return AjaxResult.success(iGUserService.getExamineWorker(workerId));
+    }
+
+    /**
+     * 手机号唯一校验
+     * @param phone
+     * @return
+     */
+    @GetMapping("/getForPhone")
+    public AjaxResult getForPhone(Long phone,String id) {
+        return AjaxResult.success(iGUserService.getForPhone(phone,id));
+    }
+
+    /**
+     *工号唯一校验
+     * @param jobNum
+     * @return
+     */
+    @GetMapping("/getForJobnum")
+    public AjaxResult getForJobnum(String jobNum,String id) {
+        return AjaxResult.success(iGUserService.getForJobnum(jobNum,id));
+    }
+}

+ 57 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

@@ -0,0 +1,57 @@
+package com.ruoyi.web.controller.monitor;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 缓存监控
+ *
+ * @author Lion Li
+ */
+@Api(value = "缓存监控", tags = {"缓存监控管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/monitor/cache")
+public class CacheController {
+
+    private final RedisTemplate<String, String> redisTemplate;
+
+    @ApiOperation("获取缓存监控详细信息")
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping()
+    public AjaxResult<Map<String, Object>> getInfo() throws Exception {
+        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::info);
+        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
+        Object dbSize = redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::dbSize);
+
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("info", info);
+        result.put("dbSize", dbSize);
+
+        List<Map<String, String>> pieList = new ArrayList<>();
+        if (commandStats != null) {
+            commandStats.stringPropertyNames().forEach(key -> {
+                Map<String, String> data = new HashMap<>(2);
+                String property = commandStats.getProperty(key);
+                data.put("name", StringUtils.removeStart(key, "cmdstat_"));
+                data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
+                pieList.add(data);
+            });
+        }
+        result.put("commandStats", pieList);
+        return AjaxResult.success(result);
+    }
+}

+ 68 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java

@@ -0,0 +1,68 @@
+package com.ruoyi.web.controller.monitor;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysLogininfor;
+import com.ruoyi.system.service.ISysLogininforService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 系统访问记录
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "系统访问记录", tags = {"系统访问记录管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/monitor/logininfor")
+public class SysLogininforController extends BaseController {
+
+    private final ISysLogininforService logininforService;
+
+    @ApiOperation("查询系统访问记录列表")
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysLogininfor> list(SysLogininfor logininfor) {
+        return logininforService.selectPageLogininforList(logininfor);
+    }
+
+    @ApiOperation("导出系统访问记录列表")
+    @Log(title = "登录日志", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
+    @GetMapping("/export")
+    public void export(SysLogininfor logininfor, HttpServletResponse response) {
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        ExcelUtil.exportExcel(list, "登录日志", SysLogininfor.class, response);
+    }
+
+    @ApiOperation("删除系统访问记录")
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "登录日志", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{infoIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] infoIds) {
+        return toAjax(logininforService.deleteLogininforByIds(infoIds));
+    }
+
+    @ApiOperation("清空系统访问记录")
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "登录日志", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clean")
+    public AjaxResult<Void> clean() {
+        logininforService.cleanLogininfor();
+        return AjaxResult.success();
+    }
+}

+ 68 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java

@@ -0,0 +1,68 @@
+package com.ruoyi.web.controller.monitor;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysOperLog;
+import com.ruoyi.system.service.ISysOperLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 操作日志记录
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "操作日志记录", tags = {"操作日志记录管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/monitor/operlog")
+public class SysOperlogController extends BaseController {
+
+    private final ISysOperLogService operLogService;
+
+    @ApiOperation("查询操作日志记录列表")
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysOperLog> list(SysOperLog operLog) {
+        return operLogService.selectPageOperLogList(operLog);
+    }
+
+    @ApiOperation("导出操作日志记录列表")
+    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
+    @GetMapping("/export")
+    public void export(SysOperLog operLog, HttpServletResponse response) {
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil.exportExcel(list, "操作日志", SysOperLog.class, response);
+    }
+
+    @ApiOperation("删除操作日志记录")
+    @Log(title = "操作日志", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/{operIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] operIds) {
+        return toAjax(operLogService.deleteOperLogByIds(operIds));
+    }
+
+    @ApiOperation("清空操作日志记录")
+    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/clean")
+    public AjaxResult<Void> clean() {
+        operLogService.cleanOperLog();
+        return AjaxResult.success();
+    }
+}

+ 80 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java

@@ -0,0 +1,80 @@
+package com.ruoyi.web.controller.monitor;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.utils.RedisUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysUserOnline;
+import com.ruoyi.system.service.ISysUserOnlineService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 在线用户监控
+ *
+ * @author Lion Li
+ */
+@Api(value = "在线用户监控", tags = {"在线用户监控管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/monitor/online")
+public class SysUserOnlineController extends BaseController {
+
+    private final ISysUserOnlineService userOnlineService;
+
+    @ApiOperation("在线用户列表")
+    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysUserOnline> list(String ipaddr, String userName) {
+        Collection<String> keys = RedisUtils.keys(Constants.LOGIN_TOKEN_KEY + "*");
+        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
+        for (String key : keys) {
+            LoginUser user = RedisUtils.getCacheObject(key);
+            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) {
+                if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
+                    userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
+                }
+            } else if (StringUtils.isNotEmpty(ipaddr)) {
+                if (StringUtils.equals(ipaddr, user.getIpaddr())) {
+                    userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
+                }
+            } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) {
+                if (StringUtils.equals(userName, user.getUsername())) {
+                    userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
+                }
+            } else {
+                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
+            }
+        }
+        Collections.reverse(userOnlineList);
+        userOnlineList.removeAll(Collections.singleton(null));
+        return PageUtils.buildDataInfo(userOnlineList);
+    }
+
+    /**
+     * 强退用户
+     */
+    @ApiOperation("强退用户")
+    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
+    @Log(title = "在线用户", businessType = BusinessType.FORCE)
+    @DeleteMapping("/{tokenId}")
+    public AjaxResult<Void> forceLogout(@PathVariable String tokenId) {
+        RedisUtils.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId);
+        return AjaxResult.success();
+    }
+}

+ 128 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java

@@ -0,0 +1,128 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.service.ISysConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 参数配置 信息操作处理
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "参数配置控制器", tags = {"参数配置管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/config")
+public class SysConfigController extends BaseController {
+
+    private final ISysConfigService configService;
+
+    /**
+     * 获取参数配置列表
+     */
+    @ApiOperation("获取参数配置列表")
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysConfig> list(SysConfig config) {
+        return configService.selectPageConfigList(config);
+    }
+
+    @ApiOperation("导出参数配置列表")
+    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @GetMapping("/export")
+    public void export(SysConfig config, HttpServletResponse response) {
+        List<SysConfig> list = configService.selectConfigList(config);
+        ExcelUtil.exportExcel(list, "参数数据", SysConfig.class, response);
+    }
+
+    /**
+     * 根据参数编号获取详细信息
+     */
+    @ApiOperation("根据参数编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
+    @GetMapping(value = "/{configId}")
+    public AjaxResult<SysConfig> getInfo(@PathVariable Long configId) {
+        return AjaxResult.success(configService.selectConfigById(configId));
+    }
+
+    /**
+     * 根据参数键名查询参数值
+     */
+    @ApiOperation("根据参数键名查询参数值")
+    @GetMapping(value = "/configKey/{configKey}")
+    public AjaxResult<Void> getConfigKey(@PathVariable String configKey) {
+        return AjaxResult.success(configService.selectConfigByKey(configKey));
+    }
+
+    /**
+     * 新增参数配置
+     */
+    @ApiOperation("新增参数配置")
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "参数管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    @RepeatSubmit
+    public AjaxResult<Void> add(@Validated @RequestBody SysConfig config) {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
+            return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        return toAjax(configService.insertConfig(config));
+    }
+
+    /**
+     * 修改参数配置
+     */
+    @ApiOperation("修改参数配置")
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysConfig config) {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
+            return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        return toAjax(configService.updateConfig(config));
+    }
+
+    /**
+     * 删除参数配置
+     */
+    @ApiOperation("删除参数配置")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] configIds) {
+        configService.deleteConfigByIds(configIds);
+        return success();
+    }
+
+    /**
+     * 刷新参数缓存
+     */
+    @ApiOperation("刷新参数缓存")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public AjaxResult<Void> refreshCache() {
+        configService.resetConfigCache();
+        return AjaxResult.success();
+    }
+}

+ 146 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java

@@ -0,0 +1,146 @@
+package com.ruoyi.web.controller.system;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysDeptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "部门控制器", tags = {"部门管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dept")
+public class SysDeptController extends BaseController {
+
+    private final ISysDeptService deptService;
+
+    /**
+     * 获取部门列表
+     */
+    @ApiOperation("获取部门列表")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list")
+    public AjaxResult<List<SysDept>> list(SysDept dept) {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 查询部门列表(排除节点)
+     */
+    @ApiOperation("查询部门列表(排除节点)")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list/exclude/{deptId}")
+    public AjaxResult<List<SysDept>> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        depts.removeIf(d -> d.getDeptId().equals(deptId)
+                || ArrayUtil.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 根据部门编号获取详细信息
+     */
+    @ApiOperation("根据部门编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
+    @GetMapping(value = "/{deptId}")
+    public AjaxResult<SysDept> getInfo(@PathVariable Long deptId) {
+        deptService.checkDeptDataScope(deptId);
+        return AjaxResult.success(deptService.selectDeptById(deptId));
+    }
+
+    /**
+     * 获取部门下拉树列表
+     */
+    @ApiOperation("获取部门下拉树列表")
+    @GetMapping("/treeselect")
+    public AjaxResult<List<TreeSelect>> treeselect(SysDept dept) {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
+    }
+
+    /**
+     * 加载对应角色部门列表树
+     */
+    @ApiOperation("加载对应角色部门列表树")
+    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
+    public AjaxResult<Map<String, Object>> roleDeptTreeselect(@PathVariable("roleId") Long roleId) {
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        Map<String, Object> ajax = new HashMap<>();
+        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
+        ajax.put("depts", deptService.buildDeptTreeSelect(depts));
+        return AjaxResult.success(ajax);
+    }
+
+    /**
+     * 新增部门
+     */
+    @ApiOperation("新增部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @Log(title = "部门管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysDept dept) {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
+            return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        return toAjax(deptService.insertDept(dept));
+    }
+
+    /**
+     * 修改部门
+     */
+    @ApiOperation("修改部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
+    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysDept dept) {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        } else if (dept.getParentId().equals(dept.getDeptId())) {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
+        } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
+                && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) {
+            return AjaxResult.error("该部门包含未停用的子部门!");
+        }
+        return toAjax(deptService.updateDept(dept));
+    }
+
+    /**
+     * 删除部门
+     */
+    @ApiOperation("删除部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
+    @Log(title = "部门管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{deptId}")
+    public AjaxResult<Void> remove(@PathVariable Long deptId) {
+        if (deptService.hasChildByDeptId(deptId)) {
+            return AjaxResult.error("存在下级部门,不允许删除");
+        }
+        if (deptService.checkDeptExistUser(deptId)) {
+            return AjaxResult.error("部门存在用户,不允许删除");
+        }
+        return toAjax(deptService.deleteDeptById(deptId));
+    }
+}

+ 112 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java

@@ -0,0 +1,112 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.system.service.ISysDictTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "数据字典信息控制器", tags = {"数据字典信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dict/data")
+public class SysDictDataController extends BaseController {
+
+    private final ISysDictDataService dictDataService;
+    private final ISysDictTypeService dictTypeService;
+
+    @ApiOperation("查询字典数据列表")
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysDictData> list(SysDictData dictData) {
+        return dictDataService.selectPageDictDataList(dictData);
+    }
+
+    @ApiOperation("导出字典数据列表")
+    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @GetMapping("/export")
+    public void export(SysDictData dictData, HttpServletResponse response) {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        ExcelUtil.exportExcel(list, "字典数据", SysDictData.class, response);
+    }
+
+    /**
+     * 查询字典数据详细
+     */
+    @ApiOperation("查询字典数据详细")
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictCode}")
+    public AjaxResult<SysDictData> getInfo(@PathVariable Long dictCode) {
+        return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 根据字典类型查询字典数据信息
+     */
+    @ApiOperation("根据字典类型查询字典数据信息")
+    @GetMapping(value = "/type/{dictType}")
+    public AjaxResult<List<SysDictData>> dictType(@PathVariable String dictType) {
+        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
+        if (StringUtils.isNull(data)) {
+            data = new ArrayList<>();
+        }
+        return AjaxResult.success(data);
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @ApiOperation("新增字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "字典数据", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysDictData dict) {
+        return toAjax(dictDataService.insertDictData(dict));
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+    @ApiOperation("修改保存字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysDictData dict) {
+        return toAjax(dictDataService.updateDictData(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @ApiOperation("删除字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictCodes}")
+    public AjaxResult<Void> remove(@PathVariable Long[] dictCodes) {
+        dictDataService.deleteDictDataByIds(dictCodes);
+        return success();
+    }
+}

+ 124 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java

@@ -0,0 +1,124 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDictType;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.service.ISysDictTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "数据字典信息控制器", tags = {"数据字典信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dict/type")
+public class SysDictTypeController extends BaseController {
+
+    private final ISysDictTypeService dictTypeService;
+
+    @ApiOperation("查询字典类型列表")
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysDictType> list(SysDictType dictType) {
+        return dictTypeService.selectPageDictTypeList(dictType);
+    }
+
+    @ApiOperation("导出字典类型列表")
+    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @GetMapping("/export")
+    public void export(SysDictType dictType, HttpServletResponse response) {
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        ExcelUtil.exportExcel(list, "字典类型", SysDictType.class, response);
+    }
+
+    /**
+     * 查询字典类型详细
+     */
+    @ApiOperation("查询字典类型详细")
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictId}")
+    public AjaxResult<SysDictType> getInfo(@PathVariable Long dictId) {
+        return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @ApiOperation("新增字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "字典类型", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysDictType dict) {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
+            return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        return toAjax(dictTypeService.insertDictType(dict));
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @ApiOperation("修改字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysDictType dict) {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
+            return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        return toAjax(dictTypeService.updateDictType(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @ApiOperation("删除字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] dictIds) {
+        dictTypeService.deleteDictTypeByIds(dictIds);
+        return success();
+    }
+
+    /**
+     * 刷新字典缓存
+     */
+    @ApiOperation("刷新字典缓存")
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public AjaxResult<Void> refreshCache() {
+        dictTypeService.resetDictCache();
+        return AjaxResult.success();
+    }
+
+    /**
+     * 获取字典选择框列表
+     */
+    @ApiOperation("获取字典选择框列表")
+    @GetMapping("/optionselect")
+    public AjaxResult<List<SysDictType>> optionselect() {
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
+        return AjaxResult.success(dictTypes);
+    }
+}

+ 35 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java

@@ -0,0 +1,35 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 首页
+ *
+ * @author Lion Li
+ */
+@Api(value = "首页控制器", tags = {"首页管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+public class SysIndexController {
+
+    /**
+     * 系统基础配置
+     */
+    private final RuoYiConfig ruoyiConfig;
+
+    /**
+     * 访问首页,提示语
+     */
+    @ApiOperation("访问首页,提示语")
+    @GetMapping("/")
+    public String index() {
+        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
+    }
+}

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -0,0 +1,92 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysMenu;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.domain.vo.RouterVo;
+import com.ruoyi.system.service.ISysMenuService;
+import com.ruoyi.system.service.SysLoginService;
+import com.ruoyi.system.service.SysPermissionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 登录验证
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "数据字典信息控制器", tags = {"数据字典信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+public class SysLoginController {
+
+    private final SysLoginService loginService;
+    private final ISysMenuService menuService;
+    private final SysPermissionService permissionService;
+
+    /**
+     * 登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @ApiOperation("登录方法")
+    @PostMapping("/login")
+    public AjaxResult<Map<String, Object>> login(@RequestBody LoginBody loginBody) {
+        Map<String, Object> ajax = new HashMap<>();
+        // 生成令牌
+        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+                loginBody.getUuid());
+        ajax.put(Constants.TOKEN, token);
+        return AjaxResult.success(ajax);
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @return 用户信息
+     */
+    @ApiOperation("获取用户信息")
+    @GetMapping("getInfo")
+    public AjaxResult<Map<String, Object>> getInfo() {
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        // 角色集合
+        Set<String> roles = permissionService.getRolePermission(user);
+        // 权限集合
+        Set<String> permissions = permissionService.getMenuPermission(user);
+        Map<String, Object> ajax = new HashMap<>();
+        ajax.put("user", user);
+        ajax.put("roles", roles);
+        ajax.put("permissions", permissions);
+        return AjaxResult.success(ajax);
+    }
+
+    /**
+     * 获取路由信息
+     *
+     * @return 路由信息
+     */
+    @ApiOperation("获取路由信息")
+    @GetMapping("getRouters")
+    public AjaxResult<List<RouterVo>> getRouters() {
+        Long userId = SecurityUtils.getUserId();
+        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
+        return AjaxResult.success(menuService.buildMenus(menus));
+    }
+}

+ 132 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java

@@ -0,0 +1,132 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.SysMenu;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysMenuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "菜单信息控制器", tags = {"菜单信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/menu")
+public class SysMenuController extends BaseController {
+
+    private final ISysMenuService menuService;
+
+    /**
+     * 获取菜单列表
+     */
+    @ApiOperation("获取菜单列表")
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list")
+    public AjaxResult<List<SysMenu>> list(SysMenu menu) {
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
+        return AjaxResult.success(menus);
+    }
+
+    /**
+     * 根据菜单编号获取详细信息
+     */
+    @ApiOperation("根据菜单编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
+    @GetMapping(value = "/{menuId}")
+    public AjaxResult<SysMenu> getInfo(@PathVariable Long menuId) {
+        return AjaxResult.success(menuService.selectMenuById(menuId));
+    }
+
+    /**
+     * 获取菜单下拉树列表
+     */
+    @ApiOperation("获取菜单下拉树列表")
+    @GetMapping("/treeselect")
+    public AjaxResult<List<TreeSelect>> treeselect(SysMenu menu) {
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
+        return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 加载对应角色菜单列表树
+     */
+    @ApiOperation("加载对应角色菜单列表树")
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    public AjaxResult<Map<String, Object>> roleMenuTreeselect(@PathVariable("roleId") Long roleId) {
+        List<SysMenu> menus = menuService.selectMenuList(getUserId());
+        Map<String, Object> ajax = new HashMap<>();
+        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
+        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
+        return AjaxResult.success(ajax);
+    }
+
+    /**
+     * 新增菜单
+     */
+    @ApiOperation("新增菜单")
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
+    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysMenu menu) {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        }
+        return toAjax(menuService.insertMenu(menu));
+    }
+
+    /**
+     * 修改菜单
+     */
+    @ApiOperation("修改菜单")
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
+    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysMenu menu) {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        } else if (menu.getMenuId().equals(menu.getParentId())) {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
+        }
+        return toAjax(menuService.updateMenu(menu));
+    }
+
+    /**
+     * 删除菜单
+     */
+    @ApiOperation("删除菜单")
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
+    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{menuId}")
+    public AjaxResult<Void> remove(@PathVariable("menuId") Long menuId) {
+        if (menuService.hasChildByMenuId(menuId)) {
+            return AjaxResult.error("存在子菜单,不允许删除");
+        }
+        if (menuService.checkMenuExistRole(menuId)) {
+            return AjaxResult.error("菜单已分配,不允许删除");
+        }
+        return toAjax(menuService.deleteMenuById(menuId));
+    }
+}

+ 84 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java

@@ -0,0 +1,84 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysNotice;
+import com.ruoyi.system.service.ISysNoticeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 公告 信息操作处理
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "公告信息控制器", tags = {"公告信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/notice")
+public class SysNoticeController extends BaseController {
+
+    private final ISysNoticeService noticeService;
+
+    /**
+     * 获取通知公告列表
+     */
+    @ApiOperation("获取通知公告列表")
+    @PreAuthorize("@ss.hasPermi('system:notice:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysNotice> list(SysNotice notice) {
+        return noticeService.selectPageNoticeList(notice);
+    }
+
+    /**
+     * 根据通知公告编号获取详细信息
+     */
+    @ApiOperation("根据通知公告编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:notice:query')")
+    @GetMapping(value = "/{noticeId}")
+    public AjaxResult<SysNotice> getInfo(@PathVariable Long noticeId) {
+        return AjaxResult.success(noticeService.selectNoticeById(noticeId));
+    }
+
+    /**
+     * 新增通知公告
+     */
+    @ApiOperation("新增通知公告")
+    @PreAuthorize("@ss.hasPermi('system:notice:add')")
+    @Log(title = "通知公告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysNotice notice) {
+        return toAjax(noticeService.insertNotice(notice));
+    }
+
+    /**
+     * 修改通知公告
+     */
+    @ApiOperation("修改通知公告")
+    @PreAuthorize("@ss.hasPermi('system:notice:edit')")
+    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysNotice notice) {
+        return toAjax(noticeService.updateNotice(notice));
+    }
+
+    /**
+     * 删除通知公告
+     */
+    @ApiOperation("删除通知公告")
+    @PreAuthorize("@ss.hasPermi('system:notice:remove')")
+    @Log(title = "通知公告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{noticeIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] noticeIds) {
+        return toAjax(noticeService.deleteNoticeByIds(noticeIds));
+    }
+}

+ 110 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java

@@ -0,0 +1,110 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bo.SysOssConfigBo;
+import com.ruoyi.system.domain.vo.SysOssConfigVo;
+import com.ruoyi.system.service.ISysOssConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+
+/**
+ * 对象存储配置Controller
+ *
+ * @author Lion Li
+ * @author 孤舟烟雨
+ * @date 2021-08-13
+ */
+@Validated
+@Api(value = "对象存储配置控制器", tags = {"对象存储配置管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/oss/config")
+public class SysOssConfigController extends BaseController {
+
+    private final ISysOssConfigService iSysOssConfigService;
+
+    /**
+     * 查询对象存储配置列表
+     */
+    @ApiOperation("查询对象存储配置列表")
+    @PreAuthorize("@ss.hasPermi('system:oss:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysOssConfigVo> list(@Validated(QueryGroup.class) SysOssConfigBo bo) {
+        return iSysOssConfigService.queryPageList(bo);
+    }
+
+    /**
+     * 获取对象存储配置详细信息
+     */
+    @ApiOperation("获取对象存储配置详细信息")
+    @PreAuthorize("@ss.hasPermi('system:oss:query')")
+    @GetMapping("/{ossConfigId}")
+    public AjaxResult<SysOssConfigVo> getInfo(@NotNull(message = "主键不能为空")
+                                              @PathVariable("ossConfigId") Integer ossConfigId) {
+        return AjaxResult.success(iSysOssConfigService.queryById(ossConfigId));
+    }
+
+    /**
+     * 新增对象存储配置
+     */
+    @ApiOperation("新增对象存储配置")
+    @PreAuthorize("@ss.hasPermi('system:oss:add')")
+    @Log(title = "对象存储配置", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) {
+        return toAjax(iSysOssConfigService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改对象存储配置
+     */
+    @ApiOperation("修改对象存储配置")
+    @PreAuthorize("@ss.hasPermi('system:oss:edit')")
+    @Log(title = "对象存储配置", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) {
+        return toAjax(iSysOssConfigService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除对象存储配置
+     */
+    @ApiOperation("删除对象存储配置")
+    @PreAuthorize("@ss.hasPermi('system:oss:remove')")
+    @Log(title = "对象存储配置", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ossConfigIds}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                   @PathVariable Long[] ossConfigIds) {
+        return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0);
+    }
+
+    /**
+     * 状态修改
+     */
+    @ApiOperation("状态修改")
+    @PreAuthorize("@ss.hasPermi('system:oss:edit')")
+    @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult<Void> changeStatus(@RequestBody SysOssConfigBo bo) {
+        return toAjax(iSysOssConfigService.updateOssConfigStatus(bo));
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.system;
+
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpException;
+import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.oss.constant.CloudConstant;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.domain.SysOss;
+import com.ruoyi.system.domain.bo.SysOssBo;
+import com.ruoyi.system.domain.vo.SysOssVo;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysOssService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 文件上传 控制层
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "OSS对象存储控制器", tags = {"OSS对象存储管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/oss")
+public class SysOssController extends BaseController {
+
+    private final ISysOssService iSysOssService;
+    private final ISysConfigService iSysConfigService;
+
+    /**
+     * 查询OSS对象存储列表
+     */
+    @ApiOperation("查询OSS对象存储列表")
+    @PreAuthorize("@ss.hasPermi('system:oss:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysOssVo> list(@Validated(QueryGroup.class) SysOssBo bo) {
+        return iSysOssService.queryPageList(bo);
+    }
+
+    /**
+     * 上传OSS对象存储
+     */
+    @ApiOperation("上传OSS对象存储")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "文件", dataType = "java.io.File", required = true),
+    })
+    @PreAuthorize("@ss.hasPermi('system:oss:upload')")
+    @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
+    @RepeatSubmit
+    @PostMapping("/upload")
+    public AjaxResult<Map<String, String>> upload(@RequestPart("file") MultipartFile file) {
+        if (ObjectUtil.isNull(file)) {
+            throw new ServiceException("上传文件不能为空");
+        }
+        SysOss oss = iSysOssService.upload(file);
+        Map<String, String> map = new HashMap<>(2);
+        map.put("url", oss.getUrl());
+        map.put("fileName", oss.getFileName());
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("下载OSS对象存储")
+    @PreAuthorize("@ss.hasPermi('system:oss:download')")
+    @GetMapping("/download/{ossId}")
+    public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException {
+        SysOss sysOss = iSysOssService.getById(ossId);
+        if (ObjectUtil.isNull(sysOss)) {
+            throw new ServiceException("文件数据不存在!");
+        }
+        response.reset();
+        FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
+        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
+        long data;
+        try {
+            data = HttpUtil.download(sysOss.getUrl(), response.getOutputStream(), false);
+        } catch (HttpException e) {
+            if (e.getMessage().contains("403")) {
+                throw new ServiceException("无读取权限, 请在对应的OSS开启'公有读'权限!");
+            } else {
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        response.setContentLength(Convert.toInt(data));
+    }
+
+    /**
+     * 删除OSS对象存储
+     */
+    @ApiOperation("删除OSS对象存储")
+    @PreAuthorize("@ss.hasPermi('system:oss:remove')")
+    @Log(title = "OSS对象存储", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ossIds}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                   @PathVariable Long[] ossIds) {
+        return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0);
+    }
+
+    /**
+     * 变更图片列表预览状态
+     */
+    @ApiOperation("变更图片列表预览状态")
+    @PreAuthorize("@ss.hasPermi('system:oss:edit')")
+    @Log(title = "OSS对象存储", businessType = BusinessType.UPDATE)
+    @PutMapping("/changePreviewListResource")
+    public AjaxResult<Void> changePreviewListResource(@RequestBody String body) {
+        Map<String, Boolean> map = JsonUtils.parseMap(body);
+        SysConfig config = iSysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
+                .eq(SysConfig::getConfigKey, CloudConstant.PEREVIEW_LIST_RESOURCE_KEY));
+        config.setConfigValue(map.get("previewListResource").toString());
+        return toAjax(iSysConfigService.updateConfig(config));
+    }
+
+}

+ 118 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java

@@ -0,0 +1,118 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysPost;
+import com.ruoyi.system.service.ISysPostService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 岗位信息操作处理
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "岗位信息控制器", tags = {"岗位信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/post")
+public class SysPostController extends BaseController {
+
+    private final ISysPostService postService;
+
+    /**
+     * 获取岗位列表
+     */
+    @ApiOperation("获取岗位列表")
+    @PreAuthorize("@ss.hasPermi('system:post:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysPost> list(SysPost post) {
+        return postService.selectPagePostList(post);
+    }
+
+    @ApiOperation("导出岗位列表")
+    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:post:export')")
+    @GetMapping("/export")
+    public void export(SysPost post, HttpServletResponse response) {
+        List<SysPost> list = postService.selectPostList(post);
+        ExcelUtil.exportExcel(list, "岗位数据", SysPost.class, response);
+    }
+
+    /**
+     * 根据岗位编号获取详细信息
+     */
+    @ApiOperation("根据岗位编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:post:query')")
+    @GetMapping(value = "/{postId}")
+    public AjaxResult<SysPost> getInfo(@PathVariable Long postId) {
+        return AjaxResult.success(postService.selectPostById(postId));
+    }
+
+    /**
+     * 新增岗位
+     */
+    @ApiOperation("新增岗位")
+    @PreAuthorize("@ss.hasPermi('system:post:add')")
+    @Log(title = "岗位管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysPost post) {
+        if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
+            return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+        } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
+            return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+        }
+        return toAjax(postService.insertPost(post));
+    }
+
+    /**
+     * 修改岗位
+     */
+    @ApiOperation("修改岗位")
+    @PreAuthorize("@ss.hasPermi('system:post:edit')")
+    @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysPost post) {
+        if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
+            return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+        } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
+            return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+        }
+        return toAjax(postService.updatePost(post));
+    }
+
+    /**
+     * 删除岗位
+     */
+    @ApiOperation("删除岗位")
+    @PreAuthorize("@ss.hasPermi('system:post:remove')")
+    @Log(title = "岗位管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{postIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] postIds) {
+        return toAjax(postService.deletePostByIds(postIds));
+    }
+
+    /**
+     * 获取岗位选择框列表
+     */
+    @ApiOperation("获取岗位选择框列表")
+    @GetMapping("/optionselect")
+    public AjaxResult<List<SysPost>> optionselect() {
+        List<SysPost> posts = postService.selectPostAll();
+        return AjaxResult.success(posts);
+    }
+}

+ 138 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -0,0 +1,138 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.service.TokenService;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysOss;
+import com.ruoyi.system.service.ISysOssService;
+import com.ruoyi.system.service.ISysUserService;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 个人信息 业务处理
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "个人信息控制器", tags = {"个人信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/user/profile")
+public class SysProfileController extends BaseController {
+
+    private final ISysUserService userService;
+    private final TokenService tokenService;
+    private final ISysOssService iSysOssService;
+
+    /**
+     * 个人信息
+     */
+    @ApiOperation("个人信息")
+    @GetMapping
+    public AjaxResult<Map<String, Object>> profile() {
+        LoginUser loginUser = getLoginUser();
+        SysUser user = loginUser.getUser();
+        Map<String, Object> ajax = new HashMap<>();
+        ajax.put("user", user);
+        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
+        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
+        return AjaxResult.success(ajax);
+    }
+
+    /**
+     * 修改用户
+     */
+    @ApiOperation("修改用户")
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> updateProfile(@RequestBody SysUser user) {
+        if (StringUtils.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
+        }
+        if (StringUtils.isNotEmpty(user.getEmail())
+                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }
+        LoginUser loginUser = getLoginUser();
+        SysUser sysUser = loginUser.getUser();
+        user.setUserId(sysUser.getUserId());
+        user.setPassword(null);
+        if (userService.updateUserProfile(user) > 0) {
+            // 更新缓存用户信息
+            sysUser.setNickName(user.getNickName());
+            sysUser.setPhonenumber(user.getPhonenumber());
+            sysUser.setEmail(user.getEmail());
+            sysUser.setSex(user.getSex());
+            tokenService.setLoginUser(loginUser);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("修改个人信息异常,请联系管理员");
+    }
+
+    /**
+     * 重置密码
+     */
+    @ApiOperation("重置密码")
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/updatePwd")
+    public AjaxResult<Void> updatePwd(String oldPassword, String newPassword) {
+        LoginUser loginUser = getLoginUser();
+        String userName = loginUser.getUsername();
+        String password = loginUser.getPassword();
+        if (!SecurityUtils.matchesPassword(oldPassword, password)) {
+            return AjaxResult.error("修改密码失败,旧密码错误");
+        }
+        if (SecurityUtils.matchesPassword(newPassword, password)) {
+            return AjaxResult.error("新密码不能与旧密码相同");
+        }
+        if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) {
+            // 更新缓存用户密码
+            loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
+            tokenService.setLoginUser(loginUser);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("修改密码异常,请联系管理员");
+    }
+
+    /**
+     * 头像上传
+     */
+    @ApiOperation("头像上传")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "用户头像", dataType = "java.io.File", required = true),
+    })
+    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
+    @PostMapping("/avatar")
+    public AjaxResult<Map<String, Object>> avatar(@RequestPart("avatarfile") MultipartFile file) {
+        Map<String, Object> ajax = new HashMap<>();
+        if (!file.isEmpty()) {
+            LoginUser loginUser = getLoginUser();
+            SysOss oss = iSysOssService.upload(file);
+            String avatar = oss.getUrl();
+            if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) {
+                ajax.put("imgUrl", avatar);
+                // 更新缓存用户头像
+                loginUser.getUser().setAvatar(avatar);
+                tokenService.setLoginUser(loginUser);
+                return AjaxResult.success(ajax);
+            }
+        }
+        return AjaxResult.error("上传图片异常,请联系管理员", ajax);
+    }
+}

+ 41 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java

@@ -0,0 +1,41 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.RegisterBody;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.SysRegisterService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 注册验证
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "注册验证控制器", tags = {"注册验证管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+public class SysRegisterController extends BaseController {
+
+    private final SysRegisterService registerService;
+    private final ISysConfigService configService;
+
+    @ApiOperation("用户注册")
+    @PostMapping("/register")
+    public AjaxResult<Void> register(@RequestBody RegisterBody user) {
+        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
+            return error("当前系统没有开启注册功能!");
+        }
+        String msg = registerService.register(user);
+        return StringUtils.isEmpty(msg) ? success() : error(msg);
+    }
+}

+ 216 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java

@@ -0,0 +1,216 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysRole;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.service.TokenService;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.SysUserRole;
+import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.SysPermissionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 角色信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@Api(value = "角色信息控制器", tags = {"角色信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/role")
+public class SysRoleController extends BaseController {
+
+    private final ISysRoleService roleService;
+    private final TokenService tokenService;
+    private final ISysUserService userService;
+    private final SysPermissionService permissionService;
+
+    @ApiOperation("查询角色信息列表")
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SysRole> list(SysRole role) {
+        return roleService.selectPageRoleList(role);
+    }
+
+    @ApiOperation("导出角色信息列表")
+    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
+    @GetMapping("/export")
+    public void export(SysRole role, HttpServletResponse response) {
+        List<SysRole> list = roleService.selectRoleList(role);
+        ExcelUtil.exportExcel(list, "角色数据", SysRole.class, response);
+    }
+
+    /**
+     * 根据角色编号获取详细信息
+     */
+    @ApiOperation("根据角色编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/{roleId}")
+    public AjaxResult<SysRole> getInfo(@PathVariable Long roleId) {
+        roleService.checkRoleDataScope(roleId);
+        return AjaxResult.success(roleService.selectRoleById(roleId));
+    }
+
+    /**
+     * 新增角色
+     */
+    @ApiOperation("新增角色")
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
+    @Log(title = "角色管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult<Void> add(@Validated @RequestBody SysRole role) {
+        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        return toAjax(roleService.insertRole(role));
+
+    }
+
+    /**
+     * 修改保存角色
+     */
+    @ApiOperation("修改保存角色")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult<Void> edit(@Validated @RequestBody SysRole role) {
+        roleService.checkRoleAllowed(role);
+        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+
+        if (roleService.updateRole(role) > 0) {
+            // 更新缓存用户权限
+            LoginUser loginUser = getLoginUser();
+            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) {
+                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
+                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
+                tokenService.setLoginUser(loginUser);
+            }
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
+    }
+
+    /**
+     * 修改保存数据权限
+     */
+    @ApiOperation("修改保存数据权限")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/dataScope")
+    public AjaxResult<Void> dataScope(@RequestBody SysRole role) {
+        roleService.checkRoleAllowed(role);
+        return toAjax(roleService.authDataScope(role));
+    }
+
+    /**
+     * 状态修改
+     */
+    @ApiOperation("状态修改")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult<Void> changeStatus(@RequestBody SysRole role) {
+        roleService.checkRoleAllowed(role);
+        return toAjax(roleService.updateRoleStatus(role));
+    }
+
+    /**
+     * 删除角色
+     */
+    @ApiOperation("删除角色")
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
+    @Log(title = "角色管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{roleIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] roleIds) {
+        return toAjax(roleService.deleteRoleByIds(roleIds));
+    }
+
+    /**
+     * 获取角色选择框列表
+     */
+    @ApiOperation("获取角色选择框列表")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping("/optionselect")
+    public AjaxResult<List<SysRole>> optionselect() {
+        return AjaxResult.success(roleService.selectRoleAll());
+    }
+
+    /**
+     * 查询已分配用户角色列表
+     */
+    @ApiOperation("查询已分配用户角色列表")
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/authUser/allocatedList")
+    public TableDataInfo<SysUser> allocatedList(SysUser user) {
+        return userService.selectAllocatedList(user);
+    }
+
+    /**
+     * 查询未分配用户角色列表
+     */
+    @ApiOperation("查询未分配用户角色列表")
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/authUser/unallocatedList")
+    public TableDataInfo<SysUser> unallocatedList(SysUser user) {
+        return userService.selectUnallocatedList(user);
+    }
+
+    /**
+     * 取消授权用户
+     */
+    @ApiOperation("取消授权用户")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/cancel")
+    public AjaxResult<Void> cancelAuthUser(@RequestBody SysUserRole userRole) {
+        return toAjax(roleService.deleteAuthUser(userRole));
+    }
+
+    /**
+     * 批量取消授权用户
+     */
+    @ApiOperation("批量取消授权用户")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/cancelAll")
+    public AjaxResult<Void> cancelAuthUserAll(Long roleId, Long[] userIds) {
+        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
+    }
+
+    /**
+     * 批量选择用户授权
+     */
+    @ApiOperation("批量选择用户授权")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/selectAll")
+    public AjaxResult<Void> selectAuthUserAll(Long roleId, Long[] userIds) {
+        return toAjax(roleService.insertAuthUsers(roleId, userIds));
+    }
+}

+ 0 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java


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