夏文涛 пре 2 година
родитељ
комит
739cdeeccf
100 измењених фајлова са 6809 додато и 0 уклоњено
  1. 1 0
      .idea/.name
  2. 23 0
      .idea/compiler.xml
  3. 7 0
      .idea/encodings.xml
  4. 452 0
      .idea/misc.xml
  5. 124 0
      .idea/uiDesigner.xml
  6. 6 0
      .idea/vcs.xml
  7. 828 0
      .idea/workspace.xml
  8. 196 0
      pom.xml
  9. 163 0
      share_video.iml
  10. 110 0
      share_videos.iml
  11. 84 0
      src/main/java/com/template/AutoCode.java
  12. 17 0
      src/main/java/com/template/MybatisPlusApplication.java
  13. 12 0
      src/main/java/com/template/annotation/ControllerIsShow.java
  14. 28 0
      src/main/java/com/template/annotation/PassToken.java
  15. 14 0
      src/main/java/com/template/annotation/UserLoginCheck.java
  16. 45 0
      src/main/java/com/template/aop/LoginCheckAspect.java
  17. 18 0
      src/main/java/com/template/api/ExcelControllerAPI.java
  18. 21 0
      src/main/java/com/template/api/LogInfoControllerAPI.java
  19. 34 0
      src/main/java/com/template/api/LoginControllerAPI.java
  20. 35 0
      src/main/java/com/template/api/RepairAdminControllerAPI.java
  21. 10 0
      src/main/java/com/template/api/SendControllerAPI.java
  22. 16 0
      src/main/java/com/template/api/SmsCodeControllerAPI.java
  23. 50 0
      src/main/java/com/template/api/SystemMenuControllerAPI.java
  24. 14 0
      src/main/java/com/template/common/exception/EmsException.java
  25. 200 0
      src/main/java/com/template/common/exception/EmsExceptionHandler.java
  26. 29 0
      src/main/java/com/template/common/exception/MyCustomException.java
  27. 7 0
      src/main/java/com/template/common/result/Code.java
  28. 82 0
      src/main/java/com/template/common/result/ResponseStatusEnum.java
  29. 199 0
      src/main/java/com/template/common/utils/AesUtils.java
  30. 173 0
      src/main/java/com/template/common/utils/CommonUtil.java
  31. 41 0
      src/main/java/com/template/common/utils/EncryptionUtil.java
  32. 105 0
      src/main/java/com/template/common/utils/JWTUtil.java
  33. 196 0
      src/main/java/com/template/common/utils/RSAUtils.java
  34. 178 0
      src/main/java/com/template/common/utils/SendSms.java
  35. 25 0
      src/main/java/com/template/common/utils/ValidateCode.java
  36. 27 0
      src/main/java/com/template/common/utils/paramUtils.java
  37. 25 0
      src/main/java/com/template/common/utils/smsUtil.java
  38. 52 0
      src/main/java/com/template/config/MyBatisPlusConfig.java
  39. 37 0
      src/main/java/com/template/config/MySecurity.java
  40. 36 0
      src/main/java/com/template/config/smsConfig.java
  41. 89 0
      src/main/java/com/template/controller/ExcelController.java
  42. 32 0
      src/main/java/com/template/controller/LogInfoController.java
  43. 161 0
      src/main/java/com/template/controller/LoginController.java
  44. 163 0
      src/main/java/com/template/controller/RepairAdminController.java
  45. 29 0
      src/main/java/com/template/controller/SendController.java
  46. 42 0
      src/main/java/com/template/controller/SmsCodeController.java
  47. 110 0
      src/main/java/com/template/controller/SystemMenuController.java
  48. 27 0
      src/main/java/com/template/core/CORSConfiguration.java
  49. 113 0
      src/main/java/com/template/core/JwtAuthenticationInterceptor.java
  50. 25 0
      src/main/java/com/template/core/JwtlnterceptorConfig.java
  51. 74 0
      src/main/java/com/template/core/SwaggerConfiguration.java
  52. 26 0
      src/main/java/com/template/handle/NonStaticResourceHttpRequestHandler.java
  53. 49 0
      src/main/java/com/template/handler/MyMetaObjectHandler.java
  54. 17 0
      src/main/java/com/template/mapper/RepairAdminMapper.java
  55. 16 0
      src/main/java/com/template/mapper/SmsCodeMapper.java
  56. 22 0
      src/main/java/com/template/mapper/SystemMenuMapper.java
  57. 16 0
      src/main/java/com/template/mapper/SystemUserMapper.java
  58. 32 0
      src/main/java/com/template/model/enumModel/eIsSuper.java
  59. 33 0
      src/main/java/com/template/model/enumModel/eStatu.java
  60. 81 0
      src/main/java/com/template/model/pojo/RepairAdmin.java
  61. 66 0
      src/main/java/com/template/model/pojo/SmsCode.java
  62. 60 0
      src/main/java/com/template/model/pojo/SystemMenu.java
  63. 57 0
      src/main/java/com/template/model/pojo/SystemRole.java
  64. 79 0
      src/main/java/com/template/model/pojo/SystemUser.java
  65. 29 0
      src/main/java/com/template/model/request/changePasswordRequest.java
  66. 29 0
      src/main/java/com/template/model/request/freezeRepairAdminRequest.java
  67. 23 0
      src/main/java/com/template/model/request/loginRequest.java
  68. 40 0
      src/main/java/com/template/model/request/queryAccountPageRequest.java
  69. 34 0
      src/main/java/com/template/model/request/updateRepairAdminRequest.java
  70. 35 0
      src/main/java/com/template/model/result/BaseResult.java
  71. 158 0
      src/main/java/com/template/model/result/CommonResult.java
  72. 64 0
      src/main/java/com/template/model/result/PageUtils.java
  73. 32 0
      src/main/java/com/template/model/vo/LoginVO.java
  74. 32 0
      src/main/java/com/template/model/vo/SystemMenuTreeVo.java
  75. 27 0
      src/main/java/com/template/model/vo/SystemMenuVo.java
  76. 30 0
      src/main/java/com/template/services/RepairAdminService.java
  77. 18 0
      src/main/java/com/template/services/SmsCodeService.java
  78. 34 0
      src/main/java/com/template/services/SystemMenuService.java
  79. 19 0
      src/main/java/com/template/services/SystemUserService.java
  80. 95 0
      src/main/java/com/template/services/impl/RepairAdminServiceImpl.java
  81. 110 0
      src/main/java/com/template/services/impl/SmsCodeServiceImpl.java
  82. 86 0
      src/main/java/com/template/services/impl/SystemMenuServiceImpl.java
  83. 103 0
      src/main/java/com/template/services/impl/SystemUserServiceImpl.java
  84. 56 0
      src/main/resources/application-dev.yml
  85. 57 0
      src/main/resources/application-prod.yml
  86. 54 0
      src/main/resources/application.yml
  87. 5 0
      src/main/resources/mapper/template/RepairAdminMapper.xml
  88. 5 0
      src/main/resources/mapper/template/SmsCodeMapper.xml
  89. 14 0
      src/main/resources/mapper/template/SystemMenuMapper.xml
  90. 5 0
      src/main/resources/mapper/template/SystemUserMapper.xml
  91. 148 0
      src/test/java/com/template/MybatisPlusApplicationTests.java
  92. 95 0
      src/test/java/com/template/WrapperTest.java
  93. 42 0
      target/classes/META-INF/spring-configuration-metadata.json
  94. 56 0
      target/classes/application-dev.yml
  95. 57 0
      target/classes/application-prod.yml
  96. 54 0
      target/classes/application.yml
  97. 5 0
      target/classes/mapper/template/RepairAdminMapper.xml
  98. 5 0
      target/classes/mapper/template/SmsCodeMapper.xml
  99. 14 0
      target/classes/mapper/template/SystemMenuMapper.xml
  100. 0 0
      target/classes/mapper/template/SystemUserMapper.xml

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+mybatis_plus

+ 23 - 0
.idea/compiler.xml

@@ -0,0 +1,23 @@
+<?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="mybatis_plus" />
+        <module name="template_code" />
+        <module name="Back-endDevelopmentFramework" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="Back-endDevelopmentFramework" options="-parameters" />
+      <module name="mybatis_plus" options="-parameters" />
+      <module name="template_code" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 7 - 0
.idea/encodings.xml

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

+ 452 - 0
.idea/misc.xml

@@ -0,0 +1,452 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectInspectionProfilesVisibleTreeState">
+    <entry key="Project Default">
+      <profile-state>
+        <expanded-state>
+          <State />
+          <State>
+            <id>Abstraction issuesJava</id>
+          </State>
+          <State>
+            <id>AccessibilityHTML</id>
+          </State>
+          <State>
+            <id>AccessibilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Android</id>
+          </State>
+          <State>
+            <id>Angular</id>
+          </State>
+          <State>
+            <id>Application Servers</id>
+          </State>
+          <State>
+            <id>Application SizePerformanceLintAndroid</id>
+          </State>
+          <State>
+            <id>Assignment issuesJava</id>
+          </State>
+          <State>
+            <id>Bean Validation</id>
+          </State>
+          <State>
+            <id>Bidirectional TextInternationalizationLintAndroid</id>
+          </State>
+          <State>
+            <id>Bitwise operation issuesJava</id>
+          </State>
+          <State>
+            <id>Bitwise operation issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CDI (Contexts and Dependency Injection)</id>
+          </State>
+          <State>
+            <id>CSS</id>
+          </State>
+          <State>
+            <id>Chrome OSCorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Class metricsJava</id>
+          </State>
+          <State>
+            <id>Class structureJava</id>
+          </State>
+          <State>
+            <id>Cloning issuesJava</id>
+          </State>
+          <State>
+            <id>Code maturityJava</id>
+          </State>
+          <State>
+            <id>Code style issuesJava</id>
+          </State>
+          <State>
+            <id>Code style issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CodeSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>CoffeeScript</id>
+          </State>
+          <State>
+            <id>Compiler issuesJava</id>
+          </State>
+          <State>
+            <id>Control flow issuesGroovy</id>
+          </State>
+          <State>
+            <id>Control flow issuesJava</id>
+          </State>
+          <State>
+            <id>Control flow issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Cucumber</id>
+          </State>
+          <State>
+            <id>Declaration redundancyJava</id>
+          </State>
+          <State>
+            <id>DeclarationGroovy</id>
+          </State>
+          <State>
+            <id>Dependency issuesJava</id>
+          </State>
+          <State>
+            <id>Dockerfile</id>
+          </State>
+          <State>
+            <id>ECMAScript 6 migration aidsJavaScript</id>
+          </State>
+          <State>
+            <id>EditorConfig</id>
+          </State>
+          <State>
+            <id>EncapsulationJava</id>
+          </State>
+          <State>
+            <id>Error handlingGroovy</id>
+          </State>
+          <State>
+            <id>Error handlingJava</id>
+          </State>
+          <State>
+            <id>Error handlingJavaScript</id>
+          </State>
+          <State>
+            <id>Faces Model</id>
+          </State>
+          <State>
+            <id>FreeMarker</id>
+          </State>
+          <State>
+            <id>GPathGroovy</id>
+          </State>
+          <State>
+            <id>GSPGrailsGroovy</id>
+          </State>
+          <State>
+            <id>General</id>
+          </State>
+          <State>
+            <id>GeneralCoffeeScript</id>
+          </State>
+          <State>
+            <id>GeneralJavaScript</id>
+          </State>
+          <State>
+            <id>Google Web Toolkit</id>
+          </State>
+          <State>
+            <id>Gradle</id>
+          </State>
+          <State>
+            <id>GrailsGroovy</id>
+          </State>
+          <State>
+            <id>Groovy</id>
+          </State>
+          <State>
+            <id>Guice</id>
+          </State>
+          <State>
+            <id>HTML</id>
+          </State>
+          <State>
+            <id>Hibernate</id>
+          </State>
+          <State>
+            <id>IconsUsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Inheritance issuesJava</id>
+          </State>
+          <State>
+            <id>InitializationJava</id>
+          </State>
+          <State>
+            <id>InternationalizationJava</id>
+          </State>
+          <State>
+            <id>InternationalizationLintAndroid</id>
+          </State>
+          <State>
+            <id>J2ME issuesJava</id>
+          </State>
+          <State>
+            <id>JBoss Seam</id>
+          </State>
+          <State>
+            <id>JPA</id>
+          </State>
+          <State>
+            <id>JSON and JSON5</id>
+          </State>
+          <State>
+            <id>JSP</id>
+          </State>
+          <State>
+            <id>JUnitJava</id>
+          </State>
+          <State>
+            <id>Java</id>
+          </State>
+          <State>
+            <id>Java 11Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 5Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 7Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 8Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 9Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java EE</id>
+          </State>
+          <State>
+            <id>Java interop issuesKotlin</id>
+          </State>
+          <State>
+            <id>Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>JavaBeans issuesJava</id>
+          </State>
+          <State>
+            <id>JavaFX</id>
+          </State>
+          <State>
+            <id>JavaScript</id>
+          </State>
+          <State>
+            <id>JavaScript function metricsJavaScript</id>
+          </State>
+          <State>
+            <id>JavadocJava</id>
+          </State>
+          <State>
+            <id>Kotlin</id>
+          </State>
+          <State>
+            <id>Language Injection</id>
+          </State>
+          <State>
+            <id>LintAndroid</id>
+          </State>
+          <State>
+            <id>LoggingJava</id>
+          </State>
+          <State>
+            <id>Lombok</id>
+          </State>
+          <State>
+            <id>Manifest</id>
+          </State>
+          <State>
+            <id>Markdown</id>
+          </State>
+          <State>
+            <id>Maven</id>
+          </State>
+          <State>
+            <id>MavenMigrationKotlin</id>
+          </State>
+          <State>
+            <id>MemoryJava</id>
+          </State>
+          <State>
+            <id>MessagesCorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Method metricsGroovy</id>
+          </State>
+          <State>
+            <id>Method metricsJava</id>
+          </State>
+          <State>
+            <id>MigrationKotlin</id>
+          </State>
+          <State>
+            <id>Modularization issuesJava</id>
+          </State>
+          <State>
+            <id>Naming conventionsGroovy</id>
+          </State>
+          <State>
+            <id>Naming conventionsJava</id>
+          </State>
+          <State>
+            <id>Naming conventionsJavaScript</id>
+          </State>
+          <State>
+            <id>Numeric issuesJava</id>
+          </State>
+          <State>
+            <id>OSGi</id>
+          </State>
+          <State>
+            <id>Packaging issuesJava</id>
+          </State>
+          <State>
+            <id>Pattern Validation</id>
+          </State>
+          <State>
+            <id>PerformanceJava</id>
+          </State>
+          <State>
+            <id>PerformanceLintAndroid</id>
+          </State>
+          <State>
+            <id>Plugin DevKit</id>
+          </State>
+          <State>
+            <id>PortabilityJava</id>
+          </State>
+          <State>
+            <id>Potentially confusing code constructsGroovy</id>
+          </State>
+          <State>
+            <id>Potentially confusing code constructsJavaScript</id>
+          </State>
+          <State>
+            <id>Probable bugsCSS</id>
+          </State>
+          <State>
+            <id>Probable bugsGradle</id>
+          </State>
+          <State>
+            <id>Probable bugsJava</id>
+          </State>
+          <State>
+            <id>Probable bugsJavaScript</id>
+          </State>
+          <State>
+            <id>Probable bugsKotlin</id>
+          </State>
+          <State>
+            <id>Properties Files</id>
+          </State>
+          <State>
+            <id>RELAX NG</id>
+          </State>
+          <State>
+            <id>Reactor</id>
+          </State>
+          <State>
+            <id>Redundant constructsKotlin</id>
+          </State>
+          <State>
+            <id>Reflective accessJava</id>
+          </State>
+          <State>
+            <id>RegExp</id>
+          </State>
+          <State>
+            <id>Resource managementJava</id>
+          </State>
+          <State>
+            <id>SQL</id>
+          </State>
+          <State>
+            <id>SecurityJava</id>
+          </State>
+          <State>
+            <id>SecurityLintAndroid</id>
+          </State>
+          <State>
+            <id>Serialization issuesJava</id>
+          </State>
+          <State>
+            <id>SetupSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>Spring</id>
+          </State>
+          <State>
+            <id>Spring AOPSpring</id>
+          </State>
+          <State>
+            <id>Spring CoreSpring</id>
+          </State>
+          <State>
+            <id>Struts</id>
+          </State>
+          <State>
+            <id>Struts 1Struts</id>
+          </State>
+          <State>
+            <id>Style issuesKotlin</id>
+          </State>
+          <State>
+            <id>TestNGJava</id>
+          </State>
+          <State>
+            <id>Threading issuesGroovy</id>
+          </State>
+          <State>
+            <id>Threading issuesJava</id>
+          </State>
+          <State>
+            <id>TypeScript</id>
+          </State>
+          <State>
+            <id>TypographyUsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>UI Form</id>
+          </State>
+          <State>
+            <id>UsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Velocity</id>
+          </State>
+          <State>
+            <id>Verbose or redundant code constructsJava</id>
+          </State>
+          <State>
+            <id>WebSocket</id>
+          </State>
+          <State>
+            <id>XML</id>
+          </State>
+          <State>
+            <id>XMLSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>XPath</id>
+          </State>
+          <State>
+            <id>YAML</id>
+          </State>
+        </expanded-state>
+      </profile-state>
+    </entry>
+  </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>

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

+ 828 - 0
.idea/workspace.xml

@@ -0,0 +1,828 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="33456f28-da03-4d10-99dd-fd9bd193cf84" name="Default Changelist" comment="" />
+    <ignored path="$PROJECT_DIR$/out/" />
+    <ignored path="$PROJECT_DIR$/target/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <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="DefaultGradleProjectSettings">
+    <option name="isMigrated" value="true" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/exception/EmsExceptionHandler.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="391">
+              <caret line="41" column="52" selection-start-line="41" selection-start-column="52" selection-end-line="41" selection-end-column="52" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/LoginController.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="253">
+              <caret line="26" column="13" selection-start-line="26" selection-start-column="13" selection-end-line="26" selection-end-column="13" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/RepairAdminController.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="1334">
+              <caret line="69" column="14" selection-start-line="69" selection-start-column="14" selection-end-line="69" selection-end-column="14" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/result/PageUtils.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="207">
+              <caret line="14" column="13" selection-start-line="14" selection-start-column="13" selection-end-line="14" selection-end-column="13" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/RepairAdminServiceImpl.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="493">
+              <caret line="86" column="12" selection-start-line="86" selection-start-column="12" selection-end-line="86" selection-end-column="12" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/RepairAdminService.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="276">
+              <caret line="15" column="17" selection-start-line="15" selection-start-column="17" selection-end-line="15" selection-end-column="17" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/ExcelControllerAPI.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="253">
+              <caret line="15" column="31" selection-start-line="15" selection-start-column="31" selection-end-line="15" selection-end-column="31" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/LoginControllerAPI.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="46">
+              <caret line="2" column="43" selection-start-line="2" selection-start-column="43" selection-end-line="2" selection-end-column="43" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/request/loginRequest.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="92">
+              <caret line="4" column="8" selection-start-line="4" selection-start-column="8" selection-end-line="4" selection-end-column="8" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/RepairAdminControllerAPI.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="598">
+              <caret line="33" column="162" selection-start-line="33" selection-start-column="162" selection-end-line="33" selection-end-column="162" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>verifyPhone</find>
+      <find>sendSms</find>
+      <find>@cOM</find>
+      <find>MapperScan</find>
+      <find>resultData</find>
+      <find>useAffectedRows</find>
+      <find>Host</find>
+      <find>InsertSystemMenu</find>
+      <find>填充</find>
+      <find>insertRepairAdmin</find>
+      <find>逻辑删除</find>
+      <find>performanceInterceptor</find>
+      <find>logging</find>
+      <find>SIGNATURE</find>
+      <find>de</find>
+      <find>handlerMethod</find>
+      <find>自动填充</find>
+      <find>setTablePrefix</find>
+      <find>getResource</find>
+      <find>getRepairByAccount</find>
+      <find>@Ma</find>
+      <find>更新</find>
+    </findStrings>
+    <replaceStrings>
+      <replace />
+    </replaceStrings>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/src/main/java/com/video/controller/PlaybackRecordController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/video/controller/VideoElseController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/video/controller/VideoShareController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/video/services/impl/PlaybackRecordImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/video/services/impl/VideoPlayServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/annotation/ControllerIsShow.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/vo/VideoVo.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/utils/BaseResult.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/auto/model/RepairAdmin.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/controller/SystemMenuController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/mapper/SystemMenuMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/mapper/RepairAdminMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/services/SystemMenuService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/config/MyBatisPlusConfig.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/result/ResponseStatusEnum.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/utils/paramUtils.java" />
+        <option value="$PROJECT_DIR$/src/main/java/common/utils/JWTUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/vo/LoginVO.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/result/CommonResult.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/utils/AesUtils.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/services/impl/SmsCodeServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/common/utils/paramUtils.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/pojo/RepairAdmin.java" />
+        <option value="$PROJECT_DIR$/src/main/java/common/result/ResponseStatusEnum.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/core/JwtAuthenticationInterceptor.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/AutoCode.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/handler/MyMetaObjectHandler.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/common/result/Code.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/vo/SystemMenuTreeVo.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/application.yml" />
+        <option value="$PROJECT_DIR$/src/main/resources/application-prod.yml" />
+        <option value="$PROJECT_DIR$/src/main/resources/application-dev.yml" />
+        <option value="$PROJECT_DIR$/pom.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/api/SystemMenuControllerAPI.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/api/SmsCodeControllerAPI.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/enumModel/eStatu.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/api/RepairAdminControllerAPI.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/model/request/LoginRequest.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/controller/LoginController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/common/exception/EmsExceptionHandler.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/api/LoginControllerAPI.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/controller/RepairAdminController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/services/RepairAdminService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/template/services/impl/RepairAdminServiceImpl.java" />
+      </list>
+    </option>
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="localRepository" value="D:\Software\Develop\Maven\repository" />
+        <option name="mavenHome" value="D:/Software/Develop/Maven/apache-maven-3.3.9" />
+        <option name="userSettingsFile" value="D:\Software\Develop\Maven\apache-maven-3.3.9\conf\settings.xml" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="MavenProjectNavigator">
+    <treeState>
+      <expand>
+        <path>
+          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
+          <item name="mybatis_plus" type="9519ce18:MavenProjectsStructure$ProjectNode" />
+        </path>
+        <path>
+          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
+          <item name="mybatis_plus" type="9519ce18:MavenProjectsStructure$ProjectNode" />
+          <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
+        </path>
+      </expand>
+      <select />
+    </treeState>
+  </component>
+  <component name="MavenRunner">
+    <option name="skipTests" value="true" />
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="x" value="-7" />
+    <option name="width" value="974" />
+    <option name="height" value="1039" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="Scope" />
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="mybatis_plus" type="b2602c69:ProjectViewProjectNode" />
+              <item name="backend_code" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="mybatis_plus" type="b2602c69:ProjectViewProjectNode" />
+              <item name="backend_code" type="462c0819:PsiDirectoryNode" />
+              <item name="框架代码说明文档" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+      <pane id="PackagesPane" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="ExpandSpringBootJavaOptionsPanel" value="true" />
+    <property name="RequestMappingsPanelOrder0" value="0" />
+    <property name="RequestMappingsPanelOrder1" value="1" />
+    <property name="RequestMappingsPanelWidth0" value="75" />
+    <property name="RequestMappingsPanelWidth1" value="75" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="settings.editor.selected.configurable" value="File.Encoding" />
+  </component>
+  <component name="RebelAgentSelection">
+    <selection>jr</selection>
+  </component>
+  <component name="RecentsManager">
+    <key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
+      <recent name="com.template" />
+    </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.template.model.result" />
+      <recent name="com.template.model.request" />
+      <recent name="com.template.api" />
+      <recent name="com.template.utils" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="D:\Bingo\Desktop\工作内容\报修系统\Back-endDevelopmentFramework\src\main\resources\mapper\video" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager" selected="Application.AutoCode">
+    <configuration name="AutoCode" type="Application" factoryName="Application" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.template.AutoCode" />
+      <module name="Back-endDevelopmentFramework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.template.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="MybatisPlusApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="Back-endDevelopmentFramework" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.template.MybatisPlusApplication" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <list>
+      <item itemvalue="Application.AutoCode" />
+      <item itemvalue="Spring Boot.MybatisPlusApplication" />
+    </list>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="33456f28-da03-4d10-99dd-fd9bd193cf84" name="Default Changelist" comment="" />
+      <created>1688462584849</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1688462584849</updated>
+      <workItem from="1688462587306" duration="235000" />
+      <workItem from="1688462870758" duration="27593000" />
+      <workItem from="1688603141902" duration="785000" />
+      <workItem from="1688609508818" duration="438000" />
+      <workItem from="1688609969175" duration="58000" />
+      <workItem from="1688610441881" duration="151000" />
+      <workItem from="1688610829222" duration="217000" />
+      <workItem from="1688611334908" duration="804000" />
+      <workItem from="1688612583930" duration="14000" />
+      <workItem from="1688623572162" duration="6039000" />
+      <workItem from="1701393315043" duration="136000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="36470000" />
+  </component>
+  <component name="TodoView">
+    <todo-panel id="selected-file">
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
+    <todo-panel id="all">
+      <are-packages-shown value="true" />
+      <is-autoscroll-to-source value="true" />
+    </todo-panel>
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-7" y="0" width="974" height="1039" extended-state="0" />
+    <layout>
+      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.38512036" />
+      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
+      <window_info id="Designer" order="2" />
+      <window_info id="JRebel" order="3" side_tool="true" />
+      <window_info id="Image Layers" order="4" />
+      <window_info id="Capture Tool" order="5" />
+      <window_info id="UI Designer" order="6" />
+      <window_info id="Favorites" order="7" side_tool="true" />
+      <window_info id="Web" order="8" side_tool="true" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" weight="0.32932165" />
+      <window_info anchor="bottom" id="Run" order="2" weight="0.49723756" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.44310722" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" weight="0.32932165" />
+      <window_info anchor="bottom" id="Spring" order="7" />
+      <window_info anchor="bottom" id="Terminal" order="8" />
+      <window_info anchor="bottom" id="Docker" order="9" />
+      <window_info anchor="bottom" id="Event Log" order="10" side_tool="true" />
+      <window_info anchor="bottom" id="Messages" order="11" visible="true" weight="0.33701658" />
+      <window_info anchor="bottom" id="Java Enterprise" order="12" />
+      <window_info anchor="bottom" id="Database Changes" order="13" />
+      <window_info anchor="bottom" id="Version Control" order="14" />
+      <window_info anchor="bottom" id="JRebel Executor" order="15" />
+      <window_info anchor="bottom" id="JRebel Console" order="16" side_tool="true" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info active="true" anchor="right" id="Maven" order="3" visible="true" weight="0.5809628" />
+      <window_info anchor="right" id="Palette" order="4" />
+      <window_info anchor="right" id="Capture Analysis" order="5" />
+      <window_info anchor="right" id="Database" order="6" />
+      <window_info anchor="right" id="Palette&#9;" order="7" />
+      <window_info anchor="right" id="Theme Preview" order="8" />
+      <window_info anchor="right" id="JRebel Setup Guide" order="9" side_tool="true" />
+      <window_info anchor="right" id="Bean Validation" order="10" />
+    </layout>
+    <layout-to-restore>
+      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.19349681" />
+      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
+      <window_info id="Designer" order="2" />
+      <window_info id="JRebel" order="3" side_tool="true" />
+      <window_info id="Image Layers" order="4" />
+      <window_info id="Capture Tool" order="5" />
+      <window_info id="UI Designer" order="6" />
+      <window_info id="Favorites" order="7" side_tool="true" />
+      <window_info id="Web" order="8" side_tool="true" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" weight="0.32932165" />
+      <window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.32932165" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.45623633" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" weight="0.32932165" />
+      <window_info anchor="bottom" id="Spring" order="7" />
+      <window_info anchor="bottom" id="Terminal" order="8" />
+      <window_info anchor="bottom" id="Docker" order="9" />
+      <window_info anchor="bottom" id="Event Log" order="10" side_tool="true" />
+      <window_info anchor="bottom" id="Messages" order="11" weight="0.3314917" />
+      <window_info anchor="bottom" id="Java Enterprise" order="12" />
+      <window_info anchor="bottom" id="Database Changes" order="13" />
+      <window_info anchor="bottom" id="Version Control" order="14" />
+      <window_info anchor="bottom" id="JRebel Executor" order="15" />
+      <window_info anchor="bottom" id="JRebel Console" order="16" side_tool="true" />
+      <window_info anchor="right" id="Bean Validation" order="0" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="1" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="2" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="3" weight="0.25" />
+      <window_info anchor="right" id="Maven" order="4" weight="0.5826226" />
+      <window_info anchor="right" id="Palette" order="5" />
+      <window_info anchor="right" id="Capture Analysis" order="6" />
+      <window_info anchor="right" id="Database" order="7" />
+      <window_info anchor="right" id="Palette&#9;" order="8" />
+      <window_info anchor="right" id="Theme Preview" order="9" />
+      <window_info anchor="right" id="JRebel Setup Guide" order="10" side_tool="true" />
+    </layout-to-restore>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/template/common/exception/MyCustomException.java</url>
+          <line>14</line>
+          <properties />
+          <option name="timeStamp" value="20" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/template/common/exception/EmsException.java</url>
+          <line>10</line>
+          <properties />
+          <option name="timeStamp" value="21" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
+  </component>
+  <component name="antWorkspaceConfiguration">
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
+    <option name="FILTER_TARGETS" value="false" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="jar://$MAVEN_REPOSITORY$/com/baomidou/mybatis-plus-generator/3.0.5/mybatis-plus-generator-3.0.5.jar!/com/baomidou/mybatisplus/generator/config/StrategyConfig.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-1242">
+          <caret line="12" column="13" selection-start-line="12" selection-start-column="13" selection-end-line="12" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/core/JwtAuthenticationInterceptor.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1104">
+          <caret line="64" column="45" selection-start-line="64" selection-start-column="45" selection-end-line="64" selection-end-column="45" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/utils/CommonUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="184">
+          <caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/result/Code.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="46">
+          <caret line="2" column="17" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/vo/SystemMenuTreeVo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="575">
+          <caret line="30" column="43" selection-start-line="30" selection-start-column="43" selection-end-line="30" selection-end-column="43" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="46">
+          <caret line="2" column="2" selection-start-line="2" selection-start-column="2" selection-end-line="3" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application-dev.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="92">
+          <caret line="4" selection-start-line="4" selection-end-line="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pom.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="230">
+          <caret line="10" column="25" selection-start-line="10" selection-start-column="17" selection-end-line="10" selection-end-column="25" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application-prod.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="92">
+          <caret line="4" selection-start-line="4" selection-end-line="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/result/ResponseStatusEnum.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="137">
+          <caret line="22" column="4" selection-start-line="22" selection-start-column="4" selection-end-line="22" selection-end-column="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.3.22/spring-web-5.3.22-sources.jar!/org/springframework/web/method/support/InvocableHandlerMethod.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="367">
+          <caret line="204" selection-start-line="204" selection-end-line="204" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/exception/EmsException.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="161">
+          <caret line="7" column="27" selection-start-line="7" selection-start-column="27" selection-end-line="7" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/exception/MyCustomException.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="207">
+          <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/handle/NonStaticResourceHttpRequestHandler.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="276">
+          <caret line="18" column="61" selection-start-line="18" selection-start-column="24" selection-end-line="18" selection-end-column="61" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/handler/MyMetaObjectHandler.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="391">
+          <caret line="17" column="31" selection-start-line="17" selection-start-column="31" selection-end-line="17" selection-end-column="31" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/result/ResponseStatusEnum.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/ExcelController.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="115">
+          <caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/SystemMenuControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="230">
+          <caret line="19" column="29" selection-start-line="19" selection-start-column="29" selection-end-line="19" selection-end-column="29" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/SmsCodeControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="92">
+          <caret line="8" column="26" selection-start-line="8" selection-start-column="26" selection-end-line="8" selection-end-column="26" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/SendControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="115">
+          <caret line="5" column="17" selection-start-line="5" selection-start-column="17" selection-end-line="5" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/LogInfoController.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="115">
+          <caret line="11" column="13" selection-start-line="11" selection-start-column="13" selection-end-line="11" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/enumModel/eStatu.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="207">
+          <caret line="9" column="19" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="19" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/controller/RepairAdminController.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/LogInfoControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="115">
+          <caret line="10" column="17" selection-start-line="10" selection-start-column="17" selection-end-line="10" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/mapper/xml/RepairAdminMapper.xml" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/mapper/RepairAdminMapper.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/mapper/SystemMenuMapper.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="322">
+          <caret line="19" column="17" selection-start-line="19" selection-start-column="17" selection-end-line="19" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/mapper/SmsCodeMapper.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="276">
+          <caret line="13" column="17" selection-start-line="13" selection-start-column="17" selection-end-line="13" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/mapper/RepairAdminMapper.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="345">
+          <caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/result/CommonResult.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="276">
+          <caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/result/BaseResult.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="253">
+          <caret line="13" column="22" selection-start-line="13" selection-start-column="22" selection-end-line="13" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/config/MyBatisPlusConfig.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="184">
+          <caret line="17" column="30" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="30" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/model/RepairAdmin.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/pojo/RepairAdmin.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="29" column="13" selection-start-line="29" selection-start-column="13" selection-end-line="29" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/service/impl/RepairAdminServiceImpl.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/auto/services/RepairAdminService.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/AutoCode.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="390">
+          <caret line="59" column="48" selection-start-line="59" selection-start-column="48" selection-end-line="59" selection-end-column="48" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/MybatisPlusApplication.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="161">
+          <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/template/MybatisPlusApplicationTests.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="23">
+          <caret line="75" column="78" selection-start-line="75" selection-start-column="78" selection-end-line="75" selection-end-column="78" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/template/WrapperTest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-1071">
+          <caret line="17" column="9" selection-start-line="17" selection-start-column="9" selection-end-line="17" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/SmsCodeServiceImpl.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="295">
+          <caret line="30" column="13" selection-start-line="30" selection-start-column="13" selection-end-line="30" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/common/exception/EmsExceptionHandler.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="391">
+          <caret line="41" column="52" selection-start-line="41" selection-start-column="52" selection-end-line="41" selection-end-column="52" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/LoginController.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="253">
+          <caret line="26" column="13" selection-start-line="26" selection-start-column="13" selection-end-line="26" selection-end-column="13" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/RepairAdminController.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1334">
+          <caret line="69" column="14" selection-start-line="69" selection-start-column="14" selection-end-line="69" selection-end-column="14" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/result/PageUtils.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="207">
+          <caret line="14" column="13" selection-start-line="14" selection-start-column="13" selection-end-line="14" selection-end-column="13" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/RepairAdminService.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="276">
+          <caret line="15" column="17" selection-start-line="15" selection-start-column="17" selection-end-line="15" selection-end-column="17" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/ExcelControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="253">
+          <caret line="15" column="31" selection-start-line="15" selection-start-column="31" selection-end-line="15" selection-end-column="31" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/LoginControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="46">
+          <caret line="2" column="43" selection-start-line="2" selection-start-column="43" selection-end-line="2" selection-end-column="43" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/request/loginRequest.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="92">
+          <caret line="4" column="8" selection-start-line="4" selection-start-column="8" selection-end-line="4" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/RepairAdminControllerAPI.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="598">
+          <caret line="33" column="162" selection-start-line="33" selection-start-column="162" selection-end-line="33" selection-end-column="162" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/RepairAdminServiceImpl.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="493">
+          <caret line="86" column="12" selection-start-line="86" selection-start-column="12" selection-end-line="86" selection-end-column="12" />
+        </state>
+      </provider>
+    </entry>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ProjectJDKs.UI">
+        <settings>
+          <last-edited>1.8</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
+  </component>
+</project>

+ 196 - 0
pom.xml

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

+ 163 - 0
share_video.iml

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

+ 110 - 0
share_videos.iml

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

+ 84 - 0
src/main/java/com/template/AutoCode.java

@@ -0,0 +1,84 @@
+package com.template;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableFill;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/30 星期四 15:46
+ * @Description: com.video
+ * @Version: 1.0
+ */
+public class AutoCode {
+    public static void main(String[] args) {
+// 需要构建一个 代码自动生成器 对象
+        AutoGenerator mpg = new AutoGenerator();
+// 配置策略
+// 1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath + "/src/main/java");
+        gc.setAuthor("ceshi");
+        gc.setOpen(false);
+        gc.setFileOverride(false); // 是否覆盖
+        gc.setServiceName("%sService"); // 去Service的I前缀
+        gc.setIdType(IdType.UUID);
+        gc.setDateType(DateType.ONLY_DATE);
+        gc.setSwagger2(true);
+        mpg.setGlobalConfig(gc);
+//2、设置数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.161.220:3306/repair_report?useUnicode=tru&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+        //3、包的配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName("auto");
+        pc.setParent("com.template");
+        pc.setEntity("model");
+        pc.setMapper("mapper");
+        pc.setService("services");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+        //4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setInclude("repair_admin"); // 设置要映射的表名
+        strategy.setNaming(NamingStrategy.underline_to_camel);//下划线转驼峰
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//下划线转驼峰
+        strategy.setEntityLombokModel(true); // 自动lombok;
+        strategy.setLogicDeleteFieldName("deleted");//逻辑删除 调用service的删除方法不会真删除 会把deleted字段的值改为1 (未删除="0",删除="1")
+        // 自动填充配置
+        TableFill deletedCreate = new TableFill("deleted", FieldFill.INSERT);
+        TableFill timeCreate = new TableFill("create_time", FieldFill.INSERT);
+        TableFill userCreate = new TableFill("create_user", FieldFill.INSERT);
+        TableFill timeModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
+        TableFill userModified = new TableFill("update_user", FieldFill.INSERT_UPDATE);
+        ArrayList<TableFill> tableFills = new ArrayList<>();
+        tableFills.add(deletedCreate);
+        tableFills.add(timeCreate);
+        tableFills.add(userCreate);
+        tableFills.add(timeModified);
+        tableFills.add(userModified);
+        strategy.setTableFillList(tableFills);
+        // 乐观锁
+        strategy.setVersionFieldName("version");
+        strategy.setRestControllerStyle(true);
+        strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
+        mpg.setStrategy(strategy);
+        mpg.execute(); //执行
+    }
+}

+ 17 - 0
src/main/java/com/template/MybatisPlusApplication.java

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

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

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

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

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

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

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

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

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

+ 18 - 0
src/main/java/com/template/api/ExcelControllerAPI.java

@@ -0,0 +1,18 @@
+package com.template.api;
+
+import com.template.annotation.PassToken;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Api(tags = {"ExcelController"}, value = "导入excel表")
+@RequestMapping("/api/excel")
+public interface ExcelControllerAPI {
+
+    @PostMapping("/toExcel")
+    @ApiOperation(value = "导入excel表更新用户",httpMethod = "POST")
+    @PassToken
+    void toExcel(String fileUrl);
+
+}

+ 21 - 0
src/main/java/com/template/api/LogInfoControllerAPI.java

@@ -0,0 +1,21 @@
+package com.template.api;
+
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+@Api(tags = {"LogInfoController"}, value = "登入接口")
+@RequestMapping("/api/logInfo")
+public interface LogInfoControllerAPI {
+
+    @GetMapping("/verify")
+    @ApiOperation(value = "验证手机号phone",httpMethod = "GET")
+    CommonResult verifyPhone(String phone);
+
+
+    @PostMapping("/logIn")
+    @ApiOperation(value = "短信验证",httpMethod = "POST")
+    CommonResult logInfo(String phone,String code);
+}

+ 34 - 0
src/main/java/com/template/api/LoginControllerAPI.java

@@ -0,0 +1,34 @@
+package com.template.api;
+
+import com.template.model.pojo.RepairAdmin;
+import com.template.model.request.loginRequest;
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+
+@RequestMapping("/api/login")
+@Api(tags = {"LoginController"}, value = "登录")
+public interface LoginControllerAPI {
+
+    @GetMapping(value = "/queryReduce")
+    @ApiOperation(value = "查看系统版本", notes = "查看系统版本", httpMethod = "GET")
+    CommonResult queryReduce();
+
+    @PostMapping(value = "/Register")
+    @ApiOperation(value = "注册", notes = "注册", httpMethod = "POST")
+    CommonResult Register(@Validated @RequestBody RepairAdmin loginRequest, BindingResult bindingResult);
+
+    @PostMapping(value = "/Login")
+    @ApiOperation(value = "登录", notes = "登录", httpMethod = "POST")
+    CommonResult Login(@Validated @RequestBody loginRequest lr, BindingResult bindingResult);
+
+    @PostMapping(value = "/ChangePassword")
+    @ApiOperation(value = "修改密码", notes = "修改密码", httpMethod = "POST")
+    CommonResult ChangePassword(@Validated @RequestBody com.repair.model.request.changePasswordRequest cpr, @RequestHeader("user_head") String userhead, BindingResult bindingResult);
+}

+ 35 - 0
src/main/java/com/template/api/RepairAdminControllerAPI.java

@@ -0,0 +1,35 @@
+package com.template.api;
+
+import com.template.model.pojo.RepairAdmin;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairAdmin")
+@Api(tags = {"RepairAdminController"}, value = "账号")
+public interface RepairAdminControllerAPI {
+
+    @PostMapping(value = "/insertRepairAdmin")
+    @ApiOperation(value = "添加账号", notes = "添加账号数据", httpMethod = "POST")
+    CommonResult InsertRepairAdmin(@Validated @RequestBody RepairAdmin repairAdmin, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairAdmins")
+    @ApiOperation(value = "账号分页数据", notes = "账号分页数据", httpMethod = "POST")
+    CommonResult queryPageRepairAdmins(@RequestParam int currentPage, @RequestParam int pageCount, String account, String phone, String userName);
+
+    @PostMapping(value = "/freezeRepairAdminById")
+    @ApiOperation(value = "根据ID冻结指定账号", notes = "根据ID冻结指定账户", httpMethod = "POST")
+    CommonResult freezeRepairAdminById(@Validated @RequestBody com.repair.model.request.freezeRepairAdminRequest frar, BindingResult bindingResult);
+
+    @GetMapping(value = "/deleteRepairAdminById")
+    @ApiOperation(value = "根据ID删除指定账号", notes = "根据ID删除指定账号", httpMethod = "POST")
+    CommonResult deleteRepairAdminById(@RequestParam String id);
+
+    @PostMapping(value = "/updateRepairAdminById")
+    @ApiOperation(value = "编辑账号数据", notes = "编辑账号数据", httpMethod = "POST")
+    CommonResult updateRepairAdminById(@Validated @RequestBody com.repair.model.request.updateRepairAdminRequest ra, @RequestHeader("user_head") String userhead, BindingResult bindingResult);
+}

+ 10 - 0
src/main/java/com/template/api/SendControllerAPI.java

@@ -0,0 +1,10 @@
+package com.template.api;
+
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+
+
+public interface SendControllerAPI {
+
+     SendStatus[] sendCodeAgain(String phone);
+
+}

+ 16 - 0
src/main/java/com/template/api/SmsCodeControllerAPI.java

@@ -0,0 +1,16 @@
+package com.template.api;
+
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/api/smsCode")
+@Api(tags = {"SmsCodeControllerAPI"}, value = "短信验证码")
+public interface SmsCodeControllerAPI {
+
+    @GetMapping(value = "/InsertSmsCode")
+    @ApiOperation(value = "新增Code", notes = "新增Code", httpMethod = "POST")
+    CommonResult InsertSmsCode();
+}

+ 50 - 0
src/main/java/com/template/api/SystemMenuControllerAPI.java

@@ -0,0 +1,50 @@
+package com.template.api;
+
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import com.template.model.vo.SystemMenuTreeVo;
+import com.template.model.vo.SystemMenuVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/30 星期四 17:28
+ * @Description: com.video.api
+ * @Version: 1.0
+ */
+@RequestMapping("/api/systemMenu")
+@Api(tags = {"SystemMenuController"}, value = "测试接口")
+public interface SystemMenuControllerAPI {
+    @GetMapping(value = "/QueryPlaybackRecordBySql")
+    @ApiOperation(value = "通过sql获取数据", notes = "通过sql获取数据", httpMethod = "GET")
+    CommonResult<List<SystemMenuVo>> QueryPlaybackRecordBySql();
+
+    @GetMapping(value = "/QuerySystemMenus")
+    @ApiOperation(value = "查询所有菜单数据", notes = "查询所有菜单数据", httpMethod = "GET")
+    CommonResult<List<SystemMenu>> QueryPlaybackRecords();
+
+    @PostMapping(value = "/InsertSystemMenu")
+    @ApiOperation(value = "新增菜单数据", notes = "新增菜单数据", httpMethod = "POST")
+    CommonResult InsertSystemMenu(@RequestBody SystemMenu systemMenu);
+
+    @PostMapping(value = "/DeleteSystemMenu")
+    @ApiOperation(value = "新增菜单数据", notes = "新增菜单数据", httpMethod = "POST")
+    CommonResult DeleteSystemMenu(@RequestParam("userId") Integer userID);
+
+    @GetMapping(value = "/QueryMenuTrees")
+    @ApiOperation(value = "查询树形菜单数据", notes = "查询树形菜单数据", httpMethod = "GET")
+    CommonResult<List<SystemMenuTreeVo>> QueryMenuTreeRecords();
+
+    @PostMapping(value = "/InsertPlaybackRecord")
+    @ApiOperation(value = "新增", notes = "新增", httpMethod = "POST")
+    CommonResult<Integer> InsertPlaybackRecord(@RequestBody SystemMenu pb);
+
+    @GetMapping("/testQuery")
+    @ApiOperation(value = "查询", notes = "查询", httpMethod = "GET")
+    CommonResult<List<SystemMenu>> QueryPlaybackRecords(HttpServletRequest request);
+}

+ 14 - 0
src/main/java/com/template/common/exception/EmsException.java

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

+ 200 - 0
src/main/java/com/template/common/exception/EmsExceptionHandler.java

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

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

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

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

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

+ 82 - 0
src/main/java/com/template/common/result/ResponseStatusEnum.java

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

+ 199 - 0
src/main/java/com/template/common/utils/AesUtils.java

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

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

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

+ 41 - 0
src/main/java/com/template/common/utils/EncryptionUtil.java

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

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

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

Разлика између датотеке није приказан због своје велике величине
+ 196 - 0
src/main/java/com/template/common/utils/RSAUtils.java


+ 178 - 0
src/main/java/com/template/common/utils/SendSms.java

@@ -0,0 +1,178 @@
+package com.template.common.utils;
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+
+//导入可选配置类
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+
+// 导入对应SMS模块的client
+import com.tencentcloudapi.sms.v20210111.SmsClient;
+
+// 导入要请求接口对应的request response类
+import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.template.config.smsConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Tencent Cloud Sms Sendsms
+ */
+public class SendSms {
+
+    @Autowired
+    private static smsConfig smsConfig;
+
+    //腾讯云上的签名
+
+    private static String secretID="AKIDDPo13qZCZqtgJsGQL7AyYu1wc7QVMyLl";
+    //腾讯云上的密钥
+
+    private static String secretKey="JPGrELFySiv0pOrKOPEwSnulOq9IPPDr";
+    //短信应用id
+
+    private static String sdkAppid="1400813506";
+    //短信签名内容
+
+    private static String signName="华仁享学教育";
+    //模板Id
+
+    private static String templateId="1770016";
+    //验证码有效时长
+
+    private static String smsMin="1";
+
+
+    public static SendStatus[] sendSms(String phoneNumber,String code) {
+        SendStatus[] returString= {};
+        try {
+            /* 必要步骤:
+             * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。
+             * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
+             * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
+             * 以免泄露密钥对危及你的财产安全。
+             * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */
+//            Credential cred = new Credential(smsConfig.getSecretID(), smsConfig.getSecretKey());
+            Credential cred = new Credential(secretID,secretKey);
+
+            // 实例化一个http选项,可选,没有特殊需求可以跳过
+            HttpProfile httpProfile = new HttpProfile();
+            // 设置代理(无需要直接忽略)
+            // httpProfile.setProxyHost("真实代理ip");
+            // httpProfile.setProxyPort(真实代理端口);
+            /* SDK默认使用POST方法。
+             * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */
+            httpProfile.setReqMethod("POST");
+            /* SDK有默认的超时时间,非必要请不要进行调整
+             * 如有需要请在代码中查阅以获取最新的默认值 */
+            httpProfile.setConnTimeout(60);
+            /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */
+            httpProfile.setEndpoint("sms.tencentcloudapi.com");
+
+            /* 非必要步骤:
+             * 实例化一个客户端配置对象,可以指定超时时间等配置 */
+            ClientProfile clientProfile = new ClientProfile();
+            /* SDK默认用TC3-HMAC-SHA256进行签名
+             * 非必要请不要修改这个字段 */
+            clientProfile.setSignMethod("HmacSHA256");
+            clientProfile.setHttpProfile(httpProfile);
+            /* 实例化要请求产品(以sms为例)的client对象
+             * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
+            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
+            /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
+             * 你可以直接查询SDK源码确定接口有哪些属性可以设置
+             * 属性可能是基本类型,也可能引用了另一个数据结构
+             * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */
+            SendSmsRequest req = new SendSmsRequest();
+
+            /* 填充请求参数,这里request对象的成员变量即对应接口的入参
+             * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
+             * 基本类型的设置:
+             * 帮助链接:
+             * 短信控制台: https://console.cloud.tencent.com/smsv2
+             * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
+
+            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
+            // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
+//            String sdkAppId = "1400009099";
+//            req.setSmsSdkAppId(smsConfig.getSdkAppid());
+            req.setSmsSdkAppId(sdkAppid);
+
+            /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
+            // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
+//            String signName = "腾讯云";
+//            req.setSignName(smsConfig.getSignName());
+            req.setSignName(signName);
+
+            /* 模板 ID: 必须填写已审核通过的模板 ID */
+            // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
+//            String templateId = "449739";
+//            req.setTemplateId(smsConfig.getTemplateId());
+            req.setTemplateId(templateId);
+
+
+            /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
+//           第一个为验证码,第二个为有效时间
+//            String[] templateParamSet = {code,smsConfig.getSmsMin()};
+            String[] templateParamSet = {code,"1"};
+            req.setTemplateParamSet(templateParamSet);
+
+            /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
+             * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */
+//            String[] phoneNumberSet = {"+8621212313123", "+8612345678902", "+8612345678903"};
+            String[] phoneNumbers = {phoneNumber};
+            req.setPhoneNumberSet(phoneNumbers);
+
+            /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
+//            String sessionContext = "";
+//            req.setSessionContext(sessionContext);
+
+            /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */
+//            String extendCode = "";
+//            req.setExtendCode(extendCode);
+
+            /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */
+//            String senderid = "";
+//            req.setSenderId(senderid);
+
+            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
+             * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
+            SendSmsResponse res = client.SendSms(req);
+
+            // 输出json格式的字符串回包
+//            System.out.println(SendSmsResponse.toJsonString(res));
+
+            // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
+            // System.out.println(res.getRequestId());
+
+            /* 当出现以下错误码时,快速解决方案参考
+             * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms)
+             */
+            SendStatus sendStatus = res.getSendStatusSet()[0];
+//            System.out.println("sendStatus = " + sendStatus);
+
+
+            returString=res.getSendStatusSet();
+
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return returString;
+    }
+
+
+    public static  void main(String[] args) throws TencentCloudSDKException{
+        //这里定义一个存储电话号码的数组
+
+       String tels="+8615779633758"; // 手机号前面记得带上国家区域编码
+//        SendStatus[] test = sendSms(tels);
+
+    }
+
+}

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

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

+ 27 - 0
src/main/java/com/template/common/utils/paramUtils.java

@@ -0,0 +1,27 @@
+package com.template.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+
+import java.util.List;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/5 星期三 16:11
+ * @Description: com.template.utils
+ * @Version: 1.0
+ */
+@Slf4j
+public class paramUtils {
+    public static String getParamError(BindingResult bindingResult){
+        //有校验没通过
+        List<ObjectError> errorList = bindingResult.getAllErrors();
+        StringBuilder st = new StringBuilder();
+        for (ObjectError error : errorList) {
+            st.append(error.getDefaultMessage()+"! ");//输出具体的错误信息
+        }
+
+        return st.toString();
+    }
+}

+ 25 - 0
src/main/java/com/template/common/utils/smsUtil.java

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

+ 52 - 0
src/main/java/com/template/config/MyBatisPlusConfig.java

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

+ 37 - 0
src/main/java/com/template/config/MySecurity.java

@@ -0,0 +1,37 @@
+package com.template.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+//@ConfigurationProperties(prefix = "my-security")
+public class MySecurity {
+    @Value("${my-security.privateKey}")
+    public String privateKey;
+    @Value("${my-security.publicKey}")
+    public String publicKey;
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    @Override
+    public String toString() {
+        return "MySecurity{" +
+                "privateKey='" + privateKey + '\'' +
+                ", publicKey='" + publicKey + '\'' +
+                '}';
+    }
+
+    public void setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public void setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+    }
+}

+ 36 - 0
src/main/java/com/template/config/smsConfig.java

@@ -0,0 +1,36 @@
+package com.template.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/20 星期四 8:29
+ * @Description: com.video.config
+ * @Version: 1.0
+ */
+
+@Component
+@ConfigurationProperties(prefix = "tencentcloud")
+@Data
+public class smsConfig {
+    //腾讯云上的签名
+
+    private String secretID;
+    //腾讯云上的密钥
+
+    private String secretKey;
+    //短信应用id
+
+    private String sdkAppid;
+    //短信签名内容
+
+    private String signName;
+    //模板Id
+
+    private String templateId;
+    //验证码有效时长
+
+    private String smsMin;
+}

+ 89 - 0
src/main/java/com/template/controller/ExcelController.java

@@ -0,0 +1,89 @@
+package com.template.controller;
+
+import com.template.annotation.PassToken;
+import com.template.api.ExcelControllerAPI;
+import com.template.model.pojo.SystemUser;
+import com.template.services.SystemUserService;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+@RestController
+public class ExcelController implements ExcelControllerAPI {
+    @Autowired
+    SystemUserService systemUserService;
+
+    /**
+     * .xlsx格式
+     * @param
+     */
+    @Override
+    @PassToken
+    public void toExcel(String fileUrl) {
+        //创建工作簿对象
+        XSSFWorkbook xssfWorkbook = null;
+        try {
+            xssfWorkbook = new XSSFWorkbook(new FileInputStream(fileUrl));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //获取工作簿下sheet的个数
+        int sheetNum = xssfWorkbook.getNumberOfSheets();
+        //遍历工作簿中的所有数据
+        for (int i = 0; i < sheetNum; i++) {
+            //读取第i个工作表
+            System.out.println("读取第"+(i+1)+"个sheet");
+            XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
+            //获取最后一行的num,即总行数。此处从0开始
+            int maxRow = sheet.getLastRowNum();
+//            从第二行开始获取数据
+            for (int row = 1; row <= maxRow; row++) {
+                //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***
+                int maxRol = sheet.getRow(row).getLastCellNum();
+                System.out.println("--------第" + row + "行的数据如下--------");
+//                for (int rol = 0; rol < maxRol; rol++){
+//                    System.out.print(sheet.getRow(row).getCell(rol) + "  ");
+//                }
+                DataFormatter dataFormatter = new DataFormatter();
+//                获取手机号
+                XSSFCell cell = sheet.getRow(row).getCell(3);
+//                获取的手机号格式有问题需要转换
+                dataFormatter.addFormat("###########",null);
+                String phone = dataFormatter.formatCellValue(cell);
+//                获取名字
+                String name = sheet.getRow(row).getCell(1).toString();
+//                获取备注
+                String remarks = sheet.getRow(row).getCell(4).toString();
+//                获取性别
+                String genderName = sheet.getRow(row).getCell(2).toString();
+                int gender;
+                if ("女".equals(genderName)) {
+                    gender=1;
+                }else {
+                    gender=2;
+                }
+
+                SystemUser systemUser = new SystemUser();
+                systemUser.setRoleId(Long.valueOf(row));
+                systemUser.setAccountName(name);
+                systemUser.setAccountNumber(row+"");
+                systemUser.setAccountPassword("123456");
+                systemUser.setPhoneNumber(phone);
+                systemUser.setEmail("123456@123456");
+                systemUser.setRemarks(remarks);
+                systemUser.setGender(gender);
+                systemUser.setDeleted(0L);
+                systemUser.setWechatId("123456789");
+
+                systemUserService.save(systemUser);
+
+            }
+        }
+    }
+}

+ 32 - 0
src/main/java/com/template/controller/LogInfoController.java

@@ -0,0 +1,32 @@
+package com.template.controller;
+
+import com.template.annotation.PassToken;
+import com.template.api.LogInfoControllerAPI;
+import com.template.model.result.CommonResult;
+import com.template.services.impl.SmsCodeServiceImpl;
+import com.template.services.impl.SystemUserServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+public class LogInfoController implements LogInfoControllerAPI {
+
+
+    @Autowired
+    SystemUserServiceImpl systemUserService;
+
+    @Autowired
+    SmsCodeServiceImpl smsCodeService;
+
+    @Override
+    @PassToken
+    public CommonResult verifyPhone(@RequestParam String phone) {
+        return systemUserService.verifyPhone(phone);
+    }
+
+    @Override
+    @PassToken
+    public CommonResult logInfo(String phone, String code) {
+        return smsCodeService.logIn(phone,code);
+    }
+}

+ 161 - 0
src/main/java/com/template/controller/LoginController.java

@@ -0,0 +1,161 @@
+package com.template.controller;
+
+import com.template.annotation.PassToken;
+import com.template.api.LoginControllerAPI;
+import com.template.model.enumModel.eStatu;
+import com.template.model.pojo.RepairAdmin;
+import com.template.model.request.loginRequest;
+import com.template.model.result.CommonResult;
+import com.template.model.vo.LoginVO;
+import com.template.services.RepairAdminService;
+import com.template.common.utils.AesUtils;
+import com.template.common.utils.paramUtils;
+import com.template.common.utils.JWTUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/5 星期三 9:28
+ * @Description: com.template.controller
+ * @Version: 1.0
+ */
+@RestController
+public class LoginController implements LoginControllerAPI {
+
+    @Autowired
+    private RepairAdminService repairAdminService;
+
+    /**
+     * 查看系统版本号
+     * @return
+     */
+    @Override
+    @PassToken
+    public CommonResult queryReduce() {
+        return CommonResult.ok("当前系统版本为:1V");
+    }
+
+    /**
+     * 注册接口
+     * @param registerdo
+     * account 账号
+     * password 密码
+     * username 昵称
+     * phone 手机号
+     * @return
+     */
+    @Override
+    @PassToken
+    public CommonResult Register(@RequestBody RepairAdmin registerdo, BindingResult bindingResult) {
+        if(registerdo == null){
+            return CommonResult.fail("请传递参数");
+        }
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = 0;
+        try{
+            result = repairAdminService.insertRepairAdmin(registerdo);
+        }catch (Exception e){
+            if(e.getCause().getMessage().contains("'repair_admin.account_un'")){
+                return CommonResult.fail("该账号已存在!");
+            }
+            return CommonResult.fail("系统异常,注册失败!");
+        }
+        if(result > 0){
+            return CommonResult.ok("注册成功!");
+        }
+        return CommonResult.fail("注册失败!");
+    }
+
+    /**
+     * 登录接口
+     * @param loginRequest
+     * account 账号
+     * password 密码
+     * @return
+     *
+     */
+    @Override
+    @PassToken
+    public CommonResult Login(@RequestBody loginRequest loginRequest, BindingResult bindingResult) {
+        if(loginRequest == null){
+            return CommonResult.fail("请传递参数");
+        }
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin result = repairAdminService.getRepairByAccount(loginRequest.getAccount());
+        if(result == null){
+            return CommonResult.fail("账号或密码错误");
+        }
+
+        if(result.getStatu() == eStatu.Freeze.getValue()){
+            return CommonResult.fail("该账号已被冻结");
+        }
+
+        String encPassword = AesUtils.encrypt(loginRequest.getPassword());
+        if(!encPassword.equals(result.getPassword())){
+            return CommonResult.fail("密码错误");
+        }
+
+        String token = JWTUtil.getToken(result);
+        LoginVO login = new LoginVO();
+        login.setToken(token);
+        login.setTokenTtl(JWTUtil.getExpired());
+        login.setUserName(result.getUsername());
+        login.setUserhead(AesUtils.encrypt(result.getId()));
+
+        return CommonResult.ok("登录成功",login);
+    }
+
+    /**
+     * 修改密码
+     * @param cpr
+     * oldPassword 旧密码
+     * newPassword 新密码
+     * confirmPassword 确认密码
+     * @param userhead
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult ChangePassword(com.repair.model.request.changePasswordRequest cpr, @RequestHeader("user_head") String userhead, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if(!cpr.getNewPassword().equals(cpr.getConfirmPassword())){
+            return CommonResult.fail("确认密码和新密码不一致!");
+        }
+
+        String userID = AesUtils.decrypt(userhead);
+        RepairAdmin operateData = repairAdminService.getRepairById(userID);
+        if(operateData == null){
+            return CommonResult.fail("当前账号不合法!");
+        }
+
+        if(operateData.getStatu() == eStatu.Freeze.getValue()){
+            return CommonResult.fail("该账号已被冻结");
+        }
+
+        if(!AesUtils.encrypt(cpr.getOldPassword()).equals(operateData.getPassword())){
+            return CommonResult.fail("原密码错误!");
+        }
+
+        RepairAdmin ra = new RepairAdmin();
+        ra.setId(userID);
+        ra.setPassword(AesUtils.encrypt(cpr.getNewPassword()));
+        int result = repairAdminService.updateRepairAdmin(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+}

+ 163 - 0
src/main/java/com/template/controller/RepairAdminController.java

@@ -0,0 +1,163 @@
+package com.template.controller;
+
+
+import com.template.api.RepairAdminControllerAPI;
+import com.template.common.utils.AesUtils;
+import com.template.common.utils.paramUtils;
+import com.template.model.enumModel.eIsSuper;
+import com.template.model.enumModel.eStatu;
+import com.template.model.pojo.RepairAdmin;
+import com.template.model.result.CommonResult;
+import com.template.model.result.PageUtils;
+import com.template.services.RepairAdminService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-05
+ */
+@RestController
+public class RepairAdminController implements RepairAdminControllerAPI {
+
+    @Autowired
+    private RepairAdminService repairAdminService;
+
+    /**
+     * 添加账号数据
+     *
+     * @param ra account 账号
+     *           password 密码
+     *           username 用户名称
+     *           phone 手机号
+     * @return
+     */
+    @Override
+    public CommonResult InsertRepairAdmin(@RequestBody RepairAdmin ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = 0; // 帮我们自动生成id
+        try {
+            result = repairAdminService.insertRepairAdmin(ra);
+        } catch (Exception e) {
+            if (e.getCause().getMessage().contains("'repair_admin.account_un'")) {
+                return CommonResult.fail("该账号已存在!");
+            }
+            return CommonResult.fail("系统异常,添加失败!");
+        }
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    /**
+     * 查询账户列表数据
+     *
+     * @param currentPage 当前页
+     * @param pageCount   一页数据条数
+     * @param account     账号
+     * @param phone       手机号
+     * @param userName    账号名称
+     * @return
+     */
+    @Override
+    public CommonResult queryPageRepairAdmins(@RequestParam int currentPage, @RequestParam int pageCount, String account, String phone, String userName) {
+        PageUtils<RepairAdmin> result = repairAdminService.queryPageList(currentPage, pageCount, account, phone, userName);
+
+        return CommonResult.ok(result);
+    }
+
+    /**
+     * 根据ID冻结账号账号数据
+     *
+     * @param frar id 数据ID
+     *             statu 状态
+     *             正常:0;冻结:1
+     * @return
+     */
+    @Override
+    public CommonResult freezeRepairAdminById(@RequestBody com.repair.model.request.freezeRepairAdminRequest frar, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        RepairAdmin data = repairAdminService.getRepairById(frar.getId());
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,解冻失败!");
+        }
+        if (data.getStatu() == frar.getStatu()) {
+            String Message = frar.getStatu() == eStatu.Freeze.getValue() ? "当前处于冻结状态,请勿重复操作!" : "当前处于未冻结状态,请勿重复操作!";
+            return CommonResult.fail(Message);
+        }
+
+        String success = frar.getStatu() == eStatu.Freeze.getValue() ? "冻结成功!" : "解冻成功";
+        String fail = frar.getStatu() == eStatu.Freeze.getValue() ? "冻结失败!" : "解冻失败";
+        RepairAdmin ra = new RepairAdmin();
+        ra.setId(frar.getId());
+        ra.setStatu(frar.getStatu());
+        int result = repairAdminService.updateRepairAdmin(ra);
+        System.out.println(result);
+        return result > 0 ? CommonResult.ok(success) : CommonResult.fail(fail);
+    }
+
+    /**
+     * 根据ID删除账号数据
+     *
+     * @param id id 数据ID
+     * @return
+     */
+    @Override
+    public CommonResult deleteRepairAdminById(@RequestParam String id) {
+        RepairAdmin data = repairAdminService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairAdminService.deleteRepairAdminById(id);
+
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    /**
+     * 编辑账号
+     *
+     * @param ra id 数据ID
+     *           username 账号名称
+     *           phone 手机号
+     *           password 密码
+     * @return
+     */
+    @Override
+    public CommonResult updateRepairAdminById(com.repair.model.request.updateRepairAdminRequest ra, @RequestHeader("user_head") String userhead, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin data = repairAdminService.getRepairById(ra.getId());
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,编辑失败!");
+        }
+
+        //只有操作管理员才能编辑他人的密码
+        String userID = AesUtils.decrypt(userhead);
+        if (ra.getPassword() != null && !userID.equals(ra.getId())) {
+            RepairAdmin operateData = repairAdminService.getRepairById(userID);
+            if(operateData == null){
+                return CommonResult.fail("操作身份不合法,编辑失败!");
+            }
+            if(!data.getPassword().equals(AesUtils.encrypt(ra.getPassword())) && operateData.getIsSuper() != eIsSuper.Super.getValue()){
+                return CommonResult.fail("只有超级管理员才能更改密码!");
+            }
+        }
+
+        int result = repairAdminService.updateRepaiRadmin(ra);
+        return result > 0 ? CommonResult.ok("编辑成功") : CommonResult.fail("编辑失败");
+    }
+}
+

+ 29 - 0
src/main/java/com/template/controller/SendController.java

@@ -0,0 +1,29 @@
+package com.template.controller;
+
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.template.api.SendControllerAPI;
+import com.template.common.utils.SendSms;
+import com.template.common.utils.ValidateCode;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/send/sms")
+@Api(tags = {"SendController"},value = "短信发送接口")
+public class SendController implements SendControllerAPI {
+
+
+    @Override
+//    @PassToken
+//    @PostMapping("/sendCodeAgain")
+    public SendStatus[] sendCodeAgain(@RequestBody String phone){
+        //         随机验证码
+        int vode= ValidateCode.generateValidateCode(6);
+        String code=String.valueOf(vode);
+        phone="+86"+phone;
+        SendStatus[] ret = SendSms.sendSms(phone,code);
+        return ret;
+    }
+
+
+}

+ 42 - 0
src/main/java/com/template/controller/SmsCodeController.java

@@ -0,0 +1,42 @@
+package com.template.controller;
+
+
+import com.template.annotation.PassToken;
+import com.template.api.SmsCodeControllerAPI;
+import com.template.model.pojo.SmsCode;
+import com.template.model.result.CommonResult;
+import com.template.services.SmsCodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-04-20
+ */
+@RestController
+public class SmsCodeController implements SmsCodeControllerAPI {
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+
+    @Override
+    @PassToken
+    public CommonResult InsertSmsCode() {
+        SmsCode smsCode = new SmsCode();
+        smsCode.setPhoneNumber("123456789");
+        smsCode.setCode("123456");
+        long time = new Date().getTime() + 60000L;
+        smsCode.setExpirationTime(new Date(time));
+        smsCode.setIsVerify("0");
+        smsCodeService.save(smsCode);
+        return null;
+    }
+}
+

+ 110 - 0
src/main/java/com/template/controller/SystemMenuController.java

@@ -0,0 +1,110 @@
+package com.template.controller;
+
+
+import com.template.api.SystemMenuControllerAPI;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import com.template.model.vo.SystemMenuTreeVo;
+import com.template.model.vo.SystemMenuVo;
+import com.template.services.SystemMenuService;
+import com.template.annotation.PassToken;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@RestController
+public class SystemMenuController implements SystemMenuControllerAPI {
+
+    @Autowired
+    private SystemMenuService systemMenuService;
+
+    @Override
+    @PassToken
+    public CommonResult<Integer> InsertPlaybackRecord(@RequestBody SystemMenu pb){
+        CommonResult<Integer> result = systemMenuService.insertPlaybackRecord(pb); // 帮我们自动生成id
+        return result;
+    }
+
+    @Override
+    @PassToken
+    public CommonResult<List<SystemMenu>> QueryPlaybackRecords(HttpServletRequest request) {
+        CommonResult<List<SystemMenu>> result = systemMenuService.getPlaybackRecords();
+        return result;
+    }
+
+    @Override
+    @PassToken
+    public CommonResult<List<SystemMenuVo>> QueryPlaybackRecordBySql() {
+        CommonResult<List<SystemMenuVo>> result = systemMenuService.getPlaybackRecordBySql();
+        return result;
+    }
+
+    @Override
+    @PassToken
+    public CommonResult<List<SystemMenu>> QueryPlaybackRecords() {
+        return systemMenuService.getSystemMenus();
+    }
+
+    @Override
+    @PassToken
+    public CommonResult InsertSystemMenu(SystemMenu systemMenu) {
+        return systemMenuService.insertSystemMenus(systemMenu);
+    }
+
+    @Override
+    @PassToken
+    public CommonResult DeleteSystemMenu(Integer userID) {
+        return systemMenuService.deleteSystemMenu(userID);
+    }
+
+    @Override
+    @PassToken
+    public CommonResult<List<SystemMenuTreeVo>> QueryMenuTreeRecords() {
+        List<SystemMenuTreeVo> newTrees = new ArrayList<>();
+
+        newTrees = QueryMenuTreeRecords(0L);
+
+        return CommonResult.ok().setResult(newTrees);
+    }
+
+    /*
+    根据父类ID获取树形菜单数据
+     */
+    private List<SystemMenuTreeVo> QueryMenuTreeRecords(Long parentID){
+        List<SystemMenuTreeVo> newTrees = new ArrayList<>();
+
+        List<SystemMenu> datas = systemMenuService.getSystemMenusByParentId(parentID).getData();
+
+        for (SystemMenu data : datas) {
+            SystemMenuTreeVo item = SystemMenuTreeVo.builder()
+                    .id(data.getId())
+                    .parentId(data.getMenuParentId())
+                    .menuName(data.getMenuName())
+                    .build();
+            List<SystemMenuTreeVo> news = QueryMenuTreeRecords(item.getId());
+            if (news == null || news.size() == 0) {
+                newTrees.add(item);
+                continue;
+            }else {
+                item.setChildren(news);
+                newTrees.add(item);
+            }
+        }
+
+        return  newTrees;
+    }
+}
+

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

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

+ 113 - 0
src/main/java/com/template/core/JwtAuthenticationInterceptor.java

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

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

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

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

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

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

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

+ 49 - 0
src/main/java/com/template/handler/MyMetaObjectHandler.java

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

+ 17 - 0
src/main/java/com/template/mapper/RepairAdminMapper.java

@@ -0,0 +1,17 @@
+package com.template.mapper;
+
+import com.template.model.pojo.RepairAdmin;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/*
+Mapper和Repository的相同点:
+@Mapper和@Repository都是作用在dao层接口,使得其生成代理对象bean,交给spring 容器管理,对于mybatis来说,都可以不用写mapper.xml文件
+Mapper和Repository的区别:
+@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中:如下,在启动类中配置扫描地址:
+@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中
+* */
+@Repository
+public interface RepairAdminMapper extends BaseMapper<RepairAdmin> {
+
+}

+ 16 - 0
src/main/java/com/template/mapper/SmsCodeMapper.java

@@ -0,0 +1,16 @@
+package com.template.mapper;
+
+import com.template.model.pojo.SmsCode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-04-20
+ */
+public interface SmsCodeMapper extends BaseMapper<SmsCode> {
+
+}

+ 22 - 0
src/main/java/com/template/mapper/SystemMenuMapper.java

@@ -0,0 +1,22 @@
+package com.template.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.vo.SystemMenuVo;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+
+@Repository
+public interface SystemMenuMapper extends BaseMapper<SystemMenu> {
+    List<SystemMenuVo> querySystemMenuAll();
+}

+ 16 - 0
src/main/java/com/template/mapper/SystemUserMapper.java

@@ -0,0 +1,16 @@
+package com.template.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.template.model.pojo.SystemUser;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+public interface SystemUserMapper extends BaseMapper<SystemUser> {
+
+}

+ 32 - 0
src/main/java/com/template/model/enumModel/eIsSuper.java

@@ -0,0 +1,32 @@
+package com.template.model.enumModel;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/7 星期五 15:14
+ * @Description: com.repair.model.enumModel
+ * @Version: 1.0
+ */
+public enum eIsSuper {
+    NotSuper(0),//非超级管理员
+    Super(1);//超级管理员
+
+    private int value;
+
+    eIsSuper(int value){
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+    public static eIsSuper valueOf(int value) {
+        switch (value) {
+            case 0:
+                return eIsSuper.NotSuper;
+            case 1:
+                return eIsSuper.Super;
+            default:
+                return null;
+        }
+    }
+}

+ 33 - 0
src/main/java/com/template/model/enumModel/eStatu.java

@@ -0,0 +1,33 @@
+package com.template.model.enumModel;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/6 星期四 16:34
+ * @Description: com.template.model.enumModel
+ * @Version: 1.0
+ * 账号状态
+ */
+public enum  eStatu {
+    Freeze(1),//冻结
+    Unfrozen(0);//未冻结
+
+    private int value;
+
+    eStatu(int value){
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+    public static eStatu valueOf(int value) {
+        switch (value) {
+            case 1:
+                return eStatu.Freeze;
+            case 0:
+                return eStatu.Unfrozen;
+            default:
+                return null;
+        }
+    }
+}

+ 81 - 0
src/main/java/com/template/model/pojo/RepairAdmin.java

@@ -0,0 +1,81 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="RepairAdmin对象", description="")
+public class RepairAdmin implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.UUID)
+    private String id;
+
+    @ApiModelProperty(value = "账号")
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    @ApiModelProperty(value = "密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    @ApiModelProperty(value = "昵称")
+    @NotBlank(message = "昵称不能为空")
+    private String username;
+
+    @ApiModelProperty(value = "手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String phone;
+
+    @ApiModelProperty(value = "是否是超级管理员 正常:0;超级管理员:1")
+    private Integer isSuper;
+
+    @ApiModelProperty(value = "状态 正常:0;冻结:1")
+    private Integer statu;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建人员")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @ApiModelProperty(value = "更新人员")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @ApiModelProperty(value = "逻辑删除 未删除:0;删除:1")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer deleted;
+
+}

+ 66 - 0
src/main/java/com/template/model/pojo/SmsCode.java

@@ -0,0 +1,66 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-04-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SmsCode对象", description="")
+public class SmsCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
+    @TableId(value = "id", type = IdType.ID_WORKER)
+    private Long id;
+
+    @ApiModelProperty(value = "手机号")
+    private String phoneNumber;
+
+    @ApiModelProperty(value = "短信验证码")
+    private String code;
+
+    @ApiModelProperty(value = "失效时间")
+    private Date expirationTime;
+
+    @ApiModelProperty(value = "是否验证 0 未验证 1 已验证")
+    private String isVerify;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 60 - 0
src/main/java/com/template/model/pojo/SystemMenu.java

@@ -0,0 +1,60 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SystemMenu对象", description="")
+public class SystemMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "上级菜单ID")
+    private Long menuParentId;
+
+    @ApiModelProperty(value = "菜单名称")
+    private String menuName;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 57 - 0
src/main/java/com/template/model/pojo/SystemRole.java

@@ -0,0 +1,57 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SystemRole对象", description="")
+public class SystemRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "角色名称")
+    private String roleName;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人员")
+    private Long createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "更新人员")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+
+}

+ 79 - 0
src/main/java/com/template/model/pojo/SystemUser.java

@@ -0,0 +1,79 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SystemUser对象", description="")
+public class SystemUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "角色ID")
+    private Long roleId;
+
+    @ApiModelProperty(value = "账户名")
+    private String accountName;
+
+    @ApiModelProperty(value = "账户")
+    private String accountNumber;
+
+    @ApiModelProperty(value = "账户密码")
+    private String accountPassword;
+
+    @ApiModelProperty(value = "手机号")
+    private String phoneNumber;
+
+    @ApiModelProperty(value = "邮箱账号")
+    private String email;
+
+    @ApiModelProperty(value = "微信号id")
+    private String wechatId;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建人员")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    @ApiModelProperty(value = "更新人员")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    @ApiModelProperty(value = "逻辑删除标记")
+    @TableLogic
+    private Long deleted;
+
+    @ApiModelProperty(value = "性别")
+    private Integer gender;
+}

+ 29 - 0
src/main/java/com/template/model/request/changePasswordRequest.java

@@ -0,0 +1,29 @@
+package com.repair.model.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 修改密码
+ */
+@Data
+public class changePasswordRequest {
+    /**
+     * 原密码
+     */
+    @NotBlank(message = "原密码不能为空")
+    private String oldPassword;
+
+    /**
+     * 新密码
+     */
+    @NotBlank(message = "新密码不能为空")
+    private String newPassword;
+
+    /**
+     * 确认密码
+     */
+    @NotBlank(message = "确认密码不能为空")
+    private String confirmPassword;
+}

+ 29 - 0
src/main/java/com/template/model/request/freezeRepairAdminRequest.java

@@ -0,0 +1,29 @@
+package com.repair.model.request;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/7 星期五 10:17
+ * @Description: com.repair.model.request
+ * @Version: 1.0
+ */
+@Data
+public class freezeRepairAdminRequest {
+    /**
+     * 数据ID
+     */
+    @NotBlank(message = "数据ID不能为空")
+    private String id;
+
+    /**
+     * 状态
+     * 正常:0;冻结:1
+     */
+    @NotNull(message = "状态不能为空")
+    private Integer statu;
+}

+ 23 - 0
src/main/java/com/template/model/request/loginRequest.java

@@ -0,0 +1,23 @@
+package com.template.model.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 登录请求参数
+ */
+@Data
+public class loginRequest {
+    /**
+     * 账号
+     */
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    /**
+     * 密码
+     */
+    @NotBlank(message = "密码不能为空")
+    private String password;
+}

+ 40 - 0
src/main/java/com/template/model/request/queryAccountPageRequest.java

@@ -0,0 +1,40 @@
+package com.repair.model.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/6 星期四 17:17
+ * @Description: com.repair.model.request
+ * @Version: 1.0
+ */
+@Data
+public class queryAccountPageRequest {
+
+    /**
+     * 当前页数
+     */
+    private int currentPage = 0;
+
+    /**
+     * 一页数据总条数
+     */
+    private int pageCount = 10;
+
+    /**
+     * 账号
+     */
+    private String account;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 账号名称
+     */
+    private String userName;
+}

+ 34 - 0
src/main/java/com/template/model/request/updateRepairAdminRequest.java

@@ -0,0 +1,34 @@
+package com.repair.model.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/7 星期五 14:27
+ * @Description: com.repair.model.request
+ * @Version: 1.0
+ */
+@Data
+public class updateRepairAdminRequest {
+    /**
+     * 数据ID
+     */
+    @NotBlank(message = "数据ID不能为空")
+    private String id;
+    /**
+     * 账号名称
+     */
+    private String username;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 35 - 0
src/main/java/com/template/model/result/BaseResult.java

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

+ 158 - 0
src/main/java/com/template/model/result/CommonResult.java

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

+ 64 - 0
src/main/java/com/template/model/result/PageUtils.java

@@ -0,0 +1,64 @@
+package com.template.model.result;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分页工具类
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+public class PageUtils<T> implements Serializable {
+	private static final long serialVersionUID = 1L;
+	/**
+	 * 总记录数
+	 */
+	private int totalCount;
+	/**
+	 * 每页记录数
+	 */
+	private int pageSize;
+	/**
+	 * 总页数
+	 */
+	private int totalPage;
+	/**
+	 * 当前页数
+	 */
+	private int currPage;
+	/**
+	 * 列表数据
+	 */
+	private List<T> list;
+
+	/**
+	 * 分页
+	 * @param list        列表数据
+	 * @param totalCount  总记录数
+	 * @param pageSize    每页记录数
+	 * @param currPage    当前页数
+	 */
+	public PageUtils(List<T> list, int totalCount, int pageSize, int currPage) {
+		this.list = list;
+		this.totalCount = totalCount;
+		this.pageSize = pageSize;
+		this.currPage = currPage;
+		this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
+	}
+
+	/**
+	 * 分页
+	 */
+	public PageUtils(IPage<T> page) {
+		this.list = page.getRecords();
+		this.totalCount = (int)page.getTotal();
+		this.pageSize = (int)page.getSize();
+		this.currPage = (int)page.getCurrent();
+		this.totalPage = (int)page.getPages();
+	}
+
+}

+ 32 - 0
src/main/java/com/template/model/vo/LoginVO.java

@@ -0,0 +1,32 @@
+package com.template.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: codingliang
+ * @Description: 登录用户vo
+ * @Date: 2022-08-04 9:58
+ * @Version: V1.0
+ **/
+
+@Data
+public class LoginVO {
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+    /**
+     * 加密后的用户ID
+     */
+    private String userhead;
+    /**
+     * 用户token
+     */
+    private String token;
+    /**
+     * token过期时间
+     */
+    private long tokenTtl;
+
+}

+ 32 - 0
src/main/java/com/template/model/vo/SystemMenuTreeVo.java

@@ -0,0 +1,32 @@
+package com.template.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.util.List;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/4 星期二 14:54
+ * @Description: com.video.model.vo
+ * @Version: 1.0
+ */
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(value="树形菜单", description="")
+public class SystemMenuTreeVo {
+    @ApiModelProperty(value = "菜单ID")
+    private Long id;
+    @ApiModelProperty(value = "上级菜单ID")
+    private Long parentId;
+    @ApiModelProperty(value = "菜单名称")
+    private String menuName;
+    @ApiModelProperty(value = "子级菜单")
+    private List<SystemMenuTreeVo> children;
+}

+ 27 - 0
src/main/java/com/template/model/vo/SystemMenuVo.java

@@ -0,0 +1,27 @@
+package com.template.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/18 星期二 9:54
+ * @Description: com.video.model.vo
+ * @Version: 1.0
+ */
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(value="菜单", description="")
+public class SystemMenuVo {
+    @ApiModelProperty(value = "菜单ID")
+    private Long id;
+
+    @ApiModelProperty(value = "菜单名称")
+    private String menuName;
+}

+ 30 - 0
src/main/java/com/template/services/RepairAdminService.java

@@ -0,0 +1,30 @@
+package com.template.services;
+
+import com.template.model.pojo.RepairAdmin;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.template.model.result.CommonResult;
+import com.template.model.result.PageUtils;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-05
+ */
+public interface RepairAdminService extends IService<RepairAdmin> {
+    int insertRepairAdmin(RepairAdmin ra);
+
+    int deleteRepairAdminById(String id);
+
+    RepairAdmin getRepairByAccount(String Account);
+
+    PageUtils<RepairAdmin> queryPageList(int currentPage, int pageCount, String account, String phone, String userName);
+
+    RepairAdmin getRepairById(String id);
+
+    int updateRepaiRadmin(com.repair.model.request.updateRepairAdminRequest urar);
+
+    int updateRepairAdmin(RepairAdmin ra);
+}

+ 18 - 0
src/main/java/com/template/services/SmsCodeService.java

@@ -0,0 +1,18 @@
+package com.template.services;
+
+import com.template.model.pojo.SmsCode;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.template.model.result.CommonResult;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-04-20
+ */
+public interface SmsCodeService extends IService<SmsCode> {
+
+    CommonResult logIn(String phone, String code);
+}

+ 34 - 0
src/main/java/com/template/services/SystemMenuService.java

@@ -0,0 +1,34 @@
+package com.template.services;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import com.template.model.vo.SystemMenuVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+public interface SystemMenuService extends IService<SystemMenu> {
+
+    CommonResult<List<SystemMenu>> getSystemMenus();
+
+    CommonResult insertSystemMenus(SystemMenu systemMenu);
+
+    CommonResult deleteSystemMenu(Integer userID);
+
+    CommonResult<List<SystemMenu>> getSystemMenusByParentId(Long parentId);
+
+    //新增播放记录
+    CommonResult<Integer> insertPlaybackRecord(SystemMenu systemMenu);
+
+    CommonResult<List<SystemMenu>> getPlaybackRecords();
+
+    CommonResult<List<SystemMenuVo>> getPlaybackRecordBySql();
+}

+ 19 - 0
src/main/java/com/template/services/SystemUserService.java

@@ -0,0 +1,19 @@
+package com.template.services;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.template.model.pojo.SystemUser;
+import com.template.model.result.CommonResult;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+public interface SystemUserService extends IService<SystemUser> {
+
+    CommonResult verifyPhone(String phone);
+
+}

+ 95 - 0
src/main/java/com/template/services/impl/RepairAdminServiceImpl.java

@@ -0,0 +1,95 @@
+package com.template.services.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.template.common.utils.AesUtils;
+import com.template.model.pojo.RepairAdmin;
+import com.template.mapper.RepairAdminMapper;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import com.template.model.result.PageUtils;
+import com.template.services.RepairAdminService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-05
+ */
+@Service
+public class RepairAdminServiceImpl extends ServiceImpl<RepairAdminMapper, RepairAdmin> implements RepairAdminService {
+
+    @Autowired
+    private RepairAdminMapper repairAdminMapper ;
+
+    @Override
+    public int insertRepairAdmin(RepairAdmin ra) {
+        ra.setIsSuper(0);
+        ra.setStatu(0);
+        ra.setPassword(AesUtils.encrypt(ra.getPassword()));//加密密码
+        int result = repairAdminMapper.insert(ra);
+        return result;
+    }
+
+    @Override
+    public int deleteRepairAdminById(String id) {
+        int result = repairAdminMapper.deleteById(id);
+        return result;
+    }
+
+    @Override
+    public RepairAdmin getRepairByAccount(String Account) {
+        QueryWrapper<RepairAdmin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account", Account);
+        RepairAdmin result = repairAdminMapper.selectOne(queryWrapper);
+        return result;
+    }
+
+    @Override
+    public RepairAdmin getRepairById(String id) {
+        RepairAdmin result = repairAdminMapper.selectById(id);
+        return result;
+    }
+
+    @Override
+    public int updateRepaiRadmin(com.repair.model.request.updateRepairAdminRequest urar) {
+        //只更改有值的字段
+        RepairAdmin ra = new RepairAdmin();
+        ra.setId(urar.getId());
+        //超级管理员用户才能更改密码
+        if(urar.getPassword() != null){
+            urar.setPassword(AesUtils.encrypt(urar.getPassword()));//加密密码
+        }
+        ra.setUsername(urar.getUsername());
+        ra.setPhone(urar.getPhone());
+        int result = repairAdminMapper.updateById(ra);
+        return result;
+    }
+
+    @Override
+    public int updateRepairAdmin(RepairAdmin ra) {
+        int result = repairAdminMapper.updateById(ra);
+        return result;
+    }
+
+    @Override
+    public PageUtils<RepairAdmin> queryPageList(int currentPage, int pageCount, String account, String phone, String userName) {
+        Page<RepairAdmin> page = new Page<>(currentPage, pageCount);
+        QueryWrapper<RepairAdmin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like(StringUtils.hasText(account), "account", account);
+        queryWrapper.like(StringUtils.hasText(phone), "phone", phone);
+        queryWrapper.like(StringUtils.hasText(userName), "username", userName);
+        IPage<RepairAdmin> result = repairAdminMapper.selectPage(page, queryWrapper);
+        return new PageUtils(result);
+    }
+}

+ 110 - 0
src/main/java/com/template/services/impl/SmsCodeServiceImpl.java

@@ -0,0 +1,110 @@
+package com.template.services.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.template.config.MySecurity;
+import com.template.model.pojo.SmsCode;
+import com.template.mapper.SmsCodeMapper;
+import com.template.model.pojo.SystemUser;
+import com.template.model.result.CommonResult;
+import com.template.services.SmsCodeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.template.services.SystemUserService;
+import com.template.common.utils.EncryptionUtil;
+import com.template.common.utils.RSAUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-04-20
+ */
+@Service
+public class SmsCodeServiceImpl extends ServiceImpl<SmsCodeMapper, SmsCode> implements SmsCodeService {
+
+    @Autowired
+    SystemUserService systemUserService;
+
+    @Autowired
+    MySecurity mySecurity;
+
+    private static final int MAX_JSON_STRING = 40;
+
+    @Override
+    public CommonResult logIn(String phone, String code) {
+        if (ObjectUtils.isEmpty(phone) || ObjectUtils.isEmpty(code)) {
+            return CommonResult.fail("500", "参数为空");
+        }
+//        获取私钥
+        String privateKey = mySecurity.getPrivateKey();
+//        postman传参会将+转换成空格
+        phone = phone.replace(" ", "+");
+        code = code.replace(" ", "+");
+        String decryptPhone;
+        String decryptCode;
+        try {
+            decryptPhone = RSAUtils.decrypt(phone, RSAUtils.getPrivateKey(privateKey));
+            decryptCode = RSAUtils.decrypt(code, RSAUtils.getPrivateKey(privateKey));
+        } catch (Exception e) {
+            return CommonResult.fail("500", "解密失败");
+        }
+        phone = decryptPhone;
+        code = decryptCode;
+
+        LambdaQueryWrapper<SmsCode> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SmsCode::getPhoneNumber, phone);
+        wrapper.ge(SmsCode::getExpirationTime, new Date());
+        wrapper.eq(SmsCode::getIsVerify, "0");
+        SmsCode one = this.getOne(wrapper);
+        if (ObjectUtils.isEmpty(one)) {
+            return CommonResult.fail("500", "验证码已过期");
+        }
+        String code1 = one.getCode();
+//            验证
+        if (!(code1.equals(code))) {
+            return CommonResult.fail("500", "验证码错误");
+        }
+
+        // 登录成功,生成token
+        LambdaQueryWrapper<SystemUser> wrapper2 = new LambdaQueryWrapper<>();
+        wrapper2.eq(SystemUser::getPhoneNumber, phone);
+        SystemUser one1 = systemUserService.getOne(wrapper2);
+//        String token = JWTUtil.getToken(one1);
+//        LoginVO loginVO = new LoginVO();
+//        loginVO.setToken(token);
+//        loginVO.setTokenTtl(JWTUtil.getExpired());
+//        loginVO.setUserName(one1.getAccountName());
+//        loginVO.setTelPhone(phone);
+
+//        将返回值转成json字符串并加密
+        String s = "";//JSON.toJSONString(loginVO);
+
+        Map<Object, Object> encryption = new HashMap<>();
+        try {
+//        返回的加密字符串太长,无法解析,每次返回加密40长度的字符串
+            EncryptionUtil encryptionUtil = new EncryptionUtil();
+            encryption = encryptionUtil.encryption(s,mySecurity.getPublicKey());
+        } catch (Exception e) {
+            return CommonResult.fail("500", "加密失败");
+        }
+//        将未验证更改为已验证
+//        SmsCode smsCode = new SmsCode();
+//        BeanUtils.copyProperties(one, smsCode);
+//        smsCode.setIsVerify("1");
+//        this.updateById(smsCode);
+
+        return CommonResult.ok(encryption);
+    }
+
+
+
+
+}

+ 86 - 0
src/main/java/com/template/services/impl/SystemMenuServiceImpl.java

@@ -0,0 +1,86 @@
+package com.template.services.impl;
+
+import com.template.mapper.SystemMenuMapper;
+import com.template.model.pojo.SystemMenu;
+import com.template.model.result.CommonResult;
+import com.template.model.vo.SystemMenuVo;
+import com.template.services.SystemMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@Service
+public class SystemMenuServiceImpl extends ServiceImpl<SystemMenuMapper, SystemMenu> implements SystemMenuService {
+
+    @Autowired
+    private SystemMenuMapper systemMenuMapper;
+
+    /*
+    查询获取所有菜单
+    * */
+    @Override
+    @Cacheable(value = {"getSystemMenus"})
+    public CommonResult<List<SystemMenu>> getSystemMenus() {
+        List<SystemMenu> result = systemMenuMapper.selectList(null);
+        return CommonResult.ok().setResult(result);
+    }
+
+    @Override
+    //根据参数清除名为roomThirdSetting的缓存
+    @CacheEvict(value = "getSystemMenus")
+    public CommonResult insertSystemMenus(SystemMenu systemMenu) {
+        int result = systemMenuMapper.insert(systemMenu);
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    @Override
+    public CommonResult deleteSystemMenu(Integer userID) {
+        int result = systemMenuMapper.deleteById(Long.valueOf(userID));
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    @Override
+    public CommonResult<List<SystemMenu>> getSystemMenusByParentId(Long parentId) {
+        HashMap<String, Object> map = new HashMap<>();
+        // 自定义要查询
+        map.put("menu_parent_id",parentId);
+
+        List<SystemMenu> result = systemMenuMapper.selectByMap(map);
+
+        return CommonResult.ok().setResult(result);
+    }
+
+    @Override
+    @CacheEvict(value = "insertPlaybackRecord", allEntries = true)//allEntries清除整个缓存区
+    public CommonResult<Integer> insertPlaybackRecord(SystemMenu systemMenu) {
+        Integer result = systemMenuMapper.insert(systemMenu); // 帮我们自动生成id
+        return CommonResult.ok().setResult(result);// 发现,id会自动回填
+    }
+
+    @Override
+    @Cacheable("insertPlaybackRecord")
+    public CommonResult<List<SystemMenu>> getPlaybackRecords() {
+        List<SystemMenu> result = systemMenuMapper.selectList(null);
+        return CommonResult.ok().setResult(result);
+    }
+
+    @Override
+    public CommonResult<List<SystemMenuVo>> getPlaybackRecordBySql() {
+        List<SystemMenuVo> result = systemMenuMapper.querySystemMenuAll();
+        return CommonResult.ok().setResult(result);
+    }
+
+}

+ 103 - 0
src/main/java/com/template/services/impl/SystemUserServiceImpl.java

@@ -0,0 +1,103 @@
+package com.template.services.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.template.config.MySecurity;
+import com.template.mapper.SystemUserMapper;
+import com.template.model.pojo.SmsCode;
+import com.template.model.pojo.SystemUser;
+import com.template.model.result.CommonResult;
+import com.template.services.SystemUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.template.common.result.ResponseStatusEnum;
+import com.template.common.utils.SendSms;
+import com.template.common.utils.ValidateCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-03-30
+ */
+@Service
+public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser> implements SystemUserService {
+
+    @Autowired
+    SmsCodeServiceImpl smsCodeService;
+
+    /**
+     * 密钥对象
+     */
+    @Autowired
+    MySecurity mySecurity;
+
+    /**
+     * 判断手机号是否符合发送验证码的要求
+     * @param phone
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor=Exception.class )
+    public CommonResult verifyPhone(String phone) {
+//        String privateKey = mySecurity.getPrivateKey();
+//        postman传参会将+转换成空格
+//        phone=phone.replace(" ","+");
+//        String decrypt;
+//        try {
+//             decrypt = RSAUtils.decrypt(phone, RSAUtils.getPrivateKey(privateKey));
+//        } catch (Exception e) {
+//            return CommonResult.fail("500","解密失败");
+//        }
+//        phone=decrypt;
+        if (ObjectUtils.isEmpty(phone) || 11 != phone.length()) {
+            return CommonResult.resultValue(ResponseStatusEnum.SEND_PARAMS);
+        }
+        LambdaQueryWrapper<SystemUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SystemUser::getPhoneNumber, phone);
+        SystemUser one = this.getOne(wrapper);
+        if (ObjectUtils.isEmpty(one)) {
+            return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_PHONE_ERROR);
+        }
+
+        LambdaQueryWrapper<SmsCode> wrappers=new LambdaQueryWrapper<>();
+        wrappers.eq(SmsCode::getPhoneNumber,phone);
+        wrappers.ge(SmsCode::getExpirationTime,new Date());
+        wrappers.eq(SmsCode::getIsVerify,"0");
+        int count = smsCodeService.count(wrappers);
+        if (count>0) {
+            return CommonResult.fail("500","请不要频繁操作");
+        }
+        //         随机验证码
+        int vode= ValidateCode.generateValidateCode(6);
+        String code=String.valueOf(vode);
+        SmsCode smsCode = new SmsCode();
+        smsCode.setPhoneNumber(phone);
+        phone = "+86" + phone;
+//        发送短信
+        SendStatus[] ret = SendSms.sendSms(phone,code);
+//        获取code
+        String code1 = ret[0].getCode();
+//        判断短信是否发送成功
+        if ("LimitExceeded.PhoneNumberDailyLimit".equals(code1)) {
+            return CommonResult.fail("500","手机号已超过发送上限");
+        }
+
+//            发送成功后存储到短信表
+            smsCode.setCode(code);
+            long time = new Date().getTime() + 60000L;
+            smsCode.setExpirationTime(new Date(time));
+            smsCode.setIsVerify("0");
+            smsCode.setDeleted(0L);
+            smsCodeService.save(smsCode);
+
+        return CommonResult.ok();
+    }
+}

Разлика између датотеке није приказан због своје велике величине
+ 56 - 0
src/main/resources/application-dev.yml


Разлика између датотеке није приказан због своје велике величине
+ 57 - 0
src/main/resources/application-prod.yml


Разлика између датотеке није приказан због своје велике величине
+ 54 - 0
src/main/resources/application.yml


+ 5 - 0
src/main/resources/mapper/template/RepairAdminMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.RepairAdminMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/template/SmsCodeMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.SmsCodeMapper">
+
+</mapper>

+ 14 - 0
src/main/resources/mapper/template/SystemMenuMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.SystemMenuMapper">
+
+    <resultMap id="SystemMenuVOMap" type="com.template.model.vo.SystemMenuVo">
+        <result property="id" column="id"/>
+        <result property="menuName" column="menu_name"/>
+    </resultMap>
+
+    <select id="querySystemMenuAll" resultMap="SystemMenuVOMap">
+        SELECT sm.id,sm.menu_name FROM system_menu sm where deleted = 0
+    </select>
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/template/SystemUserMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.SystemUserMapper">
+
+</mapper>

+ 148 - 0
src/test/java/com/template/MybatisPlusApplicationTests.java

@@ -0,0 +1,148 @@
+package com.template;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MybatisPlusApplicationTests {
+    @Value("${my-security.privateKey}")
+    String privateKey;
+    @Value("${my-security.publicKey}")
+    String publicKey;
+
+    @Test
+    void contextLoads() {
+//        System.out.println(mySecurity.toString());
+
+        System.out.println("privateKey = " + privateKey);
+        System.out.println("publicKey = " + publicKey);
+    }
+
+//    // 继承了BaseMapper,所有的方法都来自己父类
+//    // 我们也可以编写自己的扩展方法!
+//    @Autowired
+//    private PlaybackRecordMapper playbackRecordMapper;
+//
+//    @Test
+//    void contextLoads() {
+//        // 参数是一个 Wrapper ,条件构造器,这里我们先不用 null
+//        // 查询全部用户
+//        List<PlaybackRecord> playbackRecords = playbackRecordMapper.selectList(null);
+//        playbackRecords.forEach(System.out::println);
+//    }
+//
+//    // 测试插入
+//    @Test
+//    public void testInsert(){
+//        PlaybackRecord playbackRecord = new PlaybackRecord();
+//        playbackRecord.setUrl("www.baidu.com");
+//        playbackRecord.setSharerId("123456");
+//        playbackRecord.setShareeId("654321");
+//
+//        int result = playbackRecordMapper.insert(playbackRecord); // 帮我们自动生成id
+//        System.out.println(result); // 受影响的行数
+//        System.out.println(playbackRecord); // 发现,id会自动回填
+//    }
+//
+//    // 测试更新
+//    @Test
+//    public void testUpdate(){
+//        PlaybackRecord playbackRecord = new PlaybackRecord();
+//        // 通过条件自动拼接动态sql
+//        playbackRecord.setShareeId("123456");
+//        // 注意:updateById 但是参数是一个 对象!
+//        int i = playbackRecordMapper.updateById(playbackRecord);
+//        System.out.println(i);
+//    }
+//
+//    // 测试乐观锁成功!
+//    @Test
+//    public void testOptimisticLocker(){
+//        // 1、查询用户信息
+//        PlaybackRecord playbackRecord = playbackRecordMapper.selectById(1L);
+//        // 2、修改用户信息
+//        playbackRecord.setShareeId("123456");
+//        // 3、执行更新操作
+//        playbackRecordMapper.updateById(playbackRecord);
+//    }
+//
+//
+//    // 测试乐观锁失败!多线程下
+//    @Test
+//    public void testOptimisticLocker2(){
+//
+//        // 线程 1
+//        PlaybackRecord playbackRecord = playbackRecordMapper.selectById(1L);
+//        playbackRecord.setShareeId("123456");
+//
+//        // 模拟另外一个线程执行了插队操作
+//        PlaybackRecord playbackRecord2 = playbackRecordMapper.selectById(1L);
+//        playbackRecord.setShareeId("123456");
+//        playbackRecordMapper.updateById(playbackRecord2);
+//
+//        // 自旋锁来多次尝试提交!
+//        playbackRecordMapper.updateById(playbackRecord); // 如果没有乐观锁就会覆盖插队线程的值!
+//    }
+//
+//    // 测试查询
+//    @Test
+//    public void testSelectById(){
+//        PlaybackRecord playbackRecord = playbackRecordMapper.selectById(1L);
+//        System.out.println(playbackRecord);
+//    }
+//
+//    // 测试批量查询!
+//    @Test
+//    public void testSelectByBatchId(){
+//        List<PlaybackRecord> playbackRecords = playbackRecordMapper.selectBatchIds(Arrays.asList(1, 2, 3));
+//        playbackRecords.forEach(System.out::println);
+//    }
+//
+//    // 按条件查询之一使用map操作
+//    @Test
+//    public void testSelectByBatchIds(){
+//        HashMap<String, Object> map = new HashMap<>();
+//        // 自定义要查询
+//        map.put("sharer_id","123456");
+//
+//        List<PlaybackRecord> playbackRecords = playbackRecordMapper.selectByMap(map);
+//        playbackRecords.forEach(System.out::println);
+//    }
+//
+//    // 测试分页查询
+//    @Test
+//    public void testPage(){
+//        //  参数一:当前页
+//        //  参数二:页面大小
+//        //  使用了分页插件之后,所有的分页操作也变得简单的!
+//        Page<PlaybackRecord> page = new Page<>(2,5);
+//        playbackRecordMapper.selectPage(page,null);
+//
+//        page.getRecords().forEach(System.out::println);
+//        System.out.println(page.getTotal());
+//
+//    }
+//
+//
+//    // 测试删除
+//    @Test
+//    public void testDeleteById(){
+//        playbackRecordMapper.deleteById(1L);
+//    }
+//
+//    // 通过id批量删除
+//    @Test
+//    public void testDeleteBatchId(){
+//        playbackRecordMapper.deleteBatchIds(Arrays.asList(1240620674645544961L,1240620674645544962L));
+//    }
+//
+//    // 通过map删除
+//    @Test
+//    public void testDeleteMap(){
+//        HashMap<String, Object> map = new HashMap<>();
+//        map.put("name","123456");
+//        playbackRecordMapper.deleteByMap(map);
+//    }
+
+}

+ 95 - 0
src/test/java/com/template/WrapperTest.java

@@ -0,0 +1,95 @@
+package com.template;
+
+import com.template.config.MySecurity;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class WrapperTest {
+    @Value("${my-security.privateKey}")
+     String privateKey;
+    @Value("${my-security.publicKey}")
+     String publicKey;
+
+    @Autowired
+    MySecurity mySecurity;
+    @Test
+    void contextLoads() {
+        System.out.println(mySecurity.toString());
+        System.out.println("privateKey = " + privateKey);
+        System.out.println("publicKey = " + publicKey);
+    }
+
+
+//    @Autowired
+//    private PlaybackRecordMapper playbackRecordMapper;
+//
+//    @Test
+//    void contextLoads() {
+//        // 查询name不为空的用户,并且邮箱不为空的用户,年龄大于等于12
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        wrapper
+//                .isNotNull("name")
+//                .isNotNull("email")
+//                .ge("age",12);
+//        playbackRecordMapper.selectList(wrapper).forEach(System.out::println); // 和我们刚才学习的map对比一下
+//    }
+//
+//    @Test
+//    void test2(){
+//        // 查询名字123456
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        wrapper.eq("name","123456");
+//        PlaybackRecord playbackRecord = playbackRecordMapper.selectOne(wrapper); // 查询一个数据,出现多个结果使用List 或者 Map
+//        System.out.println(playbackRecord);
+//    }
+//
+//    @Test
+//    void test3(){
+//        // 查询年龄在 20 ~ 30 岁之间的用户
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        wrapper.between("age",20,30); // 区间
+//        Integer count = playbackRecordMapper.selectCount(wrapper);// 查询结果数
+//        System.out.println(count);
+//    }
+//
+//    // 模糊查询
+//    @Test
+//    void test4(){
+//        // 查询年龄在 20 ~ 30 岁之间的用户
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        // 左和右  t%
+//        wrapper
+//                .notLike("name","e")
+//                .likeRight("email","t");
+//
+//        List<Map<String, Object>> maps = playbackRecordMapper.selectMaps(wrapper);
+//        maps.forEach(System.out::println);
+//    }
+//
+//    // 模糊查询
+//    @Test
+//    void test5(){
+//
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        // id 在子查询中查出来
+//        wrapper.inSql("id","select id from user where id<3");
+//
+//        List<Object> objects = playbackRecordMapper.selectObjs(wrapper);
+//        objects.forEach(System.out::println);
+//    }
+//
+//    //测试六
+//    @Test
+//    void test6(){
+//        QueryWrapper<PlaybackRecord> wrapper = new QueryWrapper<>();
+//        // 通过id进行排序
+//        wrapper.orderByAsc("id");
+//
+//        List<PlaybackRecord> playbackRecords = playbackRecordMapper.selectList(wrapper);
+//        playbackRecords.forEach(System.out::println);
+//    }
+
+}

+ 42 - 0
target/classes/META-INF/spring-configuration-metadata.json

@@ -0,0 +1,42 @@
+{
+  "groups": [
+    {
+      "name": "tencentcloud",
+      "type": "com.template.config.smsConfig",
+      "sourceType": "com.template.config.smsConfig"
+    }
+  ],
+  "properties": [
+    {
+      "name": "tencentcloud.sdk-appid",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    },
+    {
+      "name": "tencentcloud.secret-i-d",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    },
+    {
+      "name": "tencentcloud.secret-key",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    },
+    {
+      "name": "tencentcloud.sign-name",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    },
+    {
+      "name": "tencentcloud.sms-min",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    },
+    {
+      "name": "tencentcloud.template-id",
+      "type": "java.lang.String",
+      "sourceType": "com.template.config.smsConfig"
+    }
+  ],
+  "hints": []
+}

Разлика између датотеке није приказан због своје велике величине
+ 56 - 0
target/classes/application-dev.yml


Разлика између датотеке није приказан због своје велике величине
+ 57 - 0
target/classes/application-prod.yml


Разлика између датотеке није приказан због своје велике величине
+ 54 - 0
target/classes/application.yml


+ 5 - 0
target/classes/mapper/template/RepairAdminMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.RepairAdminMapper">
+
+</mapper>

+ 5 - 0
target/classes/mapper/template/SmsCodeMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.SmsCodeMapper">
+
+</mapper>

+ 14 - 0
target/classes/mapper/template/SystemMenuMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.template.mapper.SystemMenuMapper">
+
+    <resultMap id="SystemMenuVOMap" type="com.template.model.vo.SystemMenuVo">
+        <result property="id" column="id"/>
+        <result property="menuName" column="menu_name"/>
+    </resultMap>
+
+    <select id="querySystemMenuAll" resultMap="SystemMenuVOMap">
+        SELECT sm.id,sm.menu_name FROM system_menu sm where deleted = 0
+    </select>
+
+</mapper>

+ 0 - 0
target/classes/mapper/template/SystemUserMapper.xml


Неке датотеке нису приказане због велике количине промена